Version in base suite: 2.0.12+ds1-1~deb10u1 Base version: enigmail_2.0.12+ds1-1~deb10u1 Target version: enigmail_2.1.3+ds1-4~deb10u2 Base file: /srv/ftp-master.debian.org/ftp/pool/main/e/enigmail/enigmail_2.0.12+ds1-1~deb10u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/e/enigmail/enigmail_2.1.3+ds1-4~deb10u2.dsc /srv/release.debian.org/tmp/Suwt12k_JZ/enigmail-2.1.3+ds1/util/test.jpg |binary enigmail-2.1.3+ds1/.eslintrc.js | 25 enigmail-2.1.3+ds1/.gitignore | 15 enigmail-2.1.3+ds1/.gitlab-ci.yml | 8 enigmail-2.1.3+ds1/.jsbeautifyrc | 41 enigmail-2.1.3+ds1/Makefile | 10 enigmail-2.1.3+ds1/config/autoconf.mk.in | 16 enigmail-2.1.3+ds1/configure | 40 enigmail-2.1.3+ds1/configure.ac | 7 enigmail-2.1.3+ds1/debian/changelog | 81 enigmail-2.1.3+ds1/debian/clean | 7 enigmail-2.1.3+ds1/debian/compat | 1 enigmail-2.1.3+ds1/debian/control | 21 enigmail-2.1.3+ds1/debian/copyright | 69 enigmail-2.1.3+ds1/debian/enigmail.links | 1 enigmail-2.1.3+ds1/debian/gbp.conf | 2 enigmail-2.1.3+ds1/debian/patches/0001-avoid-eslint-during-buildtest.patch | 6 enigmail-2.1.3+ds1/debian/patches/0002-Avoid-auto-download-of-pEpEngine-Closes-891882.patch | 6 enigmail-2.1.3+ds1/debian/patches/0003-avoid-OpenPGP.js-when-building.patch | 511 + enigmail-2.1.3+ds1/debian/patches/0004-copy-enums.armor-from-OpenPGP.js.patch | 31 enigmail-2.1.3+ds1/debian/patches/0005-add-more-logging-to-autocrypt-test.patch | 37 enigmail-2.1.3+ds1/debian/patches/0005-avoid-OpenPGP.js-during-key-file-import.patch | 82 enigmail-2.1.3+ds1/debian/patches/0006-drop-use-of-OpenPGP.js-for-generating-minimal-keys.patch | 178 enigmail-2.1.3+ds1/debian/patches/0006-enable-the-use-of-extra-file-descriptors-and-test-th.patch | 267 enigmail-2.1.3+ds1/debian/patches/0007-add-more-logging-to-autocrypt-test.patch | 36 enigmail-2.1.3+ds1/debian/patches/0007-add-test-to-do-symmetric-encryption-decryption-with-.patch | 114 enigmail-2.1.3+ds1/debian/patches/0008-enable-the-use-of-extra-file-descriptors-and-test-th.patch | 267 enigmail-2.1.3+ds1/debian/patches/0008-use-GnuPG-instead-of-openpgp.js-for-symmetric-encryp.patch | 326 enigmail-2.1.3+ds1/debian/patches/0009-add-test-to-do-symmetric-encryption-decryption-with-.patch | 114 enigmail-2.1.3+ds1/debian/patches/0009-tests-wrap-individual-tests-in-key-test-with-withTes.patch | 66 enigmail-2.1.3+ds1/debian/patches/0010-Avoid-errors-on-validKeyserversExist.patch | 26 enigmail-2.1.3+ds1/debian/patches/0010-use-GnuPG-instead-of-openpgp.js-for-symmetric-encryp.patch | 208 enigmail-2.1.3+ds1/debian/patches/0011-drop-unnecessary-tests.patch | 37 enigmail-2.1.3+ds1/debian/patches/0011-tests-wrap-individual-tests-in-key-test-with-withTes.patch | 65 enigmail-2.1.3+ds1/debian/patches/0012-convert-buildlist.py-to-unix-style-line-endings-no-f.patch | 98 enigmail-2.1.3+ds1/debian/patches/0013-use-py2to3-2.7-to-convert-to-python3.patch | 315 enigmail-2.1.3+ds1/debian/patches/0014-fix-shebang-lines-to-use-python3.patch | 29 enigmail-2.1.3+ds1/debian/patches/0015-convert-the-rest-of-the-build-infrastructure-to-pyth.patch | 59 enigmail-2.1.3+ds1/debian/patches/0016-always-return-a-struct_time.patch | 30 enigmail-2.1.3+ds1/debian/patches/0016-python3-treats-objects-as-Unicode-by-default-no-need.patch | 88 enigmail-2.1.3+ds1/debian/patches/0017-avoid-cmp-in-favor-of-__lt__.patch | 30 enigmail-2.1.3+ds1/debian/patches/0019-Avoid-weird-Preprocessor.py-misbehavior.patch | 26 enigmail-2.1.3+ds1/debian/patches/series | 22 enigmail-2.1.3+ds1/debian/rules | 13 enigmail-2.1.3+ds1/debian/run-tests | 9 enigmail-2.1.3+ds1/debian/tests/control | 14 enigmail-2.1.3+ds1/debian/tests/no-test.js | 2 enigmail-2.1.3+ds1/debian/tests/tbird-sqlite | 13 enigmail-2.1.3+ds1/debian/tests/tbird-sqlite.js | 10 enigmail-2.1.3+ds1/debian/tests/unit-tests | 5 enigmail-2.1.3+ds1/include/postbox.h | 1 enigmail-2.1.3+ds1/include/tbird.h | 1 enigmail-2.1.3+ds1/ipc/modules/Makefile | 37 enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_common.jsm | 50 enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_main.jsm | 18 enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_shared.js | 7 enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_shared_win.js | 13 enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_unix.jsm | 190 enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_win.jsm | 27 enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_worker_common.js | 182 enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_worker_unix.js | 6 enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_worker_win.js | 53 enigmail-2.1.3+ds1/ipc/modules/subprocess.jsm | 90 enigmail-2.1.3+ds1/ipc/tests/Makefile | 2 enigmail-2.1.3+ds1/ipc/tests/main.js | 11 enigmail-2.1.3+ds1/ipc/tests/subprocess-test.js | 14 enigmail-2.1.3+ds1/lang/ar/enigmail.dtd | 166 enigmail-2.1.3+ds1/lang/ar/enigmail.properties | 179 enigmail-2.1.3+ds1/lang/bg/enigmail.dtd | 164 enigmail-2.1.3+ds1/lang/bg/enigmail.properties | 179 enigmail-2.1.3+ds1/lang/ca/enigmail.dtd | 166 enigmail-2.1.3+ds1/lang/ca/enigmail.properties | 179 enigmail-2.1.3+ds1/lang/cs/enigmail.dtd | 172 enigmail-2.1.3+ds1/lang/cs/enigmail.properties | 179 enigmail-2.1.3+ds1/lang/current-languages.txt | 1 enigmail-2.1.3+ds1/lang/da/enigmail.dtd | 155 enigmail-2.1.3+ds1/lang/da/enigmail.properties | 179 enigmail-2.1.3+ds1/lang/de/enigmail.dtd | 189 enigmail-2.1.3+ds1/lang/de/enigmail.properties | 129 enigmail-2.1.3+ds1/lang/el/enigmail.dtd | 166 enigmail-2.1.3+ds1/lang/el/enigmail.properties | 179 enigmail-2.1.3+ds1/lang/es-ES/enigmail.dtd | 213 enigmail-2.1.3+ds1/lang/es-ES/enigmail.properties | 163 enigmail-2.1.3+ds1/lang/fa/enigmail.dtd | 956 +- enigmail-2.1.3+ds1/lang/fa/enigmail.properties | 761 +- enigmail-2.1.3+ds1/lang/fi/enigmail.dtd | 178 enigmail-2.1.3+ds1/lang/fi/enigmail.properties | 179 enigmail-2.1.3+ds1/lang/fr/enigmail.dtd | 260 enigmail-2.1.3+ds1/lang/fr/enigmail.properties | 271 enigmail-2.1.3+ds1/lang/gd/enigmail.dtd | 233 enigmail-2.1.3+ds1/lang/gd/enigmail.properties | 265 enigmail-2.1.3+ds1/lang/gl/enigmail.dtd | 205 enigmail-2.1.3+ds1/lang/gl/enigmail.properties | 179 enigmail-2.1.3+ds1/lang/hr/enigmail.dtd | 222 enigmail-2.1.3+ds1/lang/hr/enigmail.properties | 179 enigmail-2.1.3+ds1/lang/hu/enigmail.dtd | 209 enigmail-2.1.3+ds1/lang/hu/enigmail.properties | 171 enigmail-2.1.3+ds1/lang/it/enigmail.dtd | 203 enigmail-2.1.3+ds1/lang/it/enigmail.properties | 177 enigmail-2.1.3+ds1/lang/ja/enigmail.dtd | 198 enigmail-2.1.3+ds1/lang/ja/enigmail.properties | 113 enigmail-2.1.3+ds1/lang/ko/enigmail.dtd | 186 enigmail-2.1.3+ds1/lang/ko/enigmail.properties | 179 enigmail-2.1.3+ds1/lang/lt/enigmail.dtd | 264 enigmail-2.1.3+ds1/lang/lt/enigmail.properties | 289 enigmail-2.1.3+ds1/lang/make-lang.sh | 102 enigmail-2.1.3+ds1/lang/nb/enigmail.dtd | 214 enigmail-2.1.3+ds1/lang/nb/enigmail.properties | 179 enigmail-2.1.3+ds1/lang/nl/enigmail.dtd | 205 enigmail-2.1.3+ds1/lang/nl/enigmail.properties | 151 enigmail-2.1.3+ds1/lang/pl/enigmail.dtd | 203 enigmail-2.1.3+ds1/lang/pl/enigmail.properties | 179 enigmail-2.1.3+ds1/lang/pt-BR/enigmail.dtd | 206 enigmail-2.1.3+ds1/lang/pt-BR/enigmail.properties | 179 enigmail-2.1.3+ds1/lang/pt-PT/enigmail.dtd | 194 enigmail-2.1.3+ds1/lang/pt-PT/enigmail.properties | 179 enigmail-2.1.3+ds1/lang/ro/am-enigprefs.properties | 2 enigmail-2.1.3+ds1/lang/ro/enigmail.dtd | 780 ++ enigmail-2.1.3+ds1/lang/ro/enigmail.properties | 857 ++ enigmail-2.1.3+ds1/lang/ro/help/compose.html | 88 enigmail-2.1.3+ds1/lang/ro/help/editRcptRule.html | 83 enigmail-2.1.3+ds1/lang/ro/help/help.html | 35 enigmail-2.1.3+ds1/lang/ro/help/initError.html | 46 enigmail-2.1.3+ds1/lang/ro/help/messenger.html | 57 enigmail-2.1.3+ds1/lang/ro/help/rulesEditor.html | 63 enigmail-2.1.3+ds1/lang/ro/help/sendingPrefs.html | 42 enigmail-2.1.3+ds1/lang/ru/enigmail.dtd | 239 enigmail-2.1.3+ds1/lang/ru/enigmail.properties | 179 enigmail-2.1.3+ds1/lang/sk/enigmail.dtd | 170 enigmail-2.1.3+ds1/lang/sk/enigmail.properties | 179 enigmail-2.1.3+ds1/lang/sl/enigmail.dtd | 198 enigmail-2.1.3+ds1/lang/sl/enigmail.properties | 179 enigmail-2.1.3+ds1/lang/sq/enigmail.dtd | 207 enigmail-2.1.3+ds1/lang/sq/enigmail.properties | 149 enigmail-2.1.3+ds1/lang/sv/enigmail.dtd | 249 enigmail-2.1.3+ds1/lang/sv/enigmail.properties | 211 enigmail-2.1.3+ds1/lang/tr/enigmail.dtd | 166 enigmail-2.1.3+ds1/lang/tr/enigmail.properties | 241 enigmail-2.1.3+ds1/lang/vi/enigmail.dtd | 176 enigmail-2.1.3+ds1/lang/vi/enigmail.properties | 179 enigmail-2.1.3+ds1/lang/zh-CN/enigmail.dtd | 185 enigmail-2.1.3+ds1/lang/zh-CN/enigmail.properties | 179 enigmail-2.1.3+ds1/lang/zh-TW/enigmail.dtd | 432 - enigmail-2.1.3+ds1/lang/zh-TW/enigmail.properties | 615 + enigmail-2.1.3+ds1/package/Makefile | 57 enigmail-2.1.3+ds1/package/addrbook.jsm | 7 enigmail-2.1.3+ds1/package/amPrefsService.jsm | 9 enigmail-2.1.3+ds1/package/app.jsm | 8 enigmail-2.1.3+ds1/package/armor.jsm | 39 enigmail-2.1.3+ds1/package/attachment.jsm | 50 enigmail-2.1.3+ds1/package/autoSetup.jsm | 658 ++ enigmail-2.1.3+ds1/package/autocrypt.jsm | 929 +- enigmail-2.1.3+ds1/package/bootstrap.js | 88 enigmail-2.1.3+ds1/package/card.jsm | 14 enigmail-2.1.3+ds1/package/chrome.manifest | 2 enigmail-2.1.3+ds1/package/clipboard.jsm | 5 enigmail-2.1.3+ds1/package/commandLine.jsm | 15 enigmail-2.1.3+ds1/package/compat.jsm | 216 enigmail-2.1.3+ds1/package/configBackup.jsm | 19 enigmail-2.1.3+ds1/package/configure.jsm | 109 enigmail-2.1.3+ds1/package/constants.jsm | 32 enigmail-2.1.3+ds1/package/core.jsm | 79 enigmail-2.1.3+ds1/package/cryptoAPI.jsm | 26 enigmail-2.1.3+ds1/package/cryptoAPI/Makefile | 33 enigmail-2.1.3+ds1/package/cryptoAPI/README.txt | 38 enigmail-2.1.3+ds1/package/cryptoAPI/gnupg-decryption.jsm | 376 + enigmail-2.1.3+ds1/package/cryptoAPI/gnupg-key.jsm | 121 enigmail-2.1.3+ds1/package/cryptoAPI/gnupg-keylist.jsm | 503 + enigmail-2.1.3+ds1/package/cryptoAPI/gnupg.js | 450 + enigmail-2.1.3+ds1/package/cryptoAPI/interface.js | 273 enigmail-2.1.3+ds1/package/cryptoAPI/openpgp-js.js | 183 enigmail-2.1.3+ds1/package/data.jsm | 5 enigmail-2.1.3+ds1/package/decryption.jsm | 552 - enigmail-2.1.3+ds1/package/dialog.jsm | 22 enigmail-2.1.3+ds1/package/dns.jsm | 345 + enigmail-2.1.3+ds1/package/encryption.jsm | 38 enigmail-2.1.3+ds1/package/enigmailOverlays.jsm | 314 enigmail-2.1.3+ds1/package/errorHandling.jsm | 110 enigmail-2.1.3+ds1/package/events.jsm | 10 enigmail-2.1.3+ds1/package/execution.jsm | 165 enigmail-2.1.3+ds1/package/files.jsm | 23 enigmail-2.1.3+ds1/package/filters.jsm | 55 enigmail-2.1.3+ds1/package/filtersWrapper.jsm | 15 enigmail-2.1.3+ds1/package/fixExchangeMsg.jsm | 153 enigmail-2.1.3+ds1/package/funcs.jsm | 149 enigmail-2.1.3+ds1/package/glodaMime.jsm | 39 enigmail-2.1.3+ds1/package/glodaUtils.jsm | 8 enigmail-2.1.3+ds1/package/gnupgUpdate.jsm | 122 enigmail-2.1.3+ds1/package/gpg.jsm | 60 enigmail-2.1.3+ds1/package/gpgAgent.jsm | 44 enigmail-2.1.3+ds1/package/hash.jsm | 20 enigmail-2.1.3+ds1/package/httpProxy.jsm | 10 enigmail-2.1.3+ds1/package/install.rdf | 23 enigmail-2.1.3+ds1/package/installGnuPG.jsm | 219 enigmail-2.1.3+ds1/package/installPep.jsm | 207 enigmail-2.1.3+ds1/package/key.jsm | 204 enigmail-2.1.3+ds1/package/keyEditor.jsm | 38 enigmail-2.1.3+ds1/package/keyObj.jsm | 500 + enigmail-2.1.3+ds1/package/keyRefreshService.jsm | 38 enigmail-2.1.3+ds1/package/keyRing.jsm | 1564 ---- enigmail-2.1.3+ds1/package/keyUsability.jsm | 18 enigmail-2.1.3+ds1/package/keyserver.jsm | 2096 ++++-- enigmail-2.1.3+ds1/package/keyserverUris.jsm | 25 enigmail-2.1.3+ds1/package/lazy.jsm | 7 enigmail-2.1.3+ds1/package/locale.jsm | 36 enigmail-2.1.3+ds1/package/localizeHtml.jsm | 20 enigmail-2.1.3+ds1/package/log.jsm | 25 enigmail-2.1.3+ds1/package/manifest.json | 22 enigmail-2.1.3+ds1/package/mime.jsm | 27 enigmail-2.1.3+ds1/package/mimeDecrypt.jsm | 318 enigmail-2.1.3+ds1/package/mimeEncrypt.jsm | 384 - enigmail-2.1.3+ds1/package/mimeVerify.jsm | 220 enigmail-2.1.3+ds1/package/msgCompFields.jsm | 178 enigmail-2.1.3+ds1/package/msgRead.jsm | 131 enigmail-2.1.3+ds1/package/openpgp.jsm | 42 enigmail-2.1.3+ds1/package/os.jsm | 7 enigmail-2.1.3+ds1/package/overlays.jsm | 791 -- enigmail-2.1.3+ds1/package/pEp-nonfunc.jsm | 176 enigmail-2.1.3+ds1/package/pEp.jsm | 24 enigmail-2.1.3+ds1/package/pEpAdapter.jsm | 402 - enigmail-2.1.3+ds1/package/pEpDecrypt.jsm | 167 enigmail-2.1.3+ds1/package/pEpFilter.jsm | 23 enigmail-2.1.3+ds1/package/pEpKeySync.jsm | 33 enigmail-2.1.3+ds1/package/pEpListener.jsm | 14 enigmail-2.1.3+ds1/package/passwords.jsm | 12 enigmail-2.1.3+ds1/package/persistentCrypto.jsm | 1339 +--- enigmail-2.1.3+ds1/package/pgpmimeHandler.jsm | 60 enigmail-2.1.3+ds1/package/prefs.jsm | 43 enigmail-2.1.3+ds1/package/prefs/defaultPrefs.js | 10 enigmail-2.1.3+ds1/package/protocolHandler.jsm | 78 enigmail-2.1.3+ds1/package/rng.jsm | 22 enigmail-2.1.3+ds1/package/rules.jsm | 99 enigmail-2.1.3+ds1/package/searchCallback.jsm | 70 enigmail-2.1.3+ds1/package/send.jsm | 38 enigmail-2.1.3+ds1/package/singletons.jsm | 2 enigmail-2.1.3+ds1/package/socks5Proxy.jsm | 38 enigmail-2.1.3+ds1/package/sqliteDb.jsm | 193 enigmail-2.1.3+ds1/package/stdlib.jsm | 82 enigmail-2.1.3+ds1/package/streams.jsm | 133 enigmail-2.1.3+ds1/package/system.jsm | 28 enigmail-2.1.3+ds1/package/tests/Makefile | 2 enigmail-2.1.3+ds1/package/tests/armor-test.js | 20 enigmail-2.1.3+ds1/package/tests/autoSetup-test.js | 674 ++ enigmail-2.1.3+ds1/package/tests/autocrypt-test.js | 43 enigmail-2.1.3+ds1/package/tests/core-test.js | 21 enigmail-2.1.3+ds1/package/tests/decryption-test.js | 10 enigmail-2.1.3+ds1/package/tests/dns-test.js | 189 enigmail-2.1.3+ds1/package/tests/encryption-test.js | 25 enigmail-2.1.3+ds1/package/tests/errorHandling-test.js | 7 enigmail-2.1.3+ds1/package/tests/execution-test.js | 9 enigmail-2.1.3+ds1/package/tests/expiry-test.js | 27 enigmail-2.1.3+ds1/package/tests/files-test.js | 21 enigmail-2.1.3+ds1/package/tests/filters-test.js | 18 enigmail-2.1.3+ds1/package/tests/funcs-test.js | 33 enigmail-2.1.3+ds1/package/tests/gnupg-keylist-test.js | 84 enigmail-2.1.3+ds1/package/tests/gpg-test.js | 18 enigmail-2.1.3+ds1/package/tests/gpgAgent-test.js | 14 enigmail-2.1.3+ds1/package/tests/initialize.js | 15 enigmail-2.1.3+ds1/package/tests/installGnuPG-test.js | 5 enigmail-2.1.3+ds1/package/tests/key-test.js | 16 enigmail-2.1.3+ds1/package/tests/keyEditor-test.js | 10 enigmail-2.1.3+ds1/package/tests/keyObj-test.js | 55 enigmail-2.1.3+ds1/package/tests/keyRefreshService-test.js | 41 enigmail-2.1.3+ds1/package/tests/keyRing-test.js | 504 - enigmail-2.1.3+ds1/package/tests/keyserver-test.js | 869 -- enigmail-2.1.3+ds1/package/tests/keyserverUris-test.js | 15 enigmail-2.1.3+ds1/package/tests/log-test.js | 11 enigmail-2.1.3+ds1/package/tests/mailHelper.js | 32 enigmail-2.1.3+ds1/package/tests/main.js | 26 enigmail-2.1.3+ds1/package/tests/mime-test.js | 9 enigmail-2.1.3+ds1/package/tests/mimeDecrypt-test.js | 85 enigmail-2.1.3+ds1/package/tests/openpgpjs-test.js | 77 enigmail-2.1.3+ds1/package/tests/os-test.js | 10 enigmail-2.1.3+ds1/package/tests/pEp-test.js | 4 enigmail-2.1.3+ds1/package/tests/persistentCrypto-test.js | 96 enigmail-2.1.3+ds1/package/tests/prefs-test.js | 5 enigmail-2.1.3+ds1/package/tests/resources/attachment.txt | 1 enigmail-2.1.3+ds1/package/tests/resources/attachment.txt.asc | 16 enigmail-2.1.3+ds1/package/tests/resources/autocrypt-setup-message-2.eml | 185 enigmail-2.1.3+ds1/package/tests/resources/autocrypt-setup-message.eml | 189 enigmail-2.1.3+ds1/package/tests/resources/dev-strike.asc | 54 enigmail-2.1.3+ds1/package/tests/resources/dev-strike.sec | 164 enigmail-2.1.3+ds1/package/tests/resources/email-acc2-pEp-message.eml | 10 enigmail-2.1.3+ds1/package/tests/resources/encrypted-email-with-autocrypt.eml | 120 enigmail-2.1.3+ds1/package/tests/resources/encrypted-email.eml | 2 enigmail-2.1.3+ds1/package/tests/resources/encrypted-pgpmime-email.eml | 44 enigmail-2.1.3+ds1/package/tests/resources/filterable-key.asc | 205 enigmail-2.1.3+ds1/package/tests/resources/hkp-listing.txt | 8 enigmail-2.1.3+ds1/package/tests/resources/keybase-download.txt | 16 enigmail-2.1.3+ds1/package/tests/resources/keybase-search.txt | 110 enigmail-2.1.3+ds1/package/tests/resources/multi-uid.asc | 256 enigmail-2.1.3+ds1/package/tests/resources/multi-uid.sec | 377 + enigmail-2.1.3+ds1/package/tests/resources/pgpMime-msg.eml | 52 enigmail-2.1.3+ds1/package/tests/resources/testing-domain.invalid.pub-sec | 157 enigmail-2.1.3+ds1/package/tests/resources/tiny.pl | 3 enigmail-2.1.3+ds1/package/tests/rules-test.js | 51 enigmail-2.1.3+ds1/package/tests/streams-test.js | 32 enigmail-2.1.3+ds1/package/tests/system-test.js | 9 enigmail-2.1.3+ds1/package/tests/testHelper.js | 214 enigmail-2.1.3+ds1/package/tests/tor-test.js | 25 enigmail-2.1.3+ds1/package/tests/verify-test.js | 41 enigmail-2.1.3+ds1/package/tests/versioning-test.js | 7 enigmail-2.1.3+ds1/package/tests/webKey-test.js | 38 enigmail-2.1.3+ds1/package/time.jsm | 11 enigmail-2.1.3+ds1/package/timer.jsm | 15 enigmail-2.1.3+ds1/package/tor.jsm | 24 enigmail-2.1.3+ds1/package/trust.jsm | 4 enigmail-2.1.3+ds1/package/uris.jsm | 8 enigmail-2.1.3+ds1/package/verify.jsm | 50 enigmail-2.1.3+ds1/package/versioning.jsm | 12 enigmail-2.1.3+ds1/package/webKey.jsm | 206 enigmail-2.1.3+ds1/package/windows.jsm | 162 enigmail-2.1.3+ds1/package/wkdLookup.jsm | 384 - enigmail-2.1.3+ds1/package/wksMimeHandler.jsm | 46 enigmail-2.1.3+ds1/package/xhrUtils.jsm | 135 enigmail-2.1.3+ds1/static_analysis/eslint | 4 enigmail-2.1.3+ds1/stdlib/LICENSE-openpgp.js.txt | 176 enigmail-2.1.3+ds1/stdlib/Makefile | 22 enigmail-2.1.3+ds1/stdlib/compose.jsm | 140 enigmail-2.1.3+ds1/stdlib/misc.jsm | 22 enigmail-2.1.3+ds1/stdlib/msgHdrUtils.jsm | 84 enigmail-2.1.3+ds1/stdlib/qrcode.jsm | 904 ++ enigmail-2.1.3+ds1/stdlib/web-streams.jsm | 1797 +++++ enigmail-2.1.3+ds1/ui/content/Makefile | 53 enigmail-2.1.3+ds1/ui/content/aboutEnigmail.html | 35 enigmail-2.1.3+ds1/ui/content/aboutEnigmail.js | 33 enigmail-2.1.3+ds1/ui/content/accountManagerOverlay.js | 8 enigmail-2.1.3+ds1/ui/content/accountManagerOverlay.xul | 2 enigmail-2.1.3+ds1/ui/content/am-enigprefs.js | 31 enigmail-2.1.3+ds1/ui/content/am-enigprefs.xul | 6 enigmail-2.1.3+ds1/ui/content/autocryptInitiateBackup.js | 45 enigmail-2.1.3+ds1/ui/content/autocryptInitiateBackup.xul | 12 enigmail-2.1.3+ds1/ui/content/autocryptSetupPasswd.js | 38 enigmail-2.1.3+ds1/ui/content/autocryptSetupPasswd.xul | 5 enigmail-2.1.3+ds1/ui/content/columnOverlay.js | 12 enigmail-2.1.3+ds1/ui/content/columnOverlay.xul | 3 enigmail-2.1.3+ds1/ui/content/commonWorkflows.js | 67 enigmail-2.1.3+ds1/ui/content/editSingleAccount.xul | 5 enigmail-2.1.3+ds1/ui/content/enigRetrieveProgress.js | 311 enigmail-2.1.3+ds1/ui/content/enigRetrieveProgress.xul | 9 enigmail-2.1.3+ds1/ui/content/enigmailAbCardViewOverlay.xul | 2 enigmail-2.1.3+ds1/ui/content/enigmailAbContactsPanel.xul | 6 enigmail-2.1.3+ds1/ui/content/enigmailAbOverlay.js | 6 enigmail-2.1.3+ds1/ui/content/enigmailAddUidDlg.js | 32 enigmail-2.1.3+ds1/ui/content/enigmailAddUidDlg.xul | 9 enigmail-2.1.3+ds1/ui/content/enigmailAdvancedIdentityDlg.js | 69 enigmail-2.1.3+ds1/ui/content/enigmailAdvancedIdentityDlg.xul | 50 enigmail-2.1.3+ds1/ui/content/enigmailAttachmentsDialog.js | 38 enigmail-2.1.3+ds1/ui/content/enigmailAttachmentsDialog.xul | 13 enigmail-2.1.3+ds1/ui/content/enigmailCardDetails.js | 53 enigmail-2.1.3+ds1/ui/content/enigmailCardDetails.xul | 4 enigmail-2.1.3+ds1/ui/content/enigmailCommon.js | 105 enigmail-2.1.3+ds1/ui/content/enigmailConsole.js | 22 enigmail-2.1.3+ds1/ui/content/enigmailConsole.xul | 6 enigmail-2.1.3+ds1/ui/content/enigmailCustToolOverlay.js | 21 enigmail-2.1.3+ds1/ui/content/enigmailCustToolOverlay.xul | 5 enigmail-2.1.3+ds1/ui/content/enigmailDispPhoto.js | 20 enigmail-2.1.3+ds1/ui/content/enigmailDispPhoto.xul | 10 enigmail-2.1.3+ds1/ui/content/enigmailEditIdentity.js | 140 enigmail-2.1.3+ds1/ui/content/enigmailEditIdentity.xul | 22 enigmail-2.1.3+ds1/ui/content/enigmailEditKeyExpiryDlg.js | 42 enigmail-2.1.3+ds1/ui/content/enigmailEditKeyExpiryDlg.xul | 12 enigmail-2.1.3+ds1/ui/content/enigmailEditKeyTrustDlg.js | 34 enigmail-2.1.3+ds1/ui/content/enigmailEditKeyTrustDlg.xul | 17 enigmail-2.1.3+ds1/ui/content/enigmailEncryptionDlg.js | 21 enigmail-2.1.3+ds1/ui/content/enigmailEncryptionDlg.xul | 53 enigmail-2.1.3+ds1/ui/content/enigmailFilterEditorOverlay.js | 184 enigmail-2.1.3+ds1/ui/content/enigmailFilterEditorOverlay.xul | 7 enigmail-2.1.3+ds1/ui/content/enigmailFilterListOverlay.js | 11 enigmail-2.1.3+ds1/ui/content/enigmailFilterListOverlay.xul | 2 enigmail-2.1.3+ds1/ui/content/enigmailGenCardKey.js | 39 enigmail-2.1.3+ds1/ui/content/enigmailGenCardKey.xul | 31 enigmail-2.1.3+ds1/ui/content/enigmailGenericDisplay.htm | 2 enigmail-2.1.3+ds1/ui/content/enigmailGenericDisplay.js | 9 enigmail-2.1.3+ds1/ui/content/enigmailGenericDisplay.xul | 8 enigmail-2.1.3+ds1/ui/content/enigmailHelp.js | 12 enigmail-2.1.3+ds1/ui/content/enigmailHelp.xul | 6 enigmail-2.1.3+ds1/ui/content/enigmailImportPhoto.js | 13 enigmail-2.1.3+ds1/ui/content/enigmailImportPhoto.xul | 12 enigmail-2.1.3+ds1/ui/content/enigmailKeyImportInfo.js | 97 enigmail-2.1.3+ds1/ui/content/enigmailKeyImportInfo.xul | 7 enigmail-2.1.3+ds1/ui/content/enigmailKeyManager.js | 445 - enigmail-2.1.3+ds1/ui/content/enigmailKeyManager.xul | 28 enigmail-2.1.3+ds1/ui/content/enigmailKeySelection.js | 218 enigmail-2.1.3+ds1/ui/content/enigmailKeySelection.xul | 51 enigmail-2.1.3+ds1/ui/content/enigmailKeygen.js | 155 enigmail-2.1.3+ds1/ui/content/enigmailKeygen.xul | 32 enigmail-2.1.3+ds1/ui/content/enigmailKeyserverDlg.js | 78 enigmail-2.1.3+ds1/ui/content/enigmailKeyserverDlg.xul | 14 enigmail-2.1.3+ds1/ui/content/enigmailManageUidDlg.js | 57 enigmail-2.1.3+ds1/ui/content/enigmailManageUidDlg.xul | 6 enigmail-2.1.3+ds1/ui/content/enigmailMessengerOverlay.js | 845 +- enigmail-2.1.3+ds1/ui/content/enigmailMessengerOverlay.xul | 312 enigmail-2.1.3+ds1/ui/content/enigmailMsgBox.js | 28 enigmail-2.1.3+ds1/ui/content/enigmailMsgBox.xul | 5 enigmail-2.1.3+ds1/ui/content/enigmailMsgComposeHelper.js | 32 enigmail-2.1.3+ds1/ui/content/enigmailMsgComposeOverlay-pbx.xul | 301 enigmail-2.1.3+ds1/ui/content/enigmailMsgComposeOverlay-sm.xul | 15 enigmail-2.1.3+ds1/ui/content/enigmailMsgComposeOverlay.js | 1742 +++-- enigmail-2.1.3+ds1/ui/content/enigmailMsgComposeOverlay.xul | 54 enigmail-2.1.3+ds1/ui/content/enigmailMsgHdrViewOverlay.js | 759 +- enigmail-2.1.3+ds1/ui/content/enigmailMsgHdrViewOverlay.xul | 2 enigmail-2.1.3+ds1/ui/content/enigmailMsgPrintOverlay.js | 26 enigmail-2.1.3+ds1/ui/content/enigmailMsgPrintOverlay.xul | 18 enigmail-2.1.3+ds1/ui/content/enigmailPrefsOverlay.xul | 2 enigmail-2.1.3+ds1/ui/content/enigmailPrivacyOverlay.js | 12 enigmail-2.1.3+ds1/ui/content/enigmailPrivacyOverlay.xul | 12 enigmail-2.1.3+ds1/ui/content/enigmailRulesEditor.js | 52 enigmail-2.1.3+ds1/ui/content/enigmailRulesEditor.xul | 18 enigmail-2.1.3+ds1/ui/content/enigmailSearchKey.js | 871 -- enigmail-2.1.3+ds1/ui/content/enigmailSearchKey.xul | 20 enigmail-2.1.3+ds1/ui/content/enigmailSelectRule.js | 17 enigmail-2.1.3+ds1/ui/content/enigmailSelectRule.xul | 13 enigmail-2.1.3+ds1/ui/content/enigmailSetCardPin.js | 39 enigmail-2.1.3+ds1/ui/content/enigmailSetCardPin.xul | 7 enigmail-2.1.3+ds1/ui/content/enigmailSetupWizard.js | 1528 ---- enigmail-2.1.3+ds1/ui/content/enigmailSetupWizard.xul | 548 - enigmail-2.1.3+ds1/ui/content/enigmailSignKeyDlg.js | 60 enigmail-2.1.3+ds1/ui/content/enigmailSignKeyDlg.xul | 48 enigmail-2.1.3+ds1/ui/content/enigmailSingleRcptSettings.js | 67 enigmail-2.1.3+ds1/ui/content/enigmailSingleRcptSettings.xul | 215 enigmail-2.1.3+ds1/ui/content/enigmailViewFile.js | 46 enigmail-2.1.3+ds1/ui/content/enigmailViewFile.xul | 32 enigmail-2.1.3+ds1/ui/content/enigmailWrapSelection.js | 23 enigmail-2.1.3+ds1/ui/content/enigmailWrapSelection.xul | 13 enigmail-2.1.3+ds1/ui/content/exportSettingsWizard.js | 100 enigmail-2.1.3+ds1/ui/content/exportSettingsWizard.xul | 12 enigmail-2.1.3+ds1/ui/content/importSettings.js | 237 enigmail-2.1.3+ds1/ui/content/importSettings.xul | 60 enigmail-2.1.3+ds1/ui/content/keyDetailsDlg.js | 49 enigmail-2.1.3+ds1/ui/content/keyDetailsDlg.xul | 16 enigmail-2.1.3+ds1/ui/content/messengerOverlay-pbx.xul | 37 enigmail-2.1.3+ds1/ui/content/pepHandshake.js | 32 enigmail-2.1.3+ds1/ui/content/pepHandshake.xul | 4 enigmail-2.1.3+ds1/ui/content/pepPrepHandshake.js | 27 enigmail-2.1.3+ds1/ui/content/pepPrepHandshake.xul | 5 enigmail-2.1.3+ds1/ui/content/pepTrustWords.js | 48 enigmail-2.1.3+ds1/ui/content/pepTrustWords.xul | 10 enigmail-2.1.3+ds1/ui/content/pref-enigmail.js | 121 enigmail-2.1.3+ds1/ui/content/pref-enigmail.xul | 276 enigmail-2.1.3+ds1/ui/content/pref-pep.js | 42 enigmail-2.1.3+ds1/ui/content/pref-pep.xul | 77 enigmail-2.1.3+ds1/ui/content/setupWizard2.js | 472 + enigmail-2.1.3+ds1/ui/content/setupWizard2.xul | 145 enigmail-2.1.3+ds1/ui/content/tb60FilterEditorOverlay.js | 113 enigmail-2.1.3+ds1/ui/content/tb60FilterEditorOverlay.xul | 29 enigmail-2.1.3+ds1/ui/content/updateGnuPG.html | 85 enigmail-2.1.3+ds1/ui/content/updateGnuPG.js | 177 enigmail-2.1.3+ds1/ui/content/upgradeInfo.html | 2 enigmail-2.1.3+ds1/ui/locale/en-US/enigmail.dtd | 195 enigmail-2.1.3+ds1/ui/locale/en-US/enigmail.properties | 129 enigmail-2.1.3+ds1/ui/skin/Makefile | 25 enigmail-2.1.3+ds1/ui/skin/common/enigmail-common.css | 124 enigmail-2.1.3+ds1/ui/skin/common/enigmail-html.css | 10 enigmail-2.1.3+ds1/ui/skin/images/ok-sign.svg | 147 enigmail-2.1.3+ds1/ui/skin/images/pEpEncryptActive.svg | 66 enigmail-2.1.3+ds1/ui/skin/images/pEpEncryptInactive.svg | 62 enigmail-2.1.3+ds1/ui/skin/postbox/mac/enigmail.css | 25 enigmail-2.1.3+ds1/ui/skin/postbox/win/enigmail.css | 26 enigmail-2.1.3+ds1/ui/skin/tb-aero/enigmail.css | 1 enigmail-2.1.3+ds1/ui/skin/tb-linux/enigmail.css | 1 enigmail-2.1.3+ds1/ui/skin/tb-mac/enigmail.css | 1 enigmail-2.1.3+ds1/ui/tests/Makefile | 4 enigmail-2.1.3+ds1/ui/tests/enigmailMsgComposeOverlay-test-a_e.js | 663 ++ enigmail-2.1.3+ds1/ui/tests/enigmailMsgComposeOverlay-test-enc.js | 180 enigmail-2.1.3+ds1/ui/tests/enigmailMsgComposeOverlay-test-f_h.js | 1168 +++ enigmail-2.1.3+ds1/ui/tests/enigmailMsgComposeOverlay-test-i_r.js | 1068 +++ enigmail-2.1.3+ds1/ui/tests/enigmailMsgComposeOverlay-test-s_t.js | 885 ++ enigmail-2.1.3+ds1/ui/tests/enigmailMsgComposeOverlay-test-u_z.js | 91 enigmail-2.1.3+ds1/ui/tests/enigmailMsgComposeOverlay-test.js | 31 enigmail-2.1.3+ds1/ui/tests/main.js | 18 enigmail-2.1.3+ds1/ui/tests/testHelper.js | 13 enigmail-2.1.3+ds1/util/build.mk | 49 enigmail-2.1.3+ds1/util/checkFiles.py | 2 enigmail-2.1.3+ds1/util/gen-filterable-key | 55 enigmail-2.1.3+ds1/util/genxpi | 248 enigmail-2.1.3+ds1/util/header.py | 542 - enigmail-2.1.3+ds1/util/ply/__init__.py | 4 enigmail-2.1.3+ds1/util/ply/lex.py | 1058 --- enigmail-2.1.3+ds1/util/ply/yacc.py | 3276 ---------- enigmail-2.1.3+ds1/util/prepPackage | 25 enigmail-2.1.3+ds1/util/prepPostbox | 59 enigmail-2.1.3+ds1/util/run-jsunit | 11 enigmail-2.1.3+ds1/util/typelib.py | 302 enigmail-2.1.3+ds1/util/xpidl.py | 1421 ---- enigmail-2.1.3+ds1/util/xpidllex.py | 9 enigmail-2.1.3+ds1/util/xpidlyacc.py | 85 enigmail-2.1.3+ds1/util/xpt.py | 1382 ---- enigmail-2.1.3+ds1/util/xptgen | 64 489 files changed, 39866 insertions(+), 34142 deletions(-) diff -Nru enigmail-2.0.12+ds1/.eslintrc.js enigmail-2.1.3+ds1/.eslintrc.js --- enigmail-2.0.12+ds1/.eslintrc.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/.eslintrc.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,6 +1,6 @@ module.exports = { "parserOptions": { - "ecmaVersion": 2017 + "ecmaVersion": 2017 }, "rules": { "linebreak-style": [ @@ -15,6 +15,7 @@ "no-unused-vars": 0, "no-empty": 0, "comma-dangle": 2, + "require-atomic-updates": 0, "consistent-return": 2, "block-scoped-var": 2, "dot-notation": 2, @@ -34,6 +35,7 @@ "no-implied-eval": 2, "no-invalid-this": 2, "no-iterator": 2, + "no-irregular-whitespace": 0, "no-labels": 2, "no-lone-blocks": 2, "no-loop-func": 2, @@ -45,7 +47,7 @@ "no-octal-escape": 2, "no-process-env": 2, "no-proto": 2, - "no-redeclare": [0, { + "no-redeclare": [2, { "builtinGlobals": true }], "no-return-assign": 2, @@ -55,7 +57,7 @@ "no-unused-expressions": 2, "no-useless-call": 2, "no-useless-concat": 2, - "no-useless-escape": 1, + "no-useless-escape": 0, "no-void": 2, "no-with": 2, "radix": 2, @@ -70,11 +72,12 @@ "node": true, }, "extends": "eslint:recommended", - "globals": { - "ChromeUtils": true, - "Components": true, - "Cc": true, - "Cu": true, - "Ci": true - } -}; + "globals": { + "ChromeUtils": true, + "Components": true, + "Cc": true, + "Cu": true, + "Cr": true, + "Ci": true + } +}; \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/.gitignore enigmail-2.1.3+ds1/.gitignore --- enigmail-2.0.12+ds1/.gitignore 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/.gitignore 2019-10-29 17:09:36.000000000 +0000 @@ -7,15 +7,16 @@ /config/autoconf.mk /build /ui/content/enigmailBuildDate.js -/ipc/src/subprocess.o /public/_xpidlgen -ipc/src/libsubprocess-*.dylib -ipc/src/libsubprocess-*.so /test_output.log /ipc/tests/ipc-data.txt /package/tests/jsunit.result +/package/tests/file-test.txt +/package/tests/test-message.txt +/stdlib/openpgp-lib.jsm unused.txt /package/tests/enigdbug.txt +.eslintcache # vi tmp files: *.swp @@ -31,6 +32,14 @@ # vagrant files: provisioning/.vagrant +# Visual Studio Code: +/.vscode +.*.code-workspace + +# Sublime: +*.sublime-* + # other local configuration files: .ackrc .envrc + diff -Nru enigmail-2.0.12+ds1/.gitlab-ci.yml enigmail-2.1.3+ds1/.gitlab-ci.yml --- enigmail-2.0.12+ds1/.gitlab-ci.yml 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/.gitlab-ci.yml 2019-10-29 17:09:36.000000000 +0000 @@ -25,16 +25,18 @@ - apt update -y -qq - apt install thunderbird gnupg zip unzip curl xvfb libgtk-3-0 -y -qq - mkdir -p $TBPROFILE/extensions tmp jsunit - - printf '%s/build/dist/' "$(pwd)" > "$TBPROFILE/extensions/{847b3a00-7ab1-11d4-8f02-006008948af5}" + - printf '%s/build-tb/dist/' "$(pwd)" > "$TBPROFILE/extensions/{847b3a00-7ab1-11d4-8f02-006008948af5}" - printf 'user_pref("extensions.autoDisableScopes", 14);\n' > "$TBPROFILE/prefs.js" - printf 'user_pref("browser.dom.window.dump.enabled", true);\n' >> "$TBPROFILE/prefs.js" - printf 'user_pref("extensions.update.enabled", false);\n' >> "$TBPROFILE/prefs.js" - printf 'user_pref("extensions.update.autoUpdateDefault", false);\n' >> "$TBPROFILE/prefs.js" - printf 'user_pref("extensions.blocklist.enabled", false);\n' >> "$TBPROFILE/prefs.js" - printf 'user_pref("app.update.enabled", false);\n' >> "$TBPROFILE/prefs.js" + - printf 'user_pref("app.update.auto", false);\n' >> "$TBPROFILE/prefs.js" - printf 'user_pref("extensions.enigmail.logDirectory", "%s");\n' $(pwd)/tmp >> "$TBPROFILE/prefs.js" - - curl -s -o "$TBPROFILE/extensions/jsunit@enigmail.net.xpi" https://www.enigmail.net/jsunit/jsunit-0.1.6.xpi - - export TBDOWNLOAD=https://archive.mozilla.org/pub/thunderbird/releases/60.0/linux-x86_64/en-US/thunderbird-60.0.tar.bz2 + - curl -s -o "$TBPROFILE/extensions/jsunit@enigmail.net.xpi" https://www.enigmail.net/jsunit/jsunit-0.2.2.xpi + #- export TBDOWNLOAD=$(curl -s 'https://download.mozilla.org/?product=thunderbird-beta-latest&os=linux64&lang=en-US' | sed -E 's/(.*href=")([^"]+)(".*)/\2/') + - export TBDOWNLOAD=https://archive.mozilla.org/pub/thunderbird/releases/68.0/linux-x86_64/en-US/thunderbird-68.0.tar.bz2 - curl -s -o thunderbird.tar.bz2 $TBDOWNLOAD - tar -xjvf thunderbird.tar.bz2 - thunderbird/thunderbird --version diff -Nru enigmail-2.0.12+ds1/.jsbeautifyrc enigmail-2.1.3+ds1/.jsbeautifyrc --- enigmail-2.0.12+ds1/.jsbeautifyrc 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/.jsbeautifyrc 2019-10-29 17:09:36.000000000 +0000 @@ -1,22 +1,41 @@ { + "comment": "Configurations for [js, jsx, json] and Shared configurations", + + "brace_style": "end-expand", + "break_chained_methods": false, + "comma_first": false, + "e4x": true, + "end_with_newline": true, + "eol": "\n", + "eval_code": false, + "keep_array_indentation": false, + "keep_function_indentation": false, "indent_size": 2, "indent_char": " ", - "eol": "\n", "indent_level": 0, "indent_with_tabs": false, - "preserve_newlines": true, - "max_preserve_newlines": 10, "jslint_happy": false, + "max_preserve_newlines": 10, + "preserve_newlines": true, "space_after_anon_function": false, - "brace_style": "end-expand", - "keep_array_indentation": false, - "keep_function_indentation": false, "space_before_conditional": true, - "break_chained_methods": false, - "eval_code": false, - "unescape_strings": false, - "wrap_line_length": 0, + "space_in_paren": false, "wrap_attributes": "auto", "wrap_attributes_indent_size": 4, - "end_with_newline": true + "wrap_line_length": 0, + "unescape_strings": false, + + + "comment": "Configurations for [css] and its pre-processors [sass, scss, less]", + + "newline_between_rules": true, + "selector_separator_newline": false, + + + "comment": "Configurations for [html, xml]", + + "extra_liners": ["head", "body", "/html"], + "indent_inner_html": true, + "indent_scripts": "normal", + "unformatted": ["inline"] } diff -Nru enigmail-2.0.12+ds1/Makefile enigmail-2.1.3+ds1/Makefile --- enigmail-2.0.12+ds1/Makefile 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/Makefile 2019-10-29 17:09:36.000000000 +0000 @@ -10,7 +10,7 @@ DIRS = ipc ui package lang stdlib -ALL = dirs xpi +ALL = xpi ifeq ($(TESTS),yes) ALL += test @@ -28,25 +28,25 @@ $(MAKE) -C $@ xpi: $(DIRS) - $(srcdir)/util/genxpi $(XPIFILE) $(XPI_MODULE_VERS) $(DIST) $(srcdir) $(XPI_MODULE) $(ENABLE_LANG) + $(srcdir)/util/genxpi $(XPIFILE) $(TARGET_TOOL) $(DIST) $(srcdir) $(XPI_MODULE) $(ENABLE_LANG) check: util/checkFiles.py eslint: - static_analysis/eslint ipc static_analysis/eslint package + static_analysis/eslint ipc static_analysis/eslint ui unit: - make -C ipc/tests make -C package/tests make -C ui/tests + make -C ipc/tests test: eslint check unit clean: - rm -f build/$(XPIFILE) + rm -f build/$(XPIFILE) .eslintcache for dir in $(DIRS); do \ if [ "$${dir}x" != "checkx" ]; then \ $(MAKE) -C $$dir clean; fi; \ diff -Nru enigmail-2.0.12+ds1/config/autoconf.mk.in enigmail-2.1.3+ds1/config/autoconf.mk.in --- enigmail-2.0.12+ds1/config/autoconf.mk.in 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/config/autoconf.mk.in 2019-10-29 17:09:36.000000000 +0000 @@ -11,10 +11,20 @@ TESTS = @enable_tests@ FIX_LANGUAGES = @enable_fix_lang@ ENABLE_LANG = @enable_lang@ +ENABLE_POSTBOX = @enable_postbox@ srcdir = @srcdir@ -DIST = $(DEPTH)/build/dist -BUILD = $(DEPTH)/build +JSUNIT = $(DEPTH)/util/run-jsunit $(PERL) $(TB_PATH) $(TB_ARGS) -JSUNIT = $(DEPTH)/util/run-jsunit $(PERL) $(TB_PATH) $(TB_ARGS) -jsunit +ifeq ($(ENABLE_POSTBOX),yes) +TARGET_TOOL=pbx +INCLUDE = $(DEPTH)/include/postbox.h +BUILD = $(DEPTH)/build-pbx +else +TARGET_TOOL=tbird +INCLUDE = $(DEPTH)/include/tbird.h +BUILD = $(DEPTH)/build-tb +endif + +DIST = $(BUILD)/dist diff -Nru enigmail-2.0.12+ds1/configure enigmail-2.1.3+ds1/configure --- enigmail-2.0.12+ds1/configure 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/configure 2019-10-29 17:09:36.000000000 +0000 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for enigmail 2.0.12. +# Generated by GNU Autoconf 2.69 for enigmail 2.1.3. # # Report bugs to . # @@ -579,8 +579,8 @@ # Identity of this package. PACKAGE_NAME='enigmail' PACKAGE_TARNAME='enigmail' -PACKAGE_VERSION='2.0.12' -PACKAGE_STRING='enigmail 2.0.12' +PACKAGE_VERSION='2.1.3' +PACKAGE_STRING='enigmail 2.1.3' PACKAGE_BUGREPORT='https://www.enigmail.net' PACKAGE_URL='' @@ -589,6 +589,7 @@ enable_fix_lang TB_ARGS TB_PATH +enable_postbox enable_lang enable_tests target_os @@ -624,6 +625,7 @@ docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -648,6 +650,7 @@ enable_option_checking enable_tests enable_lang +enable_postbox with_tb_path with_tb_args enable_fix_lang @@ -693,6 +696,7 @@ sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -945,6 +949,15 @@ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1082,7 +1095,7 @@ for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1195,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.0.12 to adapt to many kinds of systems. +\`configure' configures enigmail 2.1.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1235,6 +1248,7 @@ --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -1261,7 +1275,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of enigmail 2.0.12:";; + short | recursive ) echo "Configuration of enigmail 2.1.3:";; esac cat <<\_ACEOF @@ -1271,6 +1285,7 @@ --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-tests run unit tests during build process --disable-lang disable creation of locales other than en-US + --enable-postbox build for Postbox instead of Thunderbird --disable-fix-lang disable replacing of missing strings in localizations with en-US @@ -1343,7 +1358,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -enigmail configure 2.0.12 +enigmail configure 2.1.3 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1360,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.0.12, which was +It was created by enigmail $as_me 2.1.3, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2003,6 +2018,11 @@ fi +# Check whether --enable-postbox was given. +if test "${enable_postbox+set}" = set; then : + enableval=$enable_postbox; enable_postbox=$enableval +fi + @@ -2595,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.0, which was +This file was extended by enigmail $as_me 2.1.3, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -2648,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.0 +enigmail config.status 2.1.3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff -Nru enigmail-2.0.12+ds1/configure.ac enigmail-2.1.3+ds1/configure.ac --- enigmail-2.0.12+ds1/configure.ac 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/configure.ac 2019-10-29 17:09:36.000000000 +0000 @@ -2,7 +2,7 @@ AC_PREREQ(2.61) min_automake_version="1.10" -AC_INIT([enigmail],[2.0.12], [https://www.enigmail.net]) +AC_INIT([enigmail],[2.1.3], [https://www.enigmail.net]) AC_PATH_PROG(PYTHON, "python2") @@ -38,10 +38,13 @@ enable_lang=yes ) +AC_ARG_ENABLE(postbox, + AC_HELP_STRING([--enable-postbox],[build for Postbox instead of Thunderbird]), + enable_postbox=$enableval) AC_SUBST(enable_tests) AC_SUBST(enable_lang) - +AC_SUBST(enable_postbox) AC_ARG_WITH(tb-path, [ --with-tb-path=/path/to/thunderbird set the path to an installed Thunderbird], diff -Nru enigmail-2.0.12+ds1/debian/changelog enigmail-2.1.3+ds1/debian/changelog --- enigmail-2.0.12+ds1/debian/changelog 2019-08-21 16:57:35.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/changelog 2019-11-20 13:20:24.000000000 +0000 @@ -1,3 +1,84 @@ +enigmail (2:2.1.3+ds1-4~deb10u2) buster-security; urgency=medium + + * Upload to buster-security after discussing with the security team + (closes: #945014) + + -- Daniel Kahn Gillmor Wed, 20 Nov 2019 21:20:24 +0800 + +enigmail (2:2.1.3+ds1-4~deb10u1) buster; urgency=medium + + * Upload to debian stable to keep it installable now that Thunderbird 68 + is in stable (Closes: #945014) + + -- Daniel Kahn Gillmor Tue, 19 Nov 2019 15:43:20 +0800 + +enigmail (2:2.1.3+ds1-4) unstable; urgency=medium + + * convert to python3 + * convert unit tests to python3 as well + * wrap-and-sort -ast + + -- Daniel Kahn Gillmor Sat, 09 Nov 2019 15:31:55 -0500 + +enigmail (2:2.1.3+ds1-3) unstable; urgency=medium + + * d/tests: permit stderr on tbird-sqlite + + -- Daniel Kahn Gillmor Fri, 08 Nov 2019 18:53:42 -0500 + +enigmail (2:2.1.3+ds1-2) unstable; urgency=medium + + * Address autopkgtest failures (Closes: #944216) + + -- Daniel Kahn Gillmor Thu, 07 Nov 2019 20:44:22 -0500 + +enigmail (2:2.1.3+ds1-1) unstable; urgency=medium + + * new upstream version (closes: #933832) + * prepare to exclude more pieces of OpenPGP.js from upstream + * upstream renamed the openpgp.worker javascript file + * standards-version: bump to 4.4.1 (no changes needed) + * drop mozilla-devscripts due to lack of install.rdf + * strip out config.guess and config.sub when importing orig tarballs + * refresh patches + * strip even more OpenPGP.js when building + * build in build-tb/ instead of build/ + * d/copyright: drop unnecessary stanzas + * enigmail 2.1.3 needs thunderbird 68 + * d/run-tests: adapt to enigmail 2.1 test practices + * use thunderbird --headless and rely on main.js to identify jsunit test + * Avoid testing dependency on X11 for sqlite + * ensure that we see some output when testing. + * JSUnit is provided globally if jsunit 0.2.2 is installed + * make unit test run without xvfb + * always use system config.{guess,sub} + * whittle down errors in the test suite + + -- Daniel Kahn Gillmor Tue, 05 Nov 2019 23:33:42 -0500 + +enigmail (2:2.0.12+ds1-1) unstable; urgency=medium + + * new upstream release + * refresh patches, dropping those already upstream + * Standards-Version: bump to 4.4.0 (no changes needed) + * move to debhelper 12 + + -- Daniel Kahn Gillmor Fri, 12 Jul 2019 07:53:20 -0400 + +enigmail (2:2.0.11+ds1-2) unstable; urgency=medium + + * minimize legacy-display protected headers for encrypted mails + + -- Daniel Kahn Gillmor Thu, 30 May 2019 15:40:57 -0400 + +enigmail (2:2.0.11+ds1-1) unstable; urgency=medium + + * new upstream release + * refresh patches + * use the older import-show with --dry-run instead of show-only + + -- Daniel Kahn Gillmor Thu, 23 May 2019 17:06:35 -0400 + enigmail (2:2.0.12+ds1-1~deb10u1) buster; urgency=medium * upload upstream version to Debian stable diff -Nru enigmail-2.0.12+ds1/debian/clean enigmail-2.1.3+ds1/debian/clean --- enigmail-2.0.12+ds1/debian/clean 2019-08-21 16:35:40.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/clean 2019-11-19 07:25:37.000000000 +0000 @@ -1,13 +1,12 @@ -build/dist/wrappers/gpg-agent-wrapper.sh -build/dist/install.rdf -build/dist/chrome.manifest -build/dist/components/enigmail.xpt +build-tb/ ui/content/enigmailBuildDate.js util/*.pyc util/*/*.pyc config.log config.status config/autoconf.mk +config.guess +config.sub unused.txt test package/buildDate.jsm diff -Nru enigmail-2.0.12+ds1/debian/compat enigmail-2.1.3+ds1/debian/compat --- enigmail-2.0.12+ds1/debian/compat 2019-08-21 16:35:40.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/compat 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -11 diff -Nru enigmail-2.0.12+ds1/debian/control enigmail-2.1.3+ds1/debian/control --- enigmail-2.0.12+ds1/debian/control 2019-08-21 16:35:40.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/control 2019-11-19 07:25:37.000000000 +0000 @@ -7,12 +7,12 @@ Willi Mann , Daniel Kahn Gillmor , Build-Depends: - debhelper (>= 11~), - mozilla-devscripts, + debhelper-compat (= 12), perl, - python, + python3, + unzip, zip, -Standards-Version: 4.3.0 +Standards-Version: 4.4.1 Homepage: https://www.enigmail.net/ Vcs-Git: https://salsa.debian.org/debian/enigmail.git -b debian/buster Vcs-Browser: https://salsa.debian.org/debian/enigmail @@ -23,18 +23,21 @@ Depends: gnupg (>= 2.2.8-2~), gnupg-agent, + thunderbird (>= 1:68.0) | icedove (>= 1:68.0), ${misc:Depends}, ${shlibs:Depends}, - ${xpi:Depends}, Recommends: pinentry-x11, - ${xpi:Recommends}, Provides: - ${xpi:Provides}, + icedove-enigmail, + thunderbird-enigmail, + xul-ext-enigmail, Enhances: - ${xpi:Enhances}, + icedove, + thunderbird, Breaks: - ${xpi:Breaks}, + icedove (<< 1:68.0), + thunderbird (<< 1:68.0), Description: GPG support for Thunderbird and Debian Icedove OpenPGP extension for Thunderbird. Enigmail allows users to access the features provided by the popular GnuPG software from within Thunderbird. diff -Nru enigmail-2.0.12+ds1/debian/copyright enigmail-2.1.3+ds1/debian/copyright --- enigmail-2.0.12+ds1/debian/copyright 2019-08-21 16:35:40.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/copyright 2019-11-19 07:25:37.000000000 +0000 @@ -2,7 +2,7 @@ Upstream-Name: enigmail Source: https://www.enigmail.net/ Upstream-Contact: Patrick Brunschwig -Files-Excluded: stdlib/openpgp-lib.js stdlib/openpgp.worker.min.js +Files-Excluded: stdlib/openpgp-lib*.js stdlib/openpgp.worker.js stdlib/LICENSE-openpgp.js.txt package/tests/pinentry-auto.exe package/tests/gpg-wks-client.exe Comment: OpenPGP.js was removed from the usptream tarball because it should be handled separately in debian. See https://bugs.debian.org/787774 @@ -19,14 +19,6 @@ Copyright: Mozilla Foundation License: MPL-2.0 -Files: util/xpt.py -Copyright: 2010,2011 Mozilla Foundation -License: BSD-2-clause - -Files: util/ply/* -Copyright: 2001-2012 David M. Beazley (Dabeaz LLC) -License: BSD-3-clause - Files: public/thunderbird-enigmail.metainfo.xml Copyright: 2016 Patrick Brunschwig License: CC0-1.0 @@ -410,65 +402,6 @@ This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0. -License: BSD-2-clause - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - . - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - . - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - . - THIS SOFTWARE IS PROVIDED BY THE MOZILLA FOUNDATION ``AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MOZILLA FOUNDATION OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - . - The views and conclusions contained in the software and documentation - are those of the authors and should not be interpreted as representing - official policies, either expressed or implied, of the Mozilla - Foundation. - -License: BSD-3-clause - All rights reserved. - . - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - . - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - . - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - . - * Neither the name of the David Beazley or Dabeaz LLC may be used to endorse - or promote products derived from this software without specific prior - written permission. - . - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - License: CC0-1.0 To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain diff -Nru enigmail-2.0.12+ds1/debian/enigmail.links enigmail-2.1.3+ds1/debian/enigmail.links --- enigmail-2.0.12+ds1/debian/enigmail.links 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/enigmail.links 2019-11-19 07:25:37.000000000 +0000 @@ -0,0 +1 @@ +/usr/share/xul-ext/enigmail /usr/share/mozilla/extensions/{3550f703-e582-4d05-9a08-453d09bdfdc6}/{847b3a00-7ab1-11d4-8f02-006008948af5} diff -Nru enigmail-2.0.12+ds1/debian/gbp.conf enigmail-2.1.3+ds1/debian/gbp.conf --- enigmail-2.0.12+ds1/debian/gbp.conf 2019-08-21 16:35:40.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/gbp.conf 2019-11-19 07:25:37.000000000 +0000 @@ -6,5 +6,7 @@ [import-orig] filter = [ 'configure', + 'config.guess', + 'config.sub', ] filter-pristine-tar = False diff -Nru enigmail-2.0.12+ds1/debian/patches/0001-avoid-eslint-during-buildtest.patch enigmail-2.1.3+ds1/debian/patches/0001-avoid-eslint-during-buildtest.patch --- enigmail-2.0.12+ds1/debian/patches/0001-avoid-eslint-during-buildtest.patch 2019-08-21 16:40:51.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0001-avoid-eslint-during-buildtest.patch 2019-11-19 07:25:37.000000000 +0000 @@ -10,15 +10,15 @@ 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile -index 73347dd..3116c15 100644 +index 308c34a..f74f9e5 100644 --- a/Makefile +++ b/Makefile @@ -43,7 +43,7 @@ unit: - make -C package/tests make -C ui/tests + make -C ipc/tests -test: eslint check unit +test: check unit clean: - rm -f build/$(XPIFILE) + rm -f build/$(XPIFILE) .eslintcache diff -Nru enigmail-2.0.12+ds1/debian/patches/0002-Avoid-auto-download-of-pEpEngine-Closes-891882.patch enigmail-2.1.3+ds1/debian/patches/0002-Avoid-auto-download-of-pEpEngine-Closes-891882.patch --- enigmail-2.0.12+ds1/debian/patches/0002-Avoid-auto-download-of-pEpEngine-Closes-891882.patch 2019-08-21 16:40:51.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0002-Avoid-auto-download-of-pEpEngine-Closes-891882.patch 2019-11-19 07:35:46.000000000 +0000 @@ -10,7 +10,7 @@ 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/prefs/defaultPrefs.js b/package/prefs/defaultPrefs.js -index 819425c..3997b49 100755 +index e40717d..d3ea115 100755 --- a/package/prefs/defaultPrefs.js +++ b/package/prefs/defaultPrefs.js @@ -14,7 +14,7 @@ @@ -22,12 +22,12 @@ // the last configured Enigmail version pref("extensions.enigmail.configuredVersion", ""); -@@ -204,7 +204,7 @@ pref("extensions.enigmail.warnDownloadContactKeys", true); +@@ -207,7 +207,7 @@ pref("extensions.enigmail.warnDownloadContactKeys", true); pref("extensions.enigmail.wrapHtmlBeforeSend", true); // automatically download pepmda if it is available (without askin user) -pref("extensions.enigmail.pEpAutoDownload", true); +pref("extensions.enigmail.pEpAutoDownload", false); - // holds the last result of the last check for pEp updates + // holds the timestamp of the last check for pEp updates pref("extensions.enigmail.pEpLastUpdate", 0); diff -Nru enigmail-2.0.12+ds1/debian/patches/0003-avoid-OpenPGP.js-when-building.patch enigmail-2.1.3+ds1/debian/patches/0003-avoid-OpenPGP.js-when-building.patch --- enigmail-2.0.12+ds1/debian/patches/0003-avoid-OpenPGP.js-when-building.patch 2019-08-21 16:40:51.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0003-avoid-OpenPGP.js-when-building.patch 2019-11-19 07:25:37.000000000 +0000 @@ -2,36 +2,505 @@ Date: Wed, 30 May 2018 15:31:50 -0400 Subject: avoid OpenPGP.js when building +GnuPG should not depend on OpenPGP.js. + +This is an attempt to strip out whatever dependency it had and make it +work with gpg alone. + +There is no need for getStrippedKey at all -- it's never invoked in +the codebase outside of getMinimalPubKey, and it should not be +relevant there, since we are already filtering appropriately. + +Since we explicitly depend on gnupg 2.2.8-2 or greater, we are fine +with these expectations. + +We also don't want to try to test openpgp.js at all. --- - stdlib/Makefile | 4 +--- - util/genxpi | 2 -- - 2 files changed, 1 insertion(+), 5 deletions(-) + package/cryptoAPI/Makefile | 1 - + package/cryptoAPI/README.txt | 8 +- + package/cryptoAPI/gnupg.js | 67 +++------------ + package/cryptoAPI/openpgp-js.js | 183 ---------------------------------------- + package/tests/main.js | 3 +- + package/tests/openpgpjs-test.js | 77 ----------------- + stdlib/Makefile | 6 +- + util/genxpi | 3 - + 8 files changed, 19 insertions(+), 329 deletions(-) + delete mode 100644 package/cryptoAPI/openpgp-js.js + delete mode 100644 package/tests/openpgpjs-test.js +diff --git a/package/cryptoAPI/Makefile b/package/cryptoAPI/Makefile +index 7e8cfd2..12c2e6a 100644 +--- a/package/cryptoAPI/Makefile ++++ b/package/cryptoAPI/Makefile +@@ -14,7 +14,6 @@ MODFILES = \ + gnupg-decryption.jsm \ + gnupg-keylist.jsm \ + gnupg-key.jsm \ +- openpgp-js.js \ + interface.js + + GENFILES = $(addprefix $(GENDIR)/,$(MODFILES)) +diff --git a/package/cryptoAPI/README.txt b/package/cryptoAPI/README.txt +index 7bf86ef..003ee3b 100644 +--- a/package/cryptoAPI/README.txt ++++ b/package/cryptoAPI/README.txt +@@ -17,8 +17,8 @@ Class Hierarchy + CryptoAPI (interface.js) + | + |----- OpenPGPjsCryptoAPI (openpgp-js.js) +- | | +- | |-- GnuPGCryptoAPI (gnupg.js) ++ | ++ |----- GnuPGCryptoAPI (gnupg.js) + | + |----- [SequoiaCryptoAPI (tbd)] + +@@ -27,8 +27,8 @@ CryptoAPI is the generic API that does not contain any functionality, except + for sync(). + + - OpenPGPjsCryptoAPI holds the implementation for OpenPGP.js (https://openpgpjs.org/). +-- GnuPGCryptoAPI holds the implementation for GnuPG (https://gnupg.org/). Some of its functionality +- bases on OpenPGP.js. ++ (OpenPGP.js is not shipped by Debian, see https://bugs.debian.org/787774) ++- GnuPGCryptoAPI holds the implementation for GnuPG (https://gnupg.org/). + - SequoiaCryptoAPI will maybe hold in the future the implementation for Sequoia (https://sequoia-pgp.org/). + + +diff --git a/package/cryptoAPI/gnupg.js b/package/cryptoAPI/gnupg.js +index 3f48354..93d712a 100644 +--- a/package/cryptoAPI/gnupg.js ++++ b/package/cryptoAPI/gnupg.js +@@ -11,13 +11,11 @@ var EXPORTED_SYMBOLS = ["getGnuPGAPI"]; + + var Services = Components.utils.import("resource://gre/modules/Services.jsm").Services; + +-// Load OpenPGP.js (including generic) API +-Services.scriptloader.loadSubScript("chrome://enigmail/content/modules/cryptoAPI/openpgp-js.js", +- null, "UTF-8"); /* global OpenPGPjsCryptoAPI: false */ +- +-/* Globals loaded from openpgp-js.js: */ +-/* global getOpenPGP: false, EnigmailLog: false */ ++// Load generic API ++Services.scriptloader.loadSubScript("chrome://enigmail/content/modules/cryptoAPI/interface.js", ++ null, "UTF-8"); /* global CryptoAPI */ + ++const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; + const EnigmailGpg = ChromeUtils.import("chrome://enigmail/content/modules/gpg.jsm").EnigmailGpg; + const EnigmailExecution = ChromeUtils.import("chrome://enigmail/content/modules/execution.jsm").EnigmailExecution; + const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +@@ -46,7 +44,7 @@ const { + * GnuPG implementation of CryptoAPI + */ + +-class GnuPGCryptoAPI extends OpenPGPjsCryptoAPI { ++class GnuPGCryptoAPI extends CryptoAPI { + constructor() { + super(); + this.api_name = "GnuPG"; +@@ -172,46 +170,14 @@ class GnuPGCryptoAPI extends OpenPGPjsCryptoAPI { + const statusObj = {}; + const exitCodeObj = {}; + let res = await EnigmailExecution.execAsync(EnigmailGpg.agentPath, args); +- let exportOK = true; + let keyBlock = res.stdoutData; + +- if (EnigmailGpg.getGpgFeature("export-result")) { +- // GnuPG 2.1.10+ +- let r = new RegExp("^\\[GNUPG:\\] EXPORTED " + fpr, "m"); +- if (res.stderrData.search(r) < 0) { +- retObj.exitCode = 2; +- retObj.errorMsg = EnigmailLocale.getString("failKeyExtract"); +- exportOK = false; +- } +- } else { +- // GnuPG older than 2.1.10 +- if (keyBlock.length < 50) { +- retObj.exitCode = 2; +- retObj.errorMsg = EnigmailLocale.getString("failKeyExtract"); +- exportOK = false; +- } ++ let r = new RegExp("^\\[GNUPG:\\] EXPORTED " + fpr, "m"); ++ if (res.stderrData.search(r) < 0) { ++ retObj.exitCode = 2; ++ retObj.errorMsg = EnigmailLocale.getString("failKeyExtract"); + } +- +- if (EnigmailGpg.getGpgFeature("export-specific-uid")) { +- // GnuPG 2.2.9+ +- retObj.keyData = btoa(keyBlock); +- return retObj; +- } +- +- // GnuPG < 2.2.9 +- if (exportOK) { +- let minKey = await this.getStrippedKey(keyBlock, email); +- if (minKey) { +- minimalKeyBlock = btoa(String.fromCharCode.apply(null, minKey)); +- } +- +- if (!minimalKeyBlock) { +- retObj.exitCode = 1; +- retObj.errorMsg = EnigmailLocale.getString("failKeyNoSubkey"); +- } +- } +- +- retObj.keyData = minimalKeyBlock; ++ retObj.keyData = btoa(keyBlock); + return retObj; + } + +@@ -431,20 +397,11 @@ class GnuPGCryptoAPI extends OpenPGPjsCryptoAPI { + } + + async getKeyListFromKeyBlock(keyBlockStr) { +- +- let res; +- try { +- res = await getGpgKeyData(keyBlockStr); +- } catch (ex) { +- if (ex === "unsupported") { +- res = await this.OPENPGPjs_getKeyListFromKeyBlock(keyBlockStr); +- } else throw ex; +- } +- return res; ++ return getGpgKeyData(keyBlockStr); + } + + } + + function getGnuPGAPI() { + return new GnuPGCryptoAPI(); +-} +\ No newline at end of file ++} +diff --git a/package/cryptoAPI/openpgp-js.js b/package/cryptoAPI/openpgp-js.js +deleted file mode 100644 +index 0203b5d..0000000 +--- a/package/cryptoAPI/openpgp-js.js ++++ /dev/null +@@ -1,183 +0,0 @@ +-/* +- * 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"; +- +-//var EXPORTED_SYMBOLS = ["getOpenPGPjsAPI"]; +- +- +-var Services = ChromeUtils.import("resource://gre/modules/Services.jsm").Services; +-const EnigmailLog = Cu.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +-const EnigmailLazy = Cu.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; +- +-const getOpenPGP = EnigmailLazy.loader("enigmail/openpgp.jsm", "EnigmailOpenPGP"); +-const getArmor = EnigmailLazy.loader("enigmail/armor.jsm", "EnigmailArmor"); +- +-// Load generic API +-Services.scriptloader.loadSubScript("chrome://enigmail/content/modules/cryptoAPI/interface.js", +- null, "UTF-8"); /* global CryptoAPI */ +- +- +-/** +- * OpenPGP.js implementation of CryptoAPI +- */ +- +-class OpenPGPjsCryptoAPI extends CryptoAPI { +- constructor() { +- super(); +- this.api_name = "OpenPGP.js"; +- } +- +- async getStrippedKey(armoredKey, emailAddr) { +- EnigmailLog.DEBUG("openpgp-js.js: getStrippedKey()\n"); +- +- let searchUid = undefined; +- if (emailAddr) { +- if (emailAddr.search(/^<.{1,500}>$/) < 0) { +- searchUid = `<${emailAddr}>`; +- } else searchUid = emailAddr; +- } +- +- try { +- const openpgp = getOpenPGP().openpgp; +- let msg = await openpgp.key.readArmored(armoredKey); +- +- if (!msg || msg.keys.length === 0) { +- if (msg.err) { +- EnigmailLog.writeException("openpgp-js.js", msg.err[0]); +- } +- return null; +- } +- +- let key = msg.keys[0]; +- let uid = await key.getPrimaryUser(null, searchUid); +- if (!uid || !uid.user) return null; +- +- let signSubkey = await key.getSigningKey(); +- let encSubkey = await key.getEncryptionKey(); +- /* +- let encSubkey = null, +- signSubkey = null; +- +- for (let i = 0; i < key.subKeys.length; i++) { +- if (key.subKeys[i].subKey === encSubkeyPacket) { +- encSubkey = key.subKeys[i]; +- break; +- } +- } +- if (!encSubkey) return null; +- +- if (!signSubkeyPacket.keyid) { +- for (let i = 0; i < key.subKeys.length; i++) { +- if (key.subKeys[i].subKey === signSubkeyPacket) { +- signSubkey = key.subKeys[i]; +- break; +- } +- } +- if (!signSubkey) return null; +- } +- */ +- +- let p = new openpgp.packet.List(); +- p.push(key.primaryKey); +- p.concat(uid.user.toPacketlist()); +- if (key !== signSubkey) { +- p.concat(signSubkey.toPacketlist()); +- } +- if (key !== encSubkey) { +- p.concat(encSubkey.toPacketlist()); +- } +- +- return p.write(); +- } catch (ex) { +- EnigmailLog.DEBUG("openpgp-js.js: getStrippedKey: ERROR " + ex.message + "\n" + ex.stack + "\n"); +- } +- return null; +- } +- +- async getKeyListFromKeyBlock(keyBlockStr) { +- return await this.OPENPGPjs_getKeyListFromKeyBlockkeyBlockStr(keyBlockStr); +- } +- +- async OPENPGPjs_getKeyListFromKeyBlock(keyBlockStr) { +- EnigmailLog.DEBUG("openpgp-js.js: getKeyListFromKeyBlock()\n"); +- const EnigmailTime = ChromeUtils.import("chrome://enigmail/content/modules/time.jsm").EnigmailTime; +- +- const SIG_TYPE_REVOCATION = 0x20; +- +- let keyList = []; +- let key = {}; +- let blocks; +- let isBinary = false; +- const EOpenpgp = getOpenPGP(); +- +- if (keyBlockStr.search(/-----BEGIN PGP (PUBLIC|PRIVATE) KEY BLOCK-----/) >= 0) { +- blocks = getArmor().splitArmoredBlocks(keyBlockStr); +- } else { +- isBinary = true; +- blocks = [EOpenpgp.enigmailFuncs.bytesToArmor(EOpenpgp.openpgp.enums.armor.public_key, keyBlockStr)]; +- } +- +- for (let b of blocks) { +- let m = await EOpenpgp.openpgp.message.readArmored(b); +- +- for (let i = 0; i < m.packets.length; i++) { +- let packetType = EOpenpgp.openpgp.enums.read(EOpenpgp.openpgp.enums.packet, m.packets[i].tag); +- switch (packetType) { +- case "publicKey": +- case "secretKey": +- key = { +- id: m.packets[i].getKeyId().toHex().toUpperCase(), +- fpr: m.packets[i].getFingerprint().toUpperCase(), +- uids: [], +- created: EnigmailTime.getDateTime(m.packets[i].getCreationTime().getTime()/1000, true, false), +- name: null, +- isSecret: false, +- revoke: false +- }; +- +- if (!(key.id in keyList)) { +- keyList[key.id] = key; +- } +- +- if (packetType === "secretKey") { +- keyList[key.id].isSecret = true; +- } +- break; +- case "userid": +- if (!key.name) { +- key.name = m.packets[i].userid.replace(/[\r\n]+/g, " "); +- } +- else { +- key.uids.push(m.packets[i].userid.replace(/[\r\n]+/g, " ")); +- } +- break; +- case "signature": +- if (m.packets[i].signatureType === SIG_TYPE_REVOCATION) { +- let keyId = m.packets[i].issuerKeyId.toHex().toUpperCase(); +- if (keyId in keyList) { +- keyList[keyId].revoke = true; +- } else { +- keyList[keyId] = { +- revoke: true, +- id: keyId +- }; +- } +- } +- break; +- } +- } +- } +- +- return keyList; +- } +-} +- +- +-function getOpenPGPjsAPI() { +- return new OpenPGPjsCryptoAPI(); +-} +\ No newline at end of file +diff --git a/package/tests/main.js b/package/tests/main.js +index fd68452..9b9397f 100644 +--- a/package/tests/main.js ++++ b/package/tests/main.js +@@ -57,6 +57,5 @@ execTest("rng-test.js"); + execTest("dns-test.js"); + execTest("filters-test.js"); + execTest("webKey-test.js"); +-execTest("openpgpjs-test.js"); + execTest("autoSetup-test.js"); +-execTest("persistentCrypto-test.js"); +\ No newline at end of file ++execTest("persistentCrypto-test.js"); +diff --git a/package/tests/openpgpjs-test.js b/package/tests/openpgpjs-test.js +deleted file mode 100644 +index ff71bb3..0000000 +--- a/package/tests/openpgpjs-test.js ++++ /dev/null +@@ -1,77 +0,0 @@ +-/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false */ +-/*global do_test_pending: false, do_test_finished: 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"; +- +-do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); +- +-testing("cryptoAPI/openpgp-js.js"); /*global getOpenPGPjsAPI: false */ +- +-test(function testGetStrippedKey() { +- const cApi = getOpenPGPjsAPI(); +- +- const pubKey = "-----BEGIN PGP PUBLIC KEY BLOCK-----" + +- "\n" + +- "\n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" + +- "\nsnHSt1DRJA==" + +- "\n=I9l9" + +- "\n-----END PGP PUBLIC KEY BLOCK-----"; +- +- let minKey = cApi.sync(cApi.getStrippedKey(pubKey)); +- let got = btoa(String.fromCharCode.apply(null, minKey)); +- Assert.equal(got.substr(0, 127), "xsFNBFVHm5sBEACs94Ln+RMdeyBpWQtTZ/NZnwntsB10Wd3HTgo5sdA/OOFOJrWetJfAZ/HRxiSu1bwRaFVC8p061ftTbxf8bsdfsykYJQQqPODfcO0/oY2n/Z93ya8"); +- Assert.equal(got.substr(-127), "QriSRXV4ZhMhGtnhHEYqHP982gBxk4RPvEp7APCLrqgC0+N8N29eC4s3JkVkHAZx+fj5YV2H9/5wJRJ1w+kwmazhpTQsy01kEwS4NZMPe8Uvz0MgoNuF7Jx0rdQ0SQ="); +- Assert.equal(got.length, 3080); +-}); +\ No newline at end of file diff --git a/stdlib/Makefile b/stdlib/Makefile -index b22894f..980ba10 100644 +index 09841e3..cceaab6 100644 --- a/stdlib/Makefile +++ b/stdlib/Makefile -@@ -10,9 +10,7 @@ include $(DEPTH)/config/autoconf.mk - MODFILES = \ +@@ -13,7 +13,6 @@ MODFILES = \ compose.jsm \ misc.jsm \ -- msgHdrUtils.jsm \ -- openpgp-lib.js \ -- openpgp.worker.min.js -+ msgHdrUtils.jsm + msgHdrUtils.jsm \ +- openpgp.worker.js \ + web-streams.jsm + + GENFILES = $(addprefix $(GENDIR)/,$(MODFILES)) +@@ -29,8 +28,7 @@ all: deploy + deploy: createlib $(GENFILES) - all: deploy + createlib: +- cat openpgp-lib-head.js openpgp-lib.js openpgp-lib-tail.js > openpgp-lib.jsm +- $(DEPTH)/util/prepPostbox $(TARGET_TOOL) openpgp-lib.jsm $(GENDIR)/openpgp-lib.jsm ++ echo skipping createlib, no OpenPGP.js in debian build + clean: +- $(DEPTH)/util/install -u $(DIST)/chrome/content/modules/stdlib $(MODFILES) openpgp-lib.jsm ++ $(DEPTH)/util/install -u $(DIST)/chrome/content/modules/stdlib $(MODFILES) diff --git a/util/genxpi b/util/genxpi -index 32433e9..5d1f439 100755 +index 9d7c39e..68d0b81 100755 --- a/util/genxpi +++ b/util/genxpi -@@ -133,8 +133,6 @@ zip -9 --must-match\ - modules/stdlib/compose.jsm \ - modules/stdlib/misc.jsm \ - modules/stdlib/msgHdrUtils.jsm \ -- modules/stdlib/openpgp-lib.js \ -- modules/stdlib/openpgp.worker.min.js \ - modules/stdlib.jsm \ - modules/streams.jsm \ - modules/subprocess.jsm \ +@@ -81,7 +81,6 @@ zip -9 --must-match\ + chrome/content/modules/cryptoAPI/gnupg-decryption.jsm \ + chrome/content/modules/cryptoAPI/gnupg-key.jsm \ + chrome/content/modules/cryptoAPI/gnupg-keylist.jsm \ +- chrome/content/modules/cryptoAPI/openpgp-js.js \ + chrome/content/modules/cryptoAPI/interface.js \ + chrome/content/modules/data.jsm \ + chrome/content/modules/dns.jsm \ +@@ -149,8 +148,6 @@ zip -9 --must-match\ + chrome/content/modules/stdlib/compose.jsm \ + chrome/content/modules/stdlib/misc.jsm \ + chrome/content/modules/stdlib/msgHdrUtils.jsm \ +- chrome/content/modules/stdlib/openpgp-lib.jsm \ +- chrome/content/modules/stdlib/openpgp.worker.js \ + chrome/content/modules/stdlib/web-streams.jsm \ + chrome/content/modules/stdlib.jsm \ + chrome/content/modules/streams.jsm \ diff -Nru enigmail-2.0.12+ds1/debian/patches/0004-copy-enums.armor-from-OpenPGP.js.patch enigmail-2.1.3+ds1/debian/patches/0004-copy-enums.armor-from-OpenPGP.js.patch --- enigmail-2.0.12+ds1/debian/patches/0004-copy-enums.armor-from-OpenPGP.js.patch 2019-08-21 16:40:51.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0004-copy-enums.armor-from-OpenPGP.js.patch 2019-11-19 07:25:37.000000000 +0000 @@ -5,19 +5,38 @@ Since we use this in our own bytesToArmor(), we just copy the simple table in here. --- - package/openpgp.jsm | 20 +++++++++++++++----- - 1 file changed, 15 insertions(+), 5 deletions(-) + package/openpgp.jsm | 33 +++++++++++++++------------------ + 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/package/openpgp.jsm b/package/openpgp.jsm -index 346c26c..bfbafe0 100644 +index 2982850..c6b8f99 100644 --- a/package/openpgp.jsm +++ b/package/openpgp.jsm -@@ -71,12 +71,22 @@ function initialize() { +@@ -35,31 +35,28 @@ var crc_table = [0x00000000, 0x00864cfb, 0x018ad50d, 0x010c99f6, 0x0393e6e1, 0x0 + 0x575bc9c3, 0x57dd8538 + ]; + +-var gOpenPGPLib; +- + function initialize() { + const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +- const getOpenPGPLibrary = ChromeUtils.import("chrome://enigmail/content/modules/stdlib/openpgp-lib.jsm").getOpenPGPLibrary; +- + EnigmailLog.DEBUG("openpgp.jsm: initialize()\n"); +- +- try { +- gOpenPGPLib = getOpenPGPLibrary(); +- +- EnigmailLog.DEBUG(`openpgp.jsm: openpgp: ${gOpenPGPLib}\n`); +- } +- catch (ex) { +- EnigmailLog.ERROR("openpgp.jsm: initialize: error: " + ex.toString() + "\n"); +- } } var EnigmailOpenPGP = { - get openpgp() { -- if (!(window && window.openpgp)) { +- if (!gOpenPGPLib) { - initialize(); + openpgp: { + enums: { @@ -36,7 +55,7 @@ + }, } - -- return window.openpgp; +- return gOpenPGPLib; }, enigmailFuncs: { diff -Nru enigmail-2.0.12+ds1/debian/patches/0005-add-more-logging-to-autocrypt-test.patch enigmail-2.1.3+ds1/debian/patches/0005-add-more-logging-to-autocrypt-test.patch --- enigmail-2.0.12+ds1/debian/patches/0005-add-more-logging-to-autocrypt-test.patch 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0005-add-more-logging-to-autocrypt-test.patch 2019-11-19 07:25:37.000000000 +0000 @@ -0,0 +1,37 @@ +From: Daniel Kahn Gillmor +Date: Thu, 6 Sep 2018 02:00:31 -0400 +Subject: add more logging to autocrypt test + +--- + package/tests/autocrypt-test.js | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/package/tests/autocrypt-test.js b/package/tests/autocrypt-test.js +index dd91642..9582531 100644 +--- a/package/tests/autocrypt-test.js ++++ b/package/tests/autocrypt-test.js +@@ -8,7 +8,7 @@ + "use strict"; + + do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); +-/* global setupTestAccounts: false, withTestGpgHome: false, withEnigmail: false, component: false */ ++/* global setupTestAccounts: false, withTestGpgHome: false, withEnigmail: false, component: false, withLogFiles: false */ + + testing("autocrypt.jsm"); /*global EnigmailAutocrypt: false, EnigmailKeyRing: false, EnigmailStdlib: false, EnigmailSqliteDb: false */ + const Sqlite = ChromeUtils.import("resource://gre/modules/Sqlite.jsm").Sqlite; +@@ -170,7 +170,7 @@ test(function processHeader() { + + }); + +-test(withTestGpgHome(withEnigmail(function shouldGetKeyFunctions() { ++test(withLogFiles(withTestGpgHome(withEnigmail(function shouldGetKeyFunctions() { + const publicKey = do_get_file("resources/dev-strike.asc", false); + const secretKey = do_get_file("resources/dev-strike.sec", false); + EnigmailKeyRing.importKeyFromFile(publicKey, {}, {}); +@@ -199,4 +199,4 @@ test(withTestGpgHome(withEnigmail(function shouldGetKeyFunctions() { + }); + inspector.enterNestedEventLoop(0); + +-}))); +\ No newline at end of file ++})))); diff -Nru enigmail-2.0.12+ds1/debian/patches/0005-avoid-OpenPGP.js-during-key-file-import.patch enigmail-2.1.3+ds1/debian/patches/0005-avoid-OpenPGP.js-during-key-file-import.patch --- enigmail-2.0.12+ds1/debian/patches/0005-avoid-OpenPGP.js-during-key-file-import.patch 2019-08-21 16:40:51.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0005-avoid-OpenPGP.js-during-key-file-import.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,82 +0,0 @@ -From: Daniel Kahn Gillmor -Date: Thu, 14 Jun 2018 00:00:41 -0400 -Subject: avoid OpenPGP.js during key file import - -note that the revocation certificate import handling is still -contingent on GnuPG's mechanisms for reporting standalone revocation -certs: - -https://dev.gnupg.org/T4018 - -This means we depend on a more recent version (or a patched version) -of GnuPG than upstream enigmail does. ---- - package/key.jsm | 55 ------------------------------------------------------- - 1 file changed, 55 deletions(-) - -diff --git a/package/key.jsm b/package/key.jsm -index efbbd9a..0ee1ff1 100644 ---- a/package/key.jsm -+++ b/package/key.jsm -@@ -151,61 +151,6 @@ var EnigmailKey = { - let keyList = getGpgKeyData(keyBlockStr); - let key = {}; - -- if (keyList.length === 0) { -- EnigmailLog.DEBUG("key.jsm: getKeyListFromKeyBlock: no data from GnuPG\n"); -- if (keyBlockStr.search(/-----BEGIN PGP (PUBLIC|PRIVATE) KEY BLOCK-----/) >= 0) { -- blocks = this.splitArmoredBlocks(keyBlockStr); -- } else { -- isBinary = true; -- blocks = [EnigmailOpenPGP.enigmailFuncs.bytesToArmor(EnigmailOpenPGP.openpgp.enums.armor.public_key, keyBlockStr)]; -- } -- -- for (let b of blocks) { -- let m = EnigmailOpenPGP.openpgp.message.readArmored(b); -- -- for (let i = 0; i < m.packets.length; i++) { -- let packetType = EnigmailOpenPGP.openpgp.enums.read(EnigmailOpenPGP.openpgp.enums.packet, m.packets[i].tag); -- switch (packetType) { -- case "publicKey": -- case "secretKey": -- key = { -- id: m.packets[i].getKeyId().toHex().toUpperCase(), -- fpr: m.packets[i].getFingerprint().toUpperCase(), -- name: null, -- isSecret: false -- }; -- -- if (!(key.id in keyList)) { -- keyList[key.id] = key; -- } -- -- if (packetType === "secretKey") { -- keyList[key.id].isSecret = true; -- } -- break; -- case "userid": -- if (!key.name) { -- key.name = m.packets[i].userid.replace(/[\r\n]+/g, " "); -- } -- break; -- case "signature": -- if (m.packets[i].signatureType === SIG_TYPE_REVOCATION) { -- let keyId = m.packets[i].issuerKeyId.toHex().toUpperCase(); -- if (keyId in keyList) { -- keyList[keyId].revoke = true; -- } else { -- keyList[keyId] = { -- revoke: true, -- id: keyId -- }; -- } -- } -- break; -- } -- } -- } -- } -- - let retArr = []; - for (let k in keyList) { - retArr.push(keyList[k]); diff -Nru enigmail-2.0.12+ds1/debian/patches/0006-drop-use-of-OpenPGP.js-for-generating-minimal-keys.patch enigmail-2.1.3+ds1/debian/patches/0006-drop-use-of-OpenPGP.js-for-generating-minimal-keys.patch --- enigmail-2.0.12+ds1/debian/patches/0006-drop-use-of-OpenPGP.js-for-generating-minimal-keys.patch 2019-08-21 16:40:51.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0006-drop-use-of-OpenPGP.js-for-generating-minimal-keys.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,178 +0,0 @@ -From: Daniel Kahn Gillmor -Date: Thu, 14 Jun 2018 00:54:05 -0400 -Subject: drop use of OpenPGP.js for generating minimal keys - -This depends on GnuPG features released only in 2.2.9 (see -https://dev.gnupg.org/T4019 and https://dev.gnupg.org/T3804) - -Note that keyRing-test.js now exports old-style packets again. - -In 32ec9c3b81d6bd38112af721af23b65ba3159e63 the test suite was -modified to account for emitting new-style packets for the primary -public key (apparently that's what OpenPGP.js does). GnuPG emits -old-style packets where the packet tag < 16 for maximal -interoperability. OpenPGP.js apparently uses new format packet -headers instead. - -see: https://tools.ietf.org/html/rfc4880#section-4.2 - -We choose to emit signing-capable subkeys as well as -encryption-capable subkeys, even though it's not strictly required by -the Autocrypt spec. - -We also change to ensuring that we select the minimal key per e-mail -address, not just a generic minimal key. ---- - package/keyRing.jsm | 124 +++------------------------------------------------- - 1 file changed, 5 insertions(+), 119 deletions(-) - -diff --git a/package/keyRing.jsm b/package/keyRing.jsm -index f3a1ae8..ac2f759 100644 ---- a/package/keyRing.jsm -+++ b/package/keyRing.jsm -@@ -2267,18 +2267,13 @@ KeyObject.prototype = { - }; - - -- // TODO: remove ECC special case once OpenPGP.js supports it -- let isECC = (this.algoSym.search(/(ECDH|ECDSA|EDDSA)/) >= 0); -- - if (!this.minimalKeyBlock[emailAddress]) { - let args = EnigmailGpg.getStandardArgs(true); - -- if (!isECC) { -- args = args.concat(["--export-options", "export-minimal,no-export-attributes", "-a", "--export", this.fpr]); -- } -- else { -- args = args.concat(["--export-options", "export-minimal,no-export-attributes", "--export", this.fpr]); -- } -+ args = args.concat(["--export-options", "export-minimal,no-export-attributes", -+ "--export-filter", "keep-uid=mbox="+emailAddress, -+ "--export-filter", "drop-subkey=usage!~e && usage!~s", -+ "--export", this.fpr]); - - const statusObj = {}; - const exitCodeObj = {}; -@@ -2304,17 +2299,7 @@ KeyObject.prototype = { - } - - if (exportOK) { -- this.minimalKeyBlock[emailAddress] = null; -- -- if (isECC) { -- this.minimalKeyBlock[emailAddress] = btoa(keyBlock); -- } -- else { -- let minKey = getStrippedKey(keyBlock, emailAddress); -- if (minKey) { -- this.minimalKeyBlock[emailAddress] = btoa(String.fromCharCode.apply(null, minKey)); -- } -- } -+ this.minimalKeyBlock[emailAddress] = btoa(keyBlock); - - if (!this.minimalKeyBlock[emailAddress]) { - retObj.exitCode = 1; -@@ -2350,103 +2335,4 @@ KeyObject.prototype = { - } - }; - -- --function _getBestUserId(key, emailAddress) { -- let bestUser = []; -- for (let i = 0; i < key.users.length; i++) { -- if (!key.users[i].userId || !key.users[i].selfCertifications) { -- continue; -- } -- for (let j = 0; j < key.users[i].selfCertifications.length; j++) { -- bestUser.push({ -- user: key.users[i], -- selfCertificate: key.users[i].selfCertifications[j] -- }); -- } -- } -- /* prefer matching e-mail addresses, then primary user IDs, -- then most-recent signatures: */ -- bestUser = bestUser.sort(function(a, b) { -- if ((a.user.userId.userid == emailAddress || -- a.user.userId.userid.endsWith(' <' + emailAddress + '>')) && -- !(b.user.userId.userid == emailAddress || -- b.user.userId.userid.endsWith(' <' + emailAddress + '>'))) { -- return -1; -- } -- else if ((b.user.userId.userid == emailAddress || -- b.user.userId.userid.endsWith(' <' + emailAddress + '>')) && -- !(a.user.userId.userid == emailAddress || -- a.user.userId.userid.endsWith(' <' + emailAddress + '>'))) { -- return 1; -- } -- else if (a.selfCertificate.isPrimaryUserID > b.selfCertificate.isPrimaryUserID) { -- return -1; -- } -- else if (a.selfCertificate.isPrimaryUserID < b.selfCertificate.isPrimaryUserID) { -- return 1; -- } -- else if (a.selfCertificate.created > b.selfCertificate.created) { -- return -1; -- } -- else if (a.selfCertificate.created < b.selfCertificate.created) { -- return 1; -- } -- else { -- return 0; -- } -- }); -- /* return first valid certification: */ -- for (var k = 0; k < bestUser.length; k++) { -- if (bestUser[k].user.isValidSelfCertificate(key.primaryKey, bestUser[k].selfCertificate)) { -- return bestUser[k]; -- } -- } -- return null; --} -- --/** -- * Get a minimal stripped key containing only: -- * - The public key -- * - the matching UID (or primary UID, if no match) + its self-signature -- * - any valid signing-capable or encryption-capable subkeys + their signature packets -- * -- * @param armoredKey - String: Key data (in OpenPGP armored format) -- * @param emailAddress - String: e-mail address that we want to match a user ID to -- * -- * @return Uint8Array, or null -- */ -- --function getStrippedKey(armoredKey, emailAddress) { -- EnigmailLog.DEBUG("keyRing.jsm: KeyObject.getStrippedKey()\n"); -- -- try { -- let openpgp = getOpenPGP().openpgp; -- let msg = openpgp.key.readArmored(armoredKey); -- -- if (!msg || msg.keys.length === 0) return null; -- -- let key = msg.keys[0]; -- let uid = _getBestUserId(key, emailAddress); -- if (!uid || !uid.user) return null; -- -- let p = new openpgp.packet.List(); -- p.push(key.primaryKey); -- p.concat(uid.user.toPacketlist()); -- -- // go through the subkeys and pull out only valid encryption-capable and -- // signing-capable subkeys. -- for (let i = 0; i < key.subKeys.length; i++) { -- if (key.subKeys[i].isValidEncryptionKey(key.primaryKey) || -- key.subKeys[i].isValidSigningKey(key.primaryKey)) { -- p.concat(key.subKeys[i].toPacketlist()); -- } -- } -- -- return p.write(); -- } catch (ex) { -- EnigmailLog.DEBUG("keyRing.jsm: KeyObject.getStrippedKey: ERROR " + ex.message + "\n"); -- } -- return null; --} -- - EnigmailKeyRing.clearCache(); diff -Nru enigmail-2.0.12+ds1/debian/patches/0006-enable-the-use-of-extra-file-descriptors-and-test-th.patch enigmail-2.1.3+ds1/debian/patches/0006-enable-the-use-of-extra-file-descriptors-and-test-th.patch --- enigmail-2.0.12+ds1/debian/patches/0006-enable-the-use-of-extra-file-descriptors-and-test-th.patch 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0006-enable-the-use-of-extra-file-descriptors-and-test-th.patch 2019-11-19 07:36:45.000000000 +0000 @@ -0,0 +1,267 @@ +From: Daniel Kahn Gillmor +Date: Fri, 28 Sep 2018 14:46:37 -0400 +Subject: enable the use of extra file descriptors, and test them + + * add "infds" and "outfds" to the enigmailprocess_* implementation, + passing the file descriptors back and forth between the threads as + needed to permit additional (non-stdin/stdout/stderr) file + descriptors to be passed to the subprocess. + + * NOTE: this presumably does not work on Windows at all! + + * use infds and outfds within subprocess.jsm +--- + ipc/modules/enigmailprocess_common.jsm | 42 +++++++++++++++++++++++--- + ipc/modules/enigmailprocess_main.jsm | 14 +++++++++ + ipc/modules/enigmailprocess_worker_unix.js | 8 +++++ + ipc/modules/subprocess.jsm | 48 ++++++++++++++++++++++++++++++ + ipc/tests/subprocess-test.js | 28 +++++++++++++++++ + 5 files changed, 136 insertions(+), 4 deletions(-) + +diff --git a/ipc/modules/enigmailprocess_common.jsm b/ipc/modules/enigmailprocess_common.jsm +index 06859c3..4e64a42 100644 +--- a/ipc/modules/enigmailprocess_common.jsm ++++ b/ipc/modules/enigmailprocess_common.jsm +@@ -598,12 +598,19 @@ class _BaseProcess { + * The internal ID of the Process object, which ties it to the + * corresponding process on the Worker side. + * @param {integer[]} fds +- * An array of internal Pipe IDs, one for each standard file descriptor +- * in the child process. ++ * An array of internal Pipe IDs, one for each connected file descriptor ++ * in the child process. fds[N] is the parent process's FD that connects ++ * via a pipe to FD N of the child process + * @param {integer} pid + * The operating system process ID of the process. ++ * @param {integer[]} infds ++ * list of child processes extra FDs (beyond stdin) that should be input ++ * from the perspective of the child process. ++ * @param {integer[]} outfds ++ * list of child processes extra FDs (beyond stdout and stderr) that ++ * should be output from the perspective of the child process. + */ +- constructor(worker, processId, fds, pid) { ++ constructor(worker, processId, fds, pid, infds, outfds) { + this.id = processId; + this.worker = worker; + +@@ -626,6 +633,33 @@ class _BaseProcess { + this.exitCode = exitCode; + }); + }); ++ /** ++ * @property {Map} infds ++ * A Map from the child process's input file ++ * descriptors to pipes to write to them. Note ++ * that the child's stdin (FD 0) is handled ++ * separately (by the property stdin). ++ * @readonly ++ */ ++ this.infds = new Map(); ++ /** ++ * @property {Map} outfds ++ * A Map from the child process's output file ++ * descriptors to pipes to read from them. Note ++ * that stdout and stderr (FDs 1 and 2) are ++ * handled separately (by the properties stdout and ++ * stderr). ++ * @readonly ++ */ ++ this.outfds = new Map(); ++ ++ for (let fd of infds) { ++ this.infds.set(fd, new OutputPipe(this, fd, fds[fd])); ++ } ++ ++ for (let fd of outfds) { ++ this.outfds.set(fd, new InputPipe(this, fd, fds[fd])); ++ } + + if (fds[0] !== undefined) { + /** +@@ -670,7 +704,7 @@ class _BaseProcess { + return worker.call("spawn", [options]).then(({ + processId, fds, pid + }) => { +- return new this(worker, processId, fds, pid); ++ return new this(worker, processId, fds, pid, options.infds, options.outfds); + }); + } + +diff --git a/ipc/modules/enigmailprocess_main.jsm b/ipc/modules/enigmailprocess_main.jsm +index 266bf14..2012428 100644 +--- a/ipc/modules/enigmailprocess_main.jsm ++++ b/ipc/modules/enigmailprocess_main.jsm +@@ -87,6 +87,18 @@ var SubprocessMain = { + * - `"pipe"`: The process's stderr is redirected to a pipe, which can be read + * from via its `stderr` property. + * ++ * @param {integer[]} [options.infds] ++ * - a list of file descriptors which should be returned in ++ * the resulting process object as keys in an "infds" member. ++ * These file descriptors should be > 3 and should not ++ * intersect with outfds (see below). ++ * ++ * @param {integer[]} [options.outfds] ++ * - a list of the file descriptors which should be returned in ++ * the resulting process object as a keys in an "outfds" member. ++ * These file descriptors should be > 3 and should not ++ * intersect with infds (see above). ++ * + * @param {string} [options.workdir] + * The working directory in which to launch the new process. + * +@@ -109,6 +121,8 @@ var SubprocessMain = { + + options.stderr = options.stderr || "ignore"; + options.workdir = options.workdir || null; ++ options.infds = options.infds || []; ++ options.outfds = options.outfds || []; + + let environment = {}; + if (!options.environment || options.environmentAppend) { +diff --git a/ipc/modules/enigmailprocess_worker_unix.js b/ipc/modules/enigmailprocess_worker_unix.js +index ebffdc9..ab4a792 100644 +--- a/ipc/modules/enigmailprocess_worker_unix.js ++++ b/ipc/modules/enigmailprocess_worker_unix.js +@@ -392,6 +392,14 @@ class Process extends BaseProcess { + this.fd = our_pipes[3].fd; + delete our_pipes[3]; + ++ // add additional file descriptors: ++ for (let fd in options.infds) { ++ their_pipes.set(Number(options.infds[fd]), pipe(false, options.infds[fd])); ++ } ++ for (let fd in options.outfds) { ++ their_pipes.set(Number(options.outfds[fd]), pipe(true, options.outfds[fd])); ++ } ++ + this.pipes = our_pipes; + + return their_pipes; +diff --git a/ipc/modules/subprocess.jsm b/ipc/modules/subprocess.jsm +index b62c676..d8ea4ab 100644 +--- a/ipc/modules/subprocess.jsm ++++ b/ipc/modules/subprocess.jsm +@@ -25,6 +25,14 @@ + * stderr: function(data) { + * dump("got data on stderr:" + data + "\n"); + * }, ++ * infds: { ++ * 4: "this is an input stream as a simple string" ++ * }, ++ * outfds: { ++ * 5: function(data) { ++ * dump("got data on file descriptor 5:" + data + "\n"); ++ * } ++ * }, + * done: function(result) { + * dump("process terminated with " + result.exitCode + "\n"); + * }, +@@ -71,6 +79,13 @@ + * something like 'data.replace(/\0/g, "\\0");'. + * (on windows it only gets called once right now) + * ++ * infds: a dictionary where the keys are file descriptor numbers >3, and ++ * the values are strings that will be written to the associated FD ++ * (like string-based stdin, but for extended file descriptors) ++ * ++ * outfds: a dictionary where the keys are file descriptor numbers >3, and ++ * the values are functions that accept data as their argument ++ * (like stdout and stderr, but for extended file descriptors) + * + * done: optional function that is called when the process has terminated. + * The exit code from the process available via result.exitCode. If +@@ -231,6 +246,19 @@ var subprocess = { + }); + } + ++ for (let fd in options.infds) { ++ if (typeof options.infds[fd] === "string") { ++ DEBUG_LOG("writing to file descriptor " + fd); ++ writePipe(proc.infds.get(fd), options.infds[fd]); ++ } else { ++ let errStr = 'infds[' + fd + '] needs to be a string, not a ' + typeof options.infds[fd]; ++ ERROR_LOG(errStr); ++ throw ("subprocess.jsm call(): " + errStr); ++ } ++ Promise.all(inputPromises).then(() => { ++ proc.infds.get(fd).close(); ++ }); ++ } + + promises.push( + readAllData(proc.stdout, read, data => { +@@ -243,6 +271,18 @@ var subprocess = { + stdoutData += data; + })); + ++ for (let fd in options.outfds) { ++ promises.push( ++ readAllData(proc.outfds.get(fd), read, data => { ++ DEBUG_LOG("Got output FD " + fd + ": " + data.length + "\n"); ++ if (typeof options.outfds[fd] === "function") { ++ options.outfds[fd](data); ++ } else { ++ throw new Error("outfds[" + fd + "] needs to be a function, not a " + typeof options.outfds[fd]); ++ } ++ })); ++ } ++ + if (!options.mergeStderr) { + promises.push( + readAllData(proc.stderr, read, data => { +@@ -301,6 +341,14 @@ var subprocess = { + opts.stderr = "pipe"; + } + ++ if (options.infds) { ++ opts.infds = Object.keys(options.infds); ++ } ++ ++ if (options.outfds) { ++ opts.outfds = Object.keys(options.outfds); ++ } ++ + if (options.command instanceof Ci.nsIFile) { + opts.command = options.command.path; + } else { +diff --git a/ipc/tests/subprocess-test.js b/ipc/tests/subprocess-test.js +index 5e68b18..5e5f85b 100644 +--- a/ipc/tests/subprocess-test.js ++++ b/ipc/tests/subprocess-test.js +@@ -294,6 +294,34 @@ function run_test() { + + p.wait(); + ++ ///////////////////////////////////////////////////////////////// ++ // Test extra file descriptors ++ ///////////////////////////////////////////////////////////////// ++ ++ do_print("caesar cipher on FD 4 and FD 5"); ++ ++ gResultData = ""; ++ try { ++ p = subprocess.call({ ++ command: pl.path, ++ arguments: [cmd.path, 'caesar', '4', '5'], ++ environment: envList, ++ infds: {4: 'monkey' }, ++ outfds: {5: function(data) { ++ gResultData += data; ++ } }, ++ done: function(result) { ++ Assert.equal(0, result.exitCode, "exit code"); ++ Assert.equal("zbaxrl", gResultData, "transformed data"); ++ }, ++ mergeStderr: false ++ }); ++ } catch (ex) { ++ Assert.ok(false, "error: " + ex); ++ } ++ ++ p.wait(); ++ + + ///////////////////////////////////////////////////////////////// + // Test many concurrent runs diff -Nru enigmail-2.0.12+ds1/debian/patches/0007-add-more-logging-to-autocrypt-test.patch enigmail-2.1.3+ds1/debian/patches/0007-add-more-logging-to-autocrypt-test.patch --- enigmail-2.0.12+ds1/debian/patches/0007-add-more-logging-to-autocrypt-test.patch 2019-08-21 16:40:51.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0007-add-more-logging-to-autocrypt-test.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -From: Daniel Kahn Gillmor -Date: Thu, 6 Sep 2018 02:00:31 -0400 -Subject: add more logging to autocrypt test - ---- - package/tests/autocrypt-test.js | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/package/tests/autocrypt-test.js b/package/tests/autocrypt-test.js -index ef100d8..b2a775b 100644 ---- a/package/tests/autocrypt-test.js -+++ b/package/tests/autocrypt-test.js -@@ -9,7 +9,7 @@ - "use strict"; - - do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); --/* global setupTestAccounts: false, withTestGpgHome: false, withEnigmail: false, component: false */ -+/* global setupTestAccounts: false, withTestGpgHome: false, withEnigmail: false, component: false, withLogFiles: false */ - - testing("autocrypt.jsm"); /*global EnigmailAutocrypt: false */ - component("enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ -@@ -169,7 +169,7 @@ test(function processHeader() { - - }); - --test(withTestGpgHome(withEnigmail(function shouldGetKeyFunctions() { -+test(withLogFiles(withTestGpgHome(withEnigmail(function shouldGetKeyFunctions() { - const publicKey = do_get_file("resources/dev-strike.asc", false); - const secretKey = do_get_file("resources/dev-strike.sec", false); - EnigmailKeyRing.importKeyFromFile(publicKey, {}, {}); -@@ -198,4 +198,4 @@ test(withTestGpgHome(withEnigmail(function shouldGetKeyFunctions() { - }); - inspector.enterNestedEventLoop(0); - --}))); -+})))); diff -Nru enigmail-2.0.12+ds1/debian/patches/0007-add-test-to-do-symmetric-encryption-decryption-with-.patch enigmail-2.1.3+ds1/debian/patches/0007-add-test-to-do-symmetric-encryption-decryption-with-.patch --- enigmail-2.0.12+ds1/debian/patches/0007-add-test-to-do-symmetric-encryption-decryption-with-.patch 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0007-add-test-to-do-symmetric-encryption-decryption-with-.patch 2019-11-19 07:25:37.000000000 +0000 @@ -0,0 +1,114 @@ +From: Daniel Kahn Gillmor +Date: Sat, 29 Sep 2018 23:32:32 -0500 +Subject: add test to do symmetric encryption/decryption with gpg + +--- + ipc/tests/subprocess-test.js | 95 ++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 95 insertions(+) + +diff --git a/ipc/tests/subprocess-test.js b/ipc/tests/subprocess-test.js +index 5e5f85b..f399cfa 100644 +--- a/ipc/tests/subprocess-test.js ++++ b/ipc/tests/subprocess-test.js +@@ -322,6 +322,101 @@ function run_test() { + + p.wait(); + ++ ///////////////////////////////////////////////////////////////// ++ // Test gpg use with extra file descriptors ++ ///////////////////////////////////////////////////////////////// ++ ++ do_print("GnuPG passphrase-based crypto"); ++ ++ let passphrase = "monkey"; ++ let cleartext = "bananas"; ++ let statusdata = ""; ++ let ciphertext; ++ try { ++ p = subprocess.call({ ++ command: "/usr/bin/gpg", ++ arguments: ['--no-options', ++ '--no-keyring', ++ '--batch', ++ '--no-tty', ++ '--with-colons', ++ '--fixed-list-mode', ++ '--armor', ++ '--cipher-algo=aes256', ++ '--pinentry-mode=loopback', ++ '--passphrase-fd=4', ++ '--status-fd=5', ++ '--symmetric', ++ ], ++ environment: envList, ++ stdin: function(pipe) { ++ pipe.write(cleartext); ++ pipe.close(); ++ }, ++ infds: {4: passphrase }, ++ outfds: {5: function(data) { ++ statusdata += data; ++ } }, ++ done: function(result) { ++ ciphertext = result.stdout; ++ Assert.equal(0, result.exitCode, "exit code"); ++ Assert.equal(statusdata, "[GNUPG:] NEED_PASSPHRASE_SYM 9 3 2\n[GNUPG:] BEGIN_ENCRYPTION 2 9\n[GNUPG:] END_ENCRYPTION\n", "status data"); ++ }, ++ mergeStderr: false ++ }); ++ } catch (ex) { ++ Assert.ok(false, "error: " + ex); ++ } ++ ++ p.wait(); ++ ++ statusdata=""; ++ let decrypt_status_re = /\[GNUPG:\] NEED_PASSPHRASE_SYM \d+ \d+ \d+\n\[GNUPG:] BEGIN_DECRYPTION\n(\[GNUPG:\] DECRYPTION_COMPLIANCE_MODE \d+\n)?\[GNUPG:\] DECRYPTION_INFO \d+ \d+\n\[GNUPG:\] PLAINTEXT \d+ \d+ *\n(\[GNUPG:\] PLAINTEXT_LENGTH (\d+)\n)?\[GNUPG:\] DECRYPTION_OKAY\n(\[GNUPG:\] GOODMDC\n)?\[GNUPG:\] END_DECRYPTION\n/m ++ ++ try { ++ p = subprocess.call({ ++ command: "/usr/bin/gpg", ++ arguments: ['--no-options', ++ '--no-keyring', ++ '--no-symkey-cache', ++ '--batch', ++ '--no-tty', ++ '--with-colons', ++ '--fixed-list-mode', ++ '--pinentry-mode=loopback', ++ '--passphrase-fd=4', ++ '--status-fd=5', ++ '--decrypt', ++ ], ++ environment: envList, ++ stdin: function(pipe) { ++ pipe.write(ciphertext); ++ pipe.close(); ++ }, ++ infds: {4: passphrase }, ++ outfds: {5: function(data) { ++ statusdata += data; ++ } }, ++ done: function(result) { ++ Assert.equal(0, result.exitCode, "exit code"); ++ Assert.equal(cleartext, result.stdout, "decryption successful"); ++ let matched = false; ++ statusdata.replace(decrypt_status_re, function(all, compliance, plen_line, plaintext_len, mdc) { ++ matched = true; ++ Assert.equal(all, statusdata, "no unexpected status lines"); ++ if (plen_line) ++ Assert.equal(result.stdout.length, plaintext_len, "plaintext length correct"); ++ Assert.equal(mdc, "[GNUPG:] GOODMDC\n", "MDC present"); ++ }); ++ Assert.ok(matched, "status-fd produced what we expected"); ++ }, ++ mergeStderr: false ++ }); ++ } catch (ex) { ++ Assert.ok(false, "error: " + ex); ++ } ++ ++ p.wait(); + + ///////////////////////////////////////////////////////////////// + // Test many concurrent runs diff -Nru enigmail-2.0.12+ds1/debian/patches/0008-enable-the-use-of-extra-file-descriptors-and-test-th.patch enigmail-2.1.3+ds1/debian/patches/0008-enable-the-use-of-extra-file-descriptors-and-test-th.patch --- enigmail-2.0.12+ds1/debian/patches/0008-enable-the-use-of-extra-file-descriptors-and-test-th.patch 2019-08-21 16:40:51.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0008-enable-the-use-of-extra-file-descriptors-and-test-th.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,267 +0,0 @@ -From: Daniel Kahn Gillmor -Date: Fri, 28 Sep 2018 14:46:37 -0400 -Subject: enable the use of extra file descriptors, and test them - - * add "infds" and "outfds" to the enigmailprocess_* implementation, - passing the file descriptors back and forth between the threads as - needed to permit additional (non-stdin/stdout/stderr) file - descriptors to be passed to the subprocess. - - * NOTE: this presumably does not work on Windows at all! - - * use infds and outfds within subprocess.jsm ---- - ipc/modules/enigmailprocess_common.jsm | 42 +++++++++++++++++++++++--- - ipc/modules/enigmailprocess_main.jsm | 14 +++++++++ - ipc/modules/enigmailprocess_worker_unix.js | 8 +++++ - ipc/modules/subprocess.jsm | 48 ++++++++++++++++++++++++++++++ - ipc/tests/subprocess-test.js | 28 +++++++++++++++++ - 5 files changed, 136 insertions(+), 4 deletions(-) - -diff --git a/ipc/modules/enigmailprocess_common.jsm b/ipc/modules/enigmailprocess_common.jsm -index 6e53ece..152ce70 100644 ---- a/ipc/modules/enigmailprocess_common.jsm -+++ b/ipc/modules/enigmailprocess_common.jsm -@@ -590,12 +590,19 @@ class BaseProcess { - * The internal ID of the Process object, which ties it to the - * corresponding process on the Worker side. - * @param {integer[]} fds -- * An array of internal Pipe IDs, one for each standard file descriptor -- * in the child process. -+ * An array of internal Pipe IDs, one for each connected file descriptor -+ * in the child process. fds[N] is the parent process's FD that connects -+ * via a pipe to FD N of the child process - * @param {integer} pid - * The operating system process ID of the process. -+ * @param {integer[]} infds -+ * list of child processes extra FDs (beyond stdin) that should be input -+ * from the perspective of the child process. -+ * @param {integer[]} outfds -+ * list of child processes extra FDs (beyond stdout and stderr) that -+ * should be output from the perspective of the child process. - */ -- constructor(worker, processId, fds, pid) { -+ constructor(worker, processId, fds, pid, infds, outfds) { - this.id = processId; - this.worker = worker; - -@@ -618,6 +625,33 @@ class BaseProcess { - this.exitCode = exitCode; - }); - }); -+ /** -+ * @property {Map} infds -+ * A Map from the child process's input file -+ * descriptors to pipes to write to them. Note -+ * that the child's stdin (FD 0) is handled -+ * separately (by the property stdin). -+ * @readonly -+ */ -+ this.infds = new Map(); -+ /** -+ * @property {Map} outfds -+ * A Map from the child process's output file -+ * descriptors to pipes to read from them. Note -+ * that stdout and stderr (FDs 1 and 2) are -+ * handled separately (by the properties stdout and -+ * stderr). -+ * @readonly -+ */ -+ this.outfds = new Map(); -+ -+ for (let fd of infds) { -+ this.infds.set(fd, new OutputPipe(this, fd, fds[fd])); -+ } -+ -+ for (let fd of outfds) { -+ this.outfds.set(fd, new InputPipe(this, fd, fds[fd])); -+ } - - if (fds[0] !== undefined) { - /** -@@ -662,7 +696,7 @@ class BaseProcess { - return worker.call("spawn", [options]).then(({ - processId, fds, pid - }) => { -- return new this(worker, processId, fds, pid); -+ return new this(worker, processId, fds, pid, options.infds, options.outfds); - }); - } - -diff --git a/ipc/modules/enigmailprocess_main.jsm b/ipc/modules/enigmailprocess_main.jsm -index 73bc217..6665060 100644 ---- a/ipc/modules/enigmailprocess_main.jsm -+++ b/ipc/modules/enigmailprocess_main.jsm -@@ -91,6 +91,18 @@ var SubprocessMain = { - * - `"pipe"`: The process's stderr is redirected to a pipe, which can be read - * from via its `stderr` property. - * -+ * @param {integer[]} [options.infds] -+ * - a list of file descriptors which should be returned in -+ * the resulting process object as keys in an "infds" member. -+ * These file descriptors should be > 3 and should not -+ * intersect with outfds (see below). -+ * -+ * @param {integer[]} [options.outfds] -+ * - a list of the file descriptors which should be returned in -+ * the resulting process object as a keys in an "outfds" member. -+ * These file descriptors should be > 3 and should not -+ * intersect with infds (see above). -+ * - * @param {string} [options.workdir] - * The working directory in which to launch the new process. - * -@@ -113,6 +125,8 @@ var SubprocessMain = { - - options.stderr = options.stderr || "ignore"; - options.workdir = options.workdir || null; -+ options.infds = options.infds || []; -+ options.outfds = options.outfds || []; - - let environment = {}; - if (!options.environment || options.environmentAppend) { -diff --git a/ipc/modules/enigmailprocess_worker_unix.js b/ipc/modules/enigmailprocess_worker_unix.js -index f814225..c44fef2 100644 ---- a/ipc/modules/enigmailprocess_worker_unix.js -+++ b/ipc/modules/enigmailprocess_worker_unix.js -@@ -392,6 +392,14 @@ class Process extends BaseProcess { - this.fd = our_pipes[3].fd; - delete our_pipes[3]; - -+ // add additional file descriptors: -+ for (let fd in options.infds) { -+ their_pipes.set(Number(options.infds[fd]), pipe(false, options.infds[fd])); -+ } -+ for (let fd in options.outfds) { -+ their_pipes.set(Number(options.outfds[fd]), pipe(true, options.outfds[fd])); -+ } -+ - this.pipes = our_pipes; - - return their_pipes; -diff --git a/ipc/modules/subprocess.jsm b/ipc/modules/subprocess.jsm -index 6ee9146..8520bb2 100644 ---- a/ipc/modules/subprocess.jsm -+++ b/ipc/modules/subprocess.jsm -@@ -26,6 +26,14 @@ - * stderr: function(data) { - * dump("got data on stderr:" + data + "\n"); - * }, -+ * infds: { -+ * 4: "this is an input stream as a simple string" -+ * }, -+ * outfds: { -+ * 5: function(data) { -+ * dump("got data on file descriptor 5:" + data + "\n"); -+ * } -+ * }, - * done: function(result) { - * dump("process terminated with " + result.exitCode + "\n"); - * }, -@@ -72,6 +80,13 @@ - * something like 'data.replace(/\0/g, "\\0");'. - * (on windows it only gets called once right now) - * -+ * infds: a dictionary where the keys are file descriptor numbers >3, and -+ * the values are strings that will be written to the associated FD -+ * (like string-based stdin, but for extended file descriptors) -+ * -+ * outfds: a dictionary where the keys are file descriptor numbers >3, and -+ * the values are functions that accept data as their argument -+ * (like stdout and stderr, but for extended file descriptors) - * - * done: optional function that is called when the process has terminated. - * The exit code from the process available via result.exitCode. If -@@ -239,6 +254,19 @@ var subprocess = { - }); - } - -+ for (let fd in options.infds) { -+ if (typeof options.infds[fd] === "string") { -+ DEBUG_LOG("writing to file descriptor " + fd); -+ writePipe(proc.infds.get(fd), options.infds[fd]); -+ } else { -+ let errStr = 'infds[' + fd + '] needs to be a string, not a ' + typeof options.infds[fd]; -+ ERROR_LOG(errStr); -+ throw ("subprocess.jsm call(): " + errStr); -+ } -+ Promise.all(inputPromises).then(() => { -+ proc.infds.get(fd).close(); -+ }); -+ } - - promises.push( - readAllData(proc.stdout, read, data => { -@@ -253,6 +281,18 @@ var subprocess = { - stdoutData += data; - })); - -+ for (let fd in options.outfds) { -+ promises.push( -+ readAllData(proc.outfds.get(fd), read, data => { -+ DEBUG_LOG("Got output FD " + fd + ": " + data.length + "\n"); -+ if (typeof options.outfds[fd] === "function") { -+ options.outfds[fd](data); -+ } else { -+ throw new Error("outfds[" + fd + "] needs to be a function, not a " + typeof options.outfds[fd]); -+ } -+ })); -+ } -+ - if (!options.mergeStderr) { - promises.push( - readAllData(proc.stderr, read, data => { -@@ -316,6 +356,14 @@ var subprocess = { - opts.stderr = "pipe"; - } - -+ if (options.infds) { -+ opts.infds = Object.keys(options.infds); -+ } -+ -+ if (options.outfds) { -+ opts.outfds = Object.keys(options.outfds); -+ } -+ - if (options.command instanceof Ci.nsIFile) { - opts.command = options.command.path; - } -diff --git a/ipc/tests/subprocess-test.js b/ipc/tests/subprocess-test.js -index f4b81fa..8df107e 100644 ---- a/ipc/tests/subprocess-test.js -+++ b/ipc/tests/subprocess-test.js -@@ -300,6 +300,34 @@ function run_test() { - - p.wait(); - -+ ///////////////////////////////////////////////////////////////// -+ // Test extra file descriptors -+ ///////////////////////////////////////////////////////////////// -+ -+ do_print("caesar cipher on FD 4 and FD 5"); -+ -+ gResultData = ""; -+ try { -+ p = subprocess.call({ -+ command: pl.path, -+ arguments: [cmd.path, 'caesar', '4', '5'], -+ environment: envList, -+ infds: {4: 'monkey' }, -+ outfds: {5: function(data) { -+ gResultData += data; -+ } }, -+ done: function(result) { -+ Assert.equal(0, result.exitCode, "exit code"); -+ Assert.equal("zbaxrl", gResultData, "transformed data"); -+ }, -+ mergeStderr: false -+ }); -+ } catch (ex) { -+ Assert.ok(false, "error: " + ex); -+ } -+ -+ p.wait(); -+ - - ///////////////////////////////////////////////////////////////// - // Test many concurrent runs diff -Nru enigmail-2.0.12+ds1/debian/patches/0008-use-GnuPG-instead-of-openpgp.js-for-symmetric-encryp.patch enigmail-2.1.3+ds1/debian/patches/0008-use-GnuPG-instead-of-openpgp.js-for-symmetric-encryp.patch --- enigmail-2.0.12+ds1/debian/patches/0008-use-GnuPG-instead-of-openpgp.js-for-symmetric-encryp.patch 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0008-use-GnuPG-instead-of-openpgp.js-for-symmetric-encryp.patch 2019-11-19 07:25:37.000000000 +0000 @@ -0,0 +1,326 @@ +From: Daniel Kahn Gillmor +Date: Sun, 30 Sep 2018 01:54:12 -0500 +Subject: use GnuPG instead of openpgp.js for symmetric encryption/decryption + +This enables all the test suite to pass, and should enable proper use +of the Autocrypt setup message. + +We need to handle PLAINTEXT status lines that include a possible +filename in them. And sometimes GnuPG gets confused about the +different sizes of plaintext: https://dev.gnupg.org/T4741. so just +warn, don't throw an exception for now as a workaround. +--- + package/autocrypt.jsm | 92 ++++++++++++++--------------- + package/gpg.jsm | 156 +++++++++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 201 insertions(+), 47 deletions(-) + +diff --git a/package/autocrypt.jsm b/package/autocrypt.jsm +index d04cd4f..74c7de5 100644 +--- a/package/autocrypt.jsm ++++ b/package/autocrypt.jsm +@@ -11,8 +11,6 @@ + + var EXPORTED_SYMBOLS = ["EnigmailAutocrypt"]; + +-const Cr = Components.results; +- + Components.utils.importGlobalProperties(["crypto"]); + + const jsmime = ChromeUtils.import("resource:///modules/jsmime.jsm").jsmime; +@@ -38,6 +36,7 @@ const EnigmailStdlib = ChromeUtils.import("chrome://enigmail/content/modules/std + const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; + const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; + const EnigmailCryptoAPI = ChromeUtils.import("chrome://enigmail/content/modules/cryptoAPI.jsm").EnigmailCryptoAPI; ++const EnigmailGpg = ChromeUtils.import("chrome://enigmail/content/modules/gpg.jsm").EnigmailGpg; + + var gCreatedSetupIds = []; + +@@ -470,14 +469,15 @@ var EnigmailAutocrypt = { + + let bkpCode = createBackupCode(); + let enc = { +- message: EnigmailOpenPGP.openpgp.message.fromText(innerMsg), +- passwords: bkpCode, ++ message: innerMsg, ++ password: bkpCode, + armor: true + }; + + // create symmetrically encrypted message +- EnigmailOpenPGP.openpgp.encrypt(enc).then(msg => { +- let msgData = EnigmailArmor.replaceArmorHeaders(msg.data, { ++ try { ++ let msg = EnigmailGpg.symmetricEncrypt(enc); ++ let msgData = EnigmailArmor.replaceArmorHeaders(msg, { + 'Passphrase-Format': 'numeric9x4', + 'Passphrase-Begin': bkpCode.substr(0, 2) + }).replace(/\n/g, "\r\n"); +@@ -487,10 +487,10 @@ var EnigmailAutocrypt = { + msg: m, + passwd: bkpCode + }); +- }).catch(e => { ++ } catch(e) { + EnigmailLog.DEBUG("autocrypt.jsm: createSetupMessage: error " + e + "\n"); + reject(2); +- }); ++ } + } + catch (ex) { + EnigmailLog.DEBUG("autocrypt.jsm: createSetupMessage: error " + ex.toString() + "\n"); +@@ -598,46 +598,46 @@ var EnigmailAutocrypt = { + end = {}; + let msgType = EnigmailArmor.locateArmoredBlock(attachmentData, 0, "", start, end, {}); + +- EnigmailOpenPGP.openpgp.message.readArmored(attachmentData.substring(start.value, end.value)).then(encMessage => { +- let enc = { +- message: encMessage, +- passwords: [passwd], +- format: 'utf8' +- }; ++ let encMessage = attachmentData.substring(start.value, end.value); + +- return EnigmailOpenPGP.openpgp.decrypt(enc); +- }) +- .then(msg => { +- EnigmailLog.DEBUG("autocrypt.jsm: handleBackupMessage: data: " + msg.data.length + "\n"); +- +- let setupData = importSetupKey(msg.data); +- if (setupData) { +- EnigmailKeyEditor.setKeyTrust(null, "0x" + setupData.fpr, "5", function(returnCode) { +- if (returnCode === 0) { +- let id = EnigmailStdlib.getIdentityForEmail(EnigmailFuncs.stripEmail(fromAddr).toLowerCase()); +- let ac = EnigmailFuncs.getAccountForIdentity(id.identity); +- ac.incomingServer.setBoolValue("enableAutocrypt", true); +- ac.incomingServer.setIntValue("acPreferEncrypt", (setupData.preferEncrypt === "mutual" ? 1 : 0)); +- id.identity.setCharAttribute("pgpkeyId", "0x" + setupData.fpr); +- id.identity.setBoolAttribute("enablePgp", true); +- id.identity.setBoolAttribute("pgpSignEncrypted", true); +- id.identity.setBoolAttribute("pgpMimeMode", true); +- id.identity.setIntAttribute("pgpKeyMode", 1); +- EnigmailPrefs.setPref("juniorMode", 1); +- resolve(setupData); +- } +- else { +- reject("keyImportFailed"); +- } +- }); +- } +- else { +- reject("keyImportFailed"); +- } +- }). +- catch(err => { ++ let enc = { ++ message: encMessage, ++ password: passwd, ++ format: 'utf8' ++ }; ++ ++ try { ++ let msg = EnigmailGpg.symmetricDecrypt(enc); ++ ++ EnigmailLog.DEBUG("autocrypt.jsm: handleBackupMessage: data: " + msg.length + "\n"); ++ ++ let setupData = importSetupKey(msg); ++ if (setupData) { ++ EnigmailKeyEditor.setKeyTrust(null, "0x" + setupData.fpr, "5", function(returnCode) { ++ if (returnCode === 0) { ++ let id = EnigmailStdlib.getIdentityForEmail(EnigmailFuncs.stripEmail(fromAddr).toLowerCase()); ++ let ac = EnigmailFuncs.getAccountForIdentity(id.identity); ++ ac.incomingServer.setBoolValue("enableAutocrypt", true); ++ ac.incomingServer.setIntValue("acPreferEncrypt", (setupData.preferEncrypt === "mutual" ? 1 : 0)); ++ id.identity.setCharAttribute("pgpkeyId", "0x" + setupData.fpr); ++ id.identity.setBoolAttribute("enablePgp", true); ++ id.identity.setBoolAttribute("pgpSignEncrypted", true); ++ id.identity.setBoolAttribute("pgpMimeMode", true); ++ id.identity.setIntAttribute("pgpKeyMode", 1); ++ EnigmailPrefs.setPref("juniorMode", 1); ++ resolve(setupData); ++ } ++ else { ++ reject("keyImportFailed"); ++ } ++ }); ++ } ++ else { ++ reject("keyImportFailed"); ++ } ++ } catch(err) { + reject("wrongPasswd"); +- }); ++ } + }); + }, + +diff --git a/package/gpg.jsm b/package/gpg.jsm +index 70465bf..489b1cd 100644 +--- a/package/gpg.jsm ++++ b/package/gpg.jsm +@@ -382,10 +382,164 @@ var EnigmailGpg = { + } + }, + ++ symmetricEncrypt: function(params) { ++ EnigmailLog.DEBUG("gpg.jsm: symmetricEncrypt:\n"); ++ ++ const args = EnigmailGpg.getStandardArgs(false). ++ concat(['--no-options', ++ '--no-keyring', ++ '--no-symkey-cache', ++ '--cipher-algo=aes256', ++ '--pinentry-mode=loopback', ++ '--passphrase-fd=4', ++ '--status-fd=5', ++ '--symmetric']); ++ if (params.armor) ++ args.push('--armor'); ++ ++ try { ++ let statusdata = ''; ++ let ciphertext; ++ let warnings = []; ++ const proc = subprocess.call({ ++ command: EnigmailGpg.agentPath, ++ arguments: args, ++ environment: EnigmailCore.getEnvList(), ++ charset: null, ++ stdin: params.message, ++ infds: { 4: params.password }, ++ outfds: { ++ 5: function(data) { ++ statusdata += data; ++ } ++ }, ++ mergeStderr: false, ++ done: function(result) { ++ if (result.exitCode != 0) { ++ warnings.unshift("non-zero return code! " + result.exitCode); ++ return; ++ } ++ if (statusdata.match(/\[GNUPG:\] NEED_PASSPHRASE_SYM \d+ \d+ \d+\n\[GNUPG:\] BEGIN_ENCRYPTION \d+ \d+\n\[GNUPG:\] END_ENCRYPTION\n/) === null) { ++ warnings.unshift("status return was unexpected: " + statusdata); ++ return; ++ } ++ ciphertext = result.stdout; ++ } ++ }); ++ proc.wait(); ++ if (warnings.length) { ++ for (let ix in warnings) { ++ /* we display the warnings here because it's not clear to ++ * dkg that the "done" function is running from a thread ++ * capable of executing them correctly. */ ++ EnigmailLog.WARNING(warnings[ix]+"\n"); ++ } ++ } ++ if (ciphertext == undefined) ++ EnigmailLog.WARNING("ciphertext output was never received\n"); ++ return ciphertext; ++ } ++ catch (ex) { ++ EnigmailLog.ERROR("enigmailCommon.jsm: encryptSymmetric: subprocess.call failed with '" + ex.toString() + "'\n"); ++ throw ex; ++ } ++ }, ++ ++ /* params contains fields: message (string), password (string), and format (string). ++ */ ++ symmetricDecrypt: function(params) { ++ EnigmailLog.DEBUG("gpg.jsm: symmetricDecrypt:\n"); ++ ++ const args = EnigmailGpg.getStandardArgs(false). ++ concat(['--no-options', ++ '--no-keyring', ++ '--no-symkey-cache', ++ '--pinentry-mode=loopback', ++ '--passphrase-fd=4', ++ '--status-fd=5', ++ '--decrypt']); ++ /* FIXME: format is going to be 'utf8' -- what does that mean, and ++ * how do we apply it to GnuPG? */ ++ ++ try { ++ let statusdata = ''; ++ let cleartext; ++ let warnings = []; ++ const proc = subprocess.call({ ++ command: EnigmailGpg.agentPath, ++ arguments: args, ++ environment: EnigmailCore.getEnvList(), ++ charset: null, ++ stdin: params.message, ++ infds: { 4: params.password }, ++ outfds: { ++ 5: function(data) { ++ statusdata += data; ++ } ++ }, ++ mergeStderr: false, ++ done: function(result) { ++ if (result.exitCode != 0) { ++ warnings.unshift("non-zero return code when decrypting! " + result.exitCode); ++ return; ++ } ++ ++ let decrypt_status_re = /\[GNUPG:\] NEED_PASSPHRASE_SYM \d+ \d+ \d+\n\[GNUPG:] BEGIN_DECRYPTION\n(\[GNUPG:\] DECRYPTION_COMPLIANCE_MODE \d+\n)?\[GNUPG:\] DECRYPTION_INFO \d+ \d+\n\[GNUPG:\] PLAINTEXT \d+ \d+[^\n]*\n(\[GNUPG:\] PLAINTEXT_LENGTH (\d+)\n)?\[GNUPG:\] DECRYPTION_OKAY\n(\[GNUPG:\] GOODMDC\n)?\[GNUPG:\] END_DECRYPTION\n/m ++ let matched = false; ++ let found = decrypt_status_re.exec(statusdata); ++ if (found !== null) { ++ let all = found[0]; ++ let compliance = found[1]; ++ let plen_line = found[2]; ++ let plen = found[3]; ++ let mdc = found[4]; ++ if (all != statusdata) ++ warnings.unshift("Got GnuPG status lines: " + statusdata + "Only matched GnuPG status lines: " + all); ++ /* PLAINTEXT_LENGTH does not necessarily match exactly: ++ * see https://dev.gnupg.org/T4741. Instead, we assume ++ * that the length could be halved (nothing but CRLFs, ++ * generated on Windows, read on unix) or doubled (nothing ++ * but LFs on unix, read on Windows) at most.*/ ++ if (plen_line) ++ if ((result.stdout.length > plen*2) || ++ (result.stdout.length < plen/2)) ++ warnings.unshift("Status line claimed " + plen + "bytes, but we got " + result.stdout.length); ++ if (mdc != "[GNUPG:] GOODMDC\n") { ++ warnings.unshift("No MDC used in encryption, skipping decryption"); ++ return; ++ } ++ matched = true; ++ } ++ if (!matched) { ++ warnings.unshift("Status FDs did not match!"); ++ return; ++ } ++ cleartext = result.stdout; ++ } ++ }); ++ proc.wait(); ++ if (warnings.length) { ++ for (let ix in warnings) { ++ /* we display the warnings here because it's not clear to ++ * dkg that the "done" function is running from a thread ++ * capable of executing them correctly. */ ++ EnigmailLog.WARNING(warnings[ix]+"\n"); ++ } ++ } ++ if (cleartext == undefined) ++ EnigmailLog.WARNING("cleartext output was never received\n"); ++ return cleartext; ++ } ++ catch (ex) { ++ EnigmailLog.ERROR("enigmailCommon.jsm: decryptSymmetric: subprocess.call failed with '" + ex.toString() + "'\n"); ++ throw ex; ++ } ++ }, ++ + /** + * For versions of GPG 2.1 and higher, checks to see if the dirmngr is configured to use Tor + * + * @return Boolean - True if dirmngr is configured with Tor. False otherwise + */ + dirmngrConfiguredWithTor: dirmngrConfiguredWithTor +-}; +\ No newline at end of file ++}; diff -Nru enigmail-2.0.12+ds1/debian/patches/0009-add-test-to-do-symmetric-encryption-decryption-with-.patch enigmail-2.1.3+ds1/debian/patches/0009-add-test-to-do-symmetric-encryption-decryption-with-.patch --- enigmail-2.0.12+ds1/debian/patches/0009-add-test-to-do-symmetric-encryption-decryption-with-.patch 2019-08-21 16:40:51.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0009-add-test-to-do-symmetric-encryption-decryption-with-.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,114 +0,0 @@ -From: Daniel Kahn Gillmor -Date: Sat, 29 Sep 2018 23:32:32 -0500 -Subject: add test to do symmetric encryption/decryption with gpg - ---- - ipc/tests/subprocess-test.js | 95 ++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 95 insertions(+) - -diff --git a/ipc/tests/subprocess-test.js b/ipc/tests/subprocess-test.js -index 8df107e..72ed872 100644 ---- a/ipc/tests/subprocess-test.js -+++ b/ipc/tests/subprocess-test.js -@@ -328,6 +328,101 @@ function run_test() { - - p.wait(); - -+ ///////////////////////////////////////////////////////////////// -+ // Test gpg use with extra file descriptors -+ ///////////////////////////////////////////////////////////////// -+ -+ do_print("GnuPG passphrase-based crypto"); -+ -+ let passphrase = "monkey"; -+ let cleartext = "bananas"; -+ let statusdata = ""; -+ let ciphertext; -+ try { -+ p = subprocess.call({ -+ command: "/usr/bin/gpg", -+ arguments: ['--no-options', -+ '--no-keyring', -+ '--batch', -+ '--no-tty', -+ '--with-colons', -+ '--fixed-list-mode', -+ '--armor', -+ '--cipher-algo=aes256', -+ '--pinentry-mode=loopback', -+ '--passphrase-fd=4', -+ '--status-fd=5', -+ '--symmetric', -+ ], -+ environment: envList, -+ stdin: function(pipe) { -+ pipe.write(cleartext); -+ pipe.close(); -+ }, -+ infds: {4: passphrase }, -+ outfds: {5: function(data) { -+ statusdata += data; -+ } }, -+ done: function(result) { -+ ciphertext = result.stdout; -+ Assert.equal(0, result.exitCode, "exit code"); -+ Assert.equal(statusdata, "[GNUPG:] NEED_PASSPHRASE_SYM 9 3 2\n[GNUPG:] BEGIN_ENCRYPTION 2 9\n[GNUPG:] END_ENCRYPTION\n", "status data"); -+ }, -+ mergeStderr: false -+ }); -+ } catch (ex) { -+ Assert.ok(false, "error: " + ex); -+ } -+ -+ p.wait(); -+ -+ statusdata=""; -+ let decrypt_status_re = /\[GNUPG:\] NEED_PASSPHRASE_SYM \d+ \d+ \d+\n\[GNUPG:] BEGIN_DECRYPTION\n(\[GNUPG:\] DECRYPTION_COMPLIANCE_MODE \d+\n)?\[GNUPG:\] DECRYPTION_INFO \d+ \d+\n\[GNUPG:\] PLAINTEXT \d+ \d+ *\n(\[GNUPG:\] PLAINTEXT_LENGTH (\d+)\n)?\[GNUPG:\] DECRYPTION_OKAY\n(\[GNUPG:\] GOODMDC\n)?\[GNUPG:\] END_DECRYPTION\n/m -+ -+ try { -+ p = subprocess.call({ -+ command: "/usr/bin/gpg", -+ arguments: ['--no-options', -+ '--no-keyring', -+ '--no-symkey-cache', -+ '--batch', -+ '--no-tty', -+ '--with-colons', -+ '--fixed-list-mode', -+ '--pinentry-mode=loopback', -+ '--passphrase-fd=4', -+ '--status-fd=5', -+ '--decrypt', -+ ], -+ environment: envList, -+ stdin: function(pipe) { -+ pipe.write(ciphertext); -+ pipe.close(); -+ }, -+ infds: {4: passphrase }, -+ outfds: {5: function(data) { -+ statusdata += data; -+ } }, -+ done: function(result) { -+ Assert.equal(0, result.exitCode, "exit code"); -+ Assert.equal(cleartext, result.stdout, "decryption successful"); -+ let matched = false; -+ statusdata.replace(decrypt_status_re, function(all, compliance, plen_line, plaintext_len, mdc) { -+ matched = true; -+ Assert.equal(all, statusdata, "no unexpected status lines"); -+ if (plen_line) -+ Assert.equal(result.stdout.length, plaintext_len, "plaintext length correct"); -+ Assert.equal(mdc, "[GNUPG:] GOODMDC\n", "MDC present"); -+ }); -+ Assert.ok(matched, "status-fd produced what we expected"); -+ }, -+ mergeStderr: false -+ }); -+ } catch (ex) { -+ Assert.ok(false, "error: " + ex); -+ } -+ -+ p.wait(); - - ///////////////////////////////////////////////////////////////// - // Test many concurrent runs diff -Nru enigmail-2.0.12+ds1/debian/patches/0009-tests-wrap-individual-tests-in-key-test-with-withTes.patch enigmail-2.1.3+ds1/debian/patches/0009-tests-wrap-individual-tests-in-key-test-with-withTes.patch --- enigmail-2.0.12+ds1/debian/patches/0009-tests-wrap-individual-tests-in-key-test-with-withTes.patch 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0009-tests-wrap-individual-tests-in-key-test-with-withTes.patch 2019-11-19 07:25:37.000000000 +0000 @@ -0,0 +1,66 @@ +From: Daniel Kahn Gillmor +Date: Thu, 4 Oct 2018 23:36:30 -0500 +Subject: tests: wrap individual tests in key-test with withTestGpgHome() + +this helps ensure that we avoid working with someone else's keys. +--- + package/tests/key-test.js | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/package/tests/key-test.js b/package/tests/key-test.js +index 486d8e1..25f24e5 100644 +--- a/package/tests/key-test.js ++++ b/package/tests/key-test.js +@@ -15,7 +15,7 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withE + testing("key.jsm"); /*global EnigmailKey: false, EnigmailOpenPGP: false */ + //EnigmailOpenPGP.initialize(); // make sure OpenPGP is initialized and available + +-test(function shouldGetKeyDetails() { ++test(withTestGpgHome(function shouldGetKeyDetails() { + const publicKey = do_get_file("resources/dev-strike.asc", false); + const secretKey = do_get_file("resources/dev-strike.sec", false); + +@@ -40,9 +40,9 @@ test(function shouldGetKeyDetails() { + Assert.equal(k.fpr, "65537E212DC19025AD38EDB2781617319CE311C4"); + Assert.equal(k.isSecret, true); + +-}); ++})); + +-test(function shouldSplitKeys() { ++test(withTestGpgHome(function shouldSplitKeys() { + const publicKey1 = do_get_file("resources/dev-strike.asc", false); + const publicKey2 = do_get_file("resources/dev-tiger.asc", false); + +@@ -57,10 +57,10 @@ test(function shouldSplitKeys() { + Assert.equal(k.fpr, "8C140834F2D683E9A016D3098439E17046977C46"); + Assert.equal(k.isSecret, false); + +-}); ++})); + + +-test(function shouldMergePubAndSec() { ++test(withTestGpgHome(function shouldMergePubAndSec() { + const keyList = EnigmailKey.getKeyListFromKeyBlock( + "-----BEGIN PGP PUBLIC KEY BLOCK-----" + + "\n" + "Comment: GPGTools - https://gpgtools.org" + +@@ -228,9 +228,9 @@ test(function shouldMergePubAndSec() { + Assert.ok(k.isSecret); + Assert.equal(k.name, "anonymous strike "); + +-}); ++})); + +-test(function testBinary() { ++test(withTestGpgHome(function testBinary() { + let data = atob( + "mQINBFVHm5sBEACs94Ln+RMdeyBpWQtTZ/NZnwntsB10Wd3HTgo5sdA/OOFOJrWetJfAZ/HRxiSu1bwRaFVC8p061ftTbxf8bsdfsykYJQQqPODfcO0/oY2n/Z93ya8KTzjXR3qBQ1P7f5x71yeuo7Zrj7B0G44Xjfy+1L0eka9paBqmm3U5cUew5wSr772LcflipWfncWXD2rBqgRfR339lRHd3Vwo7V8jje8rlP9msOuTMWCvQuQvpEkfIioXA7QipP2f0aPzsavNjFnAfC9rm2FDs6lX4syTMVUWy8IblRYo6MjhNaJFlBJkTCl0bugT9Ge0ZUifuAI0ihVGBpMSh4GF2B3ZPidwGSjgx1sojNHzU/3vBa9DuOmW95qrDNotvz61xYueTpOYK6ZeT880QMDvxXG9S5/H1KJxuOF1jx1DibAn9sfP4gtiQFI3FWMV9w3YrrqidoWSZBqyBO0Toqt" + + "5fNdRyH4ET6HlJAQmFQUbqqnZrc07s/aITZN36d9eupCZQfW6e80UkXRPCU53vhh0GQey9reDyVCsV7xi6oXk1fqlpDYigQwEr4+yJ+1qAjtSVHJhFE0inQWkUwc2nxef6n7v/M9HszhP/aABadVE49oDaRm54PtA1l0mCT8IHcVR4ZDkaNwrHJtidEQcQ/+YVV3g7UJI9+g2nPvgMhk86AzBIlGpG+wARAQABtCthbm9ueW1vdXMgc3RyaWtlIDxzdHJpa2UuZGV2dGVzdEBnbWFpbC5jb20+iQI9BBMBCgAnBQJVR5ubAhsDBQkHhh+ABQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEHgWFzGc4xHEt/4P/1zf/2VsEwpJVlqwoLiJGQbViCRW34W8rTyL45GjRYAgDXrWLDPqxSbotXTXi72Dwug6a/Pn1VI1R2ZaBsWXH8qUYtSV/0b/2Hfq" + +@@ -248,4 +248,4 @@ test(function testBinary() { + Assert.equal(k.id, "781617319CE311C4"); + Assert.ok(!k.isSecret); + Assert.equal(k.name, "anonymous strike "); +-}); +\ No newline at end of file ++})); diff -Nru enigmail-2.0.12+ds1/debian/patches/0010-Avoid-errors-on-validKeyserversExist.patch enigmail-2.1.3+ds1/debian/patches/0010-Avoid-errors-on-validKeyserversExist.patch --- enigmail-2.0.12+ds1/debian/patches/0010-Avoid-errors-on-validKeyserversExist.patch 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0010-Avoid-errors-on-validKeyserversExist.patch 2019-11-19 07:25:37.000000000 +0000 @@ -0,0 +1,26 @@ +From: Daniel Kahn Gillmor +Date: Tue, 5 Nov 2019 20:37:18 -0500 +Subject: Avoid errors on validKeyserversExist() + +This change is intended to clear these errors when running the unit +tests: + +JavaScript error: chrome://enigmail/content/modules/keyserverUris.jsm, line 114: TypeError: EnigmailPrefs.getPref(...) is undefined +--- + package/keyserverUris.jsm | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/package/keyserverUris.jsm b/package/keyserverUris.jsm +index 57f6bc8..c06db46 100644 +--- a/package/keyserverUris.jsm ++++ b/package/keyserverUris.jsm +@@ -111,7 +111,8 @@ function buildKeyserverUris() { + * @return true if keyservers exist and are valid, false otherwise. + */ + function validKeyserversExist() { +- return EnigmailPrefs.getPref(KEYSERVER_PREF).trim() !== "" && validProtocolsExist(); ++ const keyservers = EnigmailPrefs.getPref(KEYSERVER_PREF); ++ return keyservers !== undefined && keyservers.trim() !== "" && validProtocolsExist(); + } + + var EnigmailKeyserverURIs = { diff -Nru enigmail-2.0.12+ds1/debian/patches/0010-use-GnuPG-instead-of-openpgp.js-for-symmetric-encryp.patch enigmail-2.1.3+ds1/debian/patches/0010-use-GnuPG-instead-of-openpgp.js-for-symmetric-encryp.patch --- enigmail-2.0.12+ds1/debian/patches/0010-use-GnuPG-instead-of-openpgp.js-for-symmetric-encryp.patch 2019-08-21 16:40:51.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0010-use-GnuPG-instead-of-openpgp.js-for-symmetric-encryp.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,208 +0,0 @@ -From: Daniel Kahn Gillmor -Date: Sun, 30 Sep 2018 01:54:12 -0500 -Subject: use GnuPG instead of openpgp.js for symmetric encryption/decryption - -This enables all the test suite to pass, and should enable proper use -of the Autocrypt setup message. ---- - package/autocrypt.jsm | 24 ++++++----- - package/gpg.jsm | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 123 insertions(+), 11 deletions(-) - -diff --git a/package/autocrypt.jsm b/package/autocrypt.jsm -index ea6a869..b62be8c 100644 ---- a/package/autocrypt.jsm -+++ b/package/autocrypt.jsm -@@ -40,6 +40,7 @@ Cu.import("resource://enigmail/keyEditor.jsm"); /*global EnigmailKeyEditor: fals - Cu.import("resource://enigmail/stdlib.jsm"); /*global EnigmailStdlib: false */ - Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ - Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ -+Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ - - var gCreatedSetupIds = []; - -@@ -404,8 +405,9 @@ var EnigmailAutocrypt = { - }; - - // create symmetrically encrypted message -- EnigmailOpenPGP.openpgp.encrypt(enc).then(msg => { -- let msgData = EnigmailArmor.replaceArmorHeaders(msg.data, { -+ try { -+ let msg = EnigmailGpg.symmetricEncrypt(enc); -+ let msgData = EnigmailArmor.replaceArmorHeaders(msg, { - 'Passphrase-Format': 'numeric9x4', - 'Passphrase-Begin': bkpCode.substr(0, 2) - }).replace(/\n/g, "\r\n"); -@@ -415,11 +417,11 @@ var EnigmailAutocrypt = { - msg: m, - passwd: bkpCode - }); -- }).catch(e => { -+ } catch (e) { - EnigmailLog.DEBUG("autocrypt.jsm: createSetupMessage: error " + e + "\n"); - reject(2); - return; -- }); -+ } - }); - }, - -@@ -524,7 +526,7 @@ var EnigmailAutocrypt = { - end = {}; - let msgType = EnigmailArmor.locateArmoredBlock(attachmentData, 0, "", start, end, {}); - -- let encMessage = EnigmailOpenPGP.openpgp.message.readArmored(attachmentData.substring(start.value, end.value)); -+ let encMessage = attachmentData.substring(start.value, end.value); - - let enc = { - message: encMessage, -@@ -532,10 +534,11 @@ var EnigmailAutocrypt = { - format: 'utf8' - }; - -- EnigmailOpenPGP.openpgp.decrypt(enc).then(msg => { -- EnigmailLog.DEBUG("autocrypt.jsm: handleBackupMessage: data: " + msg.data.length + "\n"); -+ try { -+ let msg = EnigmailGpg.symmetricDecrypt(enc); -+ EnigmailLog.DEBUG("autocrypt.jsm: handleBackupMessage: data: " + msg.length + "\n"); - -- let setupData = importSetupKey(msg.data); -+ let setupData = importSetupKey(msg); - if (setupData) { - EnigmailKeyEditor.setKeyTrust(null, "0x" + setupData.fpr, "5", function(returnCode) { - if (returnCode === 0) { -@@ -561,11 +564,10 @@ var EnigmailAutocrypt = { - reject("keyImportFailed"); - return; - } -- }). -- catch(err => { -+ } catch (err) { - reject("wrongPasswd"); - return; -- }); -+ } - }); - }, - -diff --git a/package/gpg.jsm b/package/gpg.jsm -index 03be8e3..8fcb91f 100644 ---- a/package/gpg.jsm -+++ b/package/gpg.jsm -@@ -386,6 +386,116 @@ var EnigmailGpg = { - } - }, - -+ symmetricEncrypt: function(params) { -+ EnigmailLog.DEBUG("gpg.jsm: symmetricEncrypt:\n"); -+ -+ const args = EnigmailGpg.getStandardArgs(false). -+ concat(['--no-options', -+ '--no-keyring', -+ '--no-symkey-cache', -+ '--cipher-algo=aes256', -+ '--pinentry-mode=loopback', -+ '--passphrase-fd=4', -+ '--status-fd=5', -+ '--symmetric']); -+ if (params.armor) -+ args.push('--armor'); -+ -+ try { -+ let statusdata = ''; -+ let ciphertext; -+ const proc = subprocess.call({ -+ command: EnigmailGpg.agentPath, -+ arguments: args, -+ environment: EnigmailCore.getEnvList(), -+ charset: null, -+ stdin: params.data, -+ infds: { 4: params.passwords }, -+ outfds: { -+ 5: function(data) { -+ statusdata += data; -+ } -+ }, -+ mergeStderr: false, -+ done: function(result) { -+ if (result.exitCode != 0) -+ throw "non-zero return code! " + result.exitCode; -+ if (statusdata.match(/\[GNUPG:\] NEED_PASSPHRASE_SYM \d+ \d+ \d+\n\[GNUPG:\] BEGIN_ENCRYPTION \d+ \d+\n\[GNUPG:\] END_ENCRYPTION\n/) === null) -+ throw "status return was unexpected: " + statusdata; -+ ciphertext = result.stdout; -+ } -+ }); -+ proc.wait(); -+ return ciphertext; -+ } -+ catch (ex) { -+ EnigmailLog.ERROR("enigmailCommon.jsm: encryptSymmetric: subprocess.call failed with '" + ex.toString() + "'\n"); -+ throw ex; -+ } -+ }, -+ -+ /* params contains fields: message (string), password (string), and format (string). -+ */ -+ symmetricDecrypt: function(params) { -+ EnigmailLog.DEBUG("gpg.jsm: symmetricDecrypt:\n"); -+ -+ const args = EnigmailGpg.getStandardArgs(false). -+ concat(['--no-options', -+ '--no-keyring', -+ '--no-symkey-cache', -+ '--pinentry-mode=loopback', -+ '--passphrase-fd=4', -+ '--status-fd=5', -+ '--decrypt']); -+ /* FIXME: format is going to be 'utf8' -- what does that mean, and -+ * how do we apply it to GnuPG? */ -+ -+ try { -+ let statusdata = ''; -+ let cleartext; -+ const proc = subprocess.call({ -+ command: EnigmailGpg.agentPath, -+ arguments: args, -+ environment: EnigmailCore.getEnvList(), -+ charset: null, -+ stdin: params.message, -+ infds: { 4: params.password }, -+ outfds: { -+ 5: function(data) { -+ statusdata += data; -+ } -+ }, -+ mergeStderr: false, -+ done: function(result) { -+ if (result.exitCode != 0) -+ throw "non-zero return code when decrypting! " + result.exitCode; -+ -+ let decrypt_status_re = /\[GNUPG:\] NEED_PASSPHRASE_SYM \d+ \d+ \d+\n\[GNUPG:] BEGIN_DECRYPTION\n(\[GNUPG:\] DECRYPTION_COMPLIANCE_MODE \d+\n)?\[GNUPG:\] DECRYPTION_INFO \d+ \d+\n\[GNUPG:\] PLAINTEXT \d+ \d+ *\n(\[GNUPG:\] PLAINTEXT_LENGTH (\d+)\n)?\[GNUPG:\] DECRYPTION_OKAY\n(\[GNUPG:\] GOODMDC\n)?\[GNUPG:\] END_DECRYPTION\n/m -+ let matched = false; -+ statusdata.replace(decrypt_status_re, function(all, compliance, plen_line, plen, mdc) { -+ if (all != statusdata) -+ throw "Got GnuPG status lines: " + statusdata + "Only matched GnuPG status lines: " + all; -+ if (plen_line) -+ if (result.stdout.length != plen) -+ throw "Status line claimed " + plen + "bytes, but we got " + result.stdout.length; -+ if (mdc != "[GNUPG:] GOODMDC\n") -+ throw "No MDC used in encryption"; -+ matched = true; -+ }); -+ if (!matched) -+ throw "Status FDs did not match!"; -+ cleartext = result.stdout; -+ } -+ }); -+ proc.wait(); -+ return cleartext; -+ } -+ catch (ex) { -+ EnigmailLog.ERROR("enigmailCommon.jsm: decryptSymmetric: subprocess.call failed with '" + ex.toString() + "'\n"); -+ throw ex; -+ } -+ }, -+ - /** - * For versions of GPG 2.1 and higher, checks to see if the dirmngr is configured to use Tor - * diff -Nru enigmail-2.0.12+ds1/debian/patches/0011-drop-unnecessary-tests.patch enigmail-2.1.3+ds1/debian/patches/0011-drop-unnecessary-tests.patch --- enigmail-2.0.12+ds1/debian/patches/0011-drop-unnecessary-tests.patch 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0011-drop-unnecessary-tests.patch 2019-11-19 07:25:37.000000000 +0000 @@ -0,0 +1,37 @@ +From: Daniel Kahn Gillmor +Date: Wed, 6 Nov 2019 01:42:24 -0500 +Subject: Drop unnecessary tests in keyObj-test.js + +See Message-ID: <8736f1nfsd.fsf@fifthhorseman.net> (and followup +messages) on enigmail-users@enigmail.net for more discussion about why +these tests are bogus and irrelevant for debian. +--- + package/tests/keyObj-test.js | 17 +---------------- + 1 file changed, 1 insertion(+), 16 deletions(-) + +diff --git a/package/tests/keyObj-test.js b/package/tests/keyObj-test.js +index 0042e02..a82caa5 100644 +--- a/package/tests/keyObj-test.js ++++ b/package/tests/keyObj-test.js +@@ -37,19 +37,4 @@ test(withTestGpgHome(withEnigmail(function shouldExportMinimalSubkey() { + Assert.equal(minKey.keyData.substr(0, 50), "mQGNBFub08oBDACmb04i4u8xUV1ADbnbN5l83mpr70OyWVJb5E"); + Assert.equal(minKey.keyData.substr(-50, 50), "p9TFNKjguUrrGrVnmnmy/YoGTJWuGqrZy8kcC3LCjg0k2mV0M="); + } +- +- EnigmailGpg.agentVersion = "2.2.1"; +- Assert.ok(!EnigmailGpg.getGpgFeature("export-specific-uid")); +- +- let minKey = keyObj.getMinimalPubKey("bob@somewhere.invalid"); +- Assert.equal(minKey.exitCode, 0); +- Assert.equal(minKey.keyData.substr(3, 50), "NBFub08oBDACmb04i4u8xUV1ADbnbN5l83mpr70OyWVJb5ElIc"); +- Assert.ok(minKey.keyData.substr(-50, 50) == "1MU0qOC5SusatWeaebL9igZMla4aqtnLyRwLcsKODSTaZXQw==" || +- minKey.keyData.substr(-50, 50) == "p9TFNKjguUrrGrVnmnmy/YoGTJWuGqrZy8kcC3LCjg0k2mV0M=", "min key matches"); +- +- minKey = keyObj.getMinimalPubKey("does@not.exist"); +- Assert.equal(minKey.exitCode, 0); +- +- Assert.equal(minKey.keyData.substr(0, 50), "xsDNBFub08oBDACmb04i4u8xUV1ADbnbN5l83mpr70OyWVJb5E"); +- Assert.equal(minKey.keyData.substr(-50, 50), "1MU0qOC5SusatWeaebL9igZMla4aqtnLyRwLcsKODSTaZXQw=="); +-}))); +\ No newline at end of file ++}))); diff -Nru enigmail-2.0.12+ds1/debian/patches/0011-tests-wrap-individual-tests-in-key-test-with-withTes.patch enigmail-2.1.3+ds1/debian/patches/0011-tests-wrap-individual-tests-in-key-test-with-withTes.patch --- enigmail-2.0.12+ds1/debian/patches/0011-tests-wrap-individual-tests-in-key-test-with-withTes.patch 2019-08-21 16:40:51.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0011-tests-wrap-individual-tests-in-key-test-with-withTes.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -From: Daniel Kahn Gillmor -Date: Thu, 4 Oct 2018 23:36:30 -0500 -Subject: tests: wrap individual tests in key-test with withTestGpgHome() - -this helps ensure that we avoid working with someone else's keys. ---- - package/tests/key-test.js | 16 ++++++++-------- - 1 file changed, 8 insertions(+), 8 deletions(-) - -diff --git a/package/tests/key-test.js b/package/tests/key-test.js -index 38a3b26..093f385 100644 ---- a/package/tests/key-test.js -+++ b/package/tests/key-test.js -@@ -18,7 +18,7 @@ component("enigmail/files.jsm"); /*global EnigmailFiles: false */ - component("enigmail/openpgp.jsm"); /*global EnigmailOpenPGP: false */ - //EnigmailOpenPGP.initialize(); // make sure OpenPGP is initialized and available - --test(function shouldGetKeyDetails() { -+test(withTestGpgHome(function shouldGetKeyDetails() { - const publicKey = do_get_file("resources/dev-strike.asc", false); - const secretKey = do_get_file("resources/dev-strike.sec", false); - -@@ -43,9 +43,9 @@ test(function shouldGetKeyDetails() { - Assert.equal(k.fpr, "65537E212DC19025AD38EDB2781617319CE311C4"); - Assert.equal(k.isSecret, true); - --}); -+})); - --test(function shouldSplitKeys() { -+test(withTestGpgHome(function shouldSplitKeys() { - const publicKey1 = do_get_file("resources/dev-strike.asc", false); - const publicKey2 = do_get_file("resources/dev-tiger.asc", false); - -@@ -65,10 +65,10 @@ test(function shouldSplitKeys() { - Assert.equal(k.fpr, "8C140834F2D683E9A016D3098439E17046977C46"); - Assert.equal(k.isSecret, false); - --}); -+})); - - --test(function shouldMergePubAndSec() { -+test(withTestGpgHome(function shouldMergePubAndSec() { - const keyList = EnigmailKey.getKeyListFromKeyBlock( - "-----BEGIN PGP PUBLIC KEY BLOCK-----" + - "\n" + "Comment: GPGTools - https://gpgtools.org" + -@@ -236,9 +236,9 @@ test(function shouldMergePubAndSec() { - Assert.ok(k.isSecret); - Assert.equal(k.name, "anonymous strike "); - --}); -+})); - --test(function testBinary() { -+test(withTestGpgHome(function testBinary() { - let data = atob( - "mQINBFVHm5sBEACs94Ln+RMdeyBpWQtTZ/NZnwntsB10Wd3HTgo5sdA/OOFOJrWetJfAZ/HRxiSu1bwRaFVC8p061ftTbxf8bsdfsykYJQQqPODfcO0/oY2n/Z93ya8KTzjXR3qBQ1P7f5x71yeuo7Zrj7B0G44Xjfy+1L0eka9paBqmm3U5cUew5wSr772LcflipWfncWXD2rBqgRfR339lRHd3Vwo7V8jje8rlP9msOuTMWCvQuQvpEkfIioXA7QipP2f0aPzsavNjFnAfC9rm2FDs6lX4syTMVUWy8IblRYo6MjhNaJFlBJkTCl0bugT9Ge0ZUifuAI0ihVGBpMSh4GF2B3ZPidwGSjgx1sojNHzU/3vBa9DuOmW95qrDNotvz61xYueTpOYK6ZeT880QMDvxXG9S5/H1KJxuOF1jx1DibAn9sfP4gtiQFI3FWMV9w3YrrqidoWSZBqyBO0Toqt" + - "5fNdRyH4ET6HlJAQmFQUbqqnZrc07s/aITZN36d9eupCZQfW6e80UkXRPCU53vhh0GQey9reDyVCsV7xi6oXk1fqlpDYigQwEr4+yJ+1qAjtSVHJhFE0inQWkUwc2nxef6n7v/M9HszhP/aABadVE49oDaRm54PtA1l0mCT8IHcVR4ZDkaNwrHJtidEQcQ/+YVV3g7UJI9+g2nPvgMhk86AzBIlGpG+wARAQABtCthbm9ueW1vdXMgc3RyaWtlIDxzdHJpa2UuZGV2dGVzdEBnbWFpbC5jb20+iQI9BBMBCgAnBQJVR5ubAhsDBQkHhh+ABQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEHgWFzGc4xHEt/4P/1zf/2VsEwpJVlqwoLiJGQbViCRW34W8rTyL45GjRYAgDXrWLDPqxSbotXTXi72Dwug6a/Pn1VI1R2ZaBsWXH8qUYtSV/0b/2Hfq" + -@@ -256,4 +256,4 @@ test(function testBinary() { - Assert.equal(k.id, "781617319CE311C4"); - Assert.ok(!k.isSecret); - Assert.equal(k.name, "anonymous strike "); --}); -+})); diff -Nru enigmail-2.0.12+ds1/debian/patches/0012-convert-buildlist.py-to-unix-style-line-endings-no-f.patch enigmail-2.1.3+ds1/debian/patches/0012-convert-buildlist.py-to-unix-style-line-endings-no-f.patch --- enigmail-2.0.12+ds1/debian/patches/0012-convert-buildlist.py-to-unix-style-line-endings-no-f.patch 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0012-convert-buildlist.py-to-unix-style-line-endings-no-f.patch 2019-11-19 07:25:37.000000000 +0000 @@ -0,0 +1,98 @@ +From: Daniel Kahn Gillmor +Date: Fri, 8 Nov 2019 19:41:52 -0500 +Subject: convert buildlist.py to unix-style line-endings (no functional + change) + +--- + util/buildlist.py | 84 +++++++++++++++++++++++++++---------------------------- + 1 file changed, 42 insertions(+), 42 deletions(-) + +diff --git a/util/buildlist.py b/util/buildlist.py +index 20900ad..d430340 100644 +--- a/util/buildlist.py ++++ b/util/buildlist.py +@@ -1,42 +1,42 @@ +-# 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/. +- +-'''A generic script to add entries to a file +-if the entry does not already exist. +- +-Usage: buildlist.py [ ...] +-''' +-from __future__ import print_function +- +-import sys +-import os +-from utils import lockFile +- +-def addEntriesToListFile(listFile, entries): +- """Given a file |listFile| containing one entry per line, +- add each entry in |entries| to the file, unless it is already +- present.""" +- lock = lockFile(listFile + ".lck") +- try: +- if os.path.exists(listFile): +- f = open(listFile) +- existing = set(x.strip() for x in f.readlines()) +- f.close() +- else: +- existing = set() +- f = open(listFile, 'a') +- for e in entries: +- if e not in existing: +- f.write("{0}\n".format(e)) +- existing.add(e) +- f.close() +- finally: +- lock = None +- +-if __name__ == '__main__': +- if len(sys.argv) < 3: +- print("Usage: buildlist.py [ ...]", +- file=sys.stderr) +- sys.exit(1) +- addEntriesToListFile(sys.argv[1], sys.argv[2:]) ++# 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/. ++ ++'''A generic script to add entries to a file ++if the entry does not already exist. ++ ++Usage: buildlist.py [ ...] ++''' ++from __future__ import print_function ++ ++import sys ++import os ++from utils import lockFile ++ ++def addEntriesToListFile(listFile, entries): ++ """Given a file |listFile| containing one entry per line, ++ add each entry in |entries| to the file, unless it is already ++ present.""" ++ lock = lockFile(listFile + ".lck") ++ try: ++ if os.path.exists(listFile): ++ f = open(listFile) ++ existing = set(x.strip() for x in f.readlines()) ++ f.close() ++ else: ++ existing = set() ++ f = open(listFile, 'a') ++ for e in entries: ++ if e not in existing: ++ f.write("{0}\n".format(e)) ++ existing.add(e) ++ f.close() ++ finally: ++ lock = None ++ ++if __name__ == '__main__': ++ if len(sys.argv) < 3: ++ print("Usage: buildlist.py [ ...]", ++ file=sys.stderr) ++ sys.exit(1) ++ addEntriesToListFile(sys.argv[1], sys.argv[2:]) diff -Nru enigmail-2.0.12+ds1/debian/patches/0013-use-py2to3-2.7-to-convert-to-python3.patch enigmail-2.1.3+ds1/debian/patches/0013-use-py2to3-2.7-to-convert-to-python3.patch --- enigmail-2.0.12+ds1/debian/patches/0013-use-py2to3-2.7-to-convert-to-python3.patch 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0013-use-py2to3-2.7-to-convert-to-python3.patch 2019-11-19 07:25:37.000000000 +0000 @@ -0,0 +1,315 @@ +From: Daniel Kahn Gillmor +Date: Fri, 8 Nov 2019 19:42:39 -0500 +Subject: use py2to3-2.7 to convert to python3 + +--- + util/Expression.py | 8 ++++---- + util/JarMaker.py | 13 ++++++------- + util/MozZipFile.py | 12 ++++++------ + util/Preprocessor.py | 21 +++++++++++---------- + util/buildlist.py | 2 +- + util/checkFiles.py | 2 +- + util/run-tests.py | 2 +- + util/utils.py | 8 ++++---- + 8 files changed, 34 insertions(+), 34 deletions(-) + +diff --git a/util/Expression.py b/util/Expression.py +index ed22e38..ef85cd5 100644 +--- a/util/Expression.py ++++ b/util/Expression.py +@@ -34,7 +34,7 @@ class Expression: + self.__ignore_whitespace() + self.e = self.__get_logical_or() + if self.content: +- raise Expression.ParseError, self ++ raise Expression.ParseError(self) + + def __get_logical_or(self): + """ +@@ -135,7 +135,7 @@ class Expression: + if word_len: + rv = Expression.__ASTLeaf('string', self.content[:word_len]) + else: +- raise Expression.ParseError, self ++ raise Expression.ParseError(self) + self.__strip(word_len) + self.__ignore_whitespace() + return rv +@@ -174,7 +174,7 @@ class Expression: + return left and right + elif tok[1].value == '||': + return left or right +- raise Expression.ParseError, self ++ raise Expression.ParseError(self) + + # Mapping from token types to evaluator functions + # Apart from (non-)equality, all these can be simple lambda forms. +@@ -208,7 +208,7 @@ class Expression: + def __repr__(self): + return self.value.__repr__() + +- class ParseError(StandardError): ++ class ParseError(Exception): + """ + Error raised when parsing fails. + It has two members, offset and content, which give the offset of the +diff --git a/util/JarMaker.py b/util/JarMaker.py +index 3cb47ee..8e6e458 100644 +--- a/util/JarMaker.py ++++ b/util/JarMaker.py +@@ -16,7 +16,7 @@ import logging + from time import localtime + from optparse import OptionParser + from MozZipFile import ZipFile +-from cStringIO import StringIO ++from io import StringIO + from datetime import datetime + + from utils import pushback_iter, lockFile +@@ -176,8 +176,7 @@ class JarMaker(object): + ''' + lock = lockFile(manifestPath + '.lck') + try: +- myregister = dict.fromkeys(map(lambda s: s.replace('%', chromebasepath), +- register.iterkeys())) ++ myregister = dict.fromkeys([s.replace('%', chromebasepath) for s in iter(register.keys())]) + manifestExists = os.path.isfile(manifestPath) + mode = (manifestExists and 'r+b') or 'wb' + mf = open(manifestPath, mode) +@@ -189,7 +188,7 @@ class JarMaker(object): + continue + myregister[l] = None + mf.seek(0) +- for k in myregister.iterkeys(): ++ for k in myregister.keys(): + mf.write(k + os.linesep) + mf.close() + finally: +@@ -209,7 +208,7 @@ class JarMaker(object): + self.localedirs = [_normpath(p) for p in self.localedirs] + elif self.relativesrcdir: + self.localedirs = self.generateLocaleDirs(self.relativesrcdir) +- if isinstance(infile, basestring): ++ if isinstance(infile, str): + logging.info("processing " + infile) + self.sourcedirs.append(_normpath(os.path.dirname(infile))) + pp = self.pp.clone() +@@ -218,7 +217,7 @@ class JarMaker(object): + lines = pushback_iter(pp.out.getvalue().splitlines()) + try: + while True: +- l = lines.next() ++ l = next(lines) + m = self.jarline.match(l) + if not m: + raise RuntimeError(l) +@@ -287,7 +286,7 @@ class JarMaker(object): + try: + while True: + try: +- l = lines.next() ++ l = next(lines) + except StopIteration: + # we're done with this jar.mn, and this jar section + self.finalizeJar(jarfile, chromebasepath, register) +diff --git a/util/MozZipFile.py b/util/MozZipFile.py +index 53ea9e5..4c1ae01 100644 +--- a/util/MozZipFile.py ++++ b/util/MozZipFile.py +@@ -18,7 +18,7 @@ class ZipFile(zipfile.ZipFile): + def __init__(self, file, mode="r", compression=zipfile.ZIP_STORED, + lock = False): + if lock: +- assert isinstance(file, basestring) ++ assert isinstance(file, str) + self.lockfile = lockFile(file + '.lck') + else: + self.lockfile = None +@@ -46,7 +46,7 @@ class ZipFile(zipfile.ZipFile): + date_time=time.localtime(time.time())) + zinfo.compress_type = self.compression + # Add some standard UNIX file access permissions (-rw-r--r--). +- zinfo.external_attr = (0x81a4 & 0xFFFF) << 16L ++ zinfo.external_attr = (0x81a4 & 0xFFFF) << 16 + else: + zinfo = zinfo_or_arcname + +@@ -58,7 +58,7 @@ class ZipFile(zipfile.ZipFile): + # as the old, reuse the existing entry. + + doSeek = False # store if we need to seek to the eof after overwriting +- if self.NameToInfo.has_key(zinfo.filename): ++ if zinfo.filename in self.NameToInfo: + # Find the last ZipInfo with our name. + # Last, because that's catching multiple overwrites + i = len(self.filelist) +@@ -109,14 +109,14 @@ class ZipFile(zipfile.ZipFile): + # adjust file mode if we originally just wrote, now we rewrite + self.fp.close() + self.fp = open(self.filename, 'r+b') +- all = map(lambda zi: (zi, True), self.filelist) + \ +- map(lambda zi: (zi, False), self._remove) ++ all = [(zi, True) for zi in self.filelist] + \ ++ [(zi, False) for zi in self._remove] + all.sort(lambda l, r: cmp(l[0].header_offset, r[0].header_offset)) + # empty _remove for multiple closes + self._remove = [] + + lengths = [all[i+1][0].header_offset - all[i][0].header_offset +- for i in xrange(len(all)-1)] ++ for i in range(len(all)-1)] + lengths.append(self.end - all[-1][0].header_offset) + to_pos = 0 + for (zi, keep), length in zip(all, lengths): +diff --git a/util/Preprocessor.py b/util/Preprocessor.py +index c19f3e2..3b7822c 100644 +--- a/util/Preprocessor.py ++++ b/util/Preprocessor.py +@@ -13,6 +13,7 @@ import os.path + import re + from optparse import OptionParser + import errno ++from functools import reduce + + # hack around win32 mangling our line endings + # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65443 +@@ -40,7 +41,7 @@ class Preprocessor: + self.context = Expression.Context() + for k,v in {'FILE': '', + 'LINE': 0, +- 'DIRECTORY': os.path.abspath('.')}.iteritems(): ++ 'DIRECTORY': os.path.abspath('.')}.items(): + self.context[k] = v + self.actionLevel = 0 + self.disableLevel = 0 +@@ -55,21 +56,21 @@ class Preprocessor: + self.cmds = {} + for cmd, level in {'define': 0, + 'undef': 0, +- 'if': sys.maxint, +- 'ifdef': sys.maxint, +- 'ifndef': sys.maxint, ++ 'if': sys.maxsize, ++ 'ifdef': sys.maxsize, ++ 'ifndef': sys.maxsize, + 'else': 1, + 'elif': 1, + 'elifdef': 1, + 'elifndef': 1, +- 'endif': sys.maxint, ++ 'endif': sys.maxsize, + 'expand': 0, + 'literal': 0, + 'filter': 0, + 'unfilter': 0, + 'include': 0, + 'includesubst': 0, +- 'error': 0}.iteritems(): ++ 'error': 0}.items(): + self.cmds[cmd] = (level, getattr(self, 'do_' + cmd)) + self.out = sys.stdout + self.setMarker('#') +@@ -174,7 +175,7 @@ class Preprocessor: + escapedValue = re.compile('".*"$') + numberValue = re.compile('\d+$') + def handleE(option, opt, value, parser): +- for k,v in os.environ.iteritems(): ++ for k,v in os.environ.items(): + self.context[k] = v + def handleD(option, opt, value, parser): + vals = value.split('=', 1) +@@ -372,7 +373,7 @@ class Preprocessor: + current = dict(self.filters) + for f in filters: + current[f] = getattr(self, 'filter_' + f) +- filterNames = current.keys() ++ filterNames = list(current.keys()) + filterNames.sort() + self.filters = [(fn, current[fn]) for fn in filterNames] + return +@@ -382,7 +383,7 @@ class Preprocessor: + for f in filters: + if f in current: + del current[f] +- filterNames = current.keys() ++ filterNames = list(current.keys()) + filterNames.sort() + self.filters = [(fn, current[fn]) for fn in filterNames] + return +@@ -427,7 +428,7 @@ class Preprocessor: + args can either be a file name, or a file-like object. + Files should be opened, and will be closed after processing. + """ +- isName = type(args) == str or type(args) == unicode ++ isName = type(args) == str or type(args) == str + oldWrittenLines = self.writtenLines + oldCheckLineNumbers = self.checkLineNumbers + self.checkLineNumbers = False +diff --git a/util/buildlist.py b/util/buildlist.py +index d430340..38e3646 100644 +--- a/util/buildlist.py ++++ b/util/buildlist.py +@@ -7,7 +7,7 @@ if the entry does not already exist. + + Usage: buildlist.py [ ...] + ''' +-from __future__ import print_function ++ + + import sys + import os +diff --git a/util/checkFiles.py b/util/checkFiles.py +index 9e30d92..c187afd 100755 +--- a/util/checkFiles.py ++++ b/util/checkFiles.py +@@ -1,6 +1,6 @@ + #!/usr/bin/env python + +-from __future__ import print_function ++ + import os + import re + import sys +diff --git a/util/run-tests.py b/util/run-tests.py +index bc6aa63..faa57b3 100755 +--- a/util/run-tests.py ++++ b/util/run-tests.py +@@ -5,7 +5,7 @@ + # file, You can obtain one at https://mozilla.org/MPL/2.0/. + # + +-from __future__ import print_function ++ + + import sys + import os +diff --git a/util/utils.py b/util/utils.py +index 4098e7d..712cb43 100644 +--- a/util/utils.py ++++ b/util/utils.py +@@ -99,21 +99,21 @@ class pushback_iter(object): + def __iter__(self): + return self + +- def __nonzero__(self): ++ def __bool__(self): + if self.pushed_back: + return True + + try: +- self.pushed_back.insert(0, self.it.next()) ++ self.pushed_back.insert(0, next(self.it)) + except StopIteration: + return False + else: + return True + +- def next(self): ++ def __next__(self): + if self.pushed_back: + return self.pushed_back.pop() +- return self.it.next() ++ return next(self.it) + + def pushback(self, item): + self.pushed_back.append(item) diff -Nru enigmail-2.0.12+ds1/debian/patches/0014-fix-shebang-lines-to-use-python3.patch enigmail-2.1.3+ds1/debian/patches/0014-fix-shebang-lines-to-use-python3.patch --- enigmail-2.0.12+ds1/debian/patches/0014-fix-shebang-lines-to-use-python3.patch 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0014-fix-shebang-lines-to-use-python3.patch 2019-11-19 07:25:37.000000000 +0000 @@ -0,0 +1,29 @@ +From: Daniel Kahn Gillmor +Date: Fri, 8 Nov 2019 19:44:15 -0500 +Subject: fix shebang lines to use python3 + +--- + util/checkFiles.py | 2 +- + util/run-tests.py | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/util/checkFiles.py b/util/checkFiles.py +index c187afd..5434671 100755 +--- a/util/checkFiles.py ++++ b/util/checkFiles.py +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + + import os +diff --git a/util/run-tests.py b/util/run-tests.py +index faa57b3..2ab4daf 100755 +--- a/util/run-tests.py ++++ b/util/run-tests.py +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + # + # 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 diff -Nru enigmail-2.0.12+ds1/debian/patches/0015-convert-the-rest-of-the-build-infrastructure-to-pyth.patch enigmail-2.1.3+ds1/debian/patches/0015-convert-the-rest-of-the-build-infrastructure-to-pyth.patch --- enigmail-2.0.12+ds1/debian/patches/0015-convert-the-rest-of-the-build-infrastructure-to-pyth.patch 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0015-convert-the-rest-of-the-build-infrastructure-to-pyth.patch 2019-11-19 07:25:37.000000000 +0000 @@ -0,0 +1,59 @@ +From: Daniel Kahn Gillmor +Date: Fri, 8 Nov 2019 19:47:36 -0500 +Subject: convert the rest of the build infrastructure to python3 + +--- + COMPILING | 2 +- + configure.ac | 6 +++--- + provisioning/Dockerfile | 2 +- + 3 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/COMPILING b/COMPILING +index 09b9c27..7bb816d 100644 +--- a/COMPILING ++++ b/COMPILING +@@ -6,7 +6,7 @@ Prerequisites + In order to build Enigmail you will need the following helper tools: + - GNU make 3.81 or newer + - zip +-- python 2.7 or newer ++- python 3 + - perl 5 or newer + + If you want to execute unit tests, you will also need: +diff --git a/configure.ac b/configure.ac +index 5c56c10..4ce90bb 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -5,15 +5,15 @@ min_automake_version="1.10" + AC_INIT([enigmail],[2.1.3], [https://www.enigmail.net]) + + +-AC_PATH_PROG(PYTHON, "python2") ++AC_PATH_PROG(PYTHON, "python3") + +-# fallback to python if python2 does not exist ++# fallback to python if python3 does not exist + if test "x$PYTHON" = "x" ; then + AC_PATH_PROG(PYTHON, "python") + fi + + if test "x$PYTHON" = "x" ; then +- AC_MSG_ERROR([[python2 or python not found.]]) ++ AC_MSG_ERROR([[python3 or python not found.]]) + fi + + +diff --git a/provisioning/Dockerfile b/provisioning/Dockerfile +index 1e46dff..dc08fab 100644 +--- a/provisioning/Dockerfile ++++ b/provisioning/Dockerfile +@@ -13,7 +13,7 @@ RUN apt-get install -y xvfb + RUN apt-get install -y thunderbird + RUN apt-get install -y gnupg2 + RUN apt-get install -y make +-RUN apt-get install -y python ++RUN apt-get install -y python3 + RUN apt-get install -y gcc + RUN apt-get install -y psmisc + RUN apt-get install -y language-pack-en-base diff -Nru enigmail-2.0.12+ds1/debian/patches/0016-always-return-a-struct_time.patch enigmail-2.1.3+ds1/debian/patches/0016-always-return-a-struct_time.patch --- enigmail-2.0.12+ds1/debian/patches/0016-always-return-a-struct_time.patch 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0016-always-return-a-struct_time.patch 2019-11-19 07:25:37.000000000 +0000 @@ -0,0 +1,30 @@ +From: Daniel Kahn Gillmor +Date: Fri, 8 Nov 2019 21:44:54 -0500 +Subject: always return a struct_time + +--- + util/JarMaker.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/util/JarMaker.py b/util/JarMaker.py +index 8e6e458..5e01a60 100644 +--- a/util/JarMaker.py ++++ b/util/JarMaker.py +@@ -51,7 +51,7 @@ class ZipEntry: + + def getModTime(aPath): + if not os.path.isfile(aPath): +- return 0 ++ return localtime(0) + mtime = os.stat(aPath).st_mtime + return localtime(mtime) + +@@ -383,7 +383,7 @@ class JarMaker(object): + info = self.jarfile.getinfo(aPath) + return info.date_time + except: +- return 0 ++ return localtime(0) + def getOutput(self, name): + return ZipEntry(name, self.jarfile) + diff -Nru enigmail-2.0.12+ds1/debian/patches/0016-python3-treats-objects-as-Unicode-by-default-no-need.patch enigmail-2.1.3+ds1/debian/patches/0016-python3-treats-objects-as-Unicode-by-default-no-need.patch --- enigmail-2.0.12+ds1/debian/patches/0016-python3-treats-objects-as-Unicode-by-default-no-need.patch 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0016-python3-treats-objects-as-Unicode-by-default-no-need.patch 2019-11-19 07:25:37.000000000 +0000 @@ -0,0 +1,88 @@ +From: Daniel Kahn Gillmor +Date: Fri, 8 Nov 2019 20:14:46 -0500 +Subject: python3 treats objects as Unicode by default, + no need for explicit indicators + +--- + util/Preprocessor.py | 19 +++++++++---------- + 1 file changed, 9 insertions(+), 10 deletions(-) + +diff --git a/util/Preprocessor.py b/util/Preprocessor.py +index 3b7822c..0f51362 100644 +--- a/util/Preprocessor.py ++++ b/util/Preprocessor.py +@@ -75,7 +75,7 @@ class Preprocessor: + self.out = sys.stdout + self.setMarker('#') + self.LE = '\n' +- self.varsubst = re.compile('@(?P\w+)@', re.U) ++ self.varsubst = re.compile('@(?P\w+)@') + + def warnUnused(self, file): + if self.actionLevel == 0: +@@ -99,9 +99,8 @@ class Preprocessor: + self.marker = aMarker + if aMarker: + self.instruction = re.compile('{0}(?P[a-z]+)(?:\s(?P.*))?$' +- .format(aMarker), +- re.U) +- self.comment = re.compile(aMarker, re.U) ++ .format(aMarker)) ++ self.comment = re.compile(aMarker) + else: + class NoMatch(object): + def match(self, *args): +@@ -247,7 +246,7 @@ class Preprocessor: + + # Variables + def do_define(self, args): +- m = re.match('(?P\w+)(?:\s(?P.*))?', args, re.U) ++ m = re.match('(?P\w+)(?:\s(?P.*))?', args) + if not m: + raise Preprocessor.Error(self, 'SYNTAX_DEF', args) + val = 1 +@@ -259,7 +258,7 @@ class Preprocessor: + pass + self.context[m.group('name')] = val + def do_undef(self, args): +- m = re.match('(?P\w+)$', args, re.U) ++ m = re.match('(?P\w+)$', args) + if not m: + raise Preprocessor.Error(self, 'SYNTAX_DEF', args) + if args in self.context: +@@ -295,7 +294,7 @@ class Preprocessor: + if self.disableLevel and not replace: + self.disableLevel += 1 + return +- if re.match('\W', args, re.U): ++ if re.match('\W', args): + raise Preprocessor.Error(self, 'INVALID_VAR', args) + if args not in self.context: + self.disableLevel = 1 +@@ -310,7 +309,7 @@ class Preprocessor: + if self.disableLevel and not replace: + self.disableLevel += 1 + return +- if re.match('\W', args, re.U): ++ if re.match('\W', args): + raise Preprocessor.Error(self, 'INVALID_VAR', args) + if args in self.context: + self.disableLevel = 1 +@@ -354,7 +353,7 @@ class Preprocessor: + self.ifStates.pop() + # output processing + def do_expand(self, args): +- lst = re.split('__(\w+)__', args, re.U) ++ lst = re.split('__(\w+)__', args) + do_replace = False + def vsubst(v): + if v in self.context: +@@ -439,7 +438,7 @@ class Preprocessor: + args = self.applyFilters(args) + if not os.path.isabs(args): + args = os.path.join(self.context['DIRECTORY'], args) +- args = open(args, 'rU') ++ args = open(args, 'r') + except Preprocessor.Error: + raise + except: diff -Nru enigmail-2.0.12+ds1/debian/patches/0017-avoid-cmp-in-favor-of-__lt__.patch enigmail-2.1.3+ds1/debian/patches/0017-avoid-cmp-in-favor-of-__lt__.patch --- enigmail-2.0.12+ds1/debian/patches/0017-avoid-cmp-in-favor-of-__lt__.patch 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0017-avoid-cmp-in-favor-of-__lt__.patch 2019-11-19 07:25:37.000000000 +0000 @@ -0,0 +1,30 @@ +From: Daniel Kahn Gillmor +Date: Fri, 8 Nov 2019 21:45:46 -0500 +Subject: avoid cmp in favor of __lt__ + +--- + util/MozZipFile.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/util/MozZipFile.py b/util/MozZipFile.py +index 4c1ae01..c15a27d 100644 +--- a/util/MozZipFile.py ++++ b/util/MozZipFile.py +@@ -88,7 +88,7 @@ class ZipFile(zipfile.ZipFile): + # Couldn't optimize, sadly, just remember the old entry for removal + self._remove.append(self.filelist.pop(i)) + zipfile.ZipFile.writestr(self, zinfo, bytes) +- self.filelist.sort(lambda l, r: cmp(l.header_offset, r.header_offset)) ++ self.filelist.sort(lambda l, r: l.header_offset < r.header_offset) + if doSeek: + self.fp.seek(self.end) + self.end = self.fp.tell() +@@ -111,7 +111,7 @@ class ZipFile(zipfile.ZipFile): + self.fp = open(self.filename, 'r+b') + all = [(zi, True) for zi in self.filelist] + \ + [(zi, False) for zi in self._remove] +- all.sort(lambda l, r: cmp(l[0].header_offset, r[0].header_offset)) ++ all.sort(lambda l, r: l[0].header_offset < r[0].header_offset) + # empty _remove for multiple closes + self._remove = [] + diff -Nru enigmail-2.0.12+ds1/debian/patches/0019-Avoid-weird-Preprocessor.py-misbehavior.patch enigmail-2.1.3+ds1/debian/patches/0019-Avoid-weird-Preprocessor.py-misbehavior.patch --- enigmail-2.0.12+ds1/debian/patches/0019-Avoid-weird-Preprocessor.py-misbehavior.patch 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/0019-Avoid-weird-Preprocessor.py-misbehavior.patch 2019-11-19 07:25:37.000000000 +0000 @@ -0,0 +1,26 @@ +From: Daniel Kahn Gillmor +Date: Fri, 8 Nov 2019 23:33:07 -0500 +Subject: Avoid weird Preprocessor.py misbehavior + +Sometimes, when util/__pycache__ is not populated, +util/Preprocessor.py fails to produce any output. + +I have not been able to diagnose why this happens, but this will +hopefully work around it. +--- + ui/content/Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/ui/content/Makefile b/ui/content/Makefile +index 0cdbd60..4b2ab3c 100644 +--- a/ui/content/Makefile ++++ b/ui/content/Makefile +@@ -139,7 +139,7 @@ $(GENDIR)/%.js: %.js + $(DEPTH)/util/prepPostbox -c $(TARGET_TOOL) $< $@ + + $(GENDIR)/%.xul: %.xul +- $(PYTHON) $(DEPTH)/util/Preprocessor.py -I $(INCLUDE) -o $@ $< ++ if [ -s $< ]; then while [ ! -s $@ ]; do $(PYTHON) $(DEPTH)/util/Preprocessor.py -I $(INCLUDE) -o $@ $<; done; else touch $@; fi + + $(GENDIR)/%.htm: %.htm + $(DEPTH)/util/install -m 644 $(DIST)/chrome/content/ui $< diff -Nru enigmail-2.0.12+ds1/debian/patches/series enigmail-2.1.3+ds1/debian/patches/series --- enigmail-2.0.12+ds1/debian/patches/series 2019-08-21 16:40:51.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/patches/series 2019-11-19 07:31:34.000000000 +0000 @@ -2,10 +2,18 @@ 0002-Avoid-auto-download-of-pEpEngine-Closes-891882.patch 0003-avoid-OpenPGP.js-when-building.patch 0004-copy-enums.armor-from-OpenPGP.js.patch -0005-avoid-OpenPGP.js-during-key-file-import.patch -0006-drop-use-of-OpenPGP.js-for-generating-minimal-keys.patch -0007-add-more-logging-to-autocrypt-test.patch -0008-enable-the-use-of-extra-file-descriptors-and-test-th.patch -0009-add-test-to-do-symmetric-encryption-decryption-with-.patch -0010-use-GnuPG-instead-of-openpgp.js-for-symmetric-encryp.patch -0011-tests-wrap-individual-tests-in-key-test-with-withTes.patch +0005-add-more-logging-to-autocrypt-test.patch +0006-enable-the-use-of-extra-file-descriptors-and-test-th.patch +0007-add-test-to-do-symmetric-encryption-decryption-with-.patch +0008-use-GnuPG-instead-of-openpgp.js-for-symmetric-encryp.patch +0009-tests-wrap-individual-tests-in-key-test-with-withTes.patch +0010-Avoid-errors-on-validKeyserversExist.patch +0011-drop-unnecessary-tests.patch +0012-convert-buildlist.py-to-unix-style-line-endings-no-f.patch +0013-use-py2to3-2.7-to-convert-to-python3.patch +0014-fix-shebang-lines-to-use-python3.patch +0015-convert-the-rest-of-the-build-infrastructure-to-pyth.patch +0016-python3-treats-objects-as-Unicode-by-default-no-need.patch +0016-always-return-a-struct_time.patch +0017-avoid-cmp-in-favor-of-__lt__.patch +0019-Avoid-weird-Preprocessor.py-misbehavior.patch diff -Nru enigmail-2.0.12+ds1/debian/rules enigmail-2.1.3+ds1/debian/rules --- enigmail-2.0.12+ds1/debian/rules 2019-08-21 16:35:40.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/rules 2019-11-19 07:25:37.000000000 +0000 @@ -1,15 +1,16 @@ #!/usr/bin/make -f include /usr/share/dpkg/pkg-info.mk -XPI_MODULE_VERS = $(DEB_VERSION) %: - dh $@ --with xul-ext + dh $@ override_dh_install: - install-xpi -penigmail build/*.xpi + mkdir -p debian/enigmail/usr/share/xul-ext/enigmail + unzip build-tb/*.xpi -d debian/enigmail/usr/share/xul-ext/enigmail override_dh_auto_configure: - dh_auto_configure -- --with-tb-path=/usr/bin/thunderbird --with-tb-args='--profile $(shell pwd)/test-profile' + ln -sf /usr/share/misc/config.guess /usr/share/misc/config.sub ./ + dh_auto_configure -- --with-tb-path=/usr/bin/thunderbird --with-tb-args='--headless --profile $(shell pwd)/test-profile' override_dh_auto_test: ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS))) @@ -20,8 +21,8 @@ # if config/autoconf.mk is not present, create stub of it, such that make distclean works if [ ! -f config/autoconf.mk ]; then \ echo 'XPI_MODULE_VERS = $(DEB_VERSION_UPSTREAM)' > config/autoconf.mk; \ - echo 'DIST = $$(DEPTH)/build/dist' >> config/autoconf.mk; \ - echo 'BUILD = $$(DEPTH)/build' >> config/autoconf.mk; \ + echo 'DIST = $$(DEPTH)/build-tb/dist' >> config/autoconf.mk; \ + echo 'BUILD = $$(DEPTH)/build-tb' >> config/autoconf.mk; \ fi dh_auto_clean diff -Nru enigmail-2.0.12+ds1/debian/run-tests enigmail-2.1.3+ds1/debian/run-tests --- enigmail-2.0.12+ds1/debian/run-tests 2019-08-21 16:35:40.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/run-tests 2019-11-19 07:25:37.000000000 +0000 @@ -5,7 +5,7 @@ if [ "$1" = autopkgtest ]; then extensionpath=/usr/share/xul-ext/enigmail/ else - extensionpath="$(printf '%s/build/dist/' "$(pwd)")" + extensionpath="$(printf '%s/build-tb/dist/' "$(pwd)")" fi mkdir -p test-profile/extensions tmp @@ -16,18 +16,19 @@ user_pref("extensions.update.enabled", false); user_pref("lightweightThemes.update.enabled", false); user_pref("extensions.blocklist.enabled", false); -user_pref("browser.search.update", false); +user_pref("browser.search.update", false); +user_pref("app.update.auto", false); +user_pref("browser.dom.window.dump.enabled", true); user_pref("toolkit.telemetry.prompted", false); user_pref("toolkit.telemetry.rejected", true); user_pref("toolkit.telemetry.enabled", false); EOF export TMPDIR="$(pwd)/tmp" -export XAUTHORITY="$(pwd)/tmp/.Xauthority" make check # only run the test during autopkgtest, since it times out for some # reason i don't understand on the buildds: if [ "$1" = autopkgtest ]; then - xvfb-run -a -f "$XAUTHORITY" $(which make) unit + make unit fi head -n 200 -v test-profile/prefs.js diff -Nru enigmail-2.0.12+ds1/debian/tests/control enigmail-2.1.3+ds1/debian/tests/control --- enigmail-2.0.12+ds1/debian/tests/control 2019-08-21 16:35:40.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/tests/control 2019-11-19 07:25:37.000000000 +0000 @@ -1,6 +1,16 @@ Tests: tbird-sqlite -Depends: thunderbird, jsunit, xauth, xvfb, sqlite3 +Depends: + jsunit (>= 0.2.2), + sqlite3, + thunderbird (>= 1:68.0), +Restrictions: allow-stderr Tests: unit-tests -Depends: enigmail, jsunit, perl, python, make, xauth, xvfb, sqlite3 +Depends: + enigmail, + jsunit (>= 0.2.2), + make, + perl, + python3, + sqlite3, Restrictions: allow-stderr diff -Nru enigmail-2.0.12+ds1/debian/tests/no-test.js enigmail-2.1.3+ds1/debian/tests/no-test.js --- enigmail-2.0.12+ds1/debian/tests/no-test.js 2019-08-21 16:35:40.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/tests/no-test.js 2019-11-19 07:25:37.000000000 +0000 @@ -1 +1,3 @@ /* this runs no tests at all, just for the sake of setting up the profile. */ +/* global dump: false */ +dump("simple test to make sure logging works\n"); diff -Nru enigmail-2.0.12+ds1/debian/tests/tbird-sqlite enigmail-2.1.3+ds1/debian/tests/tbird-sqlite --- enigmail-2.0.12+ds1/debian/tests/tbird-sqlite 2019-08-21 16:35:40.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/tests/tbird-sqlite 2019-11-19 07:25:37.000000000 +0000 @@ -3,8 +3,6 @@ # Author: Daniel Kahn Gillmor # just trying to ensure that thunderbird can work with sqlite: - -rm -rf tbird-sqlite.profile tbird-sqlite.Xauthority mkdir -m 0700 -p tbird-sqlite.profile/extensions printf /usr/share/xul-ext/jsunit/ > tbird-sqlite.profile/extensions/jsunit@enigmail.net cat > tbird-sqlite.profile/prefs.js <tbird-sqlite.profile/times.json # set up a profile cleanly, ignoring messages to stderr -xvfb-run -a -f "$(pwd)/tbird-sqlite.Xauthority" /usr/bin/thunderbird -profile "$(pwd)/tbird-sqlite.profile" -jsunit debian/tests/no-test.js 2>&1 +ln -sf debian/tests/no-test.js main.js +/usr/bin/thunderbird --headless --profile "$(pwd)/tbird-sqlite.profile" 2>&1 -xvfb-run -a -f "$(pwd)/tbird-sqlite.Xauthority" /usr/bin/thunderbird -profile "$(pwd)/tbird-sqlite.profile" -jsunit debian/tests/tbird-sqlite.js +ln -sf debian/tests/tbird-sqlite.js main.js +/usr/bin/thunderbird --headless --profile "$(pwd)/tbird-sqlite.profile" +rm -rf main.js echo .dump | sqlite3 tbird-sqlite.profile/testing.sqlite diff -Nru enigmail-2.0.12+ds1/debian/tests/tbird-sqlite.js enigmail-2.1.3+ds1/debian/tests/tbird-sqlite.js --- enigmail-2.0.12+ds1/debian/tests/tbird-sqlite.js 2019-08-21 16:35:40.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/tests/tbird-sqlite.js 2019-11-19 07:25:37.000000000 +0000 @@ -1,12 +1,9 @@ -/* global Components: false; Assert: false; dump: false; */ +/* global ChromeUtils: false; Assert: false; dump: false; JSUnit: false */ "use strict"; -const Cu = Components.utils; - -Cu.import("resource://gre/modules/Sqlite.jsm"); /* global Sqlite: false */ -Cu.import("resource://gre/modules/PromiseUtils.jsm"); /* global PromiseUtils: false */ -Cu.import("resource://jsunit/jsunit-main.jsm"); /* global JSUnit */ +const Sqlite = ChromeUtils.import("resource://gre/modules/Sqlite.jsm").Sqlite; +const PromiseUtils = ChromeUtils.import("resource://gre/modules/PromiseUtils.jsm").PromiseUtils; function log(str) { /* how to log to stdout/stderr? */ @@ -59,6 +56,7 @@ } +log("started sqlite test!!!\n"); JSUnit.testPending(); Sqlite.openConnection({ path: "testing.sqlite", diff -Nru enigmail-2.0.12+ds1/debian/tests/unit-tests enigmail-2.1.3+ds1/debian/tests/unit-tests --- enigmail-2.0.12+ds1/debian/tests/unit-tests 2019-08-21 16:35:40.000000000 +0000 +++ enigmail-2.1.3+ds1/debian/tests/unit-tests 2019-11-19 07:25:37.000000000 +0000 @@ -5,11 +5,12 @@ XPI_MODULE_VERS = $(dpkg-parsechangelog -S Version | sed s'/-[^-]*$//') PERL = /usr/bin/perl -PYTHON = /usr/bin/python +PYTHON = /usr/bin/python3 TB_PATH = "/usr/bin/thunderbird" +TB_ARGS = --headless --profile $(pwd)/test-profile -JSUNIT = $(pwd)/util/run-jsunit /usr/bin/perl /usr/bin/thunderbird --profile $(pwd)/test-profile -jsunit +JSUNIT = $(pwd)/util/run-jsunit /usr/bin/perl /usr/bin/thunderbird --headless --profile $(pwd)/test-profile EOF debian/run-tests autopkgtest test_ret=$? diff -Nru enigmail-2.0.12+ds1/include/postbox.h enigmail-2.1.3+ds1/include/postbox.h --- enigmail-2.0.12+ds1/include/postbox.h 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/include/postbox.h 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1 @@ +#define POSTBOX diff -Nru enigmail-2.0.12+ds1/include/tbird.h enigmail-2.1.3+ds1/include/tbird.h --- enigmail-2.0.12+ds1/include/tbird.h 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/include/tbird.h 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1 @@ +#define THUNDERBIRD diff -Nru enigmail-2.0.12+ds1/ipc/modules/Makefile enigmail-2.1.3+ds1/ipc/modules/Makefile --- enigmail-2.0.12+ds1/ipc/modules/Makefile 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/ipc/modules/Makefile 2019-10-29 17:09:36.000000000 +0000 @@ -7,22 +7,37 @@ include $(DEPTH)/config/autoconf.mk +GENDIR = $(DIST)/chrome/content/modules -EXTRA_JS_MODULES = \ +MODFILES = \ subprocess.jsm \ - enigmailprocess_shared_unix.js \ - enigmailprocess_worker_common.js \ enigmailprocess_common.jsm \ - enigmailprocess_shared_win.js \ - enigmailprocess_worker_unix.js \ enigmailprocess_main.jsm \ enigmailprocess_unix.jsm \ - enigmailprocess_worker_win.js \ - enigmailprocess_shared.js \ enigmailprocess_win.jsm -all: $(EXTRA_JS_MODULES) - $(DEPTH)/util/install -m 644 $(DIST)/modules $^ +WORKERS = \ + enigmailprocess_shared.js \ + enigmailprocess_shared_unix.js \ + enigmailprocess_shared_win.js \ + enigmailprocess_worker_common.js \ + enigmailprocess_worker_unix.js \ + enigmailprocess_worker_win.js + +GENFILES = $(addprefix $(GENDIR)/,$(MODFILES)) + +$(GENDIR)/%.jsm: %.jsm + $(DEPTH)/util/prepPostbox $(TARGET_TOOL) $< $@ + +$(GENDIR)/%.js: %.js + $(DEPTH)/util/prepPostbox $(TARGET_TOOL) $< $@ + + +all: $(GENFILES) deploy + +deploy: + $(DEPTH)/util/install -m 644 $(DIST)/chrome/content/modules $(WORKERS) + -clean: $(EXTRA_JS_MODULES) - $(DEPTH)/util/install -u $(DIST)/modules $^ +clean: $(MODFILES) + $(DEPTH)/util/install -u $(DIST)/chrome/content/modules $^ diff -Nru enigmail-2.0.12+ds1/ipc/modules/enigmailprocess_common.jsm enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_common.jsm --- enigmail-2.0.12+ds1/ipc/modules/enigmailprocess_common.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_common.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -6,28 +6,19 @@ "use strict"; /* exported BaseProcess, PromiseWorker */ -/* global Components: false, ChromeWorker: false, */ +/* global ChromeWorker: false, */ var { - classes: Cc, - interfaces: Ci, - utils: Cu, results: Cr } = Components; -// const { -// Services -// } = Cu.import("resource://gre/modules/Services.jsm", {}); /* global Services: false */ -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /* global XPCOMUtils: false */ -Cu.importGlobalProperties(["TextDecoder", "TextEncoder"]); - -XPCOMUtils.defineLazyModuleGetter(this, "AsyncShutdown", - "resource://gre/modules/AsyncShutdown.jsm"); /* global AsyncShutdown: false */ -XPCOMUtils.defineLazyModuleGetter(this, "setTimeout", - "resource://gre/modules/Timer.jsm"); /* global Timer: false */ +const XPCOMUtils = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm").XPCOMUtils; +Components.utils.importGlobalProperties(["TextDecoder", "TextEncoder"]); + +var _AsyncShutdown, _setTimeout; var SubScriptLoader = Cc["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader); -SubScriptLoader.loadSubScript("resource://enigmail/enigmailprocess_shared.js", this); +SubScriptLoader.loadSubScript("chrome://enigmail/content/modules/enigmailprocess_shared.js", this); var EXPORTED_SYMBOLS = ["BaseProcess", "PromiseWorker", "SubprocessConstants"]; @@ -35,6 +26,21 @@ let nextResponseId = 0; + +function getAsyncShutdown() { + if (!_AsyncShutdown) { + _AsyncShutdown = ChromeUtils.import("resource://gre/modules/AsyncShutdown.jsm").AsyncShutdown; + } + return _AsyncShutdown; +} + +function getSetTimeout() { + if (!_setTimeout) { + _setTimeout = ChromeUtils.import("resource://gre/modules/Timer.jsm").setTimeout; + } + return _setTimeout; +} + /* global SubprocessConstants: true */ /** @@ -42,7 +48,7 @@ * resolves when the message has been received and the operation it triggers is * complete. */ -class PromiseWorker extends ChromeWorker { +class _PromiseWorker extends ChromeWorker { constructor(url) { super(url); @@ -57,13 +63,13 @@ this.addEventListener("message", this.onmessage); this.shutdown = this.shutdown.bind(this); - AsyncShutdown.webWorkersShutdown.addBlocker( + getAsyncShutdown().webWorkersShutdown.addBlocker( "Subprocess.jsm: Shut down IO worker", this.shutdown); } onClose() { - AsyncShutdown.webWorkersShutdown.removeBlocker(this.shutdown); + getAsyncShutdown().webWorkersShutdown.removeBlocker(this.shutdown); } shutdown() { @@ -185,6 +191,8 @@ } } +var PromiseWorker = _PromiseWorker; + /** * Represents an input or output pipe connected to a subprocess. * @@ -582,7 +590,7 @@ /** * Represents a currently-running process, and allows interaction with it. */ -class BaseProcess { +class _BaseProcess { /** * @param {PromiseWorker} worker * The worker instance which owns the process. @@ -712,7 +720,7 @@ this.worker.call("kill", [this.id, force]); if (!force) { - setTimeout(() => { + getSetTimeout()(() => { if (this.exitCode === null) { this.worker.call("kill", [this.id, true]); } @@ -740,3 +748,5 @@ return this.exitPromise; } } + +var BaseProcess = _BaseProcess; diff -Nru enigmail-2.0.12+ds1/ipc/modules/enigmailprocess_main.jsm enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_main.jsm --- enigmail-2.0.12+ds1/ipc/modules/enigmailprocess_main.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_main.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -15,27 +15,23 @@ let EXPORTED_SYMBOLS = ["SubprocessMain"]; /* exported SubprocessMain */ -/* global Components: false */ var { - classes: Cc, - interfaces: Ci, - utils: Cu, results: Cr } = Components; -Cu.importGlobalProperties(["TextEncoder"]); -Cu.import("resource://gre/modules/AppConstants.jsm"); /* global AppConstants: false */ -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /* global XPCOMUtils: false */ -Cu.import("resource://enigmail/enigmailprocess_common.jsm"); /* global SubprocessConstants: false */ +Components.utils.importGlobalProperties(["TextEncoder"]); +const AppConstants = ChromeUtils.import("resource://gre/modules/AppConstants.jsm").AppConstants; +const XPCOMUtils = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm").XPCOMUtils; +var SubprocessConstants = ChromeUtils.import("chrome://enigmail/content/modules/enigmailprocess_common.jsm").SubprocessConstants; if (AppConstants.platform == "win") { XPCOMUtils.defineLazyModuleGetter(this, "SubprocessImpl", - "resource://enigmail/enigmailprocess_win.jsm"); /* global SubprocessImpl: false */ + "chrome://enigmail/content/modules/enigmailprocess_win.jsm"); /* global SubprocessImpl: false */ } else { XPCOMUtils.defineLazyModuleGetter(this, "SubprocessImpl", - "resource://enigmail/enigmailprocess_unix.jsm"); + "chrome://enigmail/content/modules/enigmailprocess_unix.jsm"); } function encodeEnvVar(name, value) { @@ -173,8 +169,6 @@ * @returns {Promise} */ pathSearch(command, environment = this.getEnvironment()) { - // Promise.resolve lets us get around returning one of the Promise.jsm - // pseudo-promises returned by Task.jsm. let path = SubprocessImpl.pathSearch(command, environment); return Promise.resolve(path); } diff -Nru enigmail-2.0.12+ds1/ipc/modules/enigmailprocess_shared.js enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_shared.js --- enigmail-2.0.12+ds1/ipc/modules/enigmailprocess_shared.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_shared.js 2019-10-29 17:09:36.000000000 +0000 @@ -40,8 +40,7 @@ if (!this.library) { this.library = ctypes.open(name); } - } - catch (e) { + } catch (e) { // Ignore errors until we've tried all the options. } } @@ -78,7 +77,7 @@ * @namespace * @lends Subprocess */ -const SubprocessConstants = { +var SubprocessConstants = { /** * @property {integer} ERROR_END_OF_FILE * The operation failed because the end of the file was reached. @@ -100,4 +99,4 @@ ERROR_BAD_EXECUTABLE: 0xff7a0003 }; -Object.freeze(SubprocessConstants); +Object.freeze(SubprocessConstants); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/ipc/modules/enigmailprocess_shared_win.js enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_shared_win.js --- enigmail-2.0.12+ds1/ipc/modules/enigmailprocess_shared_win.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_shared_win.js 2019-10-29 17:09:36.000000000 +0000 @@ -491,6 +491,13 @@ ] }); +var user32 = new Library("user32", ["user32.dll"], { + AllowSetForegroundWindow: [ + win32.WINAPI, + win32.BOOL, + win32.DWORD /* dwProcessId */ + ] +}); let nextNamedPipeId = 0; @@ -507,7 +514,8 @@ } let pid = libc.GetCurrentProcessId(); - let pipeName = String.raw `\\.\Pipe\SubProcessPipe.${pid}.${nextNamedPipeId++}`; + const pipePrefix = "\\\\.\\Pipe\\SubProcessPipe"; + let pipeName = String.raw `${pipePrefix}.${pid}.${nextNamedPipeId++}`; let readHandle = libc.CreateNamedPipeW( pipeName, readFlags, @@ -543,8 +551,7 @@ void libc.InitializeProcThreadAttributeList; void libc.DeleteProcThreadAttributeList; void libc.UpdateProcThreadAttribute; - } - catch (e) { + } catch (e) { // This is only supported in Windows Vista and later. return null; } diff -Nru enigmail-2.0.12+ds1/ipc/modules/enigmailprocess_unix.jsm enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_unix.jsm --- enigmail-2.0.12+ds1/ipc/modules/enigmailprocess_unix.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_unix.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -5,30 +5,31 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ "use strict"; + /* exported SubprocessImpl */ /* globals BaseProcess, PromiseWorker */ -/* global Components: false, libc: false, LIBC: false, OS: false */ +/* global libc: false, LIBC: false */ var { - classes: Cc, - interfaces: Ci, - utils: Cu, results: Cr } = Components; -Cu.importGlobalProperties(["TextDecoder"]); - var EXPORTED_SYMBOLS = ["SubprocessImpl"]; -Cu.import("resource://gre/modules/ctypes.jsm"); /* global ctypes: false */ -Cu.import("resource://gre/modules/osfile.jsm"); /* global ctypes: false */ -Cu.import("resource://gre/modules/Services.jsm"); /* global Services: false */ -Cu.import("resource://enigmail/enigmailprocess_common.jsm"); /* global SubprocessConstants: false */ +Components.utils.importGlobalProperties(["TextDecoder"]); +const ctypes = ChromeUtils.import("resource://gre/modules/ctypes.jsm").ctypes; +const OS = ChromeUtils.import("resource://gre/modules/osfile.jsm").OS; +const Services = ChromeUtils.import("resource://gre/modules/Services.jsm").Services; +var { + SubprocessConstants, + BaseProcess, + PromiseWorker +} = ChromeUtils.import("chrome://enigmail/content/modules/enigmailprocess_common.jsm", this); -Services.scriptloader.loadSubScript("resource://enigmail/enigmailprocess_shared.js", this); -Services.scriptloader.loadSubScript("resource://enigmail/enigmailprocess_shared_unix.js", this); +Services.scriptloader.loadSubScript("chrome://enigmail/content/modules/enigmailprocess_shared.js", this); +Services.scriptloader.loadSubScript("chrome://enigmail/content/modules/enigmailprocess_shared_unix.js", this); class UnixPromiseWorker extends PromiseWorker { constructor(...args) { @@ -76,7 +77,7 @@ class Process extends BaseProcess { static get WORKER_URL() { - return "resource://enigmail/enigmailprocess_worker_unix.js"; + return "chrome://enigmail/content/modules/enigmailprocess_worker_unix.js"; } static get WorkerClass() { @@ -88,7 +89,10 @@ // convert that into a JS typed array. // The resulting array will not be null-terminated. function ptrToUint8Array(input) { - let {cast, uint8_t} = ctypes; + let { + cast, + uint8_t + } = ctypes; let len = 0; for (let ptr = cast(input, uint8_t.ptr); ptr.contents; ptr = ptr.increment()) { @@ -103,103 +107,103 @@ Process, call(options) { - return Process.create(options); - }, + return Process.create(options); + }, - * getEnvironment() { - let environ; - if (OS.Constants.Sys.Name == "Darwin") { - environ = libc._NSGetEnviron().contents; - } - else { - environ = libc.environ; - } + * getEnvironment() { + let environ; + if (OS.Constants.Sys.Name == "Darwin") { + environ = libc._NSGetEnviron().contents; + } else { + environ = libc.environ; + } - const EQUAL = "=".charCodeAt(0); - let decoder = new TextDecoder("utf-8", {fatal: true}); + const EQUAL = "=".charCodeAt(0); + let decoder = new TextDecoder("utf-8", { + fatal: true + }); - function decode(array) { - try { - return decoder.decode(array); - } - catch (e) { - return array; - } + function decode(array) { + try { + return decoder.decode(array); + } catch (e) { + return array; } + } - for (let envp = environ; !envp.contents.isNull(); envp = envp.increment()) { - let buf = ptrToUint8Array(envp.contents); + for (let envp = environ; !envp.contents.isNull(); envp = envp.increment()) { + let buf = ptrToUint8Array(envp.contents); - for (let i = 0; i < buf.length; i++) { - if (buf[i] == EQUAL) { - yield [decode(buf.subarray(0, i)), - decode(buf.subarray(i + 1))]; - break; - } + for (let i = 0; i < buf.length; i++) { + if (buf[i] == EQUAL) { + yield [decode(buf.subarray(0, i)), + decode(buf.subarray(i + 1)) + ]; + break; } } - }, + } + }, - async isExecutableFile(path) { - if (!OS.Path.split(path).absolute) { - return false; - } + async isExecutableFile(path) { + if (!OS.Path.split(path).absolute) { + return false; + } - try { - let info = await OS.File.stat(path); + try { + let info = await OS.File.stat(path); - // FIXME: We really want access(path, X_OK) here, but OS.File does not - // support it. - return !info.isDir && (info.unixMode & 0o111); - } - catch (e) { - return false; - } - }, + // FIXME: We really want access(path, X_OK) here, but OS.File does not + // support it. + return !info.isDir && (info.unixMode & 0x49); + } catch (e) { + return false; + } + }, - /** - * Searches for the given executable file in the system executable - * file paths as specified by the PATH environment variable. - * - * On Windows, if the unadorned filename cannot be found, the - * extensions in the semicolon-separated list in the PATHEXT - * environment variable are successively appended to the original - * name and searched for in turn. - * - * @param {string} bin - * The name of the executable to find. - * @param {object} environment - * An object containing a key for each environment variable to be used - * in the search. - * @returns {Promise} - */ - async pathSearch(bin, environment) { - let split = OS.Path.split(bin); - if (split.absolute) { - if (await this.isExecutableFile(bin)) { - return bin; - } - let error = new Error(`File at path "${bin}" does not exist, or is not executable`); - error.errorCode = SubprocessConstants.ERROR_BAD_EXECUTABLE; - throw error; + /** + * Searches for the given executable file in the system executable + * file paths as specified by the PATH environment variable. + * + * On Windows, if the unadorned filename cannot be found, the + * extensions in the semicolon-separated list in the PATHEXT + * environment variable are successively appended to the original + * name and searched for in turn. + * + * @param {string} bin + * The name of the executable to find. + * @param {object} environment + * An object containing a key for each environment variable to be used + * in the search. + * @returns {Promise} + */ + async pathSearch(bin, environment) { + let split = OS.Path.split(bin); + if (split.absolute) { + if (await this.isExecutableFile(bin)) { + return bin; } + let error = new Error(`File at path "${bin}" does not exist, or is not executable`); + error.errorCode = SubprocessConstants.ERROR_BAD_EXECUTABLE; + throw error; + } - let dirs = []; - if (typeof environment.PATH === "string") { - dirs = environment.PATH.split(":"); - } + let dirs = []; + if (typeof environment.PATH === "string") { + dirs = environment.PATH.split(":"); + } - for (let dir of dirs) { - let path = OS.Path.join(dir, bin); + for (let dir of dirs) { + let path = OS.Path.join(dir, bin); - if (await this.isExecutableFile(path)) { - return path; - } + if (await this.isExecutableFile(path)) { + return path; } - let error = new Error(`Executable not found: ${bin}`); - error.errorCode = SubprocessConstants.ERROR_BAD_EXECUTABLE; - throw error; } + let error = new Error(`Executable not found: ${bin}`); + error.errorCode = SubprocessConstants.ERROR_BAD_EXECUTABLE; + throw error; + } }; var SubprocessImpl = SubprocessUnix; diff -Nru enigmail-2.0.12+ds1/ipc/modules/enigmailprocess_win.jsm enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_win.jsm --- enigmail-2.0.12+ds1/ipc/modules/enigmailprocess_win.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_win.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -7,31 +7,32 @@ /* exported SubprocessImpl */ -/* global Components: false, libc: false */ +/* global libc: false */ /* globals BaseProcess, PromiseWorker */ var { - classes: Cc, - interfaces: Ci, - utils: Cu, results: Cr } = Components; var EXPORTED_SYMBOLS = ["SubprocessImpl"]; -Cu.import("resource://gre/modules/AppConstants.jsm"); /* global AppConstants: false */ -Cu.import("resource://gre/modules/ctypes.jsm"); /* global ctypes: false */ -Cu.import("resource://gre/modules/osfile.jsm"); /* global OS: false */ -Cu.import("resource://gre/modules/Services.jsm"); /* global Services: false */ -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /* global XPCOMUtils: false */ -Cu.import("resource://enigmail/enigmailprocess_common.jsm"); /* global SubprocessConstants: false */ +const AppConstants = ChromeUtils.import("resource://gre/modules/AppConstants.jsm").AppConstants; +const ctypes = ChromeUtils.import("resource://gre/modules/ctypes.jsm").ctypes; +const OS = ChromeUtils.import("resource://gre/modules/osfile.jsm").OS; +const Services = ChromeUtils.import("resource://gre/modules/Services.jsm").Services; +const XPCOMUtils = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm").XPCOMUtils; +var { + SubprocessConstants, + BaseProcess, + PromiseWorker +} = ChromeUtils.import("chrome://enigmail/content/modules/enigmailprocess_common.jsm", this); XPCOMUtils.defineLazyServiceGetter(this, "env", "@mozilla.org/process/environment;1", "nsIEnvironment"); /* global env: false */ -Services.scriptloader.loadSubScript("resource://enigmail/enigmailprocess_shared.js", this); -Services.scriptloader.loadSubScript("resource://enigmail/enigmailprocess_shared_win.js", this); +Services.scriptloader.loadSubScript("chrome://enigmail/content/modules/enigmailprocess_shared.js", this); +Services.scriptloader.loadSubScript("chrome://enigmail/content/modules/enigmailprocess_shared_win.js", this); class WinPromiseWorker extends PromiseWorker { constructor(...args) { @@ -58,7 +59,7 @@ class Process extends BaseProcess { static get WORKER_URL() { - return "resource://enigmail/enigmailprocess_worker_win.js"; + return "chrome://enigmail/content/modules/enigmailprocess_worker_win.js"; } static get WorkerClass() { diff -Nru enigmail-2.0.12+ds1/ipc/modules/enigmailprocess_worker_common.js enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_worker_common.js --- enigmail-2.0.12+ds1/ipc/modules/enigmailprocess_worker_common.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_worker_common.js 2019-10-29 17:09:36.000000000 +0000 @@ -8,7 +8,7 @@ /* exported BasePipe, BaseProcess, debug */ /* globals Process, io */ -/* global ctypes: false, onmessage: true */ +/* global ctypes: false */ /* eslint no-console: 0 */ function debug(message) { @@ -108,122 +108,126 @@ let requests = { init(details) { - io.init(details); + io.init(details); - return { - data: {} - }; - }, + return { + data: {} + }; + }, - shutdown() { - io.shutdown(); + shutdown() { + io.shutdown(); - return { - data: {} - }; - }, + return { + data: {} + }; + }, - close(pipeId, force = false) { - let pipe = io.getPipe(pipeId); + close(pipeId, force = false) { + let pipe = io.getPipe(pipeId); - return pipe.close(force).then(() => ({ - data: {} - })); - }, + return pipe.close(force).then(() => ({ + data: {} + })); + }, + + spawn(options) { + let process = new Process(options); + let processId = process.id; + + io.addProcess(process); + + let fds = process.pipes.map(pipe => pipe.id); + + return { + data: { + processId, + fds, + pid: process.pid + } + }; + }, - spawn(options) { - let process = new Process(options); - let processId = process.id; + kill(processId, force = false) { + let process = io.getProcess(processId); - io.addProcess(process); + process.kill(force ? 9 : 15); - let fds = process.pipes.map(pipe => pipe.id); + return { + data: {} + }; + }, + wait(processId) { + let process = io.getProcess(processId); + + process.wait(); + + process.awaitFinished().then(() => { + io.cleanupProcess(process); + }); + + return process.exitPromise.then(exitCode => { return { data: { - processId, fds, pid: process.pid + exitCode } }; - }, - - kill(processId, force = false) { - let process = io.getProcess(processId); + }); + }, - process.kill(force ? 9 : 15); + read(pipeId, count) { + let pipe = io.getPipe(pipeId); + return pipe.read(count).then(buffer => { return { - data: {} + data: { + buffer + } }; - }, - - wait(processId) { - let process = io.getProcess(processId); - - process.wait(); + }); + }, - process.awaitFinished().then(() => { - io.cleanupProcess(process); - }); - - return process.exitPromise.then(exitCode => { - return { - data: { - exitCode - } - }; - }); - }, - - read(pipeId, count) { - let pipe = io.getPipe(pipeId); - - return pipe.read(count).then(buffer => { - return { - data: { - buffer - } - }; - }); - }, - - write(pipeId, buffer) { - let pipe = io.getPipe(pipeId); - - return pipe.write(buffer).then(bytesWritten => { - return { - data: { - bytesWritten - } - }; - }); - }, + write(pipeId, buffer) { + let pipe = io.getPipe(pipeId); - getOpenFiles() { + return pipe.write(buffer).then(bytesWritten => { return { - data: new Set(io.pipes.keys()) + data: { + bytesWritten + } }; - }, + }); + }, - getProcesses() { - let data = new Map(Array.from(io.processes.values()) - .filter(proc => proc.exitCode === null) - .map(proc => [proc.id, proc.pid])); - return { - data - }; - }, + getOpenFiles() { + return { + data: new Set(io.pipes.keys()) + }; + }, - waitForNoProcesses() { - return Promise.all(Array.from(io.processes.values(), - proc => proc.awaitFinished())); - } + getProcesses() { + let data = new Map(Array.from(io.processes.values()) + .filter(proc => proc.exitCode === null) + .map(proc => [proc.id, proc.pid])); + return { + data + }; + }, + + waitForNoProcesses() { + return Promise.all(Array.from(io.processes.values(), + proc => proc.awaitFinished())); + } }; onmessage = event => { io.messageCount--; let { - msg, msgId, args + msg, + msgId, + args } = event.data; new Promise(resolve => { @@ -262,4 +266,4 @@ error: {} }); }); -}; +}; \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/ipc/modules/enigmailprocess_worker_unix.js enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_worker_unix.js --- enigmail-2.0.12+ds1/ipc/modules/enigmailprocess_worker_unix.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_worker_unix.js 2019-10-29 17:09:36.000000000 +0000 @@ -10,9 +10,9 @@ /* global importScripts: false */ -importScripts("resource://enigmail/enigmailprocess_shared.js", - "resource://enigmail/enigmailprocess_shared_unix.js", - "resource://enigmail/enigmailprocess_worker_common.js"); +importScripts("chrome://enigmail/content/modules/enigmailprocess_shared.js", + "chrome://enigmail/content/modules/enigmailprocess_shared_unix.js", + "chrome://enigmail/content/modules/enigmailprocess_worker_common.js"); /* global ctypes: false, LIBC: false, libc: false, unix: false, SubprocessConstants: false */ /* global debug: false */ diff -Nru enigmail-2.0.12+ds1/ipc/modules/enigmailprocess_worker_win.js enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_worker_win.js --- enigmail-2.0.12+ds1/ipc/modules/enigmailprocess_worker_win.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/ipc/modules/enigmailprocess_worker_win.js 2019-10-29 17:09:36.000000000 +0000 @@ -10,13 +10,13 @@ /* global importScripts: false */ -importScripts("resource://enigmail/enigmailprocess_shared.js", - "resource://enigmail/enigmailprocess_shared_win.js", - "resource://enigmail/enigmailprocess_worker_common.js"); - -/* global ctypes: false, libc: false, unix: false, SubprocessConstants: false */ -/* global debug: false */ -/* eslint no-console: 0 */ +importScripts("chrome://enigmail/content/modules/enigmailprocess_shared.js", + "chrome://enigmail/content/modules/enigmailprocess_shared_win.js", + "chrome://enigmail/content/modules/enigmailprocess_worker_common.js"); + +/* global ctypes: false, libc: false, unix: false, SubprocessConstants: false, user32: false */ + /* global debug: false */ + /* eslint no-console: 0 */ const POLL_TIMEOUT = 5000; @@ -80,10 +80,7 @@ return this.closedPromise; } - for (let { - reject - } - of this.pending) { + for (let {reject} of this.pending) { let error = new Error("File closed"); error.errorCode = SubprocessConstants.ERROR_END_OF_FILE; reject(error); @@ -162,7 +159,9 @@ return new Promise((resolve, reject) => { this.pending.push({ - resolve, reject, length + resolve, + reject, + length }); this.readNext(); }); @@ -210,9 +209,7 @@ let buffer = this.buffer; this.buffer = null; - let { - resolve - } = this.shiftPending(); + let {resolve} = this.shiftPending(); if (read == buffer.byteLength) { resolve(buffer); @@ -260,7 +257,9 @@ return new Promise((resolve, reject) => { this.pending.push({ - resolve, reject, buffer + resolve, + reject, + buffer }); this.writeNext(); }); @@ -304,9 +303,7 @@ this.onError(); } else if (written > 0) { - let { - resolve - } = this.shiftPending(); + let {resolve} = this.shiftPending(); this.buffer = null; resolve(written); @@ -370,9 +367,7 @@ * @returns {win32.Handle[]} * The array of file handles belonging to the spawned process. */ - initPipes({ - stderr - }) { + initPipes({stderr}) { let our_pipes = []; let their_pipes = []; @@ -465,7 +460,7 @@ let escaped = str.replace(/(\\*)("|$)/g, (m0, m1, m2) => { if (m2) { - m2 = `\\${m2}`; + m2 = `${m2}`; } return `${m1}${m1}${m2}`; }); @@ -474,9 +469,7 @@ } spawn(options) { - let { - command, arguments: args - } = options; + let {command, arguments: args} = options; if (/\\cmd\.exe$/i.test(command) && args.length == 3 && /^(\/S)?\/C$/i.test(args[1])) { // cmd.exe is insane and requires special treatment. @@ -574,6 +567,11 @@ throw new Error(errorMessage); } + // Allow child processes to obtain focus via Alt-Tab + try { + user32.AllowSetForegroundWindow(procInfo.dwProcessId); + } catch (x) {} + this.handle = win32.Handle(procInfo.hProcess); this.pid = procInfo.dwProcessId; @@ -729,8 +727,7 @@ if (result < handlers.length) { try { handlers[result].onReady(); - } - catch (e) { + } catch (e) { console.error(e); debug(`Worker error: ${e} :: ${e.stack}`); handlers[result].onError(); diff -Nru enigmail-2.0.12+ds1/ipc/modules/subprocess.jsm enigmail-2.1.3+ds1/ipc/modules/subprocess.jsm --- enigmail-2.0.12+ds1/ipc/modules/subprocess.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/ipc/modules/subprocess.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,11 +1,10 @@ -/*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 https://mozilla.org/MPL/2.0/. */ /* * Import into a JS component using - * 'Components.utils.import("resource://enigmail/subprocess.jsm");' + * 'ChromeUtils.import("chrome://enigmail/content/modules/subprocess.jsm");' * * This object allows to start a process, and read/write data to/from it * using stdin/stdout/stderr streams. @@ -112,13 +111,8 @@ 'use strict'; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/enigmailprocess_main.jsm"); /* global SubprocessMain: false */ -Cu.import("resource://gre/modules/Services.jsm"); /* global Services: false */ -Cu.import("resource://gre/modules/Task.jsm"); /* global Task: false */ +const SubprocessMain = ChromeUtils.import("chrome://enigmail/content/modules/enigmailprocess_main.jsm").SubprocessMain; +const Services = ChromeUtils.import("resource://gre/modules/Services.jsm").Services; var EXPORTED_SYMBOLS = ["subprocess"]; @@ -147,28 +141,27 @@ return ret; } -function read(pipe) { - return pipe.read().then(buffer => { - try { - if (buffer.byteLength > 0) { - return arrayBufferToString(buffer); - } - } - catch (ex) { - DEBUG_LOG("err: " + ex.toString()); +async function read(pipe) { + let buffer = await pipe.read(); + + try { + if (buffer.byteLength > 0) { + return arrayBufferToString(buffer); } - return ""; - }); + } catch (ex) { + DEBUG_LOG("err: " + ex.toString()); + } + return ""; } -var readAllData = Task.async(function*(pipe, read, callback) { +var readAllData = async function(pipe, read, callback) { /* eslint no-cond-assign: 0 */ let string; - while (string = yield read(pipe)) { + while (string = await read(pipe)) { callback(string); } -}); +}; function removeProcRef(proc) { @@ -214,21 +207,20 @@ // being called synchronously. options.stdin({ write(val) { - writePipe(proc.stdin, val); - }, + writePipe(proc.stdin, val); + }, - close() { - Promise.all(inputPromises).then(() => { - if (!stdinClosed) { - stdinClosed = true; - proc.stdin.close(); - } - }); - } + close() { + Promise.all(inputPromises).then(() => { + if (!stdinClosed) { + stdinClosed = true; + proc.stdin.close(); + } + }); + } }); - } - else { + } else { if (typeof options.stdin === "string") { DEBUG_LOG("write Stdin"); writePipe(proc.stdin, options.stdin); @@ -246,10 +238,8 @@ if (typeof options.stdout === "function") { try { options.stdout(data); - } - catch (ex) {} - } - else + } catch (ex) {} + } else stdoutData += data; })); @@ -260,10 +250,8 @@ if (typeof options.stderr === "function") { try { options.stderr(data); - } - catch (ex) {} - } - else + } catch (ex) {} + } else stderrData += data; })); @@ -286,8 +274,7 @@ stdout: stdoutData, stderr: stderrData }); - } - catch (ex) {} + } catch (ex) {} } }) .catch(error => { @@ -295,8 +282,7 @@ let errStr = ""; if (typeof error === "string") { errStr = error; - } - else if (error) { + } else if (error) { for (let i in error) { errStr += "\n" + i + ": " + error[i]; } @@ -311,15 +297,13 @@ let opts = {}; if (options.mergeStderr) { opts.stderr = "stdout"; - } - else { + } else { opts.stderr = "pipe"; } if (options.command instanceof Ci.nsIFile) { opts.command = options.command.path; - } - else { + } else { opts.command = options.command; } @@ -349,7 +333,7 @@ resolved = -1; let errStr = formattedStack; throw ("subprocess.jsm: launch error: " + errStr + 'error: ' + - error + "\n" + JSON.stringify(error)); + error + "\n" + JSON.stringify(error)); } ); @@ -398,4 +382,4 @@ if (gErrorFunction) { gErrorFunction("subprocess.jsm: " + str + "\n"); } -} +} \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/ipc/tests/Makefile enigmail-2.1.3+ds1/ipc/tests/Makefile --- enigmail-2.0.12+ds1/ipc/tests/Makefile 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/ipc/tests/Makefile 2019-10-29 17:09:36.000000000 +0000 @@ -10,7 +10,7 @@ ifneq ($(TB_PATH),"") -UNITTEST = $(JSUNIT) main.js +UNITTEST = $(JSUNIT) endif diff -Nru enigmail-2.0.12+ds1/ipc/tests/main.js enigmail-2.1.3+ds1/ipc/tests/main.js --- enigmail-2.0.12+ds1/ipc/tests/main.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/ipc/tests/main.js 2019-10-29 17:09:36.000000000 +0000 @@ -4,22 +4,21 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -/*global do_subtest: false, Components: false */ +/*global do_subtest: false */ function execTest(filename) { - const Cc = Components.classes; - const Ci = Components.interfaces; + + let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); let testcases = env.get("JS_TEST"); if (testcases && testcases.length > 0) { if (testcases.search(filename) >= 0) do_subtest(filename); - } - else + } else do_subtest(filename); } // the subprocess tests -execTest("subprocess-test.js"); +execTest("subprocess-test.js"); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/ipc/tests/subprocess-test.js enigmail-2.1.3+ds1/ipc/tests/subprocess-test.js --- enigmail-2.0.12+ds1/ipc/tests/subprocess-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/ipc/tests/subprocess-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,4 @@ -/* global Components: false, Assert: false, do_get_file: false, do_print: false, do_get_cwd: false */ +/* global Assert: false, do_get_file: false, do_print: false, do_get_cwd: 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 @@ -10,10 +10,7 @@ * This file tests the implementation of subprocess.jsm */ -Components.utils.import("resource://enigmail/subprocess.jsm"); /* global subprocess: false */ - -const Cc = Components.classes; -const Ci = Components.interfaces; +const subprocess = ChromeUtils.import("chrome://enigmail/content/modules/subprocess.jsm").subprocess; var gTestLines; var gResultData; @@ -99,9 +96,6 @@ ); let len = gTestLines.join("").length; - if (isWindows) { - len -= gTestLines.length; - } Assert.equal( "Starting dump\nDumped " + len + " bytes\n", gResultStdErr.replace(/\r\n/g, "\n"), @@ -134,7 +128,7 @@ }); p.wait(); - Assert.equal(gTestLines.join("").length + (isWindows ? 3 : 0) + 30, gResultData.length, "comparing result"); + Assert.equal(gTestLines.join("").length + 30, gResultData.length, "comparing result"); ///////////////////////////////////////////////////////////////// @@ -321,4 +315,4 @@ p.wait(); } -} +} \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/lang/ar/enigmail.dtd enigmail-2.1.3+ds1/lang/ar/enigmail.dtd --- enigmail-2.0.12+ds1/lang/ar/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ar/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ - - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,11 +63,8 @@ - - - @@ -89,12 +77,13 @@ + - + @@ -117,6 +106,9 @@ + + + @@ -209,6 +201,7 @@ + @@ -345,7 +338,7 @@ - + @@ -368,7 +361,6 @@ - @@ -456,8 +448,8 @@ - - + + @@ -542,7 +534,7 @@ - + @@ -623,7 +615,7 @@ - + @@ -665,114 +657,30 @@ - - + - - - - - - - - - - - - - - - - - -لاحظ: سيقوم Enigmail دائما بالتحقق من التوقيعات على البريد لكل حساب أو هوية، بغض النظر عن تفعيلها من عدمه"> - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -شكرًا لاستخدامك Enigmail."> - - - - - - - - - + + + + + + + + + + + @@ -793,7 +701,9 @@ - + + + @@ -831,7 +741,7 @@ - + @@ -852,9 +762,19 @@ - + + - + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/ar/enigmail.properties enigmail-2.1.3+ds1/lang/ar/enigmail.properties --- enigmail-2.0.12+ds1/lang/ar/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ar/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=تنبيه Enigmail -enigConfirm=تأكيد Enigmail +# enigConfirm=Enigmail Confirmation # enigInfo=Enigmail Information enigError=عطل Enigmail enigPrompt=محث Enigmail @@ -78,7 +78,7 @@ # passSpaceProblem=Due to technical reasons, your passphrase may not start or end with a space character. changePassFailed=فشل تغيير كلمة السر. -keyConfirm=أأولد مفاتحين لأجل '%S'؟ +# keyConfirm=Generate public and secret key for '%S'? keyMan.button.generateKey=ولِّد م&فتاحا keyAbort=أأجهض توليد المفتاح؟ keyMan.button.generateKeyAbort=أجه&ض توليد المفتاح @@ -86,14 +86,14 @@ expiryTooLong=لا يمكنك إنشاء مفتاح تنتهي صلاحيته بعد أكثر من 100 عام. # expiryTooLongShorter=You cannot create a key that expires in more than 90 years. expiryTooShort=يجب أن يكون المفتاح صالحا ليوم واحد على الأقل. -keyGenFailed=فشل توليد المفتاح. من فضلك راجع مرقاب Enigmail (قائمة Enigmail > تنقيح Enigmail) لمزيد من التفاصيل. +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. # setKeyExpirationDateFailed=The expiration date could not be changed # Strings in enigmailMessengerOverlay.js securityInfo=معلومات خصوصية Enigmail\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *مرفقات هذه الرسالة لم تُوقّع أو تُعمّى*\n\n +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=قد تكون رسالة PGP/MIME معماة أو موقّعة؛ انقر 'ظهِّر' للتأكد saveAttachmentHeader=Enigmail: احفظ المرفقة المُظهَّرة @@ -102,7 +102,7 @@ beginPgpPart=********* *بداية الجزء المعمى أو الموقّع* ********* endPgpPart=********* *نهاية الجزء المعمى أو الموقّع* ********* -notePartEncrypted=Enigmail: *تحوي هذه الرسالة أجزاءً لم تُوقّع أو تُعمّى* +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *توجد عدة كتل رسائل -- أُجهض التظهير/التحقق* decryptOkNoSig=تحذير\n\nكان التظهير ناجحا، لكن تعذر التحقق من التوقيع بشكل صحيح @@ -114,6 +114,7 @@ # fixBrokenExchangeMsg.failed=Did not succeed to repair message. enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. @@ -148,10 +149,9 @@ minimalLineWrapping=لقد ضبطت طول السطر على %S حرف. لتعمية و/أو توقيع سليمين، ينبغي لهذه القيمة أن تكون 68 على الأقل.\nأتريد تغيير طول السطر إلى 68 حرفا الآن؟ warning=تحذير signIconClicked=لقد قمت يدويا بتغيير تفعيل التوقيع. لذا ففيما يتعلق بهذه الرسالة فإن تفعيل/تعطيل التوقيع لم يعد يعتمد على تفعيل/تعطيل التعمية. -# 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. +# 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.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. # msgCompose.internalEncryptionError=Internal Error: promised encryption disabled @@ -164,7 +164,6 @@ # msgCompose.toolbarTxt.disabled=Enigmail is disabled for the selected identity # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject -# msgCompose.encryptedSubjectStub=Encrypted Message # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject @@ -179,7 +178,7 @@ # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -# pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=أأحفظ الرسالة %S إلى %S في مجلد الرسائل غير المرسلة؟ onlineSend=أأرسل الرسالة %S إلى %S؟ -encryptKeysNote=ملحوظة: لقد عُمّيت الرسالة باستخدام هويات/مفاتيح المستخدمين التالية: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S # hiddenKey= -signFailed=عُطل في Enigmail؛ فشلت التعمية/التوقيع؛ أُرسلُ الرسالة غير مُعمّاة؟ +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=أر&سل الرسالة بلا تعمية recipientsSelectionHdr=اختر المستلمين للتعمية @@ -225,9 +224,9 @@ # signOffWithReason=Signing: OFF (%S) # reasonEnabledByDefault=enabled by default # reasonManuallyForced=manually forced -# reasonByRecipientRules=forced by recipient rules +# reasonByRecipientRules=forced by per-recipient rules # reasonByAutoEncryption=forced by auto encryption -# reasonByConflict=due to conflict in recipient rules +# reasonByConflict=due to conflict in per-recipient rules # reasonByEncryptionMode=due to encryption mode # should not be used anymore: @@ -252,9 +251,9 @@ # pgpmimeNo=Inline PGP will be used # Attach own key status (tooltip strings): -# attachOwnKeyNo=Your own key will not be attached -# attachOwnKeyYes=Your own key will be attached -# attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=وُجِدت قواعد مستلمين متعارضة\n%S\n\nأأرسل الرسالة بهذه الإعدادات؟ msgCompose.button.configure=ا&ضبط @@ -269,6 +268,10 @@ # clickDetailsButton=; click on 'Details' button for more information # clickImportButton=; click on the 'Import Key' button to import the key # keyTypeUnsupported=; the key type is not supported by your version of GnuPG +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=ظهِّر msgPart=جزة من الرسالة %S msgSigned=مُوقّعة # msgSignedUnkownKey=signed with unknown key @@ -280,8 +283,10 @@ needKey=عُطل - بحاجة لمفتاح سري لتعمية الرسالة failedDecrypt=عُطل - فشل التظهير badPhrase=عُطل - عبارة سر غير صحيحة +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=عُطل - فشل التظهير/التحقق viewInfo=؛ اعرض > معلومات خصوصية الرسالة للتفاصيل +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=ظهِّر الرسالة # decryptedMsgWithFormatError=Decrypted message (restored broken PGP email format probably caused by an old Exchange server, so that the result might not be perfect to read) @@ -326,6 +331,7 @@ # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. @@ -337,6 +343,8 @@ prefs.warnAskNever=تحذير: تفعيل هذا الخيار سيؤدي إلى إرسال بغير تعمية دون أي تنويهات إذا لم يوجد مفتاح لأحد المُستلمين -- لن يُنبهك Enigmail عند حدوث ذلك! # prefs.warnIdleTimeForUnknownAgent=Cannot connect to gpg-agent. Maybe your system uses a specialized tool for passphrase handling (e.g. gnome-keyring, seahorse-agent, KDE wallet manager, ...). Unfortunately Enigmail cannot control the passphrase timeout for the tool you are using. Therefore the respective timeout settings in Enigmail are disregarded. prefEnigmail.oneKeyserverOnly=عطل - لا يمكن تحديد سوى خادوم مفاتيح واحد لجلب مفاتيح OpenPGP الناقصة. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +# aboutLicense.desc=Enigmail is open source and licensed under the Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=عُطل - لم تدخل أية عبارة سر noPGPblock=عُطل - لم يُعثر على أي كتل بيانات OpenPGP مدرّع unverifiedReply=جزء الرسالة المزاح (الرد) قد تغيير على الأغلب -# keyInMessageBody=Key in message body found. Click 'Import Key' to import the key +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=عُطل - توقيع غير صحيح -cantImport=خطأ في استيراد المفتاح العلني\n\n +# cantImport=Error importing public key\n\n # doImportOne=Import %1$S (%2$S)? # doImportMultiple=Import the following keys?\n\n%S # previewFailed=Can't read public key file. @@ -366,14 +374,15 @@ sc.removeCard=تتطلب هذه العملية ألا توجد في القارئ بطاقة ذكية.\nأخرج البطاقة الذكية و أعد العملية. sc.noCardAvailable=لم يُعثر على بطاقة ذكية في القارئ\nأدخل البطاقة الذكية ثم أعد العملية. sc.noReaderAvailable=لا يمكن النفاذ إلى قارئ البطاقات الذكية\nأوصل قارئ البطاقات الذكية ثم أدخل البطاقة ثم أعد العملية. -# keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. -# keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. # keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. # missingPassphrase=Missing passphrase # errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. # errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=تعذر تحديد موضع برمجية GnuPG '%S'.\nتأكد أنك ضبطت مسار ملف GnuPG التنفيذي صحيحا في تفضيلات Enigmail. @@ -384,9 +393,8 @@ prefBad=توقيع غير صحيح من %S failCancel=عُطل - ألغى المستخدم جلب المفتاح -failNoServer=عُطل - لم تحدد خادوم مفاتيح لجلب المفاتيح منه -failNoID=عُطل - لم تحدد هوية لجلب مفتاح لها failKeyExtract=عُطل - فشل أمر استخراج المفتاح +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=عُطل - أول كتلة OpenPGP ليست كتلة مفتاح علني importKeyConfirm=أأستورد المفاتيح العلنية المضمنة في الرسالة؟ failKeyImport=عُطل - فشل استيراد المفتاح @@ -425,6 +433,8 @@ identityName=الهوية: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=لقد فعّلت التعمية لكنك لم تختر مفتاحا. لتعمي الرسائل إلى %S ينبغي لك تحديد مفتاح سليم أو أكثر من قائمة المفاتيح. أترغب في تعطيل التعمية إلى %S؟ @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=الخاصية التي اخترتها غير متاحة في طور عدم الاتصال. من فضلك تحول إلى طور الاتصال وحاول مجددا. -protocolNotSupported=البروتوكول '%S://' الذي اخترته غير مدعوم لجلب مفاتيح OpenPGP. -gpgkeysDisabled=قد يُساعدك تفعيل الخيار 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=تعذّر الاتصال بخادوم المفاتيح %S. -keyDownloadFailed=فشل الجلب من خادوم المفاتيح. رسالة الحالة هي:\n%S internalError=حدث عطل داخلي. تعذّر جلب المفاتيح أو استيرادها. -noKeyFound=لم أعثر على أي مفاتيح تتطابق معايير البحث.\nلاحظ أن هويات المفاتيح يجب أن تُسبق ب‍ \\"0x\\" (مثلا: 0xABCDEF12). -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=فشل البحث عن أو جلب المفتاح من خادوم المفاتيح: لا يُمكن تنفيذ gpgkeys_%S. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=فشل ضبط الثقة في المالك @@ -490,7 +493,6 @@ asciiArmorFile=‮ملفات أسكي (‪ASCII‬) مُدرّعة (*.‪asc‬) importKeyFile=Import OpenPGP Key File gnupgFile=ملفات GnuPG -# createKeyOK=Your Key has been generated saveRevokeCertAs=أنشئ واحفظ شهادة نقض # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=تعذّر إنشاء شهادة النقض. @@ -509,19 +511,19 @@ # specificPubSecKeyFilename=%1$S (0x%2$S) pub-sec # defaultPubKeyFilename=Exported-public-keys # defaultPubSecKeyFilename=Exported-public-and-secret-keys -noSecretKeys=لم يُعثر على مفاتيح سرية.\n\nأتريد توليد مفتاح الآن؟ sendKeysOk=تم إرسال المفاتيح بنجاح sendKeysFailed=فشل إرسال المفاتيح receiveKeysOk=تم تحديث المفاتيح بنجاح receiveKeysFailed=فشل جلب المفاتيح +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=أتريد استيراد المفاتيح من الحافظة؟ # importFromUrl=Download public key from this URL: copyToClipbrdFailed=تعذر نسخ المفاتيح المختارة إلى الحافظة. copyToClipbrdOK=تم نسخ المفاتيح إلى الحافظة -deleteSecretKey=تحذير: أنت بصدد حذف مفتاح سري!\nإن حذفت مفتاحك السري فلن يعود بوسعك تظهير أية رسالة عُمِّيت لهذا المفتاح، و لن تستطيع نقض المفتاح كذلك.\n\nأترغب حقا في حذف كلا المفتاحين السري و العلني\n'%S'؟ +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=تحذير: أنت بصدد حذف مفتاح سري!\nإن حذفت مفتاحك السري فلن يعود بوسعك تظهير أية رسالة عُمِّيت لهذا المفتاح، ولن تستطيع نقض المفتاح كذلك.\n\nأترغب حقا في حذف كلا المفتاحين السري والعلني؟ deletePubKey=أتريد حذف المفتاح العلني\n'%S'؟ deleteSelectedPubKey=أتريد حذف المفاتيح العلنية؟ @@ -529,7 +531,7 @@ # revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? revokeKeyOk=لقد تم نقض هذا المفتاح. إذا كان مفتاحك منشورا على خادوم مفاتيح فيُفضّل أن تعيد رفعه ليرى الآخرون النقض. revokeKeyFailed=تعذّر نقض المفتاح. -# revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=لم تختر أي مفتاح. أتريد تحديث كل المفاتيح؟ # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? @@ -541,21 +543,21 @@ keyMan.button.import=ا&ستورد keyMan.button.refreshAll=&حدِّث كل المفاتيح keyMan.button.revokeKey=ان&قض المفتاح -# keyMan.button.skip=&Skip Key keylist.noOtherUids=ليست له هويات أخرى keylist.hasOtherUids=معروف كذلك باسم -keylist.noPhotos=لا توجد صورة -keylist.hasPhotos=الصور +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos # keyMan.addphoto.filepicker.title=Select photo to add -# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files because the keys get very large by this. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. # keyMan.addphoto.noJpegFile=The selected file does not appear to be a JPEG file. Please choose a different file. # keyMan.addphoto.failed=The photo could not be added. # noWksIdentity=The key %S does not have a WKS identity. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? -# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=فشل تغيير PIN -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=يجري تحديث المفاتيح؛ انتظر... keyserverProgress.uploading=يجري رفع المفاتيح؛ انتظر... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=تم تحديث المفاتيح keyserverTitle.uploading=تم تحديث المفتاح +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=يجب أن تتألف كلمة السر من 8 محارف على الأقل -setupWizard.reallyCancel=أترغب حقا في صرف مرشد إعداد Enigmail؟ # setupWizard.invalidGpg=The file you specified is not a GnuPG executable. Please specify a different file. -setupWizard.specifyFile=You need to at least specify a public key file in order to proceed. # setupWizard.installFailed=It seems that the installation was not successful. Please either retry the installation, or install GnuPG manually and locate it using the Browse button. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. -# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or manipulated. Do you want to continue the installation anyway? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? # setupWizard.importSettingsFile=Specify backup file to load from -# setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. # setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? -# setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm # installGnuPG.downloadFailed=An error occurred while trying to download GnuPG. Please check the console log for further details. @@ -654,12 +662,12 @@ # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. -# filter.keyNotFound=Could not find an encryption key for "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -# converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? -# converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? # saveLogFile.title=Save Log File @@ -691,13 +699,13 @@ # enigmailSettings=EnigmailSettings # defaultBackupFileName=Enigmail-export # specifyExportFile=Specify file name for exporting -# homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm -# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. -# expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties @@ -709,6 +717,7 @@ # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. @@ -728,12 +737,12 @@ # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! -# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. -# pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. @@ -763,16 +772,16 @@ # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. -# handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device -# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? @@ -785,10 +794,12 @@ # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. +#strings in pEpAdapter.jsm # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=عن Enigmail @@ -799,6 +810,7 @@ # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: +# aboutEnigmail.userSupport.team=the team and the list/forum members # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension @@ -808,3 +820,38 @@ # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/bg/enigmail.dtd enigmail-2.1.3+ds1/lang/bg/enigmail.dtd --- enigmail-2.0.12+ds1/lang/bg/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/bg/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ - - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,11 +63,8 @@ - - - @@ -89,12 +77,13 @@ + - + @@ -117,6 +106,9 @@ + + + @@ -209,6 +201,7 @@ + @@ -345,7 +338,7 @@ - + @@ -368,7 +361,6 @@ - @@ -456,8 +448,8 @@ - - + + @@ -542,7 +534,7 @@ - + @@ -623,7 +615,7 @@ - + @@ -665,114 +657,30 @@ - - + - - - - - - - - - - - - - - - - - -Забележка: Enigmail винаги ще проверява подписите на писмата за всеки акаунт или идентичност, независимо дали това е активирано или не"> - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Благодарим ви, че използвате Enigmail."> - - - - - - - - - + + + + + + + + + + + @@ -793,7 +701,9 @@ - + + + @@ -852,9 +762,19 @@ - + + - + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/bg/enigmail.properties enigmail-2.1.3+ds1/lang/bg/enigmail.properties --- enigmail-2.0.12+ds1/lang/bg/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/bg/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=Enigmail Предупреждение -enigConfirm=Enigmail Потвърждение +# enigConfirm=Enigmail Confirmation # enigInfo=Enigmail Information enigError=Enigmail Грешка enigPrompt=Enigmail Напомняне @@ -78,7 +78,7 @@ passSpaceProblem=\nПоради технически причини, паролата ви, не може да започне или завърши с интервал. changePassFailed=Промяната на паролата за защита на частния ключ е неуспешна. -keyConfirm=Генериране на публичен и частен ключ за '%S'? +# keyConfirm=Generate public and secret key for '%S'? keyMan.button.generateKey=&Генериране на ключ keyAbort=Да се прекъсне ли генерирането на ключ? keyMan.button.generateKeyAbort=&Прекъсване на генерирането на ключ @@ -86,14 +86,14 @@ expiryTooLong=Не може да създавате ключ със срок на валидност по-голям от 100 години. expiryTooLongShorter=Вие не можете да създадете ключ, който изтича след повече от 90 години. expiryTooShort=Ключа трябва да има валидност поне един ден. -keyGenFailed=Генерирането на ключ беше провалено. Моля проверете Enigmail конзолата (Меню Enigmail > Опции за отстраняване на грешки) за подробности. +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. setKeyExpirationDateFailed=Срокът на валидност не може да бъде променен # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail информация за сигурност\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Прикачените съобщения към това съобщение не са криптирани или подписани*\n\n +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=Възможно е съобщението да е криптирано или подписано с PGP/MIME; натиснете бутона 'Декриптирай' за да го проверите saveAttachmentHeader=Enigmail: Запишете декриптирания прикачен файл @@ -102,7 +102,7 @@ beginPgpPart=********* *НАЧАЛО НА КРИПТИРАНАТА ИЛИ ПОДПИСАНАТА ЧАСТ* ********* endPgpPart=********** *КРАЙ НА КРИПТИРАНАТА ИЛИ ПОДПИСАНАТА ЧАСТ* ********** -notePartEncrypted=Enigmail: *Частите на това съобщение не са криптирани или подписани* +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *В съобщението са намерени множество блокове -- декриптирането/проверката са прекъснати* decryptOkNoSig=Предупреждение\n\nДекриптирането беше успешно, но подписа не не беше проверен коректно @@ -114,6 +114,7 @@ # fixBrokenExchangeMsg.failed=Did not succeed to repair message. enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. @@ -148,10 +149,9 @@ minimalLineWrapping=Вие решихте да изравните редовете по %S символа ширина. За правилно криптиране и/или подписване, тази стойност трябва да е най-малко 68.\nЖелаете ли да промените подравняването на 68 символа? warning=Предупреждение signIconClicked=Вие ръчно определихте дали да се подписва съобщението. Ето защо използването на подписване не зависи от използването на криптиране. -# 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. +# 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.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. # msgCompose.internalEncryptionError=Internal Error: promised encryption disabled @@ -164,7 +164,6 @@ # msgCompose.toolbarTxt.disabled=Enigmail is disabled for the selected identity # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject -# msgCompose.encryptedSubjectStub=Encrypted Message # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject @@ -179,7 +178,7 @@ # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -# pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=Да запиша ли %S съобщението %S в папката за неизпратени съобщения? onlineSend=Да изпратя ли %S съобщение на %S? -encryptKeysNote=Забележка: съобщението е криптирано със следната Потребителска идентификация / Ключове: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S # hiddenKey= -signFailed=Грешка в Enigmail; Криптирането/подписването беше неуспешно; Да изпратя ли съобщението некриптирано? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=&Изпращане на некриптирано съобщение recipientsSelectionHdr=Избери получателите на криптираното съобщение @@ -225,9 +224,9 @@ # signOffWithReason=Signing: OFF (%S) # reasonEnabledByDefault=enabled by default # reasonManuallyForced=manually forced -reasonByRecipientRules=принудени от правилата на получателите +# reasonByRecipientRules=forced by per-recipient rules reasonByAutoEncryption=принудени от автоматичното криптиране -reasonByConflict=поради конфликт в правилата на получателите +# reasonByConflict=due to conflict in per-recipient rules reasonByEncryptionMode=поради режим на криптиране # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=Inline PGP ще бъдат използван # Attach own key status (tooltip strings): -# attachOwnKeyNo=Your own key will not be attached -# attachOwnKeyYes=Your own key will be attached -# attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Възникна конфликт с правилата на получателя\n%S\n\nДа изпратя ли съобщението с тези настройки? msgCompose.button.configure=&Настройки @@ -269,6 +268,10 @@ clickDetailsButton=; щракнете върху бутона 'Детайли' за повече информация # clickImportButton=; click on the 'Import Key' button to import the key # keyTypeUnsupported=; the key type is not supported by your version of GnuPG +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Декриптиране msgPart=Част от съобщението %S msgSigned=подписано # msgSignedUnkownKey=signed with unknown key @@ -280,8 +283,10 @@ needKey=Грешка - за да декриптирате съобщението имате нужда от секретния ключ failedDecrypt=Грешка - декриптирането е неуспешно badPhrase=Грешка - грешна парола за защита на частния ключ +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=Грешка - декриптирането или проверката на цифровия подпис е неуспешно viewInfo=; View > Информация за детайлите на сигурността на съобщението +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=Декриптирано съобщение # decryptedMsgWithFormatError=Decrypted message (restored broken PGP email format probably caused by an old Exchange server, so that the result might not be perfect to read) @@ -326,6 +331,7 @@ # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. @@ -337,6 +343,8 @@ prefs.warnAskNever=Предупреждение: активирането на тази опция ще доведе до некриптирани имейли без всякаква допълнителна информация, ако няма ключ за някой от получателите - Enigmail няма да ви информира, ако това се случи! # prefs.warnIdleTimeForUnknownAgent=Cannot connect to gpg-agent. Maybe your system uses a specialized tool for passphrase handling (e.g. gnome-keyring, seahorse-agent, KDE wallet manager, ...). Unfortunately Enigmail cannot control the passphrase timeout for the tool you are using. Therefore the respective timeout settings in Enigmail are disregarded. prefEnigmail.oneKeyserverOnly=Грешка - може да изберете само един сървър за ключове за свалене на липстващи OpenPGP ключове. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +# aboutLicense.desc=Enigmail is open source and licensed under the Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=Грешка - не беше въведена парола за защита на частния ключ noPGPblock=Грешка - Не е намерен защитения блок с данни на OpenPGP unverifiedReply=Indented message part (reply) was probably modified -# keyInMessageBody=Key in message body found. Click 'Import Key' to import the key +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=Грешка - Подписите не съвпадат -cantImport=Грешка при внасянето на публичния ключ\n\n +# cantImport=Error importing public key\n\n # doImportOne=Import %1$S (%2$S)? # doImportMultiple=Import the following keys?\n\n%S # previewFailed=Can't read public key file. @@ -366,14 +374,15 @@ sc.removeCard=Операцията изисква вашата Смарткарта да бъде поставена в четеца.\nМоля сложете вашата Смарткарта и повторете операцията. sc.noCardAvailable=Във вашия четец не беше открита Смарткарта\nМоля поставете вашата Смарткарта, и повторете операцията. sc.noReaderAvailable=Вашият четец за Смарт карти е недостъпен.\nМоля свържете вашия четец за Смарткарти, поставете вашата карта, и повторете операцията. -# keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. -# keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. # keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. # missingPassphrase=Missing passphrase # errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. # errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=Невъзможно е да се намери GnuPG програмата '%S'.\nУверете се, че сте задали пътя на изпълнимия GnuPG файли в настройките. @@ -384,9 +393,8 @@ prefBad=Неправилен подпис от %S failCancel=Error - Получаването на ключа е отменено от потребителя -failNoServer=Error - Не е указан сървър за ключове -failNoID=Error - Не е указан идентификатор на ключа за получаването на ключа failKeyExtract=Error - извличането на ключа е неуспешно +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=Error - Първият OpenPGP блок не е блок на публичния ключ importKeyConfirm=Да импортирам ли ключа(овете) приложени в съобщението? failKeyImport=Error - внасянето ня ключа е неуспешно @@ -425,6 +433,8 @@ identityName=Самоличност: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Имате активирано криптиране, но все ощч не сте избрали ключ. За да криптирате съобщенията изпращани на %S, трябва да изберете един или няколко ключа от вашия лист. Желаете ли да деактивирате криптирането за %S? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=Функцията която сте избрали не работи в Офлайн режим. Моля преминете в Онлайн режим. -protocolNotSupported=Протокола '%S://' който сте избрали не се поддържа за сваляне на OpenPGP ключове. -gpgkeysDisabled=Включването на опцията може да помогне 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=Свързването със сървъра за ключове %S е невъзможно. -keyDownloadFailed=Свалянето на ключа от сървъра за ключове е неуспешно. Статуса е:\n%S internalError=Възникна вътршна грешка. Ключовете не могата да бъдат свалени или внесени. -noKeyFound=Съжаляваме, не бяха намерени ключове който да съвпадат с въведените критерии за търсене.\nМоля забележете че идентификацията на ключа трябва да започва с \\"0x\\" (e.g. 0xABCDEF12). -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Търсенето или свалянето на кл=чове от сървъра за ключове е неуспешно: gpgkeys_%S не може да бъде изпълнен. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Задаването на доверие на собственика на ключа е неуспешно @@ -490,7 +493,6 @@ asciiArmorFile=ASCII Защитени файлове (*.asc) importKeyFile=Внеси файл за OpenPGP ключ gnupgFile=GnuPG Файлове -# createKeyOK=Your Key has been generated saveRevokeCertAs=Създаване и запис на Анулиращ сертификат # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=Анилиращия сертифика не може да бъде създаден. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%S (0x%S) pub-sec defaultPubKeyFilename=Изнесени-публични ключове defaultPubSecKeyFilename=Изнесени-публични-и-секретни-ключове -noSecretKeys=Не са намерени секретни ключове.\n\nЖелаете ли да генерирате собствен ключ сега? sendKeysOk=Ключа(овете) са изпратени успешно sendKeysFailed=Изпращането на ключовете е неуспешно receiveKeysOk=Ключа(овете) са обновени успешно receiveKeysFailed=Свалянето на ключовете пропадна +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=Искате ли да внесете ключ(ове) от клипборда? # importFromUrl=Download public key from this URL: copyToClipbrdFailed=Не може да копирате избраният ключо(ове) в клипборда. copyToClipbrdOK=Ключа(овете) са копирани в клипборда -deleteSecretKey=Предупреждение: На път сте да изтриете секретния ключ!\nАко изтриете вашия секретен ключ, повече няма да можете да декриптирате съобщенията криптирани за този ключ, и няма да може да анулирате този ключ.\n\nНаистина ли желаете да изтриете и двата ключа, секретния и публичния ключ\n'%S'? +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=Предупреждение: На път сте да изтриете секретния ключ!\nАко изтриете вашия секретен ключ, повече няма да можете дя декриптирате съобщенията криптирани за този ключ.\n\nНаистина ли желаете да изтриете и двата, избрания секретен и публичен ключ? deletePubKey=Желаете ли да изтриете публичния ключ\n'%S'? deleteSelectedPubKey=Желаете ли да изтриете публичните ключове? @@ -529,7 +531,7 @@ # revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? revokeKeyOk=Ключа ще бъде анулиран. Ако ключа ви е качен на сървъра за ключове, е препоръчително да го качите отново, за да виждат всички че е анулиран. revokeKeyFailed=Ключа не може да бъде анулиран. -# revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Не сте избрали ключ. Искате ли да обновите всички ключове? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? @@ -541,21 +543,21 @@ keyMan.button.import=&Внасяне keyMan.button.refreshAll=&Обновяване на всички ключове keyMan.button.revokeKey=&Нулиране на ключа -# keyMan.button.skip=&Skip Key keylist.noOtherUids=Няма други идентификации keylist.hasOtherUids=Така известни както -keylist.noPhotos=Няма фотография -keylist.hasPhotos=Фотография +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos # keyMan.addphoto.filepicker.title=Select photo to add -# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files because the keys get very large by this. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. # keyMan.addphoto.noJpegFile=The selected file does not appear to be a JPEG file. Please choose a different file. # keyMan.addphoto.failed=The photo could not be added. # noWksIdentity=The key %S does not have a WKS identity. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? -# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Смяната на PIN-а беше неуспешна -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Обновяване на ключовете, моля изчакайте ... keyserverProgress.uploading=Качване на ключовете, моля изчакайте ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Обновяване на ключовете keyserverTitle.uploading=Качване на ключ +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=Вашата парола за защита на частния ключ трябва да се състой най-малко от 8 символа! -setupWizard.reallyCancel=Наистина ли желаете да затворите Enigmail съветника за настройка? # setupWizard.invalidGpg=The file you specified is not a GnuPG executable. Please specify a different file. -# setupWizard.specifyFile=You need to at least specify a public key file in order to proceed. # setupWizard.installFailed=It seems that the installation was not successful. Please either retry the installation, or install GnuPG manually and locate it using the Browse button. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. -# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or manipulated. Do you want to continue the installation anyway? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? # setupWizard.importSettingsFile=Specify backup file to load from -# setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. # setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? -# setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm # installGnuPG.downloadFailed=An error occurred while trying to download GnuPG. Please check the console log for further details. @@ -654,12 +662,12 @@ # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. -# filter.keyNotFound=Could not find an encryption key for "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -# converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? -# converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? # saveLogFile.title=Save Log File @@ -691,13 +699,13 @@ # enigmailSettings=EnigmailSettings # defaultBackupFileName=Enigmail-export # specifyExportFile=Specify file name for exporting -# homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm -# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. -# expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties @@ -709,6 +717,7 @@ # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. @@ -728,12 +737,12 @@ # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! -# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. -# pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. @@ -763,16 +772,16 @@ # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. -# handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device -# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? @@ -785,10 +794,12 @@ # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. +#strings in pEpAdapter.jsm # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=Относно Enigmail @@ -799,6 +810,7 @@ # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: +# aboutEnigmail.userSupport.team=the team and the list/forum members # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension @@ -808,3 +820,38 @@ # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/ca/enigmail.dtd enigmail-2.1.3+ds1/lang/ca/enigmail.dtd --- enigmail-2.0.12+ds1/lang/ca/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ca/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ -Mozilla Public License 2.0."> - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,10 +63,7 @@ - - - - + @@ -89,12 +77,13 @@ + - + @@ -117,6 +106,9 @@ + + + @@ -209,6 +201,7 @@ + @@ -345,7 +338,7 @@ - + @@ -368,7 +361,6 @@ - @@ -456,8 +448,8 @@ - - + + @@ -542,7 +534,7 @@ - + @@ -623,7 +615,7 @@ - + @@ -665,114 +657,30 @@ - - + - - - - - - - - - - - - - - - - - -Nota: L'Enigmail sempre verificarà les signatures dels correus per cada compte o identitat, sense fer cas a si està habilitat o no."> - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Gràcies per emprar l'Enigmail."> - - - - - - - - - + + + + + + + + + + + @@ -793,7 +701,9 @@ - + + + @@ -852,9 +762,19 @@ - + + - + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/ca/enigmail.properties enigmail-2.1.3+ds1/lang/ca/enigmail.properties --- enigmail-2.0.12+ds1/lang/ca/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ca/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=Alerta de l'Enigmail -enigConfirm=Confirmació de l'Enigmail +# enigConfirm=Enigmail Confirmation # enigInfo=Enigmail Information enigError=Error de l'Enigmail enigPrompt=Pregunta de l'Enigmail @@ -78,7 +78,7 @@ passSpaceProblem=A causa de raons tècniques, la vostra contrasenya no pot començar amb un espai. changePassFailed=Ha fallat el canvi de contrasenya. -keyConfirm=Genero les claus pública i privada per '%S'? +# keyConfirm=Generate public and secret key for '%S'? keyMan.button.generateKey=&Genera la clau keyAbort=Cancel·lo la generació de la clau? keyMan.button.generateKeyAbort=&Interromp la generació de la clau @@ -86,14 +86,14 @@ expiryTooLong=No podeu crear cap clau que caduqui més enllà dels 100 anys. expiryTooLongShorter=No podeu crear una clau que caduqui més enllà dels 90 anys. expiryTooShort=La vostra clau ha de ser vàlida com a mínim durant un dia. -keyGenFailed=La generació de la clau ha fallat. Comproveu els detalls a la consola de l'Enigmail (menú Enigmail > Depuració de l'Enigmail). +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. setKeyExpirationDateFailed=No s'ha canviat la data de caducitat # Strings in enigmailMessengerOverlay.js securityInfo=Informació de seguretat Enigmail\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Els fitxers adjunts a aquest missatge no s'han signat o xifrat*\n\n +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=El missatge segurament s'ha xifrat o signat amb PGP/MIME; cliqueu el botó Desxifra per verificar-ho saveAttachmentHeader=Enigmail: Desa l'adjunt desxifrat @@ -102,7 +102,7 @@ beginPgpPart=********* *INICI DE PART XIFRADA o SIGNADA* ******** endPgpPart=********** *FI DE PART XIFRADA o SIGNADA* ********** -notePartEncrypted=Enigmail: *NO s'ha signat o xifrat parts del missatge* +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *S'han trobat múltiples blocs de missatge -- s'ha cancel·lat el desxifratge/verificació* decryptOkNoSig=Avís\n\nEl desxifratge ha reeixit, però la signatura no s'ha pogut verificar correctament @@ -114,6 +114,7 @@ # fixBrokenExchangeMsg.failed=Did not succeed to repair message. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. @@ -148,10 +149,9 @@ minimalLineWrapping=Heu establert l'ajustament de línia a %S caràcters. Per a un xifratge i/o signatura correctes, aquest valor ha de ser almenys 68.\nVoleu canviar ara l'ajust de línia a 68 caràcters? warning=Avís signIconClicked=Heu modificat manualment la signatura. Per tant, mentre redacteu el missatge, la (des)activació de la signatura no dependrà de la (des)activació del xifratge. -# 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. +# 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.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. # msgCompose.internalEncryptionError=Internal Error: promised encryption disabled @@ -164,7 +164,6 @@ # msgCompose.toolbarTxt.disabled=Enigmail is disabled for the selected identity # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject -# msgCompose.encryptedSubjectStub=Encrypted Message # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject @@ -179,7 +178,7 @@ # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -# pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=Deso el missatge %S a %S a la carpeta de Missatges per enviar? onlineSend=Envio el missatge %S a %S? -encryptKeysNote=Nota: el missatge està xifrat amb la següent identificació d'usuari / clau: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S # hiddenKey= -signFailed=Error a l'Enigmail; ha fallat la xifra/signatura; envio el missatge sense xifrar? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=&Envia el missatge sense xifrar recipientsSelectionHdr=Seleccioneu els destinataris per xifrar @@ -225,9 +224,9 @@ # signOffWithReason=Signing: OFF (%S) # reasonEnabledByDefault=enabled by default # reasonManuallyForced=manually forced -# reasonByRecipientRules=forced by recipient rules +# reasonByRecipientRules=forced by per-recipient rules # reasonByAutoEncryption=forced by auto encryption -# reasonByConflict=due to conflict in recipient rules +# reasonByConflict=due to conflict in per-recipient rules # reasonByEncryptionMode=due to encryption mode # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=S'usarà PGP integrat. # Attach own key status (tooltip strings): -# attachOwnKeyNo=Your own key will not be attached -# attachOwnKeyYes=Your own key will be attached -# attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=S'ha detectat un conflicte a les regles per destinatari\n%S\n\nEnvio el missatge amb aquests paràmetres? msgCompose.button.configure=&Configura @@ -269,6 +268,10 @@ # clickDetailsButton=; click on 'Details' button for more information # clickImportButton=; click on the 'Import Key' button to import the key # keyTypeUnsupported=; the key type is not supported by your version of GnuPG +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Desxifra msgPart=Part del missatge %S msgSigned=signat # msgSignedUnkownKey=signed with unknown key @@ -280,8 +283,10 @@ needKey=Error - cal la clau secreta per desxifrar el missatge failedDecrypt=Error - ha fallat el desxifratge badPhrase=Error - contrasenya incorrecta +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=Error - ha fallat el desxifratge/verificació viewInfo=; Visualitza > Informació de seguretat del missatge per als detalls +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=Missatge desxifrat # decryptedMsgWithFormatError=Decrypted message (restored broken PGP email format probably caused by an old Exchange server, so that the result might not be perfect to read) @@ -326,6 +331,7 @@ # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. @@ -337,6 +343,8 @@ prefs.warnAskNever=Avís: l'activació d'aquesta opció provocarà, sense mès informació, que els correus no es xifrin si no hi ha la clau per algun dels destinataris -- Si això passa, l'Enigmail no us informarà! # prefs.warnIdleTimeForUnknownAgent=Cannot connect to gpg-agent. Maybe your system uses a specialized tool for passphrase handling (e.g. gnome-keyring, seahorse-agent, KDE wallet manager, ...). Unfortunately Enigmail cannot control the passphrase timeout for the tool you are using. Therefore the respective timeout settings in Enigmail are disregarded. prefEnigmail.oneKeyserverOnly=Error - nomès podeu indicar un servidor de claus per a la baixada automàtica de claus OpenPGP que manquin. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +aboutLicense.desc=L'Enigmail és de codi obert i amb llicència Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=Error - no s'ha facilitat la contrasenya noPGPblock=Error - no s'ha trobat cap bloc cuirassat amb dades OpenPGP unverifiedReply=La part indentada del missatge (resposta) ha estat probablement modificada -# keyInMessageBody=Key in message body found. Click 'Import Key' to import the key +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=Error - la signatura no coincideix -cantImport=Error en importar la clau pública\n\n +# cantImport=Error importing public key\n\n # doImportOne=Import %1$S (%2$S)? # doImportMultiple=Import the following keys?\n\n%S # previewFailed=Can't read public key file. @@ -366,14 +374,15 @@ sc.removeCard=L'operació requereix que no hi hagi cap targeta intel·ligent en el lector.\nSi us plau, retireu la targeta intel·ligent i repetiu l'operació. sc.noCardAvailable=No hi ha cap targeta intel·ligent al lector\nInseriu la vostra targeta intel·ligent i repetiu l'operació. sc.noReaderAvailable=No s'ha pogut accedir a la targeta intel·ligent\nConnecteu el lector de targetes intel·ligents, inseriu la vostra targeta, i repetiu l'operació. -# keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. -# keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. # keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. # missingPassphrase=Missing passphrase # errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. # errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=No s'ha pogut trobar el programa GnuPG '%S'.\nComproveu que s'ha indicat el camí correcte a l'executable GnuPG a les Preferències de l'Enigmail. @@ -384,9 +393,8 @@ prefBad=Signatura INCORRECTA de %S failCancel=Error - L'usuari ha cancel·lat la recepció de la clau -failNoServer=Error - No s'ha especificat cap servidor de claus per rebre la clau -failNoID=Error - No s'ha especificat cap identificador de clau per rebre-la failKeyExtract=Error - ha fallat l'ordre d'extracció de la clau +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=Error - El primer bloc OpenPGP no és un bloc de clau pública importKeyConfirm=Importo la clau/s pública incrustada al missatge? failKeyImport=Error - ha fallat la importació de la clau @@ -425,6 +433,8 @@ identityName=Identitat: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Heu activat l'opció de xifrar, però no heu seleccionat cap clau. Per a enviar correus xifrats a %S us cal indicar una o més claus vàlides de la vostra llista de claus. Voleu desactivar el xifratge per a %S? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=La funció que heu seleccionat no és disponible en mode fora de línia. Connecteu-vos i torneu a provar. -protocolNotSupported=El protocol '%S://' que heu seleccionat no és permés per a descarregar claus OpenPGP. -gpgkeysDisabled=Us pot ajudar l'activació de l'opció 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=No es pot connectar al servidor de claus %S. -keyDownloadFailed=Ha fallat la descàrrega de la clau del servidor de claus. El missatge d'estat és:\n%S internalError=Hi ha hagut un error intern. Les claus no s'han pogut descarregar o importar. -noKeyFound=Ho sento, no s'ha trobat cap clau que coincideixi amb el criteri de recerca indicat.\nTingueu en compte que els identificadors de clau han d'estar prefixats amb \\"0x\\" (p.ex. 0xABCDEF12). -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Ha fallat la recerca o la descàrrega de la clau del servidor de claus: no s'ha pogut executar gpgkeys_%S. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Ha fallat l'assignació de la confiança del propietari @@ -490,7 +493,6 @@ asciiArmorFile=Fitxers cuirassats ASCII (*.asc) importKeyFile=Importa un fitxer de claus OpenPGP gnupgFile=Fitxers GnuPG -# createKeyOK=Your Key has been generated saveRevokeCertAs=Crea i desa el certificat de revocació # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=No s'ha pogut crear el certificat de revocació. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%S (0x%S) pub-sec defaultPubKeyFilename=Claus-públiques-exportades defaultPubSecKeyFilename=Claus-públiques-i-secretes-exportades -noSecretKeys=No s'ha trobat cap clau secreta.\n\nVoleu generar ara la vostra propia clau? sendKeysOk=La clau/s s'ha enviat amb èxit sendKeysFailed=Ha fallat l'enviament de les claus receiveKeysOk=La clau/s s'ha actualitzat amb èxit receiveKeysFailed=Ha fallat la baixada de les claus +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=Voleu importar alguna clau/s del porta-retalls? # importFromUrl=Download public key from this URL: copyToClipbrdFailed=No s'han pogut copiar la clau/s seleccionada al porta-retalls. copyToClipbrdOK=La clau/s s'ha copiat al porta-retalls -deleteSecretKey=AVÍS: Esteu a punt de suprimir una clau secreta!\nSi esborreu la vostra clau secreta, ja no podreu desxifrar els missatges xifrats amb aquesta clau. \n\nSegur que voleu suprimir les dues, la clau secreta i la clau pública \n'%S'? +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=AVÍS: Esteu a punt de suprimir claus secretes!\nSi esborreu la vostra clau secreta, mai més podreu desxifrar cap missatge xifrat amb aquest clau. \n\nSegur que voleu suprimir ambdues claus seleccionades, la secreta i la pública? deletePubKey=Voleu suprimir la clau pública\n'%S'? deleteSelectedPubKey=Voleu suprimir les claus públiques? @@ -529,7 +531,7 @@ # revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? revokeKeyOk=S'ha revocat la clau. Si la vostra clau estava en un servidor de claus, es recomena que la torneu a pujar, de manera que els altres puguin veure la revocació. revokeKeyFailed=No s'ha pogut revocar la clau. -# revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=No heu seleccionat cap clau. Voleu refrescar TOTES les claus? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? @@ -541,21 +543,21 @@ keyMan.button.import=&Importa keyMan.button.refreshAll=&Refresca totes les claus keyMan.button.revokeKey=&Revoca una clau -# keyMan.button.skip=&Skip Key keylist.noOtherUids=No tè altres identitats keylist.hasOtherUids=Tambè conegut com a -keylist.noPhotos=Sense fotografies disponibles -keylist.hasPhotos=Fotografies +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos keyMan.addphoto.filepicker.title=Seleccione una foto per afegir -# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files because the keys get very large by this. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. # keyMan.addphoto.noJpegFile=The selected file does not appear to be a JPEG file. Please choose a different file. keyMan.addphoto.failed=No s'afegit la foto. # noWksIdentity=The key %S does not have a WKS identity. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? -# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=El canvi de PIN ha fallat -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=S'està refrescant les claus, espereu si us plau ... keyserverProgress.uploading=S'està penjant les claus, espereu, si us plau ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Refresca les claus keyserverTitle.uploading=Penja les claus +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=La vostra contrasenya hauria de tenir 8 caràcters com a mínim! -setupWizard.reallyCancel=Esteu segur que voleu tancar l'auxiliar de configuració de l'Enigmail? # setupWizard.invalidGpg=The file you specified is not a GnuPG executable. Please specify a different file. -# setupWizard.specifyFile=You need to at least specify a public key file in order to proceed. # setupWizard.installFailed=It seems that the installation was not successful. Please either retry the installation, or install GnuPG manually and locate it using the Browse button. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. -# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or manipulated. Do you want to continue the installation anyway? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? # setupWizard.importSettingsFile=Specify backup file to load from -# setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. # setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? -# setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm # installGnuPG.downloadFailed=An error occurred while trying to download GnuPG. Please check the console log for further details. @@ -654,12 +662,12 @@ # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. -# filter.keyNotFound=Could not find an encryption key for "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -# converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? -# converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? # saveLogFile.title=Save Log File @@ -691,13 +699,13 @@ # enigmailSettings=EnigmailSettings # defaultBackupFileName=Enigmail-export # specifyExportFile=Specify file name for exporting -# homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm -# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. -# expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties @@ -709,6 +717,7 @@ # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. @@ -728,12 +737,12 @@ # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! -# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. -# pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. @@ -763,16 +772,16 @@ # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. -# handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device -# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? @@ -785,10 +794,12 @@ # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. +#strings in pEpAdapter.jsm # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=Quant a l'Enigmail @@ -799,6 +810,7 @@ # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: +# aboutEnigmail.userSupport.team=the team and the list/forum members # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension @@ -808,3 +820,38 @@ # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/cs/enigmail.dtd enigmail-2.1.3+ds1/lang/cs/enigmail.dtd --- enigmail-2.0.12+ds1/lang/cs/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/cs/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ - - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,11 +63,8 @@ - - - @@ -89,12 +77,13 @@ + - + @@ -117,6 +106,9 @@ + + + @@ -209,6 +201,7 @@ + @@ -217,8 +210,8 @@ - - + + @@ -345,7 +338,7 @@ - + @@ -368,7 +361,6 @@ - @@ -456,8 +448,8 @@ - - + + @@ -542,7 +534,7 @@ - + @@ -623,7 +615,7 @@ - + @@ -665,119 +657,35 @@ - - + - - - - - - - - - - - - - - - - - -Upozornění: Enigmail bude vždy ověřovat podpisy v e-mailech všech identit a účtů bez ohledu na to, zda je to v nich povoleno"> - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Děkujeme, že používáte Enigmail."> - - - - - - - - - + + + + + + + + + + + - + @@ -793,7 +701,9 @@ - + + + @@ -831,7 +741,7 @@ - + @@ -852,9 +762,19 @@ - + + - + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/cs/enigmail.properties enigmail-2.1.3+ds1/lang/cs/enigmail.properties --- enigmail-2.0.12+ds1/lang/cs/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/cs/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=Upozornění Enigmail -enigConfirm=Potvrzení Enigmail +# enigConfirm=Enigmail Confirmation # enigInfo=Enigmail Information enigError=Chyba Enigmail enigPrompt=Připomenutí Enigmail @@ -78,7 +78,7 @@ passSpaceProblem=Z technických důvodů může být vaše přístupové heslo není začínat nebo končit mezerou changePassFailed=Změna hesla selhala. -keyConfirm=Vytvořit veřejný a soukromý klíč pro '%S'? +# keyConfirm=Generate public and secret key for '%S'? keyMan.button.generateKey=&Vytvořit klíč keyAbort=Přerušit vytváření klíče? keyMan.button.generateKeyAbort=&Přerušit vytváření klíče @@ -86,14 +86,14 @@ expiryTooLong=Nemůžete vytvořit klíč, který expiruje více než za 100 let. expiryTooLongShorter=You cannot create a key that expires in more than 90 years. expiryTooShort=Váš klíč musí být platný minimálně jeden den. -keyGenFailed=Vytváření klíče selhalo. Podrobnosti zjistíte v konzoli Enigmail (nabídka Enigmail > Ladění Enigmail). +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. # setKeyExpirationDateFailed=The expiration date could not be changed # Strings in enigmailMessengerOverlay.js securityInfo=Informace zabezpečení Enigmail\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Přílohy k této zprávě nebyly podepsány nebo zašifrovány*\n\n +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=Tato zpráva je možná zašifrovaná nebo podepsaná PGP/MIME; ověříte si to po kliknutí na tlačítko \\"Dešifrovat\\" saveAttachmentHeader=Enigmail: Uložit dešifrovanou přílohu @@ -102,7 +102,7 @@ beginPgpPart=********* *ZACATEK SIFROVANE nebo PODEPSANE CASTI* ********* endPgpPart=********** *KONEC SIFROVANE nebo PODEPSANE CASTI* ********** -notePartEncrypted=Enigmail: *Cast zpravy nebyla podepsana nebo desifrovana* +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *Nalezen mnohonásobný blok zpráv -- dešifrování/ověření zrušeno* decryptOkNoSig=Upozornění\n\nDešifrování bylo úspěšné, ale podpis nemohl být správně ověřen @@ -114,6 +114,7 @@ # fixBrokenExchangeMsg.failed=Did not succeed to repair message. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. @@ -148,10 +149,9 @@ minimalLineWrapping=Máte nastaveno zalamování řádků na %S znaků. Pro správné šifrování a/nebo podepisování musí být tato hodnota nejméně 68.\nPřejete si nyní změnit zalamování řádků na 68 znaků? warning=Pozor signIconClicked=Ručně jste změnil/a podepisování. Při vytváření této zprávy proto (de)aktivace podpisu nezávisí na (de)aktivaci šifrování. -# 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. +# 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.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. # msgCompose.internalEncryptionError=Internal Error: promised encryption disabled @@ -164,7 +164,6 @@ # msgCompose.toolbarTxt.disabled=Enigmail is disabled for the selected identity # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject -msgCompose.encryptedSubjectStub=Šifrovaná zpráva # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject @@ -179,7 +178,7 @@ # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -# pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=Uložit %S zprávu do %S do složky konceptů? onlineSend=Odeslat zprávu %S na %S? -encryptKeysNote=Upozornění: zpráva je šifrována s následujícím uživatelským ID / klíčem: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S hiddenKey= -signFailed=Chyba Enigmail; Šifrování nebo podepisování selhalo; odeslat zprávu nezašifrovanou? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=&Odeslat nezašifrovanou zprávu recipientsSelectionHdr=Určit adresáty pro šifrování @@ -225,9 +224,9 @@ # signOffWithReason=Signing: OFF (%S) # reasonEnabledByDefault=enabled by default # reasonManuallyForced=manually forced -# reasonByRecipientRules=forced by recipient rules +# reasonByRecipientRules=forced by per-recipient rules # reasonByAutoEncryption=forced by auto encryption -# reasonByConflict=due to conflict in recipient rules +# reasonByConflict=due to conflict in per-recipient rules # reasonByEncryptionMode=due to encryption mode # should not be used anymore: @@ -252,9 +251,9 @@ # pgpmimeNo=Inline PGP will be used # Attach own key status (tooltip strings): -attachOwnKeyNo=Váš vlastní klíč nebude připojen -attachOwnKeyYes=Váš vlastní klíč bude připojen -# attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Nalezena rozporná pravidla pro adresáty\n%S\n\nPoslat zprávu s těmito nastaveními? msgCompose.button.configure=&Nastavení @@ -269,6 +268,10 @@ clickDetailsButton=; klikněte na tlačítko "Podrobnosti", pokud se chcete dozvědět více # clickImportButton=; click on the 'Import Key' button to import the key # keyTypeUnsupported=; the key type is not supported by your version of GnuPG +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Dešifrovat msgPart=Část zprávy %S msgSigned=podepsána # msgSignedUnkownKey=signed with unknown key @@ -280,8 +283,10 @@ needKey=Chyba - pro dešifrování je potřeba soukromý klíč failedDecrypt=Chyba - dešifrování selhalo badPhrase=Chyba - špatné heslo +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=Chyba - dešifrování/ověření selhalo viewInfo=; Zobrazit > Bezpečnostní informace zprávy pro podrobnosti +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=Dešifrovaná zpráva # decryptedMsgWithFormatError=Decrypted message (restored broken PGP email format probably caused by an old Exchange server, so that the result might not be perfect to read) @@ -326,6 +331,7 @@ # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. @@ -337,6 +343,8 @@ prefs.warnAskNever=Varování: aktivací této volby docílíte toho, že zprávy budou odesílány nezašifrované bez ohlášení, jestliže nemáte klíč pro některého z příjemců -- Enigmail Vás o tomto nebude nadále informovat! prefs.warnIdleTimeForUnknownAgent=Your system uses a specialized tool for passphrase handling such as gnome-keyring or seahorse-agent. Unfortunately Enigmail cannot control the passphrase timeout for the tool you are using. Therefore the respective timeout settings in Enigmail are disregarded. prefEnigmail.oneKeyserverOnly=Chyba - je možné určit pouze jeden keyserver pro automatické stahování chybějících klíčů OpenPGP. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +# aboutLicense.desc=Enigmail is open source and licensed under the Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=Chyba - nebylo vyplněno heslo noPGPblock=Chyba - nenalezen platný datový blok OpenPGP unverifiedReply=Odsazená část zprávy (odpověď) byla pravděpodobně změněna -# keyInMessageBody=Key in message body found. Click 'Import Key' to import the key +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=Chyba - podpis nesouhlasí -cantImport=Chyba při importování veřejného klíče\n\n +# cantImport=Error importing public key\n\n # doImportOne=Import %1$S (%2$S)? # doImportMultiple=Import the following keys?\n\n%S # previewFailed=Can't read public key file. @@ -366,14 +374,15 @@ sc.removeCard=Operace vyžaduje, aby ve čtečce nebyla žádná SmartCard.\nVyjměte prosím SmartCard a zopakujte operaci. sc.noCardAvailable=SmartCard ve čtečce nebyla nalezena\nVložte prosím SmartCard a zopakujte operaci. sc.noReaderAvailable=Váše čtečka SmartCard není přístupná\nPřipojte prosím čtečku SmartCard, vložte kartu a operaci zopakujte. -# keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. -# keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. # keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. # missingPassphrase=Missing passphrase # errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. # errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=Nelze nalézt program GnuPG '%S'.\nUjistěte se, zda máte správně zadanou cestu ke spustitelnému souboru GnuPG v nastavení Enigmail. @@ -384,9 +393,8 @@ prefBad=CHYBNÝ podpis od %S failCancel=Chyba - příjem klíče zrušen uživatelem -failNoServer=Chyba - není určen keyserver pro přijetí klíče -failNoID=Chyba - není určeno ID, pro které přijmout klíč failKeyExtract=Chyba - extrakce klíče selhala +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=Chyba - první blok OpenPGP není blok veřejného klíče importKeyConfirm=Importovat veřejný/é klič(e) obsažený ve zprávě? failKeyImport=Chyba - import klíče selhal @@ -425,6 +433,8 @@ identityName=Identita: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Máte aktivováno šifrování, ale nevybral/a jste žádný klíč. K šifrování zprávy pro %S je třeba vybrat jeden nebo několik platných klíčů ze seznamu. Chcete zakázat šifrování pro %S? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=Funkce, kterou jste zvolil/a, není dostupná v offline módu. Přejděte prosím do online módu a zkuste to znovu. -protocolNotSupported=Protokol '%S://', který jste zvolil/a, není podporován pro stažení klíčů OpenPGP. -gpgkeysDisabled=Může vám pomoci povolit volbu 'extensions.enigmail.useGpgKeysTool' noKeyserverConn=Nelze se připojit na keyserver %S. -keyDownloadFailed=Selhalo stažení klíče z keyserveru. Stavová zpráva:\n%S internalError=Vyskytla se vnitřní chyba. Klíče nelze stáhnout nebo importovat. -noKeyFound=Je mi líto, ale nemohu nalézt žádný klíč, který by odpovídal zadaným kritériím pro vyhledávání.\nVšimněte si prosím, že ID klíče by mělo začínat na \\"0x\\" (např. 0xABCDEF12). -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Selhalo hledání nebo stahování klíče z keyserveru: gpgkeys_%S nelze spustit. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Nastavení důvěryhodnosti selhalo @@ -490,7 +493,6 @@ asciiArmorFile=Soubory kódované ASCII (*.asc) importKeyFile=Importovat klíč OpenPGP ze souboru gnupgFile=Soubory GnuPG -# createKeyOK=Your Key has been generated saveRevokeCertAs=Vytvořit a uložit revokační certifikát # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=Revokační certifikát nemohl být vytvořen. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%S (0x%S)_verejny-soukromy defaultPubKeyFilename=Exportovane-verejne-klice defaultPubSecKeyFilename=Exportovany-verejny-a-soukromy-klic -noSecretKeys=Nebyly nalezeny žádné soukromé klíče.\n\nPřejete si nyní vytvořit svůj vlastní klíč? sendKeysOk=Klíč/e byly úspěšně odeslány sendKeysFailed=Odeslání klíčů selhalo receiveKeysOk=Klíč/e úspěšně aktualizovány receiveKeysFailed=Stažení klíčů selhalo +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=Přejete si importovat některý/é klíč/e ze schránky? # importFromUrl=Download public key from this URL: copyToClipbrdFailed=Zvolený/é klíč/e nelze kopírovat do schránky. copyToClipbrdOK=Klíče byly zkopírovány do schránky -deleteSecretKey=Varování: Snažíte se smazat soukromý klíč!\nJestliže smažete svůj soukromý klíč, nebudete moci dále dešifrovat zprávy zašifrované pro tento klíč ani klíč revokovat.\n\nPřejete si opravdu smazat oba klíče (veřejný i soukromý)\n'%S'? +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=POZOR: Pokoušíte se smazat soukromé klíče!\nJestliže smažete svůj soukromý klíč, nebudete moci dále dešifrovat zprávy zašifrované pro tento klíč.\n\nOpravdu si přejte smazat Vámi zvolený veřejný a soukromý klíč? deletePubKey=Přejete si smazat tento veřejný klíč\n'%S'? deleteSelectedPubKey=Přejete si smazat tyto veřejné klíče? @@ -529,7 +531,7 @@ # revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? revokeKeyOk=Klíč byl revokován. Jestliže je tento klíč dostupný také na keyserveru, je doporučeno odeslat jej tam znovu, abyste dal/a i ostatním uživatelům vědet o revokaci. revokeKeyFailed=Klíč nelze revokovat -# revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Nevybral/a jste žádný klíč. Přejete si obnovit seznam všech klíčů? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? @@ -541,21 +543,21 @@ keyMan.button.import=&Importovat keyMan.button.refreshAll=&Znovu načíst všechny klíče keyMan.button.revokeKey=&Revokovat klíč -# keyMan.button.skip=&Skip Key keylist.noOtherUids=Nemá jiné identity keylist.hasOtherUids=Další identita -keylist.noPhotos=Fotografie není dostupná -keylist.hasPhotos=Foto +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos keyMan.addphoto.filepicker.title=Vyberte fotografii pro vložení -keyMan.addphoto.warnLargeFile=Vybrali jste soubor větší než 25kB.\nNení doporučeno připojovat příliš velké soubory, protože se tím klíče stávají velmi objemné. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. keyMan.addphoto.noJpegFile=Vybraný soubor zřejmě není JPEG. Vyberte jiný soubor. keyMan.addphoto.failed=Soubor nelze vlořit. # noWksIdentity=The key %S does not have a WKS identity. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? -# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Změna PIN selhala -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Obnovují se klíče, prosím čekejte ... keyserverProgress.uploading=Odesílání klíčů, prosím čekejte ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Obnovit klíče keyserverTitle.uploading=Odesílání klíče +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=Vaše heslo je kratší než 8 znaků! -setupWizard.reallyCancel=Opravdu si přejete ukončit průvodce nastavením Enigmail? setupWizard.invalidGpg=Soubor, který jste zadali, není spustitelný GnuPG. Zadejte prosím jiný soubor. -setupWizard.specifyFile=Abyste mohli pokračovat, potřebujete určit alespoň soubor s veřejným klíčem. setupWizard.installFailed=Zdá se, že instalace nebyla úspěšná. Prosím, buď opakovat instalaci nebo nainstalovat GnuPG ručně a lokalizovat pomocí tlačítka Procházet. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. -setupWizard.hashSumError=Průvodce nemohl ověřit integritu staženého souboru.Soubor může být poškozen nebo maniuplated. Chcete pokračovat přesto v instalaci ? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? # setupWizard.importSettingsFile=Specify backup file to load from -# setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. # setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? -# setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Chyba ocurred při pokusu o stažení GnuPG. Zkontrolujte prosím konzoly protokol pro další podrobnosti. @@ -654,12 +662,12 @@ # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. -# filter.keyNotFound=Could not find an encryption key for "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -# converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? -# converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? # saveLogFile.title=Save Log File @@ -691,13 +699,13 @@ # enigmailSettings=EnigmailSettings # defaultBackupFileName=Enigmail-export # specifyExportFile=Specify file name for exporting -# homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm -# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. -# expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties @@ -709,6 +717,7 @@ # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. @@ -728,12 +737,12 @@ # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! -# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. -# pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. @@ -763,16 +772,16 @@ # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. -# handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device -# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? @@ -785,10 +794,12 @@ # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. +#strings in pEpAdapter.jsm # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=O Enigmail @@ -799,6 +810,7 @@ # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: +# aboutEnigmail.userSupport.team=the team and the list/forum members # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension @@ -808,3 +820,38 @@ # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/current-languages.txt enigmail-2.1.3+ds1/lang/current-languages.txt --- enigmail-2.0.12+ds1/lang/current-languages.txt 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/current-languages.txt 2019-10-29 17:09:36.000000000 +0000 @@ -22,6 +22,7 @@ pl pt-BR pt-PT +ro ru sk sl diff -Nru enigmail-2.0.12+ds1/lang/da/enigmail.dtd enigmail-2.1.3+ds1/lang/da/enigmail.dtd --- enigmail-2.0.12+ds1/lang/da/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/da/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ -Mozilla Public License 2.0."> - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,11 +63,8 @@ - - - @@ -89,6 +77,7 @@ + @@ -117,6 +106,9 @@ + + + @@ -209,6 +201,7 @@ + @@ -368,7 +361,6 @@ - @@ -666,118 +658,29 @@ - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Eksporter dine data fra din gamle computer ved hjælp af backupguiden fra Enigmail præferencerne - Importer dataene til din nye computer ved hjælp af denne guiden. -"> - - - - - - - - - - - - - - - - + + + + + + + + + + + @@ -798,7 +701,9 @@ - + + + @@ -857,9 +762,19 @@ - + + - + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/da/enigmail.properties enigmail-2.1.3+ds1/lang/da/enigmail.properties --- enigmail-2.0.12+ds1/lang/da/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/da/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### # enigAlert=Enigmail Alert -# enigConfirm=Enigmail Confirm +# enigConfirm=Enigmail Confirmation # enigInfo=Enigmail Information # enigError=Enigmail Error # enigPrompt=Enigmail Prompt @@ -78,7 +78,7 @@ # passSpaceProblem=Due to technical reasons, your passphrase may not start or end with a space character. # changePassFailed=Changing the passphrase failed. -# keyConfirm=Generate public and secret keys for '%S'? +# keyConfirm=Generate public and secret key for '%S'? # keyMan.button.generateKey=&Generate Key # keyAbort=Abort key generation? # keyMan.button.generateKeyAbort=&Abort Key Generation @@ -86,14 +86,14 @@ # expiryTooLong=You cannot create a key that expires in more than 100 years. # expiryTooLongShorter=You cannot create a key that expires in more than 90 years. # expiryTooShort=Your key must be valid for at least one day. -# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Enigmail) for details. +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. # setKeyExpirationDateFailed=The expiration date could not be changed # Strings in enigmailMessengerOverlay.js # securityInfo=Enigmail Security Info\n\n # enigHeader=Enigmail: -# enigContentNote=Enigmail: *Attachments to this message have not been signed or encrypted*\r\n\r\n +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n # possiblyPgpMime=Possibly PGP/MIME encrypted or signed message; use 'Decrypt/Verify' function to verify # saveAttachmentHeader=Enigmail: Save decrypted attachment @@ -102,7 +102,7 @@ # beginPgpPart=********* *BEGIN ENCRYPTED or SIGNED PART* ********* # endPgpPart=********** *END ENCRYPTED or SIGNED PART* ********** -# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed or encrypted* +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* # noteCutMessage=Enigmail: *Multiple message blocks found -- decryption/verification aborted* # decryptOkNoSig=Warning\n\nDecryption was successful, but the signature could not be verified correctly @@ -114,6 +114,7 @@ # fixBrokenExchangeMsg.failed=Did not succeed to repair message. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. @@ -148,10 +149,9 @@ # minimalLineWrapping=You have set line wrapping to %S characters. For correct encryption and/or signing, this value needs to be at least 68.\nDo you wish to change line wrapping to 68 characters now? # warning=Warning # signIconClicked=You have manually modified signing. Therefore, while you are composing this message, (de)activating signing does not depend anymore on (de)activating encryption. -# 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. +# 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.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. # msgCompose.internalEncryptionError=Internal Error: promised encryption disabled @@ -164,7 +164,6 @@ # msgCompose.toolbarTxt.disabled=Enigmail is disabled for the selected identity # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject -# msgCompose.encryptedSubjectStub=Encrypted Message # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject @@ -179,7 +178,7 @@ # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -# pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ # offlineSave=Save %1$S message to %2$S in Unsent Messages folder? # onlineSend=Send %1$S message to %2$S? -# encryptKeysNote=Note: The message is encrypted for the following User ID's / Keys: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S # hiddenKey= -# signFailed=Error in Enigmail; Encryption/signing failed; send unencrypted message? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? # msgCompose.button.sendUnencrypted=&Send Unencrypted Message # recipientsSelectionHdr=Select Recipients for Encryption @@ -225,9 +224,9 @@ # signOffWithReason=Signing: OFF (%S) # reasonEnabledByDefault=enabled by default # reasonManuallyForced=manually forced -# reasonByRecipientRules=forced by recipient rules +# reasonByRecipientRules=forced by per-recipient rules # reasonByAutoEncryption=forced by auto encryption -# reasonByConflict=due to conflict in recipient rules +# reasonByConflict=due to conflict in per-recipient rules # reasonByEncryptionMode=due to encryption mode # should not be used anymore: @@ -252,9 +251,9 @@ # pgpmimeNo=Inline PGP will be used # Attach own key status (tooltip strings): -# attachOwnKeyNo=Your own key will not be attached -# attachOwnKeyYes=Your own key will be attached -# attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. # rulesConflict=Conflicting per-recipient rules detected\n%S\n\nSend message with these settings? # msgCompose.button.configure=&Configure @@ -269,6 +268,10 @@ # clickDetailsButton=; click on 'Details' button for more information # clickImportButton=; click on the 'Import Key' button to import the key # keyTypeUnsupported=; the key type is not supported by your version of GnuPG +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +# headerView.button.decrypt=Decrypt # msgPart=Part of the message %S # msgSigned=signed # msgSignedUnkownKey=signed with unknown key @@ -280,8 +283,10 @@ # needKey=Error - no matching secret key found to decrypt message # failedDecrypt=Error - decryption failed # badPhrase=Error - bad passphrase +# missingMdcError=Error - missing or broken integrity protection (MDC) # failedDecryptVerify=Error - decryption/verification failed # viewInfo=; View > Message security info for details +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. # decryptedMsg=Decrypted message # decryptedMsgWithFormatError=Decrypted message (restored broken PGP email format probably caused by an old Exchange server, so that the result might not be perfect to read) @@ -326,6 +331,7 @@ # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. @@ -337,6 +343,8 @@ # prefs.warnAskNever=Warning: activating this option will result in unencrypted emails without any further information if there is no key for one of the recipients -- Enigmail will not inform you if this happens! # prefs.warnIdleTimeForUnknownAgent=Cannot connect to gpg-agent. Maybe your system uses a specialized tool for passphrase handling (e.g. gnome-keyring, seahorse-agent, KDE wallet manager, ...). Unfortunately Enigmail cannot control the passphrase timeout for the tool you are using. Therefore the respective timeout settings in Enigmail are disregarded. # prefEnigmail.oneKeyserverOnly=Error - you can only specify one keyserver for automatic downloading of missing OpenPGP keys. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +aboutLicense.desc=Enigmail er open source og licenseret under Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ # noPassphrase=Error - no passphrase supplied # noPGPblock=Error - No valid armored OpenPGP data block found # unverifiedReply=Indented message part (reply) was probably modified -# keyInMessageBody=Key in message body found. Click 'Import Key' to import the key +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key # sigMismatch=Error - Signature mismatch -# cantImport=Error in importing public key\n\n +# cantImport=Error importing public key\n\n # doImportOne=Import %1$S (%2$S)? # doImportMultiple=Import the following keys?\n\n%S # previewFailed=Can't read public key file. @@ -366,14 +374,15 @@ # sc.removeCard=The operation requires no SmartCard to be in the reader.\nPlease remove your SmartCard and repeat the operation. # sc.noCardAvailable=No SmartCard could be found in your reader\nPlease insert your SmartCard and repeat the operation. # sc.noReaderAvailable=Your SmartCard reader could not be accessed\nPlease attach your SmartCard reader, insert your card, and repeat the operation. -# keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. -# keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. # keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. # missingPassphrase=Missing passphrase # errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. # errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. # gpgNotFound=Unable to locate GnuPG program '%S'.\nMake sure you have set the GnuPG executable path correctly in the Enigmail Preferences. @@ -384,9 +393,8 @@ # prefBad=BAD signature from %S # failCancel=Error - Key receive cancelled by user -# failNoServer=Error - No keyserver specified to receive key from -# failNoID=Error - No key ID specified to receive key for # failKeyExtract=Error - key extraction command failed +# failKeyNoSubkey=No valid (sub-)key # notFirstBlock=Error - First OpenPGP block not public key block # importKeyConfirm=Import public key(s) embedded in message? # failKeyImport=Error - key importing failed @@ -425,6 +433,8 @@ # identityName=Identity: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js # noEncryption=You have activated encryption, but you did not select a key. In order to encrypt emails sent to %1$S, you need to specify one or several valid key(s) from your key list. Do you want to disable encryption for %2$S? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js # needOnline=The function you have selected is not available in offline mode. Please go online and try again. -# protocolNotSupported=The protocol '%S://' that you have selected is not supported for downloading OpenPGP keys. -# gpgkeysDisabled=It might help to enable the option 'extensions.enigmail.useGpgKeysTool'. # noKeyserverConn=Could not connect to keyserver at %S. -# keyDownloadFailed=Failed to download key from keyserver. Status message is:\n%S # internalError=An internal error occurred. The keys could not be downloaded or imported. -# noKeyFound=We are sorry, could not find any key that would match the specified search criteria. -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -# gpgKeysFailed=Failed to search or download key from keyserver: gpgkeys_%S could not be executed. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul # setKeyTrustFailed=Setting owner trust failed @@ -490,7 +493,6 @@ # asciiArmorFile=ASCII Armored Files (*.asc) # importKeyFile=Import OpenPGP Key File # gnupgFile=GnuPG Files -# createKeyOK=Your Key has been generated # saveRevokeCertAs=Create & Save Revocation Certificate # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. # revokeCertFailed=The revocation certificate could not be created. @@ -509,19 +511,19 @@ # specificPubSecKeyFilename=%1$S (0x%2$S) pub-sec # defaultPubKeyFilename=Exported-public-keys # defaultPubSecKeyFilename=Exported-public-and-secret-keys -# noSecretKeys=No secret keys found.\n\nDo you want to generate your own key now? # sendKeysOk=Key(s) sent successfully # sendKeysFailed=Sending of keys failed # receiveKeysOk=Key(s) updated successfully # receiveKeysFailed=Downloading of keys failed +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. # importFromClip=Do you want to import some key(s) from clipboard? # importFromUrl=Download public key from this URL: # copyToClipbrdFailed=Could not copy the selected key(s) to the clipboard. # copyToClipbrdOK=Key(s) copied to clipboard -# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, and you cannot revoke your key anymore.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? # deleteMix=WARNING: You are about to delete secret keys!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key.\n\nDo you really want to delete BOTH, the selected secret and public keys? # deletePubKey=Do you want to delete the public key\n'%S'? # deleteSelectedPubKey=Do you want to delete the public keys? @@ -529,7 +531,7 @@ # revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? # revokeKeyOk=The key has been revoked. If your key is available on a key server, it is recommended to re-upload it, so that others can see the revocation. # revokeKeyFailed=The key could not be revoked. -# revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. # refreshAllQuestion=You did not select any key. Would you like to refresh ALL keys? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? @@ -541,21 +543,21 @@ # keyMan.button.import=&Import # keyMan.button.refreshAll=&Refresh All Keys # keyMan.button.revokeKey=&Revoke Key -# keyMan.button.skip=&Skip Key # keylist.noOtherUids=Has no other identities # keylist.hasOtherUids=Also known as -# keylist.noPhotos=No photograph available -# keylist.hasPhotos=Photographs +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos # keyMan.addphoto.filepicker.title=Select photo to add -# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files because the keys get very large by this. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. # keyMan.addphoto.noJpegFile=The selected file does not appear to be a JPEG file. Please choose a different file. # keyMan.addphoto.failed=The photo could not be added. # noWksIdentity=The key %S does not have a WKS identity. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? -# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul # cardPin.processFailed=Failed to change PIN -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js # keyserverProgress.refreshing=Refreshing keys, please wait ... # keyserverProgress.uploading=Uploading keys, please wait ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. # keyserverTitle.refreshing=Refresh Keys # keyserverTitle.uploading=Key Upload +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -# passphrase.min8keys=Your passphrase should contain at least 8 characters! -# setupWizard.reallyCancel=Do you really want to close the Enigmail Setup Wizard? # setupWizard.invalidGpg=The file you specified is not a GnuPG executable. Please specify a different file. -# setupWizard.specifyFile=You need to at least specify a public key file in order to proceed. # setupWizard.installFailed=It seems that the installation was not successful. Please either retry the installation, or install GnuPG manually and locate it using the Browse button. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. -# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or manipulated. Do you want to continue the installation anyway? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? # setupWizard.importSettingsFile=Specify backup file to load from -# setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. # setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? -# setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm # installGnuPG.downloadFailed=An error occurred while trying to download GnuPG. Please check the console log for further details. @@ -654,12 +662,12 @@ # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. -# filter.keyNotFound=Could not find an encryption key for "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -# converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? -# converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? # saveLogFile.title=Save Log File @@ -691,13 +699,13 @@ # enigmailSettings=EnigmailSettings # defaultBackupFileName=Enigmail-export # specifyExportFile=Specify file name for exporting -# homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm -# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. -# expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties @@ -709,6 +717,7 @@ # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. @@ -728,12 +737,12 @@ # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! -# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. -# pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. @@ -763,16 +772,16 @@ # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. -# handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device -# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? @@ -785,10 +794,12 @@ # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. +#strings in pEpAdapter.jsm # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html # aboutEnigmail.tabName=About Enigmail @@ -799,6 +810,7 @@ # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: +# aboutEnigmail.userSupport.team=the team and the list/forum members # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension @@ -808,3 +820,38 @@ # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/de/enigmail.dtd enigmail-2.1.3+ds1/lang/de/enigmail.dtd --- enigmail-2.0.12+ds1/lang/de/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/de/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ -Mozilla Public License 2.0."> - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,16 +63,8 @@ - - - Die 'Autocrypt Schlüsselübertragung' erfordert, dass die E-Mail-Anwendung auf dem anderen Gerät Autocrypt unerstützt. - Dies ist die einfachere Variante, aber nur eine begrenzte Anzahl an Anwendungen unterstützt diesen Standard. - Die andere Variante ist 'Sichern & Wiederherstellen' der Einstellungen. - Dies erstellt eine ZIP-Datei mit allen notwendigen Informationen und Schlüsseln, die zum neuen Gerät übertragen werden können. - Enigmail kann diese Einstellungen direkt importieren, für andere E-Mail-Anwendungen kann die ZIP-Datei entpackt und die Einstellungen manuell übertragen werden."> - @@ -94,12 +77,13 @@ + - + '"> @@ -122,6 +106,9 @@ + + + @@ -214,6 +201,7 @@ + @@ -264,7 +252,7 @@ - + @@ -284,7 +272,7 @@ - + @@ -350,7 +338,7 @@ - + @@ -373,7 +361,6 @@ -Autocrypt ist ein Standard, welcher definiert, wie komfortable Ende-zu-Ende-Verschlüsselung von E-Mails zu erreichen ist. Er spezifiziert. wie E-Mail-Programme ihre Verschlüsselungs-Fähigkeiten mittels regulärer E-Mails aushandeln."> @@ -547,7 +534,7 @@ - + @@ -671,126 +658,29 @@ - - - -Dieser Assistent führt Sie durch die Einrichtung."> - - - - - - - - - - - - - - - - - -Hinweis: Enigmail wird Signaturen immer für alle Konten bzw. Identitäten überprüfen, unabhängig davon, was hier ausgewählt wird."> - + - - + - - - - - - - - - - - - - - - - - -öffentlichen Schlüssel können Andere E-Mails an Sie verschlüsseln (und von Ihnen signierte Nachrichten überprüfen). Sie dürfen ihn jedem geben."> - privater Schlüssel ist nur für Sie, um damit Mails an Sie zu entschlüsseln und um Mails, die Sie schicken, zu signieren. -  Sie sollten ihm niemandem geben."> - privater Schlüssel ist nur für Sie, um damit Mails an Sie zu entschlüsseln und um Mails, die Sie schicken, zu signieren. - Sie sollten ihm niemandem geben. - Um Ihren privaten Schlüssel zu schützen, fragen die folgenden zwei Dialoge Sie nach einer Passphrase."> -Passphrase ist ein Passwort, mit dem GnuPG Ihren privaten Schlüssel schützt. Es soll Missbrauch Ihres privaten Schlüssels verhindern."> -nicht empfehlenswert (weil nicht jedes Programm damit richtig umgeht)."> - - - - - - - - - - - - - - - - - - - - - - - - -Sie werden aufgefordert ein Passwort dafür einzugeben. Bitte transferieren Sie das Zertifikat auf ein sicheres Medium wie z.B. eine CD oder einen USB-Stick. Jeder, der Zugriff auf dieses Zertifikat erhält, kann damit Ihren Schlüssel unbrauchbar machen."> - - - - - - - - - - - -Exportieren Sie die Einstellungen vom alten Rechner. Das geht mit dem Sicherungs-Assistenten aus den Enigmail-Einstellungen. -Importieren Sie die Einstellungen auf den neuen Rechner. Das geht mit diesem Assistenten. -"> - - - - - - -Danke, dass Sie Enigmail verwenden."> -Bitte bestätigen Sie die Anfrage die Sie in Ihrem Posteingang finden werden wenn Sie dies wollen."> - - - - - - - - + + + + + + + + + + + @@ -811,11 +701,9 @@ - -Exportieren Sie die Einstellungen vom alten Rechner. Das geht mit diesem Assistenten. -Importieren Sie die Einstellungen auf den neuen Rechner. Das geht mit dem Einrichtungs-Assistenten. -"> + + + @@ -834,7 +722,7 @@ - + @@ -877,12 +765,19 @@ - - Wählen Sie unten das Konto dessen Schlüssel übertragen werden soll. - Es wird am folgenden Schirm ein Einrichtungspasswort angezeigt das auf dem anderen Gerät eingegeben werden muss um den Schlüssel und die dazugehörigen Einstellungen zu importieren."> + + -Wecheln Sie nun zum anderen Gerät und öffnen Sie die Nachricht. Sie sollten um ein Passwort gefragt werden. Geben Sie dort die folgenden Ziffern ein:"> + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/de/enigmail.properties enigmail-2.1.3+ds1/lang/de/enigmail.properties --- enigmail-2.0.12+ds1/lang/de/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/de/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=Enigmail-Meldung -enigConfirm=Enigmail-Bestätigung +enigConfirm=Enigmail Bestätigung enigInfo=Enigmail Information enigError=Enigmail-Fehler enigPrompt=Enigmail-Eingabe @@ -93,7 +93,7 @@ securityInfo=Enigmail-Sicherheitsinfo:\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Anhänge an diese Nachricht wurden nicht signiert oder verschlüsselt*\r\n\r\n +enigContentNote=Enigmail: *Anhänge an diese Nachricht wurden weder signiert noch verschlüsselt*\r\n\r\n possiblyPgpMime=Eventuell PGP/MIME verschlüsselte oder signierte Nachricht; verwenden Sie die Funktion 'Entschlüsseln/Überprüfen' zum Überprüfen saveAttachmentHeader=Enigmail: Entschlüsselte Anhänge speichern @@ -102,7 +102,7 @@ beginPgpPart=********* *ANFANG DES VERSCHLÜSSELTEN oder SIGNIERTEN BEREICHS* ********* endPgpPart=********* *ENDE DES VERSCHLÜSSELTEN oder SIGNIERTEN BEREICHS* ********* -notePartEncrypted=Enigmail: *Teile der Nachricht wurden NICHT signiert oder verschlüsselt* +notePartEncrypted=Enigmail: *Teile der Nachricht wurden weder signiert noch verschlüsselt* noteCutMessage=Enigmail: *MehrereTextblöcke gefunden – Entschlüsselung/Überprüfung abgebrochen* decryptOkNoSig=Achtung:\n\nDie Entschlüsselung war erfolgreich, aber die Signatur konnte nicht überprüft werden @@ -114,6 +114,7 @@ fixBrokenExchangeMsg.failed=Reparatur der Nachricht ist fehlgeschlagen. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +detailsDlg.importKey=Schlüssel importieren wksNoIdentity=Dieser Schlüssel ist mit keinem Ihrer E-Mailkonten verknüpft. Bitte fügen Sie ein Konto für mindestens eine der folgenden E-Mailadressen hinzu: wksConfirmSuccess=Bestätigungs-E-Mail gesendet. wksConfirmFailure=Senden der Bestätigungs-E-Mail fehlgeschlagen. @@ -148,10 +149,9 @@ minimalLineWrapping=Sie haben den Textumbruch auf %S Zeichen eingestellt. Für korrekte Verschlüsselung und Signatur muss dieser Wert auf mindestens 68 eingestellt werden. \nMöchten Sie den Wert jetzt auf 68 ändern? warning=Warnung signIconClicked=Sie haben Einstellungen für das Signieren verändert. Deshalb hängt für diese Nachricht das (De-)Aktivieren des Signierens nicht mehr von der (De-)Aktivierung der Verschlüsselung ab. -errorOwnKeyUnusable=Die Schlüssel-ID „%S“ für die aktuelle Identität entspricht keinem gültigen OpenPGP-Schlüssel.\n\nBitte stellen Sie sicher, dass Sie einen gültigen, nicht abgelaufenen OpenPGP-Schlüssel haben und dass die Einstellungen des E-Mail-Kontos auf diesen Schlüssel verweisen.\nWenn Ihr Schlüssel nicht abgelaufen ist, prüfen Sie bitte, ob das Besitzervertrauen des Schlüssels auf „vertraut“ oder „absolut“ eingestellt ist. +errorOwnKeyUnusable=Die Schlüssel-ID „%S“ für die aktuelle Identität entspricht keinem gültigen OpenPGP-Schlüssel.\n\nBitte stellen Sie sicher, dass Sie einen gültigen, nicht abgelaufenen OpenPGP-Schlüssel haben, und dass die Einstellungen des E-Mail-Kontos auf diesen Schlüssel verweisen.\nWenn Ihr Schlüssel nicht abgelaufen ist, prüfen Sie bitte, ob das Besitzervertrauen des Schlüssels auf „vertraut“ oder „absolut“ eingestellt ist. msgCompose.cannotSaveDraft=Fehler beim Speichern des Entwurfs msgCompose.partiallyEncrypted.short=Vorsicht: teilweise verschlüsselte Email - Sie könnten sensitive Informationen preisgeben. -msgCompose.partiallyEncrypted.mimeMsg=Die Nachricht welche Sie beantworten enthält verschlüsselte und unverschlüsselte Teile. Manche verschlüsselte Teile der Nachricht können unsichtbar sein.\n\nWenn der Absender der Nachricht nicht in der Lage war die versteckten Nachrichtenteile zu entschlüsseln, könnten Sie beim Antworten unbewusst die verschlüsselte Information preisgeben, die der Absender ursprünglich nicht entschlüsseln konnte.\n\nWir empfehlen eine neue Nachricht mit der Antwort zu erstellen anstatt auf diese Nachricht zu antworten. msgCompose.partiallyEncrypted.inlinePGP=Die Nachricht welche Sie beantworten enthält verschlüsselte und unverschlüsselte Teile. \n\nWenn der Absender der Nachricht nicht in der Lage war manche Nachrichtenteile zu entschlüsseln, könnten Sie beim Antworten unbewusst die verschlüsselte Information preisgeben, die der Absender ursprünglich nicht entschlüsseln konnte.\n\nErwägen Sie alle zitierten Nachrichtenteile aus Ihrer Antwort zu entfernen. msgCompose.internalEncryptionError=Interner Fehler: Versprochene Verschlüsselung ist deaktiviert. @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=Enigmail ist für die ausgewählte Identität deaktiviert. msgCompose.protectSubject.tooltip=Den Betreff der Nachricht schützen msgCompose.noSubjectProtection.tooltip=Den Betreff der Nachricht nicht schützen -msgCompose.encryptedSubjectStub=Verschlüsselte Nachricht msgCompose.protectSubject.dialogTitle=Schutz des Betreffs einschalten? msgCompose.protectSubject.question=Normale verschlüsselte Nachrichten enthalten den unredigierten Betreff.\nWir haben einen neuen Standard etabliert der den originalen Betreff in der verschlüsselten Nachricht versteckt und ihn mit einem Platzhalter ersetzt, sodass der eigentliche Betreff erst nach dem Entschlüsseln der E-Mail sichtbar ist.\n\nWollen Sie den Betreff in verschlüsselten Nachrichten schützen? msgCompose.protectSubject.yesButton=&Betreff schützen @@ -203,7 +202,7 @@ encryptKeysNote=Hinweis: Die Nachricht wurde mit folgenden Benutzer-IDs / Schlüsseln verschlüsselt: %S hiddenKey= -signFailed=Fehler in Enigmail; Verschlüsselung/Signieren fehlgeschlagen; Nachricht unverschlüsselt senden? +signFailed=Fehler in Enigmail: Verschlüsselung/Signieren fehlgeschlagen. Nachricht unverschlüsselt senden? msgCompose.button.sendUnencrypted=Nachricht &unverschlüsselt senden recipientsSelectionHdr=Empfänger für Verschlüsselung wählen @@ -252,9 +251,9 @@ pgpmimeNo=Inline-PGP wird verwendet # Attach own key status (tooltip strings): -attachOwnKeyNo=Ihr eigener Schlüssel wird nicht angehängt -attachOwnKeyYes=Ihr eigener Schlüssel wird angehängt -attachOwnKeyDisabled=Sie können Ihren eigenen Schlüssel nicht anhängen. Um dieses Feature zu aktivieren, müssen Sie einen bestimmten Schlüssel in den Konto-Einstellungen im Abschnitt OpenPGP auswählen. +attachOwnKeyNo=Ihr eigener öffentlicher Schlüssel wird nicht angehängt +attachOwnKeyYes=Ihr eigener öffentlicher Schlüssel wird angehängt +attachOwnKeyDisabled=Ihr eigener öffentlicher Schlüssel kann nicht angehängt werden. Um diese Funktion zu verwenden, müssen Sie einen bestimmten Schlüssel in den Konto-Einstellungen im Abschnitt OpenPGP auswählen. rulesConflict=Konflikt in Empfängerregeln entdeckt\n%S\n\nNachrichten trotzdem mit diesen Einstellungen senden? msgCompose.button.configure=&Konfigurieren @@ -269,6 +268,10 @@ clickDetailsButton=; Für weitere Informationen klicken Sie auf die Schaltfläche „Details“. clickImportButton=; Drücken Sie die Schaltfläche „Schlüssel importieren“, um den Schlüssel herunterzuladen. keyTypeUnsupported=; Der Schlüsseltyp wird von Ihrer Version von GnuPG nicht unterstützt. +decryptManually=; drücken Sie auf den Knopf 'Entschlüsseln' +verifyManually=; drücken Sie auf den Knopf 'Überprüfen' +headerView.button.verify=Überprüfen +headerView.button.decrypt=Entschlüsseln msgPart=Teil der Nachricht %S msgSigned=signiert msgSignedUnkownKey=signiert mit unbekanntem Schlüssel @@ -280,8 +283,10 @@ needKey=Fehler - kein passender privater/geheimer Schlüssel zur Entschlüsselung gefunden failedDecrypt=Fehler – Entschlüsselung fehlgeschlagen badPhrase=Fehler – falsche Passphrase +missingMdcError=Fehler - fehlende oder defekte Integritätsprüfung (MDC) failedDecryptVerify=Fehler – Entschlüsselung/Überprüfung fehlgeschlagen viewInfo=; Ansicht > Nachrichtensicherheitsinformation für Details +brokenExchangeMessage=Ungültige PGP/MIME Nachricht von MS-Exchange decryptedMsg=Entschlüsselte Nachricht decryptedMsgWithFormatError=Nachricht entschlüsselt (wiederhergestelltes ungültiges PGP Email Format - vermutlich durch alte Exchange Server Version entstanden. Das Resultat könnte nicht ideal zu lesen sein) @@ -326,6 +331,7 @@ autocryptSetupReq.setupMsg.backup=Sie können diese Nachricht behalten und als Sicherungskopie für Ihren geheimen Schlüssel verwenden. Wenn Sie das tun möchten, sollten Sie das Passwort notieren und es sicher verwahren. autocryptSetupReq.message.import=Um die Einstellungen und Schlüssel in Enigmail zu importieren, klicken Sie bitte auf die Schaltfläche "Einrichtung starten" in der Statusleiste. autocryptSetupReq.message.sent=Bitte klicken Sie die Nachricht auf Ihrem neuen Gerät an und befolgen Sie die Hinweise, um die Einstellungen zu importieren. +postbox.cannotUseQuickReply.message=Sie antworten auf eine verschlüsselte Email. Bitte verwenden Sie den Kopf "Vergrössern" in der oberen rechten Ecke des Eingabefeldes, um die Antwort in einem eigenen Fenster zu öffnen. Sie können die Nachricht dann von dort aus abschicken. # strings in pref-enigmail.js oldGpgVersion20=Initialisierung von Enigmail fehlgeschlagen.\n\nSie nutzen GnuPG Version %1$S, welche nicht mehr unterstützt wird. Enigmail benötigt GnuPG Version %2$S oder neuer. Bitte aktualisieren Sie Ihre GnuPG Installation, andernfalls kann Enigmail nicht funtkionieren. @@ -337,6 +343,8 @@ prefs.warnAskNever=Warnung: Das Aktivieren dieser Option führt dazu, dass Nachrichten UNVERSCHLÜSSELT gesendet werden, sobald bei Nachrichten an mehrere Empfänger auch nur ein einziger Schlüssel für die Liste der Empfänger fehlt. Enigmail wird Sie in diesen Situationen NICHT nochmals informieren! prefs.warnIdleTimeForUnknownAgent=Ihr System verwendet ein spezialisiertes Tool für die Passphrasen-Verwaltung (z.B. gnome-keyring oder seahorse-agent, KDE-Wallet, etc.) Leider kann Enigmail die Ablaufzeit für diese Tools nicht kontrollieren. Daher werden Änderungen an der Ablaufzeit hier ignoriert. prefEnigmail.oneKeyserverOnly=Fehler – Es kann nur ein Schlüsselserver für das automatische Herunterladen fehlender OpenPGP-Schlüssel angegeben werden. +acSetupMessage.desc=Transferieren Sie Ihren Schlüssel an ein anderes Autocrypt-fähiges Gerät. (Was ist Autocrypt) +aboutLicense.desc=Enigmail ist quelloffen und lizenziert unter der Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -355,7 +363,7 @@ unverifiedReply=Der eingerückte Teil der Nachricht (Antwort) wurde wahrscheinlich verändert keyInMessageBody=Schlüssel im Text der Nachricht gefunden. Klicken Sie auf „Schlüssel importieren“, um den Schlüssel zu importieren. sigMismatch=Fehler – Signatur passt nicht zusammen -cantImport=Fehler beim Importieren eines öffentlichen Schlüssels +cantImport=Fehler beim Importieren eines öffentlichen Schlüssels\n\n doImportOne=%1$S (%2$S) importieren? doImportMultiple=Die folgenden Schlüssel importieren?\n\n%S previewFailed=Öffentlicher Schlüssel kann nicht gelesen werden. @@ -374,6 +382,7 @@ errorHandling.gpgAgentError=In der Kommunikation zwischen GnuPG und gpg-agent (einem Teil von GnuPG) ist ein Fehler aufgetreten. errorHandling.dirmngrError=In der Kommunikation zwischen GnuPG und dirmngr (einem Teil von GnuPG) ist ein Fehler aufgetreten. errorHandling.pinentryError=GnuPG kann Ihre Passphrase nicht mit Hilfe des Programms pinentry abfragen. +errorHandling.pinentryCursesError=Ihre GnuPG Installation ist so eingerichtet, dass die Konsole für die Eingabe des Passworts verwendet wird (pinentry). Für Enigmail ist jedoch eine grafische Version von pinentry notwendig. errorHandling.readFaq=Dies ist ein Problem mit der Systeminstallation oder ein Konfigurationsfehler und führt dazu, dass Enigmail nicht funktioniert. Das Problem kann nicht automatisch behoben werden.\n\nBitte sehen Sie auf der Support-Webseite https://enigmail.net/faq (auf Englisch) nach, welche Möglichkeiten Sie haben. gpgNotFound=Die GnuPG-Anwendung „%S“ konnte nicht gefunden werden.\nStellen Sie sicher, dass der Pfad zur GnuPG-Anwendung in den Enigmail-Einstellungen korrekt angegeben ist. @@ -384,9 +393,8 @@ prefBad=FALSCHE Signatur von %S failCancel=Fehler - Schlüsselempfang durch Benutzer abgebrochen -failNoServer=Fehler – Es wurde kein Schlüssel-Server angegeben -failNoID=Fehler – Es wurde keine Schlüssel-ID angegeben failKeyExtract=Fehler – Schlüssel-Extraktion fehlgeschlagen +failKeyNoSubkey=Kein gültiger (Unter-)Schlüssel notFirstBlock=Fehler - Der erste OpenPGP-Block ist kein öffentlicher Schlüssel-Block importKeyConfirm=In der Nachricht enthaltene(n) öffentliche(n) Schlüssel importieren? failKeyImport=Fehler – Schlüssel konnte nicht importiert werden @@ -425,6 +433,8 @@ identityName=Identität: %S switchPepMode=Sie nutzen momentan den 'p≡p Junior' Modus von Enigmail.\n\nDurch das Aktivieren con OpenPGP oder S/MIME für ein Konto deaktivieren Sie p≡p und nutzen den regulären Modus von Enigmail ohne p≡p. enableEnigmail=p≡p &deaktiveren +amPrefAutocrypt.desc=Autocrypt ist ein Standard, welcher definiert, wie komfortable Ende-zu-Ende-Verschlüsselung von E-Mails erreichet wird. Er spezifiziert. wie E-Mail-Programme ihre Verschlüsselungs-Fähigkeiten mittels regulärer E-Mails aushandeln. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Sie haben die Verschlüsselung aktiviert, aber keinen Schlüssel gewählt. Um Nachrichten an %1$S verschlüsselt zu senden, müssen Sie einen oder mehrere gültige Schlüssel auswählen. Möchten Sie die Verschlüsselung für %2$S deaktivieren? @@ -444,18 +454,11 @@ # Strings used in enigmailSearchKey.js needOnline=Im Offline-Modus ist die gewählte Funktion nicht verfügbar. Bitte gehen Sie online und versuchen es erneut. -protocolNotSupported=Das ausgewählte Protokoll „%S://“ wird nicht unterstützt, um OpenPGP-Schlüssel herunterzuladen. -gpgkeysDisabled=Es könnte helfen folgende Funktion zu aktivieren: „extensions.enigmail.useGpgKeysTool“ noKeyserverConn=Verbindung zum Schlüssel-Server %S konnte nicht hergestellt werden. -keyDownloadFailed=Schlüssel konnte nicht vom Server heruntergeladen werden. Status-Meldung:\n%S internalError=Ein interner Fehler ist aufgetreten. Schlüssel konnten nicht heruntergeladen oder importiert werden. -noKeyFound=Leider konnte kein passender Schlüssel zu den angegebenen Suchkriterien gefunden werden.\nBeachten Sie, dass Schlüssel-IDs mit „0x“ beginnen müssen (z.B. 0xABCDEF12). +noKeyFound=Leider konnte kein passender Schlüssel zu den angegebenen Suchkriterien gefunden werden. keyDownload.keyUnavailable=Verzeihung, aber der Schlüssel mit der ID %S ist nicht verfügbar auf dem Schlüssel-Server. Vermutlich hat der Besitzer des Schlüssels diesen nicht zu dem Schlüssel-Server hochgeladen.\n\nErsuchen Sie bitte den Sender der Nachricht, Ihnen den Schlüssel per E-Mail zu senden. -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Schlüssel konnte nicht gesucht oder heruntergeladen werden: gpgkeys_%S konnte nicht ausgeführt werden. - - # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Festlegen des Besitzervertrauens fehlgeschlagen @@ -490,7 +493,6 @@ asciiArmorFile=ASCII-Armored-Dateien (*.asc) importKeyFile=OpenPGP-Schlüsseldatei importieren gnupgFile=GnuPG-Dateien -createKeyOK=Ihr Schlüssel wurde erzeugt. saveRevokeCertAs=Widerrufszertifikat erzeugen & speichern revokeCertOK=Das Widerrufszertifikat wurde erfolgreich erstellt. Damit können Sie Ihren öffentlichen Schlüssel für ungültig erklären, z.B. für den Fall, dass Sie Ihren geheimen Schlüssel verlieren. revokeCertFailed=Das Widerrufszertifikat konnte nicht erzeugt werden. @@ -509,12 +511,12 @@ specificPubSecKeyFilename=%1$S (0x%2$S) pub-sec defaultPubKeyFilename=Exportierte_oeffentliche_Schluessel defaultPubSecKeyFilename=Exportierte_oeffentliche_und_private_Schluessel -noSecretKeys=Keinen privaten Schlüssel gefunden.\n\nMöchten Sie jetzt Ihren eigenen Schlüssel erzeugen? sendKeysOk=Schlüssel erfolgreich gesendet sendKeysFailed=Senden der Schlüssel fehlgeschlagen receiveKeysOk=Schlüssel erfolgreich aktualisiert receiveKeysFailed=Herunterladen der Schlüssel ist fehlgeschlagen +keyUpload.verifyEmails=Der Schlüssel-Server wird Ihnen an jede E-Mail-Adresse Ihres hochgeladenen Schlüssels eine E-Mail schicken. Um die Veröffentlichung Ihres Schlüssels zu bestätigen, müssen sie auf den Link in jeder E-Mail klicken die Sie erhalten werden. importFromClip=Möchten Sie Schlüssel aus der Zwischenablage importieren? importFromUrl=Öffentlichen Schlüssel von dieser URL herunterladen: @@ -529,7 +531,7 @@ revokeKeyQuestion=Sie sind dabei, den Schlüssel '%S' zu widerrufen.\n\nSie werden mit diesem Schlüssel nicht mehr signieren können, und sobald der Widerruf verteilt ist, werden andere nicht mehr mit diesem Schlüssel verschlüsseln können. Sie können mit dem Schlüssel aber weiterhin alte Nachrichten entschlüsseln.\n\nMöchten Sie fortfahren? revokeKeyOk=Der Schlüssel wurde widerrufen. Wenn Ihr Schlüssel auf einem Schlüssel-Server verfügbar ist, sollten Sie Ihn jetzt erneut hochladen. Erst dann können andere Anwender sehen, dass er widerrufen wurde. revokeKeyFailed=Der Schlüssel konnte nicht widerrufen werden. -revokeKeyNotPresent=Sie haben keine Slüssel (0x%S), der zu dem Widerrufszertifikat passt!\n\nWenn Sie ihren Schlüssel verloren haben, müssen sie ihn (z.B. vom Keyserver) vor dem Widerrufszertifikat importieren! +revokeKeyNotPresent=Sie haben keinen Schlüssel (0x%S), der zu dem Widerrufszertifikat passt!\n\nWenn Sie ihren Schlüssel verloren haben, müssen sie ihn (z.B. von einem Schlüssel-Server) importieren bevor Sie das Widerrufszertifikat anwenden können! revokeKeyAlreadyRevoked=Der Schlüssel 0x%S wurde bereits zurückgerufen. refreshAllQuestion=Sie haben keinen Schlüssel ausgewählt. Möchten Sie ALLE Schlüssel aktualisieren? refreshKeyServiceOn.warn=Warnung: Ihre Schlüssel werden derzeit so schnell wie möglich im Hintergrund aufgefrischt.\nWenn Sie all Ihre Schlüssel sofort erneuern, werden Sie unnötigerweise Infos über Sie preis geben.\nWollen Sie das wirklich machen? @@ -541,7 +543,6 @@ keyMan.button.import=&Importieren keyMan.button.refreshAll=Alle Schlüssel &aktualisieren keyMan.button.revokeKey=Schlüssel &widerrufen -keyMan.button.skip=Schlüssel über&springen keylist.noOtherUids=Hat keine weiteren Identitäten keylist.hasOtherUids=Auch bekannt als @@ -553,8 +554,9 @@ keyMan.addphoto.noJpegFile=Das ausgewählte Foto scheint nicht im JPEG-Format zu sein. Bitte wählen Sie eine andere Datei. keyMan.addphoto.failed=Das Foto konnte nicht hinzugefügt werden. noWksIdentity=Der Schlüssel %S hat keine WKS-Identität. +wksUpload.noKeySupported=Der Upload war nicht erfolgreich - Ihr Provider scheint WKS nicht zu unterstützen. -keyman.addBlacklistKey.msg=Möchten Sie wirklich, dass p≡p den Schlüssel "%1$S (%2$S)" nicht mehr verwendet zum Verschlüsseln von Nachrichten? +keyman.addBlacklistKey.msg=Möchten Sie wirklich, dass p≡p den Schlüssel "%1$S (%2$S)" nicht mehr verwendet zum Verschlüsseln von Nachrichten? keyman.removeBlacklistKey.msg=Möchten Sie p≡p erlauben, den Schlüssel "%1$S (%2$S)" für zukünftige Nachrichten zu verwenden? keyman.addBlacklistKey.button=Den Schlüssel auf die Sperrliste setzen keyman.removeBlacklistKey.button=Schlüssel von der Sperrliste &entfernen @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Ändern der PIN fehlgeschlagen -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Schlüssel werden aktualisiert. Bitte warten… keyserverProgress.uploading=Schlüssel werden hochgeladen. Bitte warten… keyserverProgress.wksUploadFailed=Ihr Schlüssel konnte nicht zum Webkey Service hochgeladen werden. keyserverProgress.wksUploadCompleted=Ihr öffentlicher Schlüssel wurde Ihrem Anbieter erfolgreich übermittelt. Sie erhalten eine E-Mail, zum bestätigen, dass Sie den Upload eingeleitet haben. keyserverTitle.refreshing=Schlüssel aktualisieren keyserverTitle.uploading=Schlüssel hochladen +keyserver.result.download.none=Keine Schlüssel heruntergeladen. +keyserver.result.download.1of1=Schlüssel erfolgreich heruntergeladen. +keyserver.result.download.1ofN=1 von %S Schlüssel erfolgreich heruntergeladen. +keyserver.result.download.NofN=%1$S von %2$S Schlüssel erfolgreich heruntergeladen. +keyserver.result.uploadOne=1 Schlüssel erfolgreich hochgeladen. +keyserver.result.uploadMany=%S Schlüssel erfolgreich hochgeladen. # Strings in enigmailSetupWizard -passphrase.min8keys=Ihre Passphrase sollte mindestens 8 Zeichen lang sein! -setupWizard.reallyCancel=Möchten Sie den Einrichtungs-Assistenten wirklich schließen? setupWizard.invalidGpg=Bei der angegebenen Datei handelt es sich nicht um die GnuPG-Anwendung. Bitte wählen Sie eine andere Datei aus. -setupWizard.specifyFile=Sie müssen zumindest eine öffentliche Schlüsseldatei auswählen, um fortzufahren. setupWizard.installFailed=Die Installation scheint nicht erfolgreich abgeschlossen worden zu sein. Bitte versuchen Sie GnuPG erneut zu installieren, oder installieren Sie GnuPG manuell und weisen Sie den Pfad über die Schaltfläche „Durchsuchen“ zu. setupWizard.downloadForbidden=Zu ihrer eigenen Sicherheit werden wir GnuPG nicht herunterladen. Bitte besuchen Sie die Webseite https://gnupg.org/, um GnuPG herunterzuladen. setupWizard.downloadImpossible=GnuPG kann im Moment nicht heruntergeladen werden. Bitte versuchen Sie es später erneut oder laden Sie GnuPG von https://gnupg.org/ herunter. -setupWizard.hashSumError=Der Assistent konnte die Integrität der heruntergeladenen Datei nicht verifizieren. Die Datei könnte defekt oder manipuliert sein. Möchten Sie die Installation trotzdem fortsetzen? +setupWizard.hashSumError=Der Assistent konnte die Integrität der heruntergeladenen Datei nicht verifizieren. Die Datei könnte defekt oder manipuliert worden sein. Möchten Sie die Installation trotzdem fortsetzen? setupWizard.importSettingsFile=Geben Sie die zu ladende Sicherungsdatei an setupWizard.invalidSettingsFile=Die angegebene Datei enthält keine Enigmail-Einstellungen. setupWizard.gpgConfExists=Es existiert bereits eine GnuPG-Konfigurationsdatei. Soll sie durch die GnuPG-Konfigurationsdatei aus der Sicherung ersetzt werden? setupWizard.noGpgHomeDir=Es scheint, dass Sie %S zur Verwendung mit GnuPG konfiguriert haben. Dies ist jedoch kein Verzeichnis - Sie können es nicht verwenden. setupWizard.unmachtedIds=Folgende Identitäten Ihres alten Setups konnten nicht zugeordnet werden:\n%S\nDie Einstellungen für diese Identitäten wurden übersprungen. +setupWizard.foundAcSetupMessage=Eine Autocrypt Einrichtungsnachricht wurde gefunden. Um die Autocrypt-Einrichtung zu beginnen, drücken Sie auf den KnopfEinrichtung starten unten. +setupWizard.foundAcNoSetupMsg=Wir haben festgestellt, dass Sie ein Autocrypt-fähiges E-Mail Programm verwenden, aber wir können keine Autocrypt-Einrichtungsnachricht finden. Wir empfehlen Ihnen, dass Sie auf Ihrem bereits existierenden Gerät eine Autocrypt-Einrichtungsnachricht erzeugen, und anschliessend auf Postfach erneut durchsuchen drücken. Alternativ können Sie Ihre Einstellungen und Schlüssel von einer vorhandenen Enigmail-Installation exportieren, und hier einspielen. +setupWizard.setupComplete=Enigmail ist nun korrekt konfiguriert und betriebsbereit. Für weitere Informationen können Sie unsere Web-Seite besuchen (auf Englisch). # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Beim Download von GnuPG ist ein Fehler aufgetreten. Bitte prüfen Sie die Fehlerkonsole für weitere Details. @@ -655,7 +663,7 @@ filter.encrypt.label=Verschlüsseln (Enigmail) filter.keyRequired=Sie müssen einen Empfänger-Schlüssel wählen. filter.keyNotFound=Konnte keinen Verschlüsselungs-Schlüssel finden für "%S". -filter.warn.keyNotSecret=Achtung - die Filteraktion "Verschlüsseln" ersetzt den Empfänger.\n\nWenn Sie keinen geheimen Schlüssel für "%S" haben, können Sie die E-Mails nicht mehr lesen. +filter.warn.keyNotSecret=Achtung - die Filteraktion "Verschlüsseln" ersetzt die Empfänger.\n\nWenn Sie keinen geheimen Schlüssel für "%S" haben, können Sie die E-Mails nicht mehr lesen. # strings in enigmailConvert.jsm converter.decryptBody.failed=Konnte Nachricht mit folgendem Betreff nicht entschlüsseln:\n„%S“\nWollen Sie es mit einer anderen Passphrase erneut versuchen, oder wollen Sie die Nachricht überspringen? @@ -695,8 +703,8 @@ #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 Schlüssel laufen in weniger als %1$S Tagen ab:\n%2$S Wir empfehlen neue Schlüssel zu erzeugen und diese in ihren Accounts zu nutzen. -expiry.keyMissingOwnerTrust=Dem geheimen Schlüssel %S fehlt das Vertrauen.\n\nWir empfehlen Ihnen, in den Schlüsseleigenschaften die Option "Sie verlassen sich auf Zertifizierungen" auf "absolut" zu setzen. +expiry.keysExpireSoon=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.keyMissingOwnerTrust=Ihrem geheimen Schlüssel %S fehlt das Vertrauen.\n\nWir empfehlen Ihnen, in den Schlüsseleigenschaften die Option "Sie verlassen sich auf Zertifizierungen" auf "absolut" zu setzen. expiry.keysMissingOwnerTrust=Folgende geheime Schlüssel sind nicht vertrauenswürdig.\n%S.\nWir empfehlen Ihnen, in den Schlüsseleigenschaften die Option "Sie verlassen sich auf Zertifizierungen" auf "absolut" zu setzen. expiry.OpenKeyManager=Enigmail Schlüsselverwaltung öffnen expiry.OpenKeyProperties=Schlüsseleigenschaften öffnen @@ -709,6 +717,7 @@ gpghomedir.notwritable=Das Verzeichnis '%S' mit den OpenPGP-Schlüsseln kann nicht beschrieben werden. gpghomedir.notdirectory=Das Verzeichnis '%S' mit den OpenPGP-Schlüsseln ist eine Datei, kein Verzeichnis. gpghomedir.notusable=Bitte korrigieren Sie die Verzeichnisberechtigungen oder ändern Sie den Speicherort Ihres GnuPG "home"-Verzeichnisses. GnuPG funktioniert sonst nicht korrekt. +gpgAgent.noAutostart=Sie verwenden die GnuPG version %S. Der Einsatz dieser Version bedingt, dass Sie gpg-agent starten, bevor Thunderbird gestartet wird, und dass die Umgebungsvariable "GPG_AGENT_INFO" für vorgeladen wird.\n\nDiese Vorbedingungen sind nicht erfüllt - Sie können Enigmail nicht verwenden bis Sie dieses Problem behoben haben. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=Kann keine p≡p vertrauliche Wörter für Ihren Account verifizieren. @@ -730,10 +739,10 @@ pepPrivacyStatus.RatingTrustedSuggestion=Keine Aktion notwendig! pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Beachten Sie, dass die Nachricht möglicherweise nicht sicher ist. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Bitte fügen Sie die notwendigen Informationen hinzu. -pepPrivacyStatus.RatingUnderAttackSuggestion=Den Inhalt dieser Nachricht mit Ihrem Kommunikationspartner separat prüfen. -pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Stellen Sie sicher, dass der Datenschutzstatus für jeden aufgeführten Kommunikations-Partner sicher ist. +pepPrivacyStatus.RatingUnderAttackSuggestion=Überprüfen Sie den Inhalt dieser Nachricht mit Ihrem Kommunikationspartner auf einem anderen Kanal. +pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Stellen Sie sicher, dass der Datenschutzstatus für jeden aufgeführten Kommunikations-Partner mindestens "sicher" ist. pepPrivacyStatus.RatingUnencryptedSuggestion=Bitte fragen Sie Ihren Kommunikationspartner Verschlüsselungslösungen zu nutzen oder p≡p zu installieren. -pepPrivacyStatus.RatingUnreliableSuggestion=Diese Nachricht hat keine zuverlässige Verschlüsselung oder keine Signatur. Fragen Sie Ihren Kommunikationspartner, um seine Verschlüsselungslösungen zu aktualisieren oder p≡p zu installieren. +pepPrivacyStatus.RatingUnreliableSuggestion=Diese Nachricht hat keine zuverlässige Verschlüsselung oder keine Signatur. Bitten Sie Ihren Kommunikationspartner, seine Verschlüsselungseinstellungen zu aktualisieren oder p≡p zu installieren. pepPrivacyStatus.RatingBrokenExplanation=Diese Nachricht hat eine defekte Verschlüsselung oder Formatierung. pepPrivacyStatus.RatingHaveNoKeyExplanation=Diese Nachricht kann nicht entschlüsselt werden, da der Schlüssel nicht verfügbar ist. @@ -765,14 +774,14 @@ handshakeDlg.error.noPeers=Kann ohne Hände schütteln nicht korrespondieren. handshakeDlg.error.noProtection=Bitte aktivieren Sie den Schutz, um die Handshake-Funktion nutzen zu können. -enigmail.acSetupPasswd.descEnterPasswd=Bitte geben Sie den Einrichtungscode ein, der auf dem anderen Gerät angezeigt wird -enigmail.acSetupPasswd.descCopyPasswd=Bitte geben Sie den untenstehenden Einrichtungscode auf Ihrem anderen Gerät ein, um mit der Installation fortzufahren +enigmail.acSetupPasswd.descEnterPasswd=Bitte geben Sie den Einrichtungscode ein, der auf dem anderen Gerät angezeigt wird. +enigmail.acSetupPasswd.descCopyPasswd=Bitte geben Sie den unten stehenden Einrichtungscode auf Ihrem anderen Gerät ein, um mit der Installation fortzufahren. #strings in autocrypt.jsm autocrypt.setupMsg.subject=Autocrypt-Einrichtungsnachricht autocrypt.setupMsg.msgBody=Um Ihr neues Gerät für Autocrypt einzurichten, folgen Sie bitte den Anweisungen, die von Ihrem neuen Gerät angezeigt werden sollten. -autocrypt.setupMsg.fileTxt=Dies ist die Autocrypt-Einrichtungsdatei, die für die Übertragung von Einstellungen und Schlüsseln zwischen Clients verwendet wird. Sie können sie mit dem Einrichtungscode entschlüsseln, den Sie auf Ihrem alten Gerät finden, und dann den enthaltenen Schlüssel in Ihren Schlüsselbund importieren. +autocrypt.setupMsg.fileTxt=Dies ist die Autocrypt-Einrichtungsdatei, die für die Übertragung von Einstellungen und Schlüsseln zwischen E-Mail Clients verwendet wird. Sie können sie mit dem Einrichtungscode entschlüsseln, den Sie auf Ihrem alten Gerät finden, und dann den enthaltenen Schlüssel in Ihren Schlüsselbund importieren. #strings in upgradeInfo.html upgradeInfo.doctitle=Was gibt es Neues in Enigmail v2.0? @@ -785,10 +794,12 @@ upgradeInfo.autocrypt.title=Unterstützung für Autocrypt upgradeInfo.autocrypt.desc=Enigmail unterstützt nun Autocrypt, einen neuen Standard zur Verteilung von Schlüsseln als Teil der gesendeten Nachrichten. Enigmail importiert automatisch Schlüssel aus Autocrypt-kompatiblen Nachrichten, so dass im Laufe der Zeit immer mehr E-Mails verschlüsselt werden können. upgradeInfo.pEp.title=Neuer p≡p Junior-Modus (Pretty Easy Privacy) -upgradeInfo.pEp.desc=Enigmail enthält jetzt einen p≡p Junior-Modus. Derzeit müssen Sie dazu p≡p manuell installieren; dies wird sich in einer zukünftigen Version ändern. Der p≡p Junior-Modus ermöglicht es Ihnen, die OpenPGP-Verschlüsselung so transparent wie möglich zu nutzen; Sie müssen sich nicht mehr um die Schlüsselverwaltung und die Synchronisation von Schlüsseln zwischen Geräten kümmern. +upgradeInfo.pEp.desc=Enigmail enthält jetzt einen p≡p Junior-Modus. Der p≡p Junior-Modus ermöglicht es Ihnen, die OpenPGP-Verschlüsselung so transparent wie möglich zu nutzen; Sie müssen sich nicht mehr um die Schlüsselverwaltung und die Synchronisation von Schlüsseln zwischen Geräten kümmern. upgradeInfo.bottom.desc=Bitte beachten Sie unsere Dokumentation, um Hilfe zur Verwendung von Enigmail zu erhalten. +#strings in pEpAdapter.jsm pep.missingGnuPG=Für die Verwendung von Enigmail/p≡p wird GnuPG benötigt. Da wir es nicht finden konnten, schlagen wir vor, es für Sie herunterzuladen und zu installieren. +pep.updateAvailable=Eine neue Version der Enigmail/p≡p Kryptografie-Komponente ist verfügbar. Möchten Sie diese herunterladen und installieren? #strings in enigmailAbout.html aboutEnigmail.tabName=Über Enigmail @@ -799,6 +810,7 @@ aboutEnigmail.documentation=Dokumentation: aboutEnigmail.testing=Testen: aboutEnigmail.userSupport=Anwender-Support: +aboutEnigmail.userSupport.team=das Team und die Mitglieder der Mailing Liste und Foren aboutEnigmail.localization=Lokalisierung: Siehe die Enigmail-Sprachpakete-Seite aboutEnigmail.Credits=Danksagungen: aboutEnigmail.origAuthor=Ursprünglicher Autor der Enigmail-Erweiterung @@ -808,3 +820,38 @@ aboutEnigmail.licenseSupportTitle=Lizenz & Unterstützung aboutEnigmail.license=Enigmail OpenPGP ist quelloffen und lizenziert unter der %S aboutEnigmail.support=Support und Download ist verfügbar unter www.enigmail.net. + +#strings in updateGnuPG.html +updateGnuPG.tabName=Aktualisierung von GnuPG +updateGnuPG.title=Neue Versionen von GnuPG +updateGnuPG.introduction.desc=Enigmail verwendet GnuPG um die kryptografischen Funktionen durchzuführen. Wir empfehlen Ihnen, Ihre Installation von GnuPG aktuell zu halten. +updateGnuPG.updateRequired=Eine neue Version von GnuPG ist verfügbar. Wir empfehlen, dass Sie Ihre GnuPG Installation stets aktuell halten. Bitte drücken Sie auf den Knopf Update installieren, um GnuPG herunterzuladen und die neue Version zu installieren. +updateGnuPG.noUpdateRequired=GnuPG ist auf dem neusten Stand. +updateGnuPG.cannotUpdate.header=Enigmail unterstützt nur folgende Varianten von GnuPG: +updateGnuPG.cannotUpdate.footer=Sie scheinen eine andere Variante von GnuPG zu verwenden, welche leider nicht mit Enigmail aktualisiert werden kann. +updateGnuPG.installUpdate=Update installieren +updateGnuPG.noMoreUpdates=Zukünftig nicht nach Aktualisierungen suchen +updateGnuPG.checkUpdate=Suche nach GnuPG Aktualisierungen + + +#strings in keyserver.jsm +keyserver.error.aborted=Abgebrochen +keyserver.error.unknown=Ein unbekannter Fehler ist aufgetreten. +keyserver.error.serverError=Der Schlüssel-Server hat einen Fehler gemeldet. +keyserver.error.importError=Der heruntergeladene Schlüssel konnte nicht importiert werden. +keyserver.error.unavailable=Der Schlüssel-Server ist nicht verfügbar. +keyserver.error.securityError=Der Schlüssel-Server unterstützt keine verschlüsselten Verbindungen. +keyserver.error.certificateError=Das Zertifikat des Schlüssel-Servers ist nicht gültig. +keyserver.error.unsupported=Der Schlüssel-Server wird von Enigmail nicht unterstützt. + +#strings in mimeDecrypt.jsm +mimeDecrypt.encryptedPart.attachmentLabel=Verschlüsselter Teil der Nachricht +mimeDecrypt.encryptedPart.concealedData=Dies ist ein verschlüsselter Teil der Nachricht. Sie müssen ihn in einem separaten Fenster öffnen, indem Sie auf den Anhang klicken. + +#strings in gnupg-key.jsm +import.secretKeyImportError=Während des Imports von geheimen Schlüsseln ist ein Fehler in GnuPG aufgetreten. Der Import war nicht erfolgreich. + +#strings in importSettings.js +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 diff -Nru enigmail-2.0.12+ds1/lang/el/enigmail.dtd enigmail-2.1.3+ds1/lang/el/enigmail.dtd --- enigmail-2.0.12+ds1/lang/el/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/el/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ -Mozilla Public License 2.0."> - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,11 +63,8 @@ - - - @@ -89,12 +77,13 @@ + - + @@ -117,6 +106,9 @@ + + + @@ -209,6 +201,7 @@ + @@ -345,7 +338,7 @@ - + @@ -368,7 +361,6 @@ - @@ -456,8 +448,8 @@ - - + + @@ -542,7 +534,7 @@ - + @@ -623,7 +615,7 @@ - + @@ -665,119 +657,35 @@ - - + - - - - - - - - - - - - - - - - - -Σημείωση: Το Enigmail θα επαληθεύει πάντα τις υπογραφές των μηνυμάτων όλων των λογαριασμών και ταυτοτήτων, ανεξάρτητα αν είναι ενεργοποιημένο για αυτές ή όχι"> - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Ευχαριστούμε που χρησιμοποιείτε το Enigmail."> - - - - - - - - - + + + + + + + + + + + - + @@ -793,7 +701,9 @@ - + + + @@ -852,9 +762,19 @@ - + + - + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/el/enigmail.properties enigmail-2.1.3+ds1/lang/el/enigmail.properties --- enigmail-2.0.12+ds1/lang/el/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/el/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=Ειδοποίηση του Enigmail -enigConfirm=Επιβεβαίωση του Enigmail +# enigConfirm=Enigmail Confirmation # enigInfo=Enigmail Information enigError=Σφάλμα του Enigmail enigPrompt=Ερώτηση του Enigmail @@ -78,7 +78,7 @@ passSpaceProblem=Για τεχνικούς λόγους, ο κωδικός δεν πρέπει να αρχίζει ή να τελειώνει με κενό. changePassFailed=Η αλλαγή της φράσης κωδικού απέτυχε. -keyConfirm=Να δημιουργηθεί δημόσιο και ιδιωτικό κλειδί για το '%S'; +# keyConfirm=Generate public and secret key for '%S'? keyMan.button.generateKey=&Δημιουργία κλειδιού keyAbort=Ακύρωση της δημιουργίας του κλειδιού; keyMan.button.generateKeyAbort=&Εγκατάλειψη δημιουργίας κλειδιού @@ -86,14 +86,14 @@ expiryTooLong=Δεν μπορείτε να δημιουργήσετε κλειδί που να λήγει σε περισσότερο από 100 χρόνια. expiryTooLongShorter=Δεν μπορείτε να δημιουργήσετε κλειδί που λήγει σε περισσότερα από 90 έτη. expiryTooShort=Το κλειδί θα πρέπει να είναι έγκυρο για μία ημέρα τουλάχιστον. -keyGenFailed=Η δημιουργία του κλειδιού απέτυχε. Ανατρέξτε στην κονσόλα του Enigmail (Μενού Enigmail > Αποσφαλμάτωση του Enigmail) για λεπτομέρειες. +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. # setKeyExpirationDateFailed=The expiration date could not be changed # Strings in enigmailMessengerOverlay.js securityInfo=Πληροφορίες ασφαλείας του Enigmail\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Οι επισυνάψεις αυτού του μηνύματος δεν υπογράφηκαν ή κρυπτογραφήθηκαν*\n\n +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=Πιθανό κρυπτογραφημένο ή υπογεγραμμένο μήνυμα με PGP/MIME. Κάντε κλικ στο κουμπί Αποκρυπτογράφηση για να το επαληθεύσετε saveAttachmentHeader=Enigmail: Αποθήκευση αποκρυπτογραφημένων επισυνάψεων @@ -102,7 +102,7 @@ beginPgpPart=********* *BEGIN ENCRYPTED or SIGNED PART* ********* endPgpPart=********** *END ENCRYPTED or SIGNED PART* ********** -notePartEncrypted=Enigmail: *Κάποια τμήματα του μηνύματος ΔΕΝ υπογράφηκαν ή κρυπτογραφήθηκαν* +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *Βρέθηκε μήνυμα πολλαπλών τμημάτων -- η αποκρυπτογράφηση/επαλήθευση διακόπηκε* decryptOkNoSig=Προειδοποίηση\n\nΗ αποκρυπτογράφηση ήταν επιτυχής, αλλά ή επαλήθευση της υπογραφής δεν έγινε σωστά @@ -114,6 +114,7 @@ # fixBrokenExchangeMsg.failed=Did not succeed to repair message. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. @@ -148,10 +149,9 @@ minimalLineWrapping=Έχετε ορίσει να γίνεται αναδίπλωση κειμένου στους %S χαρακτήρες. Για σωστή κρυπτογράφηση και/ή υπογραφή, αυτή η τιμή θα πρέπει να είναι τουλάχιστον 68.\nΘέλετε να αλλάξει η αναδίπλωση κειμένου στους 68 χαρακτήρες τώρα; warning=Προειδοποίηση signIconClicked=Έχετε τροποποιήσει χειρωνακτικά τις ρυθμίσεις υπογραφής μηνυμάτων. Για αυτό το λόγο, κατά τη σύνταξη αυτού του μηνύματος, η (απ)ενεργοποίηση της υπογραφής δεν εξαρτάται πια από την (απ)ενεργοποίηση της κρυπτογράφησης. -# 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. +# 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=Σφάλμα κατά την αποθήκευση προχείρου # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. -# msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. # msgCompose.internalEncryptionError=Internal Error: promised encryption disabled @@ -164,7 +164,6 @@ # msgCompose.toolbarTxt.disabled=Enigmail is disabled for the selected identity # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject -# msgCompose.encryptedSubjectStub=Encrypted Message # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject @@ -179,7 +178,7 @@ # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -# pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=Αποθήκευση του μηνύματος %S ως %S στο φάκελο Μη απεσταλμένης αλληλογραφίας; onlineSend=Αποστολή του μηνύματος %S στον %S; -encryptKeysNote=Σημείωση: το μήνυμα κρυπτογραφήθηκε με τα ακόλουθα ID χρήστη / κλειδιά: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S # hiddenKey= -signFailed=Σφάλμα του Enigmail. Η κρυπτογράφηση/υπογραφή απέτυχε. Να αποσταλεί χωρίς κρυπτογράφηση; +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=&Αποστολή μη κρυπτογραφημένου μηνύματος recipientsSelectionHdr=Επιλέξτε παραλήπτες για κρυπτογράφηση @@ -225,9 +224,9 @@ # signOffWithReason=Signing: OFF (%S) reasonEnabledByDefault=ενεργοποιημένο από προεπιλογή # reasonManuallyForced=manually forced -# reasonByRecipientRules=forced by recipient rules +# reasonByRecipientRules=forced by per-recipient rules # reasonByAutoEncryption=forced by auto encryption -# reasonByConflict=due to conflict in recipient rules +# reasonByConflict=due to conflict in per-recipient rules # reasonByEncryptionMode=due to encryption mode # should not be used anymore: @@ -252,9 +251,9 @@ # pgpmimeNo=Inline PGP will be used # Attach own key status (tooltip strings): -# attachOwnKeyNo=Your own key will not be attached -# attachOwnKeyYes=Your own key will be attached -# attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Εντοπίστηκαν αλληλοσυγκρουόμενοι κανόνες παραληπτών\n%S\n\nΝα σταλθεί το μήνυμα με αυτές τις παραμέτρους; msgCompose.button.configure=&Ρύθμιση @@ -269,6 +268,10 @@ # clickDetailsButton=; click on 'Details' button for more information clickImportButton=· πατήστε στο κουμπί 'Εισαγωγή κλειδιού' για να εισάγετε το κλειδί # keyTypeUnsupported=; the key type is not supported by your version of GnuPG +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Αποκρ/φηση msgPart=Τμήμα του μηνύματος %S msgSigned=υπογεγραμμένο msgSignedUnkownKey=υπογεγραμμένο με άγνωστο κλειδί @@ -280,8 +283,10 @@ needKey=Σφάλμα - απαιτείται ιδιωτικό κλειδί για την αποκρυπτογράφηση του μηνύματος failedDecrypt=Σφάλμα - η αποκρυπτογράφηση απέτυχε badPhrase=Σφάλμα - κακή δράση κωδικού +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=Σφάλμα - η αποκρυπτογράφηση/επαλήθευση απέτυχε viewInfo=· Προβολή > Πληροφορίες ασφαλείας μηνύματος +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=Αποκρυπτογραφημένο μήνυμα # decryptedMsgWithFormatError=Decrypted message (restored broken PGP email format probably caused by an old Exchange server, so that the result might not be perfect to read) @@ -326,6 +331,7 @@ # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. @@ -337,6 +343,8 @@ prefs.warnAskNever=Προειδοποίηση: η ενεργοποίηση αυτής της επιλογής θα οδηγήσει σε αποστολή μη κρυπτογραφημένων μηνυμάτων χωρίς να εμφανίζεται καμία απολύτως πληροφορία, όταν δεν υπάρχει το κλειδί κάποιου από τους παραλήπτες -- το Enigmail δε θα σας πληροφορεί όταν συμβαίνει αυτό! prefs.warnIdleTimeForUnknownAgent=Δεν είναι δυνατή η σύνδεση στο gpg-agent. Ίσως το σύστημά σας να χρησιμοποιεί ένα εξειδικευμένο εργαλείο για τη διαχείριση των κωδικών πρόσβασης (π.χ. gnome-keyring, seahorse-agent, KDE wallet manager, ...). Δυστυχώς, το Enigmail δεν μπορεί να ελέγξει το χρονικό όριο λήξης κωδικού για αυτό το εργαλείο. Συνεπώς, οι αντίστοιχες ρυθμίσεις χρονικού ορίου, στο Enigmail, αγνοούνται. prefEnigmail.oneKeyserverOnly=Σφάλμα - μπορείτε να ορίσετε μόνο ένα εξυπηρετητή κλειδιών για την αυτόματη λήψη των OpenPGP κλειδιών που λείπουν. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +aboutLicense.desc=Το Enigmail είναι λογισμικό ανοιχτού κώδικα και διατίθεται υπό την άδεια Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=Σφάλμα - δε δόθηκε φράση κωδικού noPGPblock=Σφάλμα - Δε βρέθηκε έγκυρο μπλοκ δεδομένων armored OpenPGP unverifiedReply=Η απάντηση δεν επαληθεύθηκε -keyInMessageBody=Βρέθηκε κλειδί στο σώμα του μηνύματος. Πατήστε στο 'Εισαγωγή κλειδιού' για να εισάγετε το κλειδί +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=Σφάλμα - Η υπογραφή δεν ταιριάζει -cantImport=Σφάλμα εισαγωγής δημόσιου κλειδιού\n\n +# cantImport=Error importing public key\n\n # doImportOne=Import %1$S (%2$S)? # doImportMultiple=Import the following keys?\n\n%S # previewFailed=Can't read public key file. @@ -366,14 +374,15 @@ sc.removeCard=Για τη λειτουργία δε χρειάζεται να υπάρχει κάποια SmartCard στη συσκευή ανάγνωσης.\nΠαρακαλώ αφαιρέστε τη SmartCard και ξαναδοκιμάστε. sc.noCardAvailable=Δε βρέθηκε SmartCard στη συσκευή ανάγνωσης της\nΠαρακαλώ εισάγετε την SmartCard σας και ξαναδοκιμάστε. sc.noReaderAvailable=Η συσκευή ανάγνωσης SmartCard δεν μπόρεσε να προσπελασθεί.\nΠαρακαλώ συνδέστε τη συσκευή, εισάγετε την κάρτα σας, και ξαναδοκιμάστε. -# keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. -# keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. # keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. missingPassphrase=Λείπει η φράση πρόσβασης errorHandling.gpgAgentInvalid=Το σύστημά σας τρέχει μια έκδοση του gpg-agent που δεν είναι κατάλληλη για την έκδοση GnuPG. errorHandling.gpgAgentError=Το GnuPG ανέφερε ένα σφάλμα στην επικοινωνία με το gpg-agent (ένα στοιχείο του GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=Αδύνατος ο εντοπισμός του προγράμματος GnuPG '%S'.\nΣιγουρευτείτε ότι έχετε ορίσει σωστά τη διαδρομή του εκτελέσιμου του GnuPG στις προτιμήσεις του Enigmail. @@ -384,9 +393,8 @@ prefBad=ΜΗ έγκυρη υπογραφή από %S failCancel=Σφάλμα - Η λήψη του κλειδιού ακυρώθηκε από το χρήση -failNoServer=Σφάλμα - Δεν καθορίστηκε εξυπηρετητής κλειδιών για χρήση -failNoID=Σφάλμα - Δεν καθορίστηκε ID για τη λήψη του κλειδιού failKeyExtract=Σφάλμα - η εντολή εξαγωγής του κλειδιών απέτυχε +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=Σφάλμα - Το πρώτο μπλοκ OpenPGP δεν είναι μπλοκ δημόσιου κλειδιού importKeyConfirm=Να εισαχθούν τα δημόσια κλειδιά που υπάρχουν στο μήνυμα; failKeyImport=Σφάλμα - η εισαγωγή κλειδιών απέτυχε @@ -425,6 +433,8 @@ identityName=Ταυτότητα: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Ενεργοποιήσατε την κρυπτογράφηση, αλλά δεν επιλέξατε κλειδί. Για να αποστέλλονται κρυπτογραφημένα μηνύματα στον παραλήπτη(ες) %S, πρέπει να ορίσετε ένα ή περισσότερα έγκυρα κλειδιά για χρήση από τη λίστα των κλειδιών σας. Θέλετε να απενεργοποιήσετε την κρυπτογράφηση για τον παραλήπτη(ες) %S; @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=Η λειτουργία που επιλέξατε δεν είναι διαθέσιμη όταν είστε χωρίς σύνδεση. Παρακαλώ συνδεθείτε και ξαναδοκιμάστε. -protocolNotSupported=Το πρωτόκολλο '%S://' που έχετε επιλέξει δεν υποστηρίζεται για τη λήψη κλειδιών OpenPGP. -gpgkeysDisabled=Ίσως βοηθήσει αν ενεργοποιήσετε την επιλογή 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=Αδύνατη η σύνδεση στον εξυπηρετητή κλειδιών %S. -keyDownloadFailed=Η λήψη του κλειδιού από τον εξυπηρετητή κλειδιών απέτυχε. Μήνυμα κατάστασης:\n%S internalError=Παρουσιάστηκε ένα εσωτερικό σφάλμα. Η λήψη ή εισαγωγή των κλειδιών είναι αδύνατη. -noKeyFound=Δε βρέθηκε κανένα κλειδί που να ταιριάζει στα κριτήρια αναζήτησης.\nΠαρακαλώ σημειώστε ότι το ID των κλειδιών πρέπει να αρχίζει με \\"0x\\" (π.χ. 0xABCDEF12). -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Η αναζήτηση ή λήψη κλειδιού από τον εξυπηρετητή κλειδιών απέτυχε: αδύνατη η εκτέλεση της εντολής gpgkeys_%S. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Ο ορισμός της εμπιστοσύνης απέτυχε @@ -490,7 +493,6 @@ asciiArmorFile=Αρχεία ASCII Armored (*.asc) importKeyFile=Εισαγωγή κλειδιού OpenPGP gnupgFile=Αρχεία GnuPG -# createKeyOK=Your Key has been generated saveRevokeCertAs=Δημιουργία & αποθήκευση πιστοποιητικού ανάκλησης # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=Δεν είναι δυνατή η δημιουργία του πιστοποιητικού ανάκλησης. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%S (0x%S) pub-sec defaultPubKeyFilename=Εξαγωγηθέντα-δημόσια-κλειδιά defaultPubSecKeyFilename=Εξαγωγηθέντα-δημόσια-και-ιδιωτικά-κλειδιά -noSecretKeys=Δε βρέθηκαν ιδιωτικά κλειδιά.\n\nΘέλετε να δημιουργήσετε ένα τώρα; sendKeysOk=Το κλειδί(ά) απεστάλη με επιτυχία sendKeysFailed=Η αποστολή των κλειδιών απέτυχε receiveKeysOk=Τα κλειδιά ανανεώθηκαν με επιτυχία receiveKeysFailed=Η λήψη των κλειδιών απέτυχε +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=Θέλετε να εισάγετε κάποια κλειδιά από το πρόχειρο; # importFromUrl=Download public key from this URL: copyToClipbrdFailed=Αδύνατη η αντιγραφή των επιλεγμένων κλειδιών στο πρόχειρο. copyToClipbrdOK=Τα κλειδιά αντιγράφηκαν στο πρόχειρο -deleteSecretKey=ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Πρόκειται να διαγράψετε ένα ιδιωτικό κλειδί!\nΑν διαγράψετε το ιδιωτικό κλειδί σας, δε θα μπορείτε πια να αποκρυπτογραφήσετε κανένα μήνυμα που κρυπτογραφήθηκε για αυτό το κλειδί.\n\nΘέλετε πραγματικά να διαγράψετε αυτά τα ΔΥΟ κλειδιά (το ιδιωτικό και το δημόσιο)\n'%S'; +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=WARNING: Πρόκειται να διαγράψετε ιδιωτικά κλειδιά!\nΑν διαγράψετε το ιδιωτικό κλειδί σας, δε θα μπορείτε πια να αποκρυπτογραφήσετε κανένα μήνυμα που κρυπτογραφήθηκε για αυτό το κλειδί.\n\nΘέλετε πραγματικά να διαγράψετε αυτά τα ΖΕΥΓΗ κλειδιών (τα ιδιωτικά και τα δημόσια); deletePubKey=Θέλετε να διαγράψετε το δημόσιο κλειδί\n'%S'; deleteSelectedPubKey=Θέλετε να διαγράψετε τα δημόσια κλειδιά; @@ -529,7 +531,7 @@ revokeKeyQuestion=Πρόκειται να ανακαλέσετε το κλειδί '% S'.\n\nΔεν θα μπορείτε πλέον να υπογράφετε με αυτό το κλειδί και μετά τη διανομή, οι άλλοι δεν θα μπορούν πλέον να κρυπτογραφήσουν μηνύματα με αυτό το κλειδί. Μπορείτε ακόμα να χρησιμοποιήσετε το κλειδί για να αποκρυπτογραφήσετε παλιά μηνύματα.\n\nΘέλετε να συνεχίσετε? revokeKeyOk=Το κλειδί ανακλήθηκε. Αν το κλειδί σας υπάρχει σε κάποιο εξυπηρετητή κλειδιών, θα πρέπει να το αποστείλετε και πάλι, ώστε να γίνει γνωστή η ανάκληση. revokeKeyFailed=Το κλειδί δεν μπόρεσε να ανακληθεί. -# revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Δεν επιλέξατε κανένα κλειδί. Θέλετε να ανανεωθούν ΟΛΑ τα κλειδιά; # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? @@ -541,21 +543,21 @@ keyMan.button.import=Ε&ισαγωγή keyMan.button.refreshAll=&Ανανέωση όλων των κλειδιών keyMan.button.revokeKey=Ανάκ&ληση κλειδιού -keyMan.button.skip=&Παράλειψη Κλειδιού keylist.noOtherUids=Δεν υπάρχουν άλλες ταυτότητες keylist.hasOtherUids=Γνωστός και ως -keylist.noPhotos=Δεν υπάρχει διαθέσιμη φωτογραφία -keylist.hasPhotos=Φωτογραφίες +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos keyMan.addphoto.filepicker.title=Επιλέξτε αρχείο εικόνας -keyMan.addphoto.warnLargeFile=Το αρχείο που επιλέξατε είναι μεγαλύτερο από 25 kB.\nΔεν προτείνετε να επιλέγετε πολύ μεγάλα αρχεία καθώς το μέγεθος των κλειδιών θα αυξηθεί δραματικά. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. keyMan.addphoto.noJpegFile=Το επιλεγμένο αρχείο δεν είναι σε μορφή JPEG. Παρακαλώ επιλέξτε ένα άλλο αρχείο. keyMan.addphoto.failed=Δεν ήταν δυνατό να προστεθεί η εικόνα. # noWksIdentity=The key %S does not have a WKS identity. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? -# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Η αλλαγή του PIN απέτυχε -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Ανανέωση κλειδιών, παρακαλώ περιμένετε... keyserverProgress.uploading=Αποστολή κλειδιών, παρακαλώ περιμένετε... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Ανανέωση κλειδιών keyserverTitle.uploading=Αποστολή κλειδιού +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=Η φράση κωδικού σας θα πρέπει να αποτελείται από τουλάχιστον 8 χαρακτήρες! -setupWizard.reallyCancel=Θέλετε πραγματικά να τερματίσετε το Μάγο του Enigmail; setupWizard.invalidGpg=Το αρχείο που επιλέξατε δεν είναι εκτελέσιμο του GnuPG. Παρακαλώ επιλέξτε διαφορετικό αρχείο. -setupWizard.specifyFile=Πρέπει να ορίσετε τουλάχιστον ένα δημόσιο κλειδί για να συνεχίσετε. setupWizard.installFailed=Η εγκατάσταση δεν ήταν επιτυχής. Παρακαλώ ξαναπροσπαθήστε ή εγκαταστήστε το GnuPG χειροκίνητα και εντοπίστε το από το Browse button. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. -setupWizard.hashSumError=Δεν ήταν δυνατή η επαλήθευση της ακεραιότητας του αρχείου. Το αρχείο μπορεί να είναι εσφαλμένο ή επεξεργασμένο. Θέλετε να συνεχίσετε την εγκατάσταση παρ'ολ'αυτά; +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? # setupWizard.importSettingsFile=Specify backup file to load from -# setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. # setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? -# setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Προέκυψε πρόβλημα στην λήψη του GnuPG. Παρακαλώ ελέγξτε τη καταγραφή κονσόλας για περισσότερες πληροφορίες. @@ -654,12 +662,12 @@ # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. -# filter.keyNotFound=Could not find an encryption key for "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -# converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? -# converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? # saveLogFile.title=Save Log File @@ -691,13 +699,13 @@ # enigmailSettings=EnigmailSettings # defaultBackupFileName=Enigmail-export specifyExportFile=Προσδιορίστε όνομα αρχείου για εξαγωγή -# homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm -# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. -# expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties @@ -709,6 +717,7 @@ # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. @@ -728,12 +737,12 @@ # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! -# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Προσθέστε τις απαραίτητες πληροφορίες. -# pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. pepPrivacyStatus.RatingHaveNoKeyExplanation=Αυτό το μήνυμα δεν μπορεί να αποκρυπτογραφηθεί επειδή το κλειδί δεν είναι διαθέσιμο. @@ -763,16 +772,16 @@ handshakeDlg.label.outgoingMessage=Εξερχόμενο μήνυμα handshakeDlg.label.incomingMessage=Εισερχόμενο μήνυμα # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. -# handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device -# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? @@ -785,10 +794,12 @@ # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. +#strings in pEpAdapter.jsm # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=Σχετικά με το Enigmail @@ -799,6 +810,7 @@ # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: +# aboutEnigmail.userSupport.team=the team and the list/forum members # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension @@ -808,3 +820,38 @@ # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/es-ES/enigmail.dtd enigmail-2.1.3+ds1/lang/es-ES/enigmail.dtd --- enigmail-2.0.12+ds1/lang/es-ES/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/es-ES/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ -Mozilla Public License 2.0."> - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,15 +63,7 @@ - - - - - La 'Transferencia de clave de Autocrypt' requiere que el cliente de correo en el otro dispositivo sea compatible con Autocrypt. - Aunque esta es la solución más fácil, actualmente sólo un número limitado de clientes soporta este estándar. - La otra forma es 'Hacer copia de seguridad y Restaurar' tu configuración. - Esto creará un archivo ZIP con toda la información y claves requeridas, que puedes copiar a tu nuevo dispositivo. - Enigmail puede importar directamente esta configuración; para otros clientes de correo, el archivo ZIP puede desempaquetarse y manejarse de forma manual."> + @@ -94,6 +77,7 @@ + @@ -122,6 +106,9 @@ + + + @@ -214,6 +201,7 @@ + @@ -222,8 +210,8 @@ - - + + @@ -350,7 +338,7 @@ - + @@ -373,7 +361,6 @@ -Autocrypt es un estándar que define cómo lograr un cifrado extremo-a-extremo conveniente para correo electrónico. Especifica cómo los programas de correo electrónico negocian las capacidades de cifrado usando correos ordinarios."> @@ -461,8 +448,8 @@ - - + + @@ -547,7 +534,7 @@ - + @@ -628,7 +615,7 @@ - + @@ -670,147 +657,42 @@ - - + - - - - - - - - - - - - - - - - - -Nota: Enigmail siempre comprobará las firmas de los correos para cada cuenta o identidad, tanto si está activada como si no"> - +Este asistente te guiará a través del proceso de configuración."> - - + - - - - - - - - - - - - - - - - - -clave pública sirve para que otros el envíen correos cifrados. Puede distribuirla a todo el mundo."> -clave privada sirve para que usted descifre estos correos y para envíar correos firmados. - -No debe dársela a nadie."> -clave privada sirve para que usted descrifre estos correos y envíe correos cifrados. - -No debe dársela a nadie. - -Para proteger su clave privada, en los dos próximos cuadros de diálogo se le pedirá una frase-contraseña."> -frase-contraseña es una palabra/frase de seguridad para proteger su clave privada. Evita el mal uso de su clave privada."> -No se recomiendan, diéresis, acentos o caracteres específicos del idioma (ej. ä, é, ñ)."> - - - - - - - - - - - - - - - - - - - - - - - - -Se le pedirá para ello que introduzca su contraseña. Por favor, transfiera el certificado a un soporte que pueda ser guardado aparte de forma segura, como un CD o una memoria USB. Si alguien obtiene acceso a este certificado puede usarlo para volver su clave inutilizable."> - - - - - - - - - - - -Exporta tus datos desde tu antiguo equipo usando el asistente de copia de seguridad en las Preferencias de Enigmail. -Importa los datos desde tu nuevo equipo usando este asistente. -"> - - - - - - -Gracias por usar Enigmail."> -Si deseas hacerlo, por favor, confirma la petición que encontrarás en tu bandeja de entrada."> - - - - - - - - + + + + + + + + + + + - + @@ -826,12 +708,10 @@ - -Exporte sus datos desde su antiguo equipo usando este asistente -Importe los datos a su nuevo equipo usando el asistente de configuración -"> + + + @@ -852,7 +732,7 @@ - + @@ -893,12 +773,21 @@ - - Por favor, seleccione debajo la cuenta para la que quiere transferir su clave. - En la siguiente pantalla mostraremos un código de instalación (contraseña) que necesitará introducir en el otro dispositivo para importar su clave y la configuración relacionada."> + + -Por favor, cambia ahora al otro dispositivo y abre el mensaje. Se te debe solicitar un código de instalación. Escribe los siguientes dígitos en la solicitud:"> + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/es-ES/enigmail.properties enigmail-2.1.3+ds1/lang/es-ES/enigmail.properties --- enigmail-2.0.12+ds1/lang/es-ES/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/es-ES/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -9,7 +9,7 @@ enigConfirm=Confirmación de Enigmail enigInfo=Información de Enigmail enigError=Error de Enigmail -enigPrompt=Requerimiento de Enigmail +enigPrompt=Aviso de Enigmail dlgYes=&Sí dlgNo=&No @@ -33,7 +33,7 @@ noRepeat=\n\nEsta alerta no se repetirá hasta que actualice Enigmail. pgpNotSupported=Parece que está usando Enigmail junto con PGP 6.x\n\nDesafortunadamente, PGP 6.x tiene varios problemas que impiden que Enigmail funcione correctamente. Por ello, Enigmail ya no soporta PGP 6.x. Por favor, use GnuPG (GPG) en su lugar.\n\nSi necesita ayuda para cambiar a GnuPG, eche un vistazo a la sección Support (soporte) en la página web de Enigmail. -initErr.howToFixIt=Para usar Enigmail es necesario GnuPG. Si no lo ha instalado todavía, la forma más fácil de hacerlo es usar el botón del "Asistente de configuración" de debajo. +initErr.howToFixIt=Para usar Enigmail es necesario GnuPG. Si no lo ha instalado todavía, la forma más fácil de hacerlo es usando el botón del "Asistente de configuración" de debajo. initErr.setupWizard.button=Asistente de &configuración passphraseCleared=Se ha eliminado la frase-contraseña. cannotClearPassphrase=Estás usando una herramienta no-estándar (como gnome-keyring) para la gestión de frases-contraseña. Por tanto, no es posible desechar la frase-contraseña desde el interior de Enigmail. @@ -46,7 +46,7 @@ # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Esta nueva versión de Enigmail presenta cambios significativos en el manejo de preferencias y opciones. Hemos tratado de transferir la configuración antigua a esta nueva versión. Sin embargo, no podemos cubrir todos los casos de forma automática. Por favor, vuelve a comprobar las nuevas preferencias y opciones resultantes. enigmailCommon.checkPreferences=Comprobar preferencias ... -preferences.defaultToPgpMime=Hemos cambiado la codificación de mensajes predeterminada en Enigmail de Inline-PGP (como texto en el correo) a PGP/MIME (aparte). Recomendamos que mantenga esta última como predeterminada.\n\nSi todavía desea usar Inline-PGP por defecto, puede establecerlo así en Herramientas > Configuración de cuenta > Seguridad OpenPGP. +preferences.defaultToPgpMime=Hemos cambiado la codificación de mensajes predeterminada en Enigmail de Inline-PGP (a PGP/MIME. Recomendamos que mantenga esta última como predeterminada.\n\nSi todavía desea usar Inline-PGP por defecto, puede establecerlo así en Configuración de cuenta bajo Seguridad OpenPGP. ##################################################################### # Strings in enigmailAbout.js @@ -65,20 +65,20 @@ onlyGPG=¡La generación de clave sólo funciona con GnuPG (no con PGP)! keygenComplete=¡Se ha completado la generación de clave! Se usará la identidad <%S> para firmar. -revokeCertRecommended=Recomendamos firmemente crear un certificado de revocación para su clave. Este certificado se puede usar para invalidar su clave, por ejemplo, si su clave privada/secreta se pierde o resulta comprometida. ¿Quiere crear ahora dicho certificado de revocación? +revokeCertRecommended=Recomendamos firmemente crear un certificado de revocación para su clave. Este certificado se puede usar para invalidar su clave, por ejemplo, si su clave privada/secreta se pierde o resulta comprometida. ¿Quiere crear dicho certificado de revocación ahora? keyMan.button.generateCert=&Generar certificado genCompleteNoSign=¡La clave ha sido generada! genGoing=¡Ya se está generando la clave! passNoMatch=Las frases-contraseña no coinciden, por favor, inténtelo de nuevo -passCheckBox=Por favor, marca la casilla si no quieres especificar una contraseña para la clave +passCheckBox=Por favor, marque la casilla si no quiere especificar una contraseña para la clave passUserName=Por favor, indica un nombre de usuario para esta identidad keygen.missingUserName=No se ha especificado nombre para la cuenta/identidad seleccionada. Por favor, introduzca un valor en el campo 'Su nombre' en la configuración de la cuenta. keygen.passCharProblem=Está usando caracteres especiales en su frase-contraseña. Por desgracia, esto puede causar problemas en otras aplicaciones. Le recomendamos que escoja una contraseña que únicamente se componga de estos caracteres:\na-z A-Z 0-9 /.;:-,!?(){}[]%* -passSpaceProblem=Debido a razones técnicas, su frase-contraseña no puede comenzar o acabar con un espacio. +passSpaceProblem=Debido a razones técnicas, su frase-contraseña no puede comenzar o terminar con un espacio. changePassFailed=No se pudo cambiar la contraseña. -keyConfirm=¿Generar claves pública y privada para '%S'? +keyConfirm=¿Generar clave pública y privada para '%S'? keyMan.button.generateKey=&Generar clave keyAbort=¿Abortar la generación de clave? keyMan.button.generateKeyAbort=&Abortar la generación de clave @@ -86,14 +86,14 @@ expiryTooLong=No puede crear una clave que caduque tras más de 100 años. expiryTooLongShorter=No se puede crear una clave que caduque tras más de 90 años. expiryTooShort=Su clave debe ser válida al menos un día. -keyGenFailed=La generación de clave ha fallado. Por favor, revisa la consola de Enigmail (menú Enigmail > Depurar Enigmail) para ver los detalles. +keyGenFailed=La generación de la llave fracasó. Por favor verifique la consola de Enigmail (Menú Enigmail > Opciones de Depuración) para ver los detalles. setKeyExpirationDateFailed=No se pudo cambiar la fecha de caducidad # Strings in enigmailMessengerOverlay.js securityInfo=Información de seguridad de Enigmail\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Los adjuntos de este mensaje no han sido firmados ni cifrados*\n\n +enigContentNote=Enigmail: *Los adjuntos a este correo no han sido firmados ni cifrados*\r\n\r\n possiblyPgpMime=Posiblemente es un mensaje cifrado o firmado PGP/MIME; pulse 'Descifrar/Verificar' para comprobarlo saveAttachmentHeader=Enigmail: Guardar adjunto descifrado @@ -102,7 +102,7 @@ beginPgpPart=********* *PRINCIPIO DE LA PARTE CIFRADA o FIRMADA* ********* endPgpPart=********** *FIN DE LA PARTE CIFRADA o FIRMADA* ********** -notePartEncrypted=Enigmail: *Partes del mensaje NO han sido firmadas o cifradas* +notePartEncrypted=Enigmail: *Porciones de este mensaje NO han sido firmadas ni cifradas* noteCutMessage=Enigmail: *Se han encontrado múltiples bloques de mensaje -- se abortó el descifrado/verificación* decryptOkNoSig=Advertencia:\n\nSe ha descifrado correctamente, pero no se pudo verificar la firma. @@ -114,6 +114,7 @@ fixBrokenExchangeMsg.failed=No se logró reparar el mensaje. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +detailsDlg.importKey=Importar clave wksNoIdentity=Esta clave no está vinculada con ninguna de sus cuentas de correo electrónico. Por favor, añada una cuenta para al menos una de las siguientes direcciones de correo electrónico:\n\n%S wksConfirmSuccess=Confirmación de correo enviado. wksConfirmFailure=No se pudo enviar el correo de confirmación. @@ -148,10 +149,9 @@ minimalLineWrapping=Ha establecido el ajuste de línea a %S caracteres. Para un cifrado y/o firmado correctos, este valor ha ser de al menos 68.\n¿Desea cambiar ahora el ajuste de línea a 68 caracteres? warning=Advertencia signIconClicked=Ha modificado manualmente el firmado. Por lo tanto, mientras esté redactando este mensaje activar/desactivar el firmado ya no dependerá de activar/desactivar el cifrado. -errorOwnKeyUnusable=El identificador de clave '%S' configurado para la identidad actual no ha ofrecido una clave OpenPGP operativa.\n\nPor favor, asegúrese de que tiene una clave OpenPGP válida, no caducada, y de que la configuración de su cuenta apunta hacia esa clave.\nSi su clave no está caducada, compruebe entonces si ha establecido la confianza en el propietario a 'completa' o 'absoluta'. +# 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 al guardar borrador msgCompose.partiallyEncrypted.short=Ten cuidado de no filtrar información sensible - correo parcialmente cifrado. -msgCompose.partiallyEncrypted.mimeMsg=El mensaje al que está respondiendo contenía partes tanto no cifradas como cifradas. Algunas partes cifradas del mensaje son invisibles para usted.\n\nSi el remitente no pudo descifrar originalmente las partes ocultas del mensaje, al descifrarlo usted puede estar filtrando información confidencial que el remitente no pudo descifrar originalmente por si mismo.\n\nRecomendamos que no responda al mensaje, pero cree un nuevo mensaje que contenga su respuesta. msgCompose.partiallyEncrypted.inlinePGP=El mensaje al que está respondiendo contenía partes tanto no cifradas como cifradas. Si el remitente no pudo descifrar originalmente algunas partes del mensaje, al descifrarlo usted puede estar filtrando información confidencial que el remitente no pudo descifrar originalmente por si mismo.\n\nPor favor, considere eliminar todo el texto entrecomillado de su respuesta a este remitente. msgCompose.internalEncryptionError=Error interno: Se deshabilitó el cifrado prometido @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=Enigmail está deshabilitado para la identidad seleccionada msgCompose.protectSubject.tooltip=Proteger el asunto del mensaje msgCompose.noSubjectProtection.tooltip=No proteger el asunto del mensaje -msgCompose.encryptedSubjectStub=Mensaje cifrado msgCompose.protectSubject.dialogTitle=¿Habilitar la protección del asunto? msgCompose.protectSubject.question=Los correos cifrados ordinarios contienen el asunto sin redactar\nHemos establecido un estándar para ocultar el asunto original en el mensaje cifrado,\ny reemplazarlo con un texto de sustitución de forma que el asunto sólo es visible después de que el correo sea descifrado.\n\n¿Queire proteger el asunto en los mensajes cifrados? msgCompose.protectSubject.yesButton=&Proteger asunto @@ -179,7 +178,7 @@ msgCompose.pepSendTrusted=Seguro y de confianza pep.alert.disabledForIdentity=p≡p está deshabilitado para la identidad actual. Por favor, habilite p≡p mediante las preferencias de Enigmail/p≡p. -pep.alert.weakReply=Está a punto de reenviar o responder a un mensaje seguro de forma insegura. Si elige continuar se podría filtrar información confidencial, lo que le pondría en riesgo a usted y a la contraparte de su comunicación. ¿Está seguro de que quiere continuar? +pep.alert.weakReply=Está por reenviar o responder a un mensaje seguro, pero el mensaje que envía no es seguro. Si decide continuar, información confidencial puede ser filtrada, poniendo en riesgo a usted y a su destinatario. ¿Esta seguro que desea continuar? # note: should end with double newline: @@ -203,7 +202,7 @@ encryptKeysNote=Nota: El mensaje se cifra para las siguientes identificaciones-de-usuario / claves: %S hiddenKey= -signFailed=Error en Enigmail; No se pudo completar el cifrado/firmado; ¿Enviar el mensaje sin cifrar? +signFailed=Error en Enigmail: Fallo al cifrar/firmar. ¿Enviar el mensaje sin cifrar? msgCompose.button.sendUnencrypted=&Enviar mensaje sin cifrar recipientsSelectionHdr=Seleccionar destinatarios para cifrado @@ -225,7 +224,7 @@ signOffWithReason=Firmado: DESACTIVADO (%S) reasonEnabledByDefault=habilitado por defecto reasonManuallyForced=forzado manualmente -reasonByRecipientRules=forzado vía reglas por-destinatario +reasonByRecipientRules=forzado por reglas por destinatario reasonByAutoEncryption=fozado por auto-cifrado reasonByConflict=debido a un conflicto entre reglas por destinatario reasonByEncryptionMode=debido al modo de cifrado @@ -252,9 +251,9 @@ pgpmimeNo=Se usará PGP Inline # Attach own key status (tooltip strings): -attachOwnKeyNo=No se adjuntará su propia clave -attachOwnKeyYes=Se adjuntará tu propia clave -attachOwnKeyDisabled=No puedes adjuntar tu propia clave. Para habilitar esta característica,\ntienes que seleccionar una clave específica en Herramientas > Configuración\nde cuenta > Seguridad OpenPGP. +attachOwnKeyNo=No se adjuntará su propia clave pública +attachOwnKeyYes=Se adjuntará su propia clave pública +attachOwnKeyDisabled=No se puede adjuntar tu propia clave pública. Debe seleccionar una clave específica\nen la sección Seguridad OpenPGP bajo Configuración de Cuenta para habilitar esta función. rulesConflict=Se han detectado reglas por-destinatario en conflicto\n%S\n\n¿Enviar el mensaje con esta configuración? msgCompose.button.configure=&Configurar @@ -269,6 +268,10 @@ clickDetailsButton=; pulsa el botón 'Detalles' para más información clickImportButton=; pulse el botón 'Importar clave' para importar la clave keyTypeUnsupported=; el tipo de clave no está soportado por tu versión de GnuPG +decryptManually=; pulse el botón 'Descifrar' para descifrar el mensaje +verifyManually=; pulse el botón 'Verificar' para verificar la firma +headerView.button.verify=Verificar +headerView.button.decrypt=Descifrar msgPart=Parte del mensaje %S msgSigned=firmado msgSignedUnkownKey=firmado con una clave desconocida @@ -280,8 +283,10 @@ needKey=Error - No se encontró la clave privada/secreta correspondiente para descifrar el mensaje failedDecrypt=Error - Fallo al descifrar badPhrase=Error - Contraseña incorrecta +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=Error - Fallo al descifrar/verificar viewInfo=; Ver > Información de seguridad del mensaje, para los detalles +brokenExchangeMessage=Mensaje PGP/MIME de MS-Exchange roto. decryptedMsg=Mensaje descifrado decryptedMsgWithFormatError=Mensaje descifrado (se ha restaurado el formato de correo PGP que se estropeó probablemente a causa de un servidor Exchange antiguo, de modo que el resultado puede no haber quedado perfecto para lectura) @@ -326,6 +331,7 @@ autocryptSetupReq.setupMsg.backup=Puede conservar este mensaje y usarlo como una copia de seguridad para su clave secreta/privada. Si quiere hacer esto, debe anotar la contraseña y guardarla de forma segura. autocryptSetupReq.message.import=Para importar la configuración y clave(s) en Enigmail, por favor, pulsa el botón "Iniciar configuración" en la barra de estado. autocryptSetupReq.message.sent=Por favor, pulsa sobre el mensaje en tu nuevo dispositivo y sigue las instrucciones para importar la configuración. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js oldGpgVersion20=No se pudo inicializar Enigmail.\n\nEstá usando GnuPG versión %1$S, que ya no está soportada. Enigmail requiere GnuPG versión %2$S o superior. Por favor, actualice su instalación de GnuPG, o Enigmail no funcionará. @@ -337,6 +343,8 @@ prefs.warnAskNever=Advertencia: Activar esta opción tendrá como resultado que se dejarán sin cifrar sin aviso alguno los correos en los que no haya clave para alguno de los destinatarios -- ¡Enigmail no le informará si sucede esto! prefs.warnIdleTimeForUnknownAgent=No se pudo conectar con gpg-agent. Quizá tu sistema usa una herramienta especializada para la gestión de contraseñas (como gnome-keyring, seahorse-agent, KDE wallet manager...). Desafortunadamente Enigmail no puede controlar el tiempo de espera de contraseña para la herramienta que estás usando, por tanto no se hará caso de la respectiva configuración de tiempo de espera en Enigmail. prefEnigmail.oneKeyserverOnly=Error - Sólo puedes especificar un servidor de claves para la descarga automática de claves OpenPGP ausentes. +acSetupMessage.desc=Transferir su clave a otro dispositivo Autocrypt-enabled. (Quê is Autocrypt) +aboutLicense.desc=Enigmail es de código abierto y está licenciado bajo la Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -374,6 +382,7 @@ errorHandling.gpgAgentError=GnuPG informó de un error en la comunicación con gpg-agent (un componente de GnuPG). errorHandling.dirmngrError=GnuPG informó de un error en la comunicación con dirmngr (un componente de GnuPG). errorHandling.pinentryError=GnuPG no puede consultar tu contraseña mediante el programa pinentry. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. errorHandling.readFaq=Este es un error de instalación o configuración del sistema que evita que Enigmail funcione adecuadamente, y no se puede reparar automáticamente.\n\nLe recomendamos firmemente que consulte nuestro sitio web de soporte en https://enigmail.net/faq. gpgNotFound=No se pudo encontrar el programa '%S' de GnuPG.\nAsegúrese de haber establecido correctamente la ruta al ejecutable de GnuPG en las preferencias de Enigmail. @@ -384,9 +393,8 @@ prefBad=La firma de %S es INCORRECTA failCancel=Error - Recepción de clave cancelada por el usuario -failNoServer=Error - No se especificó servidor de claves del que recibir la clave -failNoID=Error - No se especificó identificador de clave para el que recibir la clave failKeyExtract=Error - Fallo del comando de extracción de clave +failKeyNoSubkey=Ninguna (sub)clave válida notFirstBlock=Error - El primer bloque de OpenPGP no es un bloque de clave pública importKeyConfirm=¿Importar la(s) clave(s) pública(s) incluida(s) en el mensaje? failKeyImport=Error - Fallo al importar clave @@ -425,6 +433,8 @@ identityName=Identidad: %S switchPepMode=Actualmente está usando el modo 'p≡p Junior' de Enigmail.\n\nAl habilitar el cifrado OpenPGP o el S/MIME para una cuenta, está deshabilitando p≡p y usando el modo 'regular' de Enigmail sin p≡p. enableEnigmail=&Deshabilitar p≡p +amPrefAutocrypt.desc=Autocrypt es un estándar que define cómo lograr un cifrado extremo-a-extremo conveniente para correo electrónico. Este especifica cómo los programas de correo electrónico negocian las capacidades de cifrado usando correos electrónicos ordinarios. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Has activado el cifrado, pero no has seleccionado una clave. Para cifrar correos enviados a %1$S tienes que especificar una o varias claves válidas de tu lista de claves. ¿Quieres deshabilitar el cifrado para %2$S? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=La función seleccionada no está disponible en modo sin conexión. Por favor, conéctese y vuelva a intentarlo. -protocolNotSupported=El protocolo '%S://' que ha seleccionado no está soportado para descargar claves OpenPGP. -gpgkeysDisabled=Podría ser útil activar la opción 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=No se pudo conectar con el servidor de claves en %S. -keyDownloadFailed=Fallo al descargar la clave del servidor de claves. El mensaje de estado es:\n%S internalError=Ha ocurrido un error interno. No se pudieron descargar o importar las claves. -noKeyFound=Lo sentimos, no se pudo encontrar ninguna clave coincidente con el criterio de búsqueda especificado. -keyDownload.keyUnavailable=Lo sentimos, pero la clave con identificación %S no está disponible en el servidor de claves. Lo más probable es que el propietario de la clave no la subiera al servidor de claves.\n\nPor favor, pida al remitente del mensaje que le envíe su clave por correo. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Fallo al buscar o descargar la clave del servidor de claves: No se pudo ejecutar gpgkeys_%S. - +noKeyFound=No podimos encontrar ninguna clave que coincida con el criterio de búsqueda especificado. +keyDownload.keyUnavailable=La clave con identificación %S no está disponible en el servidor de claves. Lo más probable es que el propietario de la clave no la subiera al servidor de claves.\n\nPor favor, pida al remitente del mensaje que le envíe su clave por correo. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=No se pudo establecer la confianza en el propietario @@ -490,7 +493,6 @@ asciiArmorFile=Ficheros con blindaje ASCII (*.asc) importKeyFile=Importar fichero de clave OpenPGP gnupgFile=Ficheros de GnuPG -createKeyOK=Se ha generado su clave saveRevokeCertAs=Crear y guardar certificado de revocación revokeCertOK=El certificado de revocación se ha creado con éxito. Puedes usarlo para invalidar tu clave pública, por ejemplo, en caso de que perdieras tu clave secreta/privada. revokeCertFailed=No se pudo crear el certificado de revocación. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%1$S (0x%2$S) pública-secreta defaultPubKeyFilename=Claves-públicas-exportadas defaultPubSecKeyFilename=Claves-públicas-y-secretas-exportadas -noSecretKeys=No se encontraron claves secretas (privadas).\n\n¿Desea generar ahora su propia clave? sendKeysOk=La(s) clave(s) se enviaron correctamente sendKeysFailed=No se pudieron enviar las claves receiveKeysOk=La(s) clave(s) se actualizaron correctamente receiveKeysFailed=No se pudieron descargar la(s) clave(s) +keyUpload.verifyEmails=El servidor de claves le enviará un correo electrónico por cada dirección de correo de su clave subida. Para confirmar la publicación de su clave, necesitará dar click en el vínculo de cada correo electrónico que reciba. importFromClip=¿Deseas importar alguna(s) clave(s) desde el portapapeles? importFromUrl=Descargar clave pública desde esta URL: copyToClipbrdFailed=No se pudo copiar la(s) clave(s) seleccionada(s) al portapapeles. copyToClipbrdOK=La(s) clave(s) se copiaron al portapapeles -deleteSecretKey=ADVERTENCIA: ¡Estás a punto de borrar claves privadas/secretas!\nSi borras tu clave privada, ya no podrás descifrar los mensajes cifrados para esa clave, y tampoco podrás ya revocarla.\n\n¿Seguro que deseas borrar los PARES de claves privada y pública seleccionados? +deleteSecretKey=ADVERTENCIA: ¡Está a punto de borrar claves privadas/secretas!\nSi borra su clave privada, ya no podrá descifrar los mensajes cifrados para esa clave, y tampoco podrás ya revocarla.\n\n¿Seguro que desea borrar los PARES de claves privada y pública\n'%S'? deleteMix=ADVERTENCIA: ¡Estás a punto de borrar claves privadas/secretas!\nSi borras tu clave privada, ya no podrás descifrar los mensajes cifrados para esa clave, y tampoco podrás ya revocarla.\n\n¿Seguro que deseas borrar los PARES de claves privada y pública seleccionados? deletePubKey=¿Desea borrar la clave pública\n'%S'? deleteSelectedPubKey=¿Deseas borrar las claves públicas? @@ -529,7 +531,7 @@ revokeKeyQuestion=Está a punto de revocar la clave (par) '%S'.\n\nNo podrá volver a firmar con esta clave (privada), y cuando el certificado de revocación se distribuya, los demás tampoco podrán cifrar con esta clave (pública). Aún podrá usar la clave (privada) para descifrar mensajes antiguos.\n\n¿Quiere continuar? revokeKeyOk=La clave ha sido revocada. Si tu clave está disponible en un servidor de claves, se recomienda subirla otra vez, para que otros puedan ver la revocación. revokeKeyFailed=No se pudo revocar la clave. -revokeKeyNotPresent=¡No tienes ninguna clave (0x%S) que corresponda a este certificado de revocación!\n\n¡Si has perdido tu clave, debes importarla (p.e. desde un servidor de claves) antes de importar el certificado de revocación! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! revokeKeyAlreadyRevoked=La clave 0x%S ya ha sido revocada. refreshAllQuestion=No ha seleccionado clave alguna. ¿Desea refrescar TODAS las claves? refreshKeyServiceOn.warn=Advertencia: Actualmente tus claves se están refrescando en segundo plano con la mayor seguridad posible.\nRefrescar todas sus claves de una vez revelaría innecesariamente información sobre ti.\n¿De verdad quieres hacer esto? @@ -541,18 +543,18 @@ keyMan.button.import=&Importar keyMan.button.refreshAll=&Refrescar todas las claves keyMan.button.revokeKey=&Revocar clave -keyMan.button.skip=&Omitir clave keylist.noOtherUids=No tiene otras identidades keylist.hasOtherUids=También se le conoce por -keylist.noPhotos=No dispone de fotografía +keylist.noPhotos=No hay fotografía disponible keylist.hasPhotos=Fotografías keyMan.addphoto.filepicker.title=Seleccione una foto a añadir -keyMan.addphoto.warnLargeFile=El fichero que ha seleccionado supera los 25 KB.\nNo se recomienda añadir ficheros muy grandes porque esto causa que las claves queden muy grandes. +keyMan.addphoto.warnLargeFile=El archivo que ha seleccionado es mayor de 25 KB.\nNo se recomienda añadir archivos demasiado grandes porque generá claves muy grandes. keyMan.addphoto.noJpegFile=El fichero seleccionado no parece ser un fichero JPEG. Por favor, seleccione un fichero diferente. keyMan.addphoto.failed=No se pudo añadir la foto. noWksIdentity=La clave %S no tiene una identidad WKS (servicio Webkey). +wksUpload.noKeySupported=Subida no exitosa - su proveedor parece no soportar WKS. keyman.addBlacklistKey.msg=¿De verdad quiere que p≡p deje de usar la clave "%1$S (%2$S)" para cifrar mensajes? keyman.removeBlacklistKey.msg=¿Quiere permitir que p≡p use la clave "%1$S (%2$S)" para futuros mensajes? @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=No se pudo cambiar el PIN -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Refrescando claves. Por favor, espere ... keyserverProgress.uploading=Subiendo claves, por favor espera ... keyserverProgress.wksUploadFailed=No se pudo subir su clave al servicio de directorio web de claves (Webkey) keyserverProgress.wksUploadCompleted=Tu clave pública fue enviada con éxito a tu proveedor. Recibirás un correo para confirmar que fuiste tú quien inició la subida. keyserverTitle.refreshing=Refrescar claves keyserverTitle.uploading=Subir claves +keyserver.result.download.none=No se descargó ninguna clave. +keyserver.result.download.1of1=Las claves se descargaron correctamente. +keyserver.result.download.1ofN=Se descargó correctamente 1 de %S claves. +keyserver.result.download.NofN=Se descargaron correctamente %1$S de %2$S claves. +keyserver.result.uploadOne=Se subió exitosamente 1 clave. +keyserver.result.uploadMany=Se subieron exitosamente %S claves. # Strings in enigmailSetupWizard -passphrase.min8keys=¡Su frase-contraseña debe contener al menos 8 caracteres! -setupWizard.reallyCancel=¿De verdad quieres cancelar el asistente de configuración de Enigmail? setupWizard.invalidGpg=El fichero que has especificado no es un ejecutable de GnuPG. Por favor, elige un fichero diferente. -setupWizard.specifyFile=Tienes que especificar al menos un fichero de clave pública para continuar. setupWizard.installFailed=Parece que la instalación no se ha completado. Intente instalarlo de nuevo o instale GnuPG de forma manual usando el botón Examinar para seleccionarlo. setupWizard.downloadForbidden=Por tu propia seguridad, no descargaremos GnuPG. Por favor, visita https://gnupg.org/ para descargarlo. setupWizard.downloadImpossible=No podemos descargar GnuPG en este momento. Por favor, inténtalo más tarde o visita https://gnupg.org/ para descargar GnuPG. setupWizard.hashSumError=El asistente no ha podido verificar la integridad del archivo descargado. El archivo puede estar dañado o manipulado. ¿Quiere continuar la instalación de todos modos? setupWizard.importSettingsFile=Especificar fichero de copia seguridad desde el que cagar -setupWizard.invalidSettingsFile=El fichero especificado no es un fichero correcto de copia de configuración de Enigmail. +setupWizard.invalidSettingsFile=El archivo especificado no es un archivo valido de copia de configuración de Enigmail. setupWizard.gpgConfExists=El fichero de configuración de GnuPG ya existe. ¿Quiere sobrescribirlo con el de su antigua instalación? -setupWizard.noGpgHomeDir=Parece que has configurado %S para su uso con GnuPG. Sin embargo, no es un directorio - no se puede usar. +setupWizard.noGpgHomeDir=Parece que ha configurado %S para su uso con GnuPG. Sin embargo, este no es un directorio - no puede usarlo. setupWizard.unmachtedIds=No se pudieron encontrar en tu antigua instalación las identidades correspondientes a:\n%S\nLas configuraciones para estas identidades fueron omitidas. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Se produjo un error al intentar descargar GnuPG. Por favor, revise el registro de la consola para más detalles. @@ -655,11 +663,11 @@ filter.encrypt.label=Cifrar para clave (Enigmail) filter.keyRequired=Tiene que seleccionar la clave de un destinatario. filter.keyNotFound=No se pudo encontrar una clave de cifrado para "%S". -filter.warn.keyNotSecret=Advertencia - la acción de filtrado "Cifrar para clave" reemplaza los destinatarios.\n\nSi no tiene la clave secreta (privada) para "%S" ya no podrá leer los correos. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -converter.decryptBody.failed=No se pudo descifrar el mensaje con asunto\n"%S".\n¿Quiere intentarlo de nuevo con una contraseña diferente o quiere omitir el mensaje? -converter.decryptAtt.failed=No se pudo descifrar el adjunto "%1$S"\ndel mensaje con asunto\n"%2$S".\n¿Quieres intentarlo de nuevo con una frase-contraseña diferente, o prefieres omitir el mensaje? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? saveLogFile.title=Guardar archivo de registro (log) @@ -691,13 +699,13 @@ enigmailSettings=EnigmailSettings defaultBackupFileName=Enigmail-export specifyExportFile=Especificar nombre de fichero para la exportación -homedirParamNotSUpported=Los parámetros adicionales que configuran rutas como --homedir y --keyring (directorio principal y juego de claves) no están soportados para exportar/restaurar su configuración. Por favor, use métodos alternativos como establecer la variable de entorno GNUPGHOME (directorio principal de GnuPG). +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #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 Recomendamos que cree nuevas claves y configure sus cuentas para que las usen. -expiry.keyMissingOwnerTrust=Tu clave secreta (privada) %S carece de nivel de confiaza.\n\nTe recomendamos que establezcas la opción 'Tu confianza en las certificaciones es' a 'absoluta' en las propiedades de la clave. -expiry.keysMissingOwnerTrust=La siguiente de sus claves secretas/privadas carece de nivel de confianza\n%S.\nRecomendamos que establezca la configuración 'Su confianza en las certificaciones es' a 'absoluta' en las propiedades de la clave. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. expiry.OpenKeyManager=Abrir administración de claves de Enigmail expiry.OpenKeyProperties=Abrir propiedades de la clave @@ -709,6 +717,7 @@ gpghomedir.notwritable=El directorio '%S' que contiene tus claves OpenPGP no es escribible. gpghomedir.notdirectory=El directorio '%S' que contiene tus claves OpenPGP es un fichero en vez de un directorio. gpghomedir.notusable=Por favor, corrige los permisos del directorio o cambia la ubicación de tu directorio 'home' (principal) de GnuPG, o de otro modo GnuPG no podrá funcionar correctamente. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=No se pueden verificar las palabras de confianza (trustwords) de p≡p para la cuenta propia. @@ -728,12 +737,12 @@ pepPrivacyStatus.RatingMistrustSuggestion=Vuelve a establecer la conexión con tu interlocutor e intenta completar otra negociación. pepPrivacyStatus.RatingReliableSuggestion=Completa una negociación con el interlocutor de tu comunicación intercambiando las palabras de confianza (trustwords) en persona o por teléfono (canal seguro). Una negociación sólo es necesaria una vez por cada interlocutor, y asegurará una comunicación segura y de confianza. pepPrivacyStatus.RatingTrustedSuggestion=¡No hay que hacer nada! -pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Ten en cuenta que este mensaje puede no ser seguro. +pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Tenga en cuenta que este mensaje puede no ser seguro. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Por favor, añada la información necesaria. -pepPrivacyStatus.RatingUnderAttackSuggestion=Verifica de forma separada el contenido de este mensaje con el interlocutor de tu comunicación. -pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Asegúrese de que el estado de privacidad para cada interlocutor de la comunicación listado es al menos 'seguro'. +pepPrivacyStatus.RatingUnderAttackSuggestion=Verifique el contenido de este mensaje con su interlocutor utilizando otro canal de comunicación. +pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Asegúrese de que el estado de privacidad para cada contraparte de la comunicación en la lista es al menos seguro. pepPrivacyStatus.RatingUnencryptedSuggestion=Por favor, pida al interlocutor de su comunicación que use una solución de cifrado o instale p≡p. -pepPrivacyStatus.RatingUnreliableSuggestion=Este mensaje no tiene un cifrado fiable o carece de firma. Pida al interlocutor de su comunicación que actualice su solución de cifrado o instale p≡p (Pretty Easy Privacy). +pepPrivacyStatus.RatingUnreliableSuggestion=Este mensaje no tiene un cifrado confiable o carece de firma. Pida a la contraparte de su comunicación que actualice su solución de cifrado o instale p≡p. pepPrivacyStatus.RatingBrokenExplanation=Este mensaje tiene un cifrado o formato estropeado. pepPrivacyStatus.RatingHaveNoKeyExplanation=Este mensaje no se puede descifrar porque la clave no está disponible. @@ -766,13 +775,13 @@ handshakeDlg.error.noProtection=Por favor, habilita la protección para usar la función de Negociación. enigmail.acSetupPasswd.descEnterPasswd=Por favor, introduzca el código de configuración que se muestra en el otro dispositivo. -enigmail.acSetupPasswd.descCopyPasswd=Por favor, introduzca el código de configuración en su otro dispositivo para continuar con la configuración +enigmail.acSetupPasswd.descCopyPasswd=Por favor, introduzca el código de configuración en su otro dispositivo para continuar con la configuración. #strings in autocrypt.jsm autocrypt.setupMsg.subject=Mensaje de configuración de Autocrypt autocrypt.setupMsg.msgBody=Para configurar tu nuevo dispositivo para Autocrypt, por favor sigue las instrucciones que aparecen en el nuevo dispositivo. -autocrypt.setupMsg.fileTxt=Este es el fichero de configuración de Autocrypt usado para transferir configuraciones y claves entre clientes de correo. Puede descifrarlo usando el código de configuración presentado en su dispositivo antiguo, y luego importar la clave que contiene a su juego de claves. +autocrypt.setupMsg.fileTxt=Este es el archivo de configuración de Autocrypt usado para transferir configuraciones y claves entre clientes de correo. Puede descifrarlo usando el código de configuración presentado en su dispositivo antiguo, y luego importe la clave a su juego de claves. #strings in upgradeInfo.html upgradeInfo.doctitle=¿Qué novedades hay en Enigmail v2.0? @@ -785,10 +794,12 @@ upgradeInfo.autocrypt.title=Soporte para Autocrypt upgradeInfo.autocrypt.desc=Enigmail ahora soporta Autocrypt, un nuevo estándar para distribuir claves como parte de mensajes enviados. Enigmail importa claves automáticamente desde mensajes compatibles con Autocrypt, de forma que con el tiempo se pueden cifrar cada vez más correos electrónicos. upgradeInfo.pEp.title=Nuevo Modo Junior de p≡p (pretty Easy privacy) -upgradeInfo.pEp.desc=Enigmail ahora contiene un Modo Junior de p≡p. En la actualidad necesita instalar p≡p manualmente para este propósito; esto cambiará en una futura versión. El Modo Junior de p≡p le permite usar cifrado OpenPGP de la forma más transparente posible; no tendrá que atender la administración de claves y la sincronización de claves entre dispositivos nunca más. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. upgradeInfo.bottom.desc=Por favor, visite nuestra documentación para ayuda en el uso de Enigmail. +#strings in pEpAdapter.jsm pep.missingGnuPG=Para usar Enigmail/p≡p, se requiere GnuPG. Como no pudimos encontrarlo, podemos descargarlo e instalarlo para ti. +pep.updateAvailable=Una nueva versión de Enigmail/p≡p crypto-engine está disponible. ¿Desea descargar e instalar la actualización? #strings in enigmailAbout.html aboutEnigmail.tabName=Acerca de Enigmail @@ -799,6 +810,7 @@ aboutEnigmail.documentation=Documentación: aboutEnigmail.testing=Probando: aboutEnigmail.userSupport=Soporte para el usuario: +aboutEnigmail.userSupport.team=el equipo y los miembros de la lista/del foro. aboutEnigmail.localization=Ubicación: Vea la página de Paquetes de Idioma de Enigmail aboutEnigmail.Credits=Reconocimientos: aboutEnigmail.origAuthor=Autor original de la extensión Enigmail @@ -808,3 +820,38 @@ aboutEnigmail.licenseSupportTitle=Licencia y soporte aboutEnigmail.license=El OpenPGP de Enigmail es de código abierto y está licenciado bajo la %S aboutEnigmail.support=Tiene disponibles soporte y descargas desde www.enigmail.net. + +#strings in updateGnuPG.html +updateGnuPG.tabName=Actualización GnuPG +updateGnuPG.title=Actualizaciones para GnuPG +updateGnuPG.introduction.desc=Enigmail necesita de GnuPG para realizar sus funciones criptográficas. Nosotros recomendamos que mantenga actualizada su instalación de GnuPG. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +updateGnuPG.noUpdateRequired=GnuPG está actualizado. +updateGnuPG.cannotUpdate.header=Enigmail únicamente permite la actualización de los siguientes paquetes: +updateGnuPG.cannotUpdate.footer=Parace que utiliza alguna otra variante de GnuPG; por tanto, desafortunadamente no le es posible a Enigmail actualizar su instalacion de GnuPG. +updateGnuPG.installUpdate=Instalar actualización +updateGnuPG.noMoreUpdates=No buscar actualizaciones futuras +updateGnuPG.checkUpdate=Buscar actualizaciones de GnuPG + + +#strings in keyserver.jsm +keyserver.error.aborted=Abortada +keyserver.error.unknown=Ocurrió un error desconocido. +keyserver.error.serverError=El servidor de claves reportó un error. +keyserver.error.importError=Fallo en importar la clave descargada. +keyserver.error.unavailable=El servidor de claves no está disponible. +keyserver.error.securityError=El servidor de claves no permite acceso cifrado. +keyserver.error.certificateError=El certificado del servidor de claves no es válido. +keyserver.error.unsupported=El servidor de claves no es soportado por Enigmail. + +#strings in mimeDecrypt.jsm +mimeDecrypt.encryptedPart.attachmentLabel=Pedazo de mensaje cifrado +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +import.secretKeyImportError=Un error en GnuPG ha ocurrido al importar las claves secretas. La importación no ha sido exitosa. + +#strings in importSettings.js +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 diff -Nru enigmail-2.0.12+ds1/lang/fa/enigmail.dtd enigmail-2.1.3+ds1/lang/fa/enigmail.dtd --- enigmail-2.0.12+ds1/lang/fa/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/fa/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -1,20 +1,18 @@ - - - + - - - - + + + + - + @@ -23,63 +21,53 @@ - + + + - - - - - - - - - - - - + - - + + - + - + - - - - + + + + + - + - - - + + + + - + - + - - - - + - + - + - + @@ -89,52 +77,56 @@ + - - + + - - - - +'"> + + + ' استفاده کنید"> - - - - + +' برای مشخص سازی آدرس های ایمیل برای GnuPG. اگر گیرندگان دارای کلید های Hushmail قدیمی می باشند غیرفعال کنید."> + + - - + + - + + + + - - + + - - + + - + - + @@ -143,40 +135,40 @@ - - + + - + - - - - + + + + - - + + - - - + + + - - - + + + - - - + + + - + - + @@ -185,30 +177,31 @@ - - + + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + @@ -216,93 +209,93 @@ - - - + + + - + - + - - + + امنیت OpenPGP را ببینید)"> - + - - + + - + - + - + - + - + - + - + - - - + + + - - - - - - - - + + + + + + + + - - - - - - + + + + + + - +توجه: تولید کلید ممکن است چندین دقیقه بگیرد تا تکمیل شود.زمانی که تولید کلید در حال انجام است از برنامه خارج نشوید. گشت و گذار به صورت فعال و انجام عملیات های سنگین دیسک در طول تولید کلید باعث تقویت 'مخزن تصادفی بودن' شده و این رویه را سرعت می بخشد. زمانیکه تکمیل شد شما آگاه خواهید شد."> - + - + - - + + - - + + - + - + @@ -310,180 +303,179 @@ - - - - - - - - + + + + + + + + - + - + - - - - + + + + - - + + - - + + - - - - - - - + + + + + + + - + - + - + - + - - - + + + - - - - - + + + + - - - - - + + + + + - + - - + + - + - + - - - - - - + + + + + + - - + + - - + + - - + + - - - - - - - - - +' نامعتبر می باشد"> + + + + + + + + - + - + - + - - - - - - + + + + + + - + - - + + - - + + - - - + + + - - - + + + - + - - - - - - - - - + + + + + + + + + - - + + - + - - - + + + @@ -491,39 +483,39 @@ - - - - - + + + + + - + - - - + + + - + - + - - + + - - - - - + + + + + - + - + - - + + @@ -533,103 +525,103 @@ - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - - + + - - + + - - + + - + - + - + - - + + - - + + - + - - - - - - + + + + + + @@ -643,218 +635,156 @@ - - - - + + + + - - + +توجه: تولید کلید ممکن است چندین دقیقه طول بکشد تا کامل شود. زمانیکه تولید کلید در حال انجام است از برنامه خارج نشوید. زمانیکه تولید کلید کامل شد شما آگاه خواهید شد."> - + - - - - + + + + - + - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - + + + - + - + - + - - - - - - - - - - - - - + + + + + + + + + + + + + + + - + - + - - - + + + - - + + - - + + - + - + - + - - - - - - - - - + + + + + + + + + - - + + - - + + - - - - - - - - + + + + + + + + + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/fa/enigmail.properties enigmail-2.1.3+ds1/lang/fa/enigmail.properties --- enigmail-2.0.12+ds1/lang/fa/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/fa/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -5,7 +5,7 @@ # Strings used within enigmailCommon.js and enigmailCommon.jsm ##################################################################### -# enigAlert=Enigmail Alert +enigAlert=هشدار Enigmail enigConfirm=تایید Enigmail enigInfo=اطلاعات Enigmail enigError=خطا Enigmail @@ -13,116 +13,117 @@ dlgYes=&بلی dlgNo=&خیر -# dlgKeepSetting=Remember my answer and do not ask me again -# dlgNoPrompt=Do not show me this dialog again +dlgKeepSetting=پاسخ من را به یاد داشته باش و دیگر از من سوال نپرس +dlgNoPrompt=این دیالوگ را دیگر به من نشان نده dlg.button.delete=&حذف dlg.button.cancel=&لغو dlg.button.close=&بستن -# dlg.button.continue=Con&tinue -# dlg.button.skip=&Skip +dlg.button.continue=&ادامه +dlg.button.skip=&پرش dlg.button.overwrite=&اوورایت dlg.button.view=&نمایش -# dlg.button.retry=&Retry -# dlg.button.ignore=&Ignore +dlg.button.retry=&تلاش دوباره +dlg.button.ignore=&چشم پوشی dlg.button.install=&نصب dlg.button.ok=&اوکی -# repeatPrefix=\n\nThis alert will repeat %S +repeatPrefix=\n\nاین هشدار %S را تکرار خواهد کرد repeatSuffixSingular=زمان بیشتر. -# repeatSuffixPlural=more times. -# noRepeat=\n\nThis alert will not repeat until you upgrade Enigmail. +repeatSuffixPlural=به تعداد دفعات بیشتر +noRepeat=\n\nاین هشدار تا زمان آپگرید Enigmail تکرار نخواهد شد. -# pgpNotSupported=You seem to be using Enigmail together with PGP 6.x\n\nUnfortunately, PGP 6.x has a number of issues that prevent Enigmail from working correctly. Therefore, Enigmail does not support PGP 6.x anymore; please switch to GnuPG (GPG) instead.\n\nIf you need help on switching to GnuPG, check the Help section of the Enigmail homepage. -# initErr.howToFixIt=In order to use Enigmail, GnuPG is required. If you did not install GnuPG yet, the easiest way to do this is using the "Setup Wizard" button below. -# initErr.setupWizard.button=&Setup Wizard -# passphraseCleared=The passphrase has been cleared. -# cannotClearPassphrase=You are using a non-standard tool (such as gnome-keyring) for passphrase handling. Clearing the passphrase is therefore not possible from within Enigmail. +pgpNotSupported=به نظر می آید که شما در حال استفاده از Enigmail با PGP 6.x می باشید\n\nمتاسفانه، PGP 6.x تعدادی مشکل دارد که از کار کردن Enigmail به درستی جلوگیری میکند. بنابراین، Enigmail از PGP 6.x بیشتر از این پشتیبانی نمی کند؛ لطفا به جای آن از GnuPG (GPG) استفاده کنید.\n\nاگر برای استفاده از GnuPG نیاز به کمک دارید، بخش راهنما در صفحه اصلی Enigmail را بررسی کنید. +initErr.howToFixIt=برای استفاده از Enigmail، داشتن GnuPG ضروری می باشد. اگر هنوز GnuPG را نصب نکرده اید، آسان ترین راه استفاده از دکمه "ویزارد نصب" که در پایین آمده می باشد. +initErr.setupWizard.button=&ویزارد نصب +passphraseCleared=عبارت عبور پاک شده است. +cannotClearPassphrase=شما در حال استفاده از یک ابزار غیر-استاندارد (مثل gnome-keyring) برای کنترل عبارت عبور می باشید. بنابراین پاک سازی عبارت عبور از طریق Enigmail ممکن نیست. noPhotoAvailable=هیچ تصویری موجود نمی باشد -# debugLog.title=Enigmail Debug Log -# error.photoPathNotReadable=Photo path '%S' is not readable +debugLog.title=لاگ اشکال زدایی Enigmail +error.photoPathNotReadable=مسیر تصویر '%S' قابل خواندن نمی باشد generalError=خطا: S% # Strings in configure.jsm -# enigmailCommon.versionSignificantlyChanged=This new version of Enigmail has significant changes in the handling of preferences and options. We tried to transfer the old settings to this new version. However, we cannot cover all cases automatically. Please double check the resulting new preferences and options. -# enigmailCommon.checkPreferences=Check Preferences ... -# preferences.defaultToPgpMime=We have changed the default message encoding in Enigmail from Inline-PGP to PGP/MIME. We recommend you keep this as default.\n\nIf you still wish to use Inline-PGP by default, you can do so in the Account Settings under OpenPGP Security. +enigmailCommon.versionSignificantlyChanged=این نسخه جدید از Enigmail دارای تغییرات قابل توجهی در کنترل ترجیحات و گزینه ها می باشد. ما سعی کردیم تا تنظیمات قدیمی را به این نسخه جدید انتقال دهیم. هرچند، ما نمی توانیم تمام موارد را به صورت خودکار پوشش دهیم. لطفا ترجیحات و گزینه های جدید را دوباره بررسی کنید. +enigmailCommon.checkPreferences=کنترل ترجیحات ... +preferences.defaultToPgpMime=ما پیام پیش فرض رمزنگاری شده در Enigmail را از Inline-PGP به PGP/MIME تغییر دادیم. ما پیشنهاد می کنیم تا شما این را به عنوان پیشفرض نگه دارید.\n\nاگر همچنان مایل به استفاده از Inline-PGP به صورت پیشفرض می باشید، می توانید آن را از تنظیمات حساب کاربری در زیر امنیت OpenPGP فعال کنید. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=اجراء Enigmail نسخه S% -# enigmailPepVersion=Enigmail/p≡p version %S -# usingAgent=Using %1$S executable %2$S to encrypt and decrypt -# agentError=ERROR: Failed to access Enigmail core service! +enigmailPepVersion=Enigmail/p≡p نسخه %S +usingAgent=استفاده از %1$S قابل اجرا %2$S برای رمزنگاری و رمزگشایی +agentError=خطا: ناتوانی در دسترسی به سرویس اصلی Enigmail ##################################################################### # Strings in enigmailKeygen.js ##################################################################### accessError=خطا در هنگام دسترسی به سرویس Enigmail -# onlyGPG=Key generation only works with GnuPG (not with PGP)! +onlyGPG=تولید کلید فقط با GnuPG کار می کند ( نه PGP)! -# keygenComplete=Key generation completed! Identity <%S> will be used for signing. -# revokeCertRecommended=We highly recommend to create a revocation certificate for your key. This certificate can be used to invalidate your key, e.g. in case your secret key gets lost or compromised. Do you want to create such a revocation certificate now? -# keyMan.button.generateCert=&Generate Certificate +keygenComplete=تولید کلید کامل شد! از هویت <%S> برای امضا استفاده خواهد شد. +revokeCertRecommended=ما به شدت توصیه میکنیم تا یک گواهی فسخ برای کلید خود ایجاد کنید. این گواهی برای باطل کردن کلید خود می توانند استفاده شود، مثلا در موردی که کلید خصوصی شما گم شود یا در معرض خطر قرار بگیرد. آیا میخواهید چنین گواهی فسخی را الان ایجاد کنید؟ +keyMan.button.generateCert=&تولید گواهی genCompleteNoSign=تولید کلید کامل شد! genGoing=تولید کلید در حال انجام می باشد! -# passNoMatch=Passphrase entries do not match; please re-enter -# passCheckBox=Please check box if specifying no passphrase for key -# passUserName=Please specify user name for this identity -# keygen.missingUserName=There is no name specified for the selected account/identity. Please enter a value in the field "Your name" in the account settings. -# keygen.passCharProblem=You are using special characters in your passphrase. Unfortunately, this can cause troubles for other applications. We recommend you choose a passphrase consisting only of any of these characters:\na-z A-Z 0-9 /.;:-,!?(){}[]%* -# passSpaceProblem=Due to technical reasons, your passphrase may not start or end with a space character. -# changePassFailed=Changing the passphrase failed. +passNoMatch=عبارت های عبور وارد شده با یکدیگر تطابق ندارند; لطفا دوباره وارد کنید +passCheckBox=لطفا جعبه را در صورت مشخص نکردن عیچ عبارت عبور برای کلید علامت بزنید +passUserName=لطفا نام کاربر برای این هویت را مشخص کنید +keygen.missingUserName=هیچ نامی برای حساب کاربری/هویت انتخاب شده مشخص نشده است. لطفا یک مقدار را در فیلد "نام شما" در تنظیمات حساب کاربری وارد کنید. +keygen.passCharProblem=شما در حال استفاده از کاراکتر های خاص در عبارت عبور خود می باشید. متاسفانه، این کار باعث ایجاد مشکل برای برنامه های دیگر خواهد شد. ما توصیه میکنیم تا یک عبارت عبور که حاوی فقط این کاراکتر ها می باشد انتخاب کنید:\na-z A-Z 0-9 /.;:-,!?(){}[]%* +passSpaceProblem=به دلایل فنی، عبارت عبور شما نمی تواند با یک کاراکتر فاصله آغاز شود یا پایان یابد. +changePassFailed=تغییر عبارت عبور ناموفق بود. -# keyConfirm=Generate public and secret keys for '%S'? +keyConfirm=تولید کلید عمومی و خصوصی برای 'S%'؟ keyMan.button.generateKey=&تولید کلید keyAbort=لغو تولید کلید؟ -# keyMan.button.generateKeyAbort=&Abort Key Generation +keyMan.button.generateKeyAbort=&لغو تولید کلید keyMan.button.generateKeyContinue=&ادامه تولید کلید expiryTooLong=شما نمی توانید یک کلید ایجاد کنید که در در صد سال آینده منقضی خواهد شد. -# expiryTooLongShorter=You cannot create a key that expires in more than 90 years. -# expiryTooShort=Your key must be valid for at least one day. -# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Enigmail) for details. -# setKeyExpirationDateFailed=The expiration date could not be changed +expiryTooLongShorter=شما نمی توانید یک کلید ایجاد کنید که بعد از 90 سال فسخ می شود. +expiryTooShort=کلید شما باید حداقل برای یک روز معتبر باشد. +keyGenFailed=تولید کلید ناموفق بود. لطفا کنسول Enigmail را (منو Enigmail > گزینه های اشکال زدایی) برای جزییات بیشتر بررسی کنید. +setKeyExpirationDateFailed=تاریخ انقضا قابل تغییر نیست # Strings in enigmailMessengerOverlay.js -# securityInfo=Enigmail Security Info\n\n +securityInfo=اطلاعات امنیتی Enigmail\n\n enigHeader=Enigmail: -# enigContentNote=Enigmail: *Attachments to this message have not been signed or encrypted*\r\n\r\n -# possiblyPgpMime=Possibly PGP/MIME encrypted or signed message; use 'Decrypt/Verify' function to verify +enigContentNote=Enigmail: *پیوست های به این پیام امضا یا رمزنگاری نشده اند*\r\n\r\n +possiblyPgpMime=احتمالا پیام رمزنگاری شده PGP/MIME و یا پیام امضا شده نمی باشد؛ از عمل 'رمزگشایی/تایید' برای تایید آن استفاده کنید -# saveAttachmentHeader=Enigmail: Save decrypted attachment -# noTempDir=Could not find a temporary directory to write to\nPlease set the TEMP environment variable -# attachmentPgpKey=The attachment '%S' you are opening appears to be an OpenPGP key file.\n\nClick 'Import' to import the keys contained or 'View' to view the file contents in a browser window - -# beginPgpPart=********* *BEGIN ENCRYPTED or SIGNED PART* ********* -# endPgpPart=********** *END ENCRYPTED or SIGNED PART* ********** -# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed or encrypted* -# noteCutMessage=Enigmail: *Multiple message blocks found -- decryption/verification aborted* +saveAttachmentHeader=Enigmail: ذخیره ضمیمه رمزگشایی شده +noTempDir=ناتوانی در یافتن یک پوشه موقت برای نوشتن بر آن\nلطفا متغیر محیطی TEMP را تنظیم کنید +attachmentPgpKey=پیوست 'S%' که شما قصد باز کردن آن را دارید به نظر می آید که یک فایل کلید OpenPGP باشد.\n\nروی 'وارد کردن' برای وارد کردن کلیدهایی که حاوی می باشند کلیک کنید یا برای دیدن محتواهای فایل در یک پنجره مرورگر روی 'دیدن' کلیک کنید + +beginPgpPart=********* *آغاز بخش امضا شده یا رمزنگاری شده* ********* +endPgpPart=********** *پایان بخش امضا‌ء شده یا رمزنگاری شده* ********** +notePartEncrypted=Enigmail: *بخش هایی از پیام امضا و یا رمزنگاری نشده اند * +noteCutMessage=Enigmail: *چندین قسمت پیام یافت شد -- رمزنگاری/تایید لغو شد* decryptOkNoSig=هشدار\n\nرمزگشایی با موفقیت انجام شد، اما امضاء به درستی تایید نشد -# msgOvl.button.contAnyway=&Continue Anyway -# signature.verifiedOK=The signature for attachment %S was successfully verified +msgOvl.button.contAnyway=&ادامه به هر صورت +signature.verifiedOK=امضا برای پیوست S% با موفقیت تایید شد signature.verifyFailed=امضاء مربوط به پیوست S% قابل تایید نیست -# attachment.noMatchToSignature=Could not match attachment '%S' to a signature file -# attachment.noMatchFromSignature=Could not match signature file '%S' to an attachment -# fixBrokenExchangeMsg.failed=Did not succeed to repair message. +attachment.noMatchToSignature=ناتوانی در تطابق فایل امضا '%S' با یک ضمیمه +attachment.noMatchFromSignature=ناتوانی در تطابق فایل امضا '%S' با یک ضمیمه +fixBrokenExchangeMsg.failed=ناتوانی در اصلاح ‍پیام. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p -# wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S +# detailsDlg.importKey=Import key +wksNoIdentity=کلید به هیچ یک از حساب های ایمیل شما پیوند زده نشده است. لطفا یک حساب کاربری حداقل برای یکی از ایمیل (های) آمده اضافه کنید:\n\nS% wksConfirmSuccess=ایمیل تایید ارسال شد. wksConfirmFailure=ارسال ایمیل تایید ناموفق بود. -# autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? -# autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. -# autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. -# autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. +autocrypt.importSetupKey.accountPreconfigured=حساب کاربری شما هم اکنون به درستی برای Autocrypt پیکربندی شده است.\n\nآیا واقعا می خواهید تا تنظیمات خود را با این پیام نصب رونویسی کنید؟ +autocrypt.importSetupKey.selfCreated=این پیام توسط همین برنامه Enigmail ایجاد شده است.\n\nلطفا به کلاینت ایمیل که میخواهید تنظیمات خود را به آن انتقال دهید سوئیچ کنید، و روی پیام در آن کلاینت ایمیل برای درون برد تنظیمات کلیک کنید. +autocrypt.importSetupKey.invalidMessage=خطا - ناتوانی در خواندن پیام نصب. پیام به نظر خراب می باشد. لطفا سعی کنید تا یک پیام نصب جدید روی دستگاه "دیگر" خود ایجاد کند. +autocrypt.importSetupKey.invalidKey=خطا - کلید نمی تواند ایمپورت شود. کلید یا توسط نسخه GnuPG شما پشتیبانی نمی شود، یا خراب می باشد. autocrypt.importSetupKey.wrongPasswd=رمز عبور وارد شده صحیح نیست. قصد دارید دوباره امتحان کنید؟ -# autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. +autocrypt.importSetupKey.success=پیام نصب Autocrypt با موفقیت پردازش شد. Autocrypt هم اکنون برای حساب کاربری '%S' موجود می باشد. ##################################################################### # Strings in enigmailMsgComposeOverlay.js @@ -132,30 +133,29 @@ keysToUse=انتخاب کلید(های) OpenPGP به منظور استفاده برای S% pubKey=کلید عمومی برای S%\n -# windowLocked=Compose window is locked; send cancelled -# sendUnencrypted=Failed to initialize Enigmail.\nSend unencrypted message? -# composeSpecifyEmail=Please specify your primary email address, which will be used to choose the signing key for outgoing messages.\n If you leave it blank, the FROM address of the message will be used to choose the signing key. -# sendingHiddenRcpt=This message has BCC (blind copy) recipients. If this message is encrypted, it is possible to hide the BCC recipients but users of some products (e.g. PGP Corp.) will not be able to decrypt the message. Given this, we recommend to avoid BCC-emails with encrypted messages. +windowLocked=پنجره نوشتن قفل می باشد؛ ارسال لغو شد +sendUnencrypted=ناموفقیت در شروع Enigmail.\nارسال پیام رمزنگاری نشده؟ +composeSpecifyEmail=لطفا آدرس ایمیل اصلی خود را مشخص کنید، که برای انتخاب کلید امضا برای پیام های خروجی استفاده خواهد شد.\nاگر آن را خالی بگذارید، آدرس FROM پیام برای انتخاب کلید امضا استفاده خواهد شد. +sendingHiddenRcpt=این پیام دارای گیرندگان BCC (کپی کور) می باشد. اگر این پیام رمزنگاری شده است، می توان گیرندگان BCC را پنهان کرد اما کاربران برخی از محصولات ( مثلا PGP Corp.) قادر به رمزگشایی پیام نخواهند بود. به این دلیل، توصیه ما این است تا از ایمیل های BCC با پیام های رمزنگاری شده خودداری کنید. sendWithHiddenBcc=مخفی سازی گیرندگان BCC -# sendWithShownBcc=Encrypt normally -# sendingNews=Encrypted send operation aborted.\n\nThis message cannot be encrypted because there are newsgroup recipients. Please re-send the message without encryption. -# sendToNewsWarning=Warning: you are about to send an encrypted email to a newsgroup.\n\nThis is discouraged because it only makes sense if all members of the group can decrypt the message, i.e. the message needs to be encrypted with the keys of all group participants. Please send this message only if you know exactly what you are doing.\n\nContinue? -# hasHTML=HTML email warning:\nThis message may contain HTML, which could cause signing/encryption to fail. To avoid this in the future, you should press the SHIFT key when clicking on the Compose/Reply button to send signed email.\nIf you sign email by default, you should uncheck the 'Compose Messages in HTML' preference box to permanently disable HTML email for this email account. -# strippingHTML=Message contains HTML formatting information that will be lost when converting to plain text for signing/encryption. Do you wish to proceed? -# msgCompose.button.sendAnyway=&Send Message Anyway -# attachWarning=Attachments to this message are not local, they cannot be encrypted. In order to encrypt the attachments, store them as local files first and attach these files. Do you wish to send the message anyway? -# quotedPrintableWarn=You have enabled 'quoted-printable' encoding for sending messages. This may result in incorrect decryption and/or verification of your message.\nDo you wish to turn off sending 'quoted-printable' messages now? -# minimalLineWrapping=You have set line wrapping to %S characters. For correct encryption and/or signing, this value needs to be at least 68.\nDo you wish to change line wrapping to 68 characters now? +sendWithShownBcc=رمزنگاری به صورت دستی +sendingNews=عملیات ارسال رمزنگاری شده لغو شد.\n\nاین پیام نمی تواند رمزنگاری شود چون گیرنده های گروه خبری موجود میباشند. لطفا پیام را دوباره بدون رمزنگاری ارسال کنید. +sendToNewsWarning=هشدار: شما در حال ارسال یک ایمیل رمزنگاری شده به یک گروه خبری می باشید.\n\nتوصیه نمی شود چون در صورتی قابل توجیه است که تمام اعضا گروه بتوانند پیام را رمزگشایی کنند، به عبارتی دیگر پیام باید با کلید تمام اعضا گروه رمزنگاری شود. لطفا این پیام را تنها در صورتی بفرستید که می دانید چه کار میکنید.\n\nادامه؟ +hasHTML=هشدار ایمیل HTML:\nاین پیام ممکن است حاوی HTML باشد، که ممکن است باعث ناموفقیت در امضا/رمزنگاری شود. برای جلوگیری از این در آینده، شما باید کلید SHIFT را در هنگام کلیک بر روی دکمه پاسخ/نوشتن برای ارسال ایمیل امضا شده فشار دهید.\nاگر شما ایمیل را به صورت پیشفرض امضا میکنید، شما باید نشان جعبه ترجیحات 'نوشتن پیام در HTML' برای غیرفعال کردن دائم ایمیل HTML برای این حساب کاربری ایمیل را بردارید. +strippingHTML=پیام حاوی اطلاعات قالب بندی HTML میباشد که در هنگام تبدیل به متن آشکار برای امضا/رمزنگاری از دست خواهد رفت. آیا مایل به ادامه می باشید؟ +msgCompose.button.sendAnyway=&ارسال پیام به هر صورت +attachWarning=ضمیمه های این پیام به صورت محلی نمی باشند، نمی توانند رمزنگاری شوند. برای رمزنگاری ضمیمه ها، آن ها را به صورت فایل های محلی ذخیره کنید و بعد این فایل ها را ضمیمه کنید. آیا مایل هستید تا پیام را به هر صورت ارسال کنید؟ +quotedPrintableWarn=شما رمزنگاری 'نقل قول شده-قابل پرینت' را برای ارسال پیام ها فعال کرده اید. این باعث رمزگشایی ناصحیح و/یا تایید پیام شما خواهد شد.\nآیا مایل به خاموش کردن ارسال پیام های 'نقل قول شده-قابل پرینت' می باشید؟ +minimalLineWrapping=شما بسته بندی خط را به S% کاراکتر تنظیم کرده اید. برای رمزنگاری و/یا امضا صحیح، این مقدار حداقل باید 68 باشد.\nآیا مایل به تغییر آن به 68 هستید؟ warning=هشدار -# signIconClicked=You have manually modified signing. Therefore, while you are composing this message, (de)activating signing does not depend anymore on (de)activating encryption. -# 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. +signIconClicked=شما به صورت دستی امضا را تغییر داده اید. بنابراین، در حالیکه مشغول نوشتن این پیام هستید، (غیر)فعالسازی امضا دیگر به (غیر)فعالسازی رمزنگاری وابسته نخواهد بود. +errorOwnKeyUnusable=آیدی کلید 'S%' پیکربندی شده برای هویت فعلی دارای یک کلید OpenPGP قابل استفاده نمی باشد.\n\nلطفا مطمئن شوید که شما یک کلید OpenPGP معتبر، انقضا نیافته دارید و اینکه تنظیمات حساب کاربری شما به آن کلید اشاره دارد.\nاگر کلید شما انقضا نیافته است، بررسی کنید آیا شما اعتماد مالک را به "کامل" یا "نهایی" قرار داده اید. msgCompose.cannotSaveDraft=خطا در هنگام ذخیره پیش نویس -# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. -# msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. -# msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. +msgCompose.partiallyEncrypted.short=مراقب فاش کردن اطلاعات حساس به ویژه ایمیل های رمزنگاری شده جزیی باشید. +msgCompose.partiallyEncrypted.inlinePGP=پیامی که در حال پاسخ به آن هستید حاوی بخش های رمزنگاری شده و رمزنگاری نشده می باشد. اگر ارسال کننده قادر نبود تا بخش هایی از پیام را رمزگشایی کند، ممکن است شما در حال لو دادن اطلاعاتی باشید که ارسال کننده قادر به رمزگشایی آن نبوده است.\n\nلطفا حذف تمام متن نقل قول شده از پاسخ خود به این ارسال کننده را در نظر بگیرید. -# msgCompose.internalEncryptionError=Internal Error: promised encryption disabled -# msgCompose.internalError=An internal error has occurred. +msgCompose.internalEncryptionError=خطا داخلی: رمزنگاری وعده داده شده غیرفعال شد +msgCompose.internalError=یک خطا داخلی رخ داده است. msgCompose.toolbarTxt.signAndEncrypt=ین پیام امضاء و رمزنگاری خواهد شد. msgCompose.toolbarTxt.signOnly=پیام امضاء خواهد شد @@ -164,22 +164,21 @@ msgCompose.toolbarTxt.disabled=Enigmail برای هویت انتخاب شده غیرفعال است msgCompose.protectSubject.tooltip=محافظت از موضوع پیام msgCompose.noSubjectProtection.tooltip=از موضوع پیام محافظت نکن -msgCompose.encryptedSubjectStub=پیام رمزنگاری شده msgCompose.protectSubject.dialogTitle=فعال سازی محافظت برای موضوع؟ -# msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? +msgCompose.protectSubject.question=ایمیل های رمزنگاری شده عادی حاوی موضوع ویرایش نشده می باشد.\n\nما یک استاندارد برای پنهان کردن موضوع اصلی در پیام رمزنگاری شده ایجاد کرده ایم\nو آن را با یک متن ساختگی جایگزین کرده ایم، که چنین موضوعی فقط تنها بعد از رمزگشایی ایمیل قابل مشاهده میباشد.\n\nآیا میخواهید تا از موضوع در پیام های رمزنگاری شده محافظت کنید؟ msgCompose.protectSubject.yesButton=&محافظت از موضوع -# msgCompose.protectSubject.noButton=&Leave subject unprotected +msgCompose.protectSubject.noButton=&رها کرن موضوع به صورت محافظت نشده msgCompose.detailsButton.label=جزییات ... -# msgCompose.detailsButton.accessKey=D +msgCompose.detailsButton.accessKey=D msgCompose.pepSendUnknown=ناشناخته msgCompose.pepSendUnsecure=ناامن msgCompose.pepSendSecure=امن msgCompose.pepSendTrusted=امن و قابل اعتماد -# pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -# pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? +pep.alert.disabledForIdentity=p≡p برای هویت فعلی غیرفعال می باشد. لطفا p≡p را از طریق ترجیحات Enigmail/p≡p فعال کنید. +pep.alert.weakReply=شما در حال ارسال یا پاسخ به یک پیام امن می باشید، اما پیامی که قصد ارسال آن را دارید امن نیست. اگر قصد ادامه دارید، اطلاعات محرمانه ممکن است لو برود و شما و هم صحبتتان را در خطر قرار دهد. آیا مطمئن هستید که میخواهید ادامه دهید؟ # note: should end with double newline: @@ -188,26 +187,26 @@ # details: keyNotTrusted=اعتماد کافی برای کلید 'S%' وجود ندارد keyNotFound=کلید '%S' یافت نشد -# keyRevoked=Key '%S' revoked +keyRevoked=کلید '%S' منقضی شد keyExpired=کلید 'S%' انقضاء یافت statPGPMIME=PGP/MIME statSMIME=S/MIME statSigned=امضاء شده statEncrypted=رمزنگاری شده -# statPlain=UNSIGNED and UNENCRYPTED +statPlain=امضا نشده و رمزنگاری نشده -# offlineSave=Save %1$S message to %2$S in Unsent Messages folder? +offlineSave=ذخیره %1$S پیام در %2$S داخل پوشه پیام های ارسال نشده؟ -# onlineSend=Send %1$S message to %2$S? -# encryptKeysNote=Note: The message is encrypted for the following User ID's / Keys: %S +onlineSend=ارسال پیام %1$S به %2$S؟ +encryptKeysNote=توجه: پیام برای آیدی های کاربر / کلید های آمده رمزنگاری شده اند: S% hiddenKey= -# signFailed=Error in Enigmail; Encryption/signing failed; send unencrypted message? +signFailed=خطا در Enigmail: رمزنگاری/امضا ناموفق بود. ارسال پیام به صورت رمزنگاری نشده؟ msgCompose.button.sendUnencrypted=&ارسال پیام رمزنگاری نشده recipientsSelectionHdr=انتخاب گیرندگان برای رمزنگاری -# configureNow=You did not yet configure Enigmail security for the selected identity. Do you want to do this now? +configureNow=شما امنیت Enigmail را هنوز برای هویت انتخاب شده ‍پیکربندی نکرده اید. آیا می خواهید اینکار را الان انجام دهید؟ # encryption/signing status and associated reasons: encryptMessageAuto=رمزنگاری پیام (خودکار) @@ -224,10 +223,10 @@ signOnWithReason=امضاء: روشن (S%) signOffWithReason=امضاء: خاموش (S%) reasonEnabledByDefault=فعال شده به صورت پیش فرض -# reasonManuallyForced=manually forced -# reasonByRecipientRules=forced by recipient rules -# reasonByAutoEncryption=forced by auto encryption -# reasonByConflict=due to conflict in recipient rules +reasonManuallyForced=تحمیل شده به صورت دستی +reasonByRecipientRules=تحمیل شده توسط قوانین هر-گیرنده +reasonByAutoEncryption=تحمیل شده توسط رمزنگاری خودکار +reasonByConflict=به دلیل تضاد در قوانین هر-گیرنده reasonByEncryptionMode=به دلیل وضعیت رمزنگاری # should not be used anymore: @@ -252,23 +251,27 @@ pgpmimeNo=از Inline PGP استفاده خواهد شد # Attach own key status (tooltip strings): -attachOwnKeyNo=کلید شما ملحق نخواهد شد -# attachOwnKeyYes=Your own key will be attached -# attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. +attachOwnKeyNo=کلید عمومی شما پیوست نخواهد شد +attachOwnKeyYes=کلید عمومی شما پیوست خواهد شد +attachOwnKeyDisabled=کلید عمومی شما پیوست نخواهد شد. شما باید یک کلید مشخص را\nدر بخش OpenPGP تنظیمات حساب کاربری برای فعال سازی این ویژگی انتخاب کنید. -# rulesConflict=Conflicting per-recipient rules detected\n%S\n\nSend message with these settings? -# msgCompose.button.configure=&Configure +rulesConflict=قوانین متضاد هر-گیرنده شناسایی شد\nS%\n\nارسال پیام با این تنظیمات؟ +msgCompose.button.configure=&پیکربندی msgCompose.button.send=&ارسال پیام msgCompose.button.save=&ذخیره پیام # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=نیاز به کلید عمومی S% برای تایید امضاء keyUsed=کلید عمومی S% استفاده شده برای تایید امضاء -# clickDecrypt=; use 'Decrypt/Verify' function -# clickDecryptRetry=; use 'Decrypt/Verify' function to retry -# clickDetailsButton=; click on 'Details' button for more information -# clickImportButton=; click on the 'Import Key' button to import the key -# keyTypeUnsupported=; the key type is not supported by your version of GnuPG +clickDecrypt=; استفاده از عملیات 'رمزگشایی/تایید' +clickDecryptRetry=؛ استفاده از عمل 'رمزگشایی/تایید' برای تلاش دوباره +clickDetailsButton=; برای اطلاعات بیشتر روی دکمه 'جزییات' کلیک کنید +clickImportButton=; برای ایمپورت کلید روی دکمه 'ایمپورت کلید' کلیک کنید +keyTypeUnsupported=; نوع کلید توسط نسخه GnuPG شما پشتیبانی نمی شود +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=رمزگشایی msgPart=بخشی از پیام S% msgSigned=امضاء شده msgSignedUnkownKey=امضاء نشده با کلید ناشناخته @@ -279,19 +282,21 @@ incompleteDecrypt=رمزگشایی ناقص needKey=خطا - هیچ کلید خصوصی برای رمزگشایی پیام یافت نشد failedDecrypt=خطا - رمزگشایی با خطا روبرو شد -# badPhrase=Error - bad passphrase -# failedDecryptVerify=Error - decryption/verification failed -# viewInfo=; View > Message security info for details +badPhrase=خطا - عبارت عبور بد +missingMdcError=خطا - محافظت یکپارچگی (MDC) ناقص یا خراب می باشد +failedDecryptVerify=خطا - رمزگشایی/تایید ناموفق بود +viewInfo=؛ نما > اطلاعات امنیت پیام برای جزییات بیشتر +brokenExchangeMessage=پیام PGP/MIME ناقص از جانب MS-Exchange decryptedMsg=پیام رمزگشایی شده -# decryptedMsgWithFormatError=Decrypted message (restored broken PGP email format probably caused by an old Exchange server, so that the result might not be perfect to read) +decryptedMsgWithFormatError=پیام رمزگشایی شد (فرمت ایمیل PGP خراب بازیابی شد احتمالا به دلیل یک سرور Exchange قدیمی، بنابراین نتیجه ممکن است برای خواندن ایده آل نباشد) usedAlgorithms=الگوریتم های استفاده شده: %1$S و %2$S pepStatusInfo.text=وضعیت پیام p≡p. pepStatusInfo.title.m3=در معرض حمله -# pepStatusInfo.info.m3=This message is not secure and has been tampered with. +pepStatusInfo.info.m3=این ‍پیام امن نمی باشد و دستکاری شده است. pepStatusInfo.title.m1=غیرقابل اعتماد -# pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted +pepStatusInfo.info.m1=این پیام یک هم صحبت دارد که از قبل به عنوان غیرقابل اعتماد علامت گذاری شده است pepStatusInfo.title.r0=ناشناخته pepStatusInfo.info.r0=این پیام اطلاعات کافی برای مشخص بودن امن بودن یا نبودن را شامل نمی شود. pepStatusInfo.title.r1=رمزگشایی نشد @@ -301,7 +306,7 @@ pepStatusInfo.title.r3=ناامن pepStatusInfo.info.r3=این پیام امن نمی باشد. pepStatusInfo.title.r4=ناامن برای برخی -# pepStatusInfo.info.r4=This message is unsecure for some communication partners. +pepStatusInfo.info.r4=این پیام برای برخی از هم صحبت ها ناامن می باشد. pepStatusInfo.title.r5=امنیت غیرقابل اعتماد pepStatusInfo.info.r5=این پیام دارای محافظت غیرقابل اعتماد می باشد. pepStatusInfo.title.r6=امن سازی... @@ -312,37 +317,40 @@ pepStatusInfo.color.green=سبز pepStatusInfo.color.yellow=زرد pepStatusInfo.color.red=قرمز -# pepRevokeTrust.question=Do you really want to cancel the trust for %S? +pepRevokeTrust.question=آیا واقعا می خواهید اعتماد برای S% را لغو کنید؟ pepRevokeMistrust.question=آیا میخواهید دوباره به کلید برای S% اعتماد کنید؟ pepRevokeTrust.doRevoke=لغو &اعتماد -# wksConfirmationReq=Web Key Directory Confirmation Request -# wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. +wksConfirmationReq=درخواست تایید پوشه کلید وب +wksConfirmationReq.message=این پیام توسط ارائه دهنده ایمیل شما برای تایید کاراندازی کلید عمومی OpenPGP شما\nدر دایرکتوری کلید وب آن ها ارسال شده است.\nفراهم سازی کلید عمومی شما به دیگران اجازه می دهد تا کلید شما را پیدا کنند و بنابراین قادر باشند تا پیام هایشان را به شما رمزنگاری کنند.\n\nاگر قصد دارید تا کلید خود را در دایرکتوری کلید وب همین الان به کار بیاندازید، لطفا روی دکمه "تایید درخواست" در نوار وضعیت کلیک کنید.\nدر غیر اینصورت، از این پیام چشم پوشی کنید. wksConfirmationReq.button.label=درخواست تایید -# autocryptSetupReq=Perform Autocrypt Setup -# autocryptSetupReq.button.label=Start Setup -# autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. -# autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. -# autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. -# autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. +autocryptSetupReq=اعمال نصب Autocrypt +autocryptSetupReq.button.label=شروع نصب +autocryptSetupReq.setupMsg.desc=این پیام حاوی تمام اطلاعات برای انتقال تنظیمات Autocrypt شما همراه با کلید خصوصی شما به صورت امن از دستگاه اصلی می باشد. +autocryptSetupReq.setupMsg.backup=شما می توانید این پیام را نگه دارید و از آن به عنوان پشتیبان برای کلید خصوصی خود استفاده کنید. اگر میخواهید این کار را انجام دهید، بهتر است رمزعبور را بنویسید و آن را به صورتی امن ذخیره کنید. +autocryptSetupReq.message.import=برای ایمپورت تنظیمات و کلید(ها) در Enigmail، لطفا روی دکمه "آغاز نصب" در نوار وضعیت کلیک کنید. +autocryptSetupReq.message.sent=لطفا روی پیام در دستگاه جدید خود کلیک کنید و دستور العمل ها برای درون برد تنظیمات را دنبال کنید. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js -# oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. +oldGpgVersion20=آغاز Enigmail ناموفق بود.\n\nشما در حال استفاده از نسخه %1$S برنامه GnuPG می باشید، که دیگر پشتیبانی نمی شود. Enigmail به نسخه %2$S یا بالاتر نیاز دارد. لطفا نصب GnuPG خود را آپگرید کرده، در غیر اینصورت Enigmail کار نخواهد کرد. locateGpg=مکان یابی برنامه GnuPG -# invalidGpgPath=GnuPG cannot be executed with the path provided. Enigmail is therefore deactivated until you change the path to GnuPG again or until you restart the application. +invalidGpgPath=GnuPG نمی تواند با مسیر فراهم شده اجرا شود. بنابراین Enigmail غیرفعال می باشد تا زمانی که شما مسیر را دوباره به GnuPG تغییر دهید یا برنامه را دوباره راه اندازی کنید. warningsAreReset=تمام هشدارها ریست شدند. prefs.gpgFound=GnuPG در S% یافت شد prefs.gpgNotFound=GnuPG یافت نشد -# prefs.warnAskNever=Warning: activating this option will result in unencrypted emails without any further information if there is no key for one of the recipients -- Enigmail will not inform you if this happens! -# prefs.warnIdleTimeForUnknownAgent=Cannot connect to gpg-agent. Maybe your system uses a specialized tool for passphrase handling (e.g. gnome-keyring, seahorse-agent, KDE wallet manager, ...). Unfortunately Enigmail cannot control the passphrase timeout for the tool you are using. Therefore the respective timeout settings in Enigmail are disregarded. -# prefEnigmail.oneKeyserverOnly=Error - you can only specify one keyserver for automatic downloading of missing OpenPGP keys. +prefs.warnAskNever=هشدار: فعال سازی این گزینه باعث ایمیل های رمزنگاری نشده بدون هیچ اطلاعات بیشتری میشود اگر برای یکی از گیرندگان هیچ کلیدی موجود نباشد -- Enigmail زمانی که اتفاق بیافتد شما را آگاه نخواهد کرد! +prefs.warnIdleTimeForUnknownAgent=ناتوانی در اتصال به gpg-agent. شاید سیستم شما از یک ابزار تخصصی برای کنترل عبارت عبور استفاده میکند (مثلا gnome-keyring، seahourse-agent، KDE wallet manager، ...) متاسفانه Enigmail قادر نیست تا پایان زمان عبارت عبور را برای ابزاری که در حال استفاده از آن هستید را کنترل کند. بنابراین به تنظیمات پایان زمان در Enigmail توجهی نمی شود. +prefEnigmail.oneKeyserverOnly=خطا - شما فقط می توانید یک سرور کلید برای دانلود خودکار یا کلید های OpenPGP ناموجود مشخص کنید. +acSetupMessage.desc=انتقال کلید به یک دستگاه که روی آن Autocrypt فعال است. (Autocrypt چیست) +aboutLicense.desc=Enigmail متن باز بوده و دارای لایسنس عمومی موزیلا ۲.۰ میباشد. # Strings used in core.jsm # (said file also re-uses some strings from above) -# enterAdminPin=Please type in the ADMIN PIN of your SmartCard -# enterCardPin=Please type your SmartCard PIN +enterAdminPin=لطفا پین ادمین SmartCard خود را تایپ کنید +enterCardPin=لطفا پین SmartCard خود را وارد نمایید notInit=خطا - سرویس Enigmail هنوز شروع به کار نکرده است badCommand=خطا - دستور رمزنگاری ناموفق بود @@ -351,135 +359,130 @@ notComplete=خطاء - تولید کلید هنوز کامل نشده است invalidEmail=خطا - آدرس ایمیل(های) ناموجود noPassphrase=خطا - هیچ پسفریزی تامین نشد -# noPGPblock=Error - No valid armored OpenPGP data block found -# unverifiedReply=Indented message part (reply) was probably modified -keyInMessageBody=کلید در متن پیام یافت شد. برای ایمپورت کردن آن روی "ایمپورت کلید" کلید کنید +noPGPblock=خطا - هیچ بخش داده OpenPGP محافظت شده معتبری یافت نشد +unverifiedReply=بخش پیام برجسته شده (پاسخ) احتمالا تغییر کرده بود +keyInMessageBody=یک کلید در بدنه پیام یافت شد. برای وارد کردن کلید روی 'وارد کردن کلید' کلیک کنید sigMismatch=خطا - عدم تطابق امضاء -cantImport=خطا در ایمپورت کلید عمومی\n\n -# doImportOne=Import %1$S (%2$S)? -# doImportMultiple=Import the following keys?\n\n%S -# previewFailed=Can't read public key file. +cantImport=خطا در وارد کردن کلید عمومی\n\n +doImportOne=درون برد %1$S (%2$S)؟ +doImportMultiple=ایمپورت کلید های در پایین آمده؟\n\n%S +previewFailed=ناتوانی در خواندن کلید عمومی. # Strings used in errorHandling.jsm -# sc.wrongCardAvailable=The SmartCard %1$S found in your reader cannot be used to process the message.\nPlease insert your SmartCard %2$S and repeat the operation. -# sc.insertCard=The operation requires your SmartCard %S.\nPlease insert the required SmartCard and repeat the operation. -# sc.removeCard=The operation requires no SmartCard to be in the reader.\nPlease remove your SmartCard and repeat the operation. -# sc.noCardAvailable=No SmartCard could be found in your reader\nPlease insert your SmartCard and repeat the operation. -# sc.noReaderAvailable=Your SmartCard reader could not be accessed\nPlease attach your SmartCard reader, insert your card, and repeat the operation. -# keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. -# keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. -# keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. +sc.wrongCardAvailable=اسمارت کارت %1$S یافته شده در خواننده شما نمی تواند برای پردازش پیام مورد استفاده قرار بگیرد.\nلطفا اسمارت کارت %2$S خود را وارد کنید و عملیات را تکرار کنید. +sc.insertCard=عملیات نیاز به اسمارت کارت S% شما دارد.\nلطفا اسمارت کارت خواسته شده را وارد کنید و عملیات را تکرار کنید. +sc.removeCard=عملیات نیاز به بودن اسمارت کارت در خواننده ندارد.\nلطفا اسمارت کارت خود را حذف کرده و عملیات را تکرار کنید. +sc.noCardAvailable=هیچ اسمارت کارتی در خواننده شما یافت نشد\nلطفا اسمارت کارت خود را وارد کرده و عملیات را تکرار کنید. +sc.noReaderAvailable=خواننده اسمارت کارت شما قابل دسترسی نمی باشد\nلطفا خواننده اسمارت کارت خود را پیوست کرده، کارت خود را وارد کنید، و عملیات را تکرار کنید. +keyError.keySpecNotFound=آدرس ایمیل 'S%' نمی تواند با کلید در حلقه کلید شما تطابق یابد. +keyError.keyIdNotFound=آیدی کلید پیکربندی شده 'S%' در حلقه کلید شما یافت نشد. +keyError.resolutionAction=لطفا یک کلید معتبر از قسمت OpenPGP تنظیمات حساب کاربری خود انتخاب کنید. missingPassphrase=پسفریز ناموجود errorHandling.gpgAgentInvalid=سیستم شما نسخه ای از gpg-agent را استفاده میکند که مناسب نسخه GnuPG شما نیست. -# errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). -# errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). -# errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. -# errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. - -# gpgNotFound=Unable to locate GnuPG program '%S'.\nMake sure you have set the GnuPG executable path correctly in the Enigmail Preferences. -# gpgNotInPath=Unable to locate GnuPG executable in the PATH.\nMake sure you have set the GnuPG executable path correctly in the Enigmail Preferences. -# enigmailNotAvailable=Enigmail core Service not available +errorHandling.gpgAgentError=GnuPG در ارتباط شما با gpg-agent ( یکی از اجزا GnuPG) یک خطا گزارش کرد. +errorHandling.dirmngrError=GnuPG یک خطا در ارتباط شما با dirmngr (یکی از اجزا GnuPG) گزارش کرد. +errorHandling.pinentryError=GnuPG نمی تواند عبارت عبور شما را از طریق pinetry پرس و جو کند. +errorHandling.pinentryCursesError=نصب GnuPG برای استفاده کنسول از pinetry پیکربندی شده است. هرچند، زمانی که شما در حال استفاده از Enigmail می باشید نیاز به یک نسخه گرافیکی از pinetry دارید. +errorHandling.readFaq=این یک نصب سیستم یا خطا پیکربندی می باشد که از کار کردن Enigmail به درستی جلوگیری میکند و نمی تواند به صورت خودکار اصلاح شود.\n\nتوصیه اکید ما بر این است که شما از پشتیبانی سایت ما در https://enigmail.net/faq مشورت بگیرید. + +gpgNotFound=ناتوانی در یافتن مکان برنامه GnuPG %S.\nمطمئن شوید که مسیر GnuPG قابل اجرا را به درستی در ترجیحات Enigmail تنظیم کرده اید. +gpgNotInPath=ناتوانی در یافت فایل قابل اجرا GnuPG در مسیر.\nمطمئن شوید که مسیر فایل قابل اجرا GnuPG در ترجیحات Enigmail به درستی تنظیم شده است. +enigmailNotAvailable=سرویس اصلی Enigmail موجود نمی باشد -# prefGood=Good signature from %S -# prefBad=BAD signature from %S +prefGood=امضا‌ خوب از S% +prefBad=امضا بد از S% failCancel=خطا - لغو دریافت کلید توسط کاربر -# failNoServer=Error - No keyserver specified to receive key from -# failNoID=Error - No key ID specified to receive key for -# failKeyExtract=Error - key extraction command failed -# notFirstBlock=Error - First OpenPGP block not public key block -# importKeyConfirm=Import public key(s) embedded in message? +failKeyExtract=خطا - دستور استخراج کلید ناموفق بود +failKeyNoSubkey=هیچ (زیر-)کلید معتبر +notFirstBlock=خطا - اولین قسمت OpenPGP قسمت کلید عمومی نیست +importKeyConfirm=ایمپورت کلید(های) عمومی جاسازی شده در پیام؟ failKeyImport=خطا - ایمپورت کلید ناموفق بود -# fileWriteFailed=Failed to write to file %S +fileWriteFailed=ناتوانی در نوشتن بر روی فایل %S -# importKey=Import public key %S from keyserver: +importKey=وارد کردن کلید عمومی S% از کلید سرور: uploadKey=ارسال کلید عمومی S% به keyserver: keyId=آیدی کلید -# keyAndSigDate=Key ID: 0x%1$S / Signed on: %2$S +keyAndSigDate=آیدی کلید: 0x%1$S / امضا شده در: %2$S keyFpr=اثرانگشت کلید: S% -# noEmailProvided=You did not provide an email address! -# keyAlreadySigned=The key is already signed, you cannot sign it twice. +noEmailProvided=هیچ ایمیلی وارد نکردید! +keyAlreadySigned=کلید امضا شده است، نمی توانید آن را برای بار دوم امضا کنید. ##################################################################### # Strings used in enigmailKeySelection.js ##################################################################### -# selKeyExpired=expired %S +selKeyExpired=%S منقضی شد createdHeader=ایجاد شده -# atLeastOneKey=No key selected! You have to select at least one key to accept this dialog -# fewerKeysThanRecipients=You have selected a smaller number of keys than recipients. Are you sure that the list of keys to encrypt is complete? +atLeastOneKey=هیچ کلیدی انتخاب نشده است! شما باید حداقل یک کلید برای پذیرش این دیالوگ انتخاب کنید +fewerKeysThanRecipients=شما تعداد کوچکتری کلید از گیرندگان را انتخاب کرده اید. آیا مطمئن هستید که لیست کلید ها برای رمزنگاری کامل می باشد؟ userSel.button.goBack=انتخاب کلید های بیشتر -# userSel.secretKeySel.title=Select a Secret OpenPGP Key to Sign Your Messages -# userSel.problemNoKey=No valid key -# userSel.problemMultipleKeys=Multiple keys +userSel.secretKeySel.title=انتخاب یک کلید خصوصی OpenPGP برای امضا ‍پیام هایتان +userSel.problemNoKey=هیچ کلید معتبری وجود ندارد +userSel.problemMultipleKeys=چندین کلید # should be same as thunderbird ENTITY sendLaterCmd.label: -# sendLaterCmd.label=Send Later +sendLaterCmd.label=ارسال بعدا # Strings used in enigmailAttachmentDialog.js -# pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. +pgpMimeNote=توجه: PGP/MIME توسط همه کلاینت های ایمیل پشتیبانی نمی شود. اگر مطمئن نیستید، گزینه %S را انتخاب کنید. first=اولین second=ثانیه # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=انتخاب کلید OpenPGP برای رمزنگاری identityName=هویت: S% -# switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. +switchPepMode=شما هم اکنون در حال استفاده از حالت 'جونیور p≡p' برنامه Enigmail هستید.\n\nبا فعال سازی OpenPGP یا S/MIME برای یک حساب کاربری، شما p≡p را غیرفعال میکنید و از حالت 'عادی' Enigmail بدون p≡p استفاده خواهید کرد. enableEnigmail=&غیرفعال سازی p≡p +amPrefAutocrypt.desc=Autocrypt یک استاندارد می باشد که مشخص می کند چگونه رمزنگاری سر-تا-سر ایمیل ها را به صورت راحت بدست بیاوریم. مشخص میکند چه طور برنامه های ایمیل از توانایی های رمزنگاری برای ایمیل های عادی استفاده می کنند. + # Strings used in enigmailSingleRcptSettings.js -# noEncryption=You have activated encryption, but you did not select a key. In order to encrypt emails sent to %1$S, you need to specify one or several valid key(s) from your key list. Do you want to disable encryption for %2$S? +noEncryption=شما رمزنگاری را فعال کرده اید، اما کلیدی را انتخاب نکرده اید. برای رمزنگاری ایمیل های ارسال شده به %1$S، شما باید یک کلید یا کلید(هایی) را از لیست کلید خود مشخص کنید. آیا میخواهید تا رمزنگاری را برای %2$S غیرفعال کنید؟ noKeyToUse=(هیچ - بدون رمزنگاری) -# noEmptyRule=The Rule may not be empty! Please set an email address in the Rule field. -# invalidAddress=The email address(es) you have entered are not valid. You should not set the names of the recipients, just the email addresses. E.g.:\nInvalid: Some Name \nValid: some.name@address.net -# noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. +noEmptyRule=قانون نمی تواند خالی باشد! لطفا یک آدرس ایمیل در بخش قانون قرار دهید. +invalidAddress=آدرس(های) ایمیل وارد شده معتبر نیستند. شما نباید نام گیرندگان را قرار دهید، بلکه فقط ایمیل آدرس کافی است. برای نمومه:\nنامعتبر: یک نام \nمعتبر: some.name@address.net +noCurlyBrackets={} دارای یک معنای خاص می باشند و نباید در یک آدرس ایمیل استفاده شوند. اگر میخواهید تا رفتار مطابق را برای این قانون تغییر دهید، از گزینه 'اعمال قانون اگر گیرنده ...' استفاده کنید.\nاطلاعات بیشتر از طریق دکمه راهنما موجود میباشد. # Strings used in enigmailRulesEditor.js never=هیچ وقت always=همیشه possible=ممکن deleteRule=قانون انتخاب شده واقعا پاک شوند؟ -# nextRcpt=(Next recipient) -# negateRule=Not -# addKeyToRule=Add key %1$S (%2$S) to per-recipient rule +nextRcpt=(گیرنده بعدی) +negateRule=نه +addKeyToRule=افزودن کلید %1$S (%2$S) به قانون هر-گیرنده # Strings used in enigmailSearchKey.js -# needOnline=The function you have selected is not available in offline mode. Please go online and try again. -# protocolNotSupported=The protocol '%S://' that you have selected is not supported for downloading OpenPGP keys. -# gpgkeysDisabled=It might help to enable the option 'extensions.enigmail.useGpgKeysTool'. -# noKeyserverConn=Could not connect to keyserver at %S. -# keyDownloadFailed=Failed to download key from keyserver. Status message is:\n%S -# internalError=An internal error occurred. The keys could not be downloaded or imported. -# noKeyFound=We are sorry, could not find any key that would match the specified search criteria. -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -# gpgKeysFailed=Failed to search or download key from keyserver: gpgkeys_%S could not be executed. - +needOnline=فعالیتی که شما انتخاب کرده اید در حالت آفلاین موجود نمی باشد. لطفا بعد از آنلاین شدن دوباره امتحان کنید. +noKeyserverConn=ناتوانی در اتصال به سرور کلید در %S. +internalError=یک خطا داخلی رخ داده است. کلید ها نمیتوانند دانلود شده یا وارد شوند. +noKeyFound=ما نتوانستیم هیچ کلیدی که با شاخص جستجو مشخص شده وجود داشت را پیدا کنیم. +keyDownload.keyUnavailable=کلید با آیدی S% روی سرور کلید موجود نمی باشد. به احتمال زیاد، مالک کلید آن را بر روی سرور کلید آپلود نکرده است.\n\nلطفا از ارسال کننده پیام بخواهید تا کلید عمومی خود را از طریق ایمیل برای شما بفرستد. # Strings in enigmailEditKeyTrustDlg.xul -# setKeyTrustFailed=Setting owner trust failed +setKeyTrustFailed=تنظیم اعتماد مالک ناموفق بود # Strings in enigmailSignKeyDlg.js signKeyFailed=امضاء کلید ناموفق بود -# alreadySigned.label=Note: the key %S is already signed with the selected secret key. -# alreadySignedexportable.label=Note: the key %S is already signed exportable with the selected secret key. A local signature does not make sense. -# partlySigned.label=Note: some user IDs of key %S are already signed with the selected secret key. -# noTrustedOwnKeys=No eligible key found for signing! You need at least one fully trusted secret key in order to sign keys. +alreadySigned.label=توجه: کلید S% با کلید خصوصی انتخاب شده از قبل امضا شده است. +alreadySignedexportable.label=توجه: کلید S% به صورت قابل برون برد با کلید خصوصی انتخاب شده هم اکنون امضا شده است. یک امضا محلی بی معناست. +partlySigned.label=توجه: برخی از آیدی های کاربر کلید S% هم اکنون با کلید خصوصی انتخاب شده اضما شده است. +noTrustedOwnKeys=هیچ کلید واجد شرایطی برای امضا کردن یافت نشد! شما حداقل نیاز به یک کلید خصوصی قابل اعتماد برای امضا کلید ها دارید. # Strings in enigmailKeyManager.js keyMan.loadingKeys=بارگذاری کلیدها، لطفا صبر کنید ... keyValid.unknown=ناشناخته keyValid.invalid=ناموجود keyValid.disabled=غیرفعال شده -# keyValid.revoked=revoked +keyValid.revoked=فسخ شده keyValid.expired=منقضی شده -# keyValid.noSubkey=no valid subkey +keyValid.noSubkey=هیچ زیرکلید معتبر keyTrust.untrusted=غیرقابل اعتماد -# keyTrust.marginal=marginal +keyTrust.marginal=مرزی keyTrust.full=قابل اعتماد -# keyTrust.ultimate=ultimate +keyTrust.ultimate=نهایی keyTrust.group=(گروه) keyType.public=پاب keyType.publicAndSec=pub/sec @@ -487,61 +490,59 @@ keyMan.disableKey=غیرفعال سازی کلید userAtt.photo=خصوصیت کاربر (تصویر JPEG) -# asciiArmorFile=ASCII Armored Files (*.asc) -# importKeyFile=Import OpenPGP Key File +asciiArmorFile=ASCII Armored Files (*.asc) +importKeyFile=وارد کردن فایل کلید OpenPGP gnupgFile=فایل های GnuPG -# createKeyOK=Your Key has been generated -# saveRevokeCertAs=Create & Save Revocation Certificate -# revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. -# revokeCertFailed=The revocation certificate could not be created. +saveRevokeCertAs=ایجاد و ذخیره گواهی فسخ +revokeCertOK=گواهی فسخ با موفقیت ایجاد شده است. شما میتوانید از آن برای سلب اعتبار کلید عمومی خود استفاده کنید، مثلا در موردی که شما کلید خصوصی خود را گم کرده اید. +revokeCertFailed=گواهی فسخ قابل ایجاد نمی باشد. addUidOK=آیدی کاربر با موفقیت افزوده شد addUidFailed=افزودن آیدی کاربر با خطا روبرو شد -# noKeySelected=You should select at least one key in order to perform the selected operation -exportToFile=اکسپورت کلید عمومی به فایل -# exportKeypairToFile=Export Secret and Public Key To File -# exportSecretKey=Do you want to include the secret key in the saved OpenPGP key file? +noKeySelected=شما باید حداقل یک کلید برای اجرا عملیات انجام شده انتخاب کنید +exportToFile=خروجی گرفتن کلید عمومی به فایل +exportKeypairToFile=خروجی گرفتن از کلید عمومی و خصوصی بر روی فایل +exportSecretKey=آیا میخواهید تا کلید خصوصی را در فایل کلید ذخیره شده OpenPGP قرار دهید؟ saveKeysOK=کلید ها با موفقیت ذخیره شدند saveKeysFailed=ذخیره سازی کلید ها ناموفق بود importKeysFailed=ایمپورت کلید ها ناموفق بود enableKeyFailed=فعال سازی/غیرفعال سازی کلید ها ناموفق بود -# specificPubKeyFilename=%1$S (0x%2$S) pub -# specificPubSecKeyFilename=%1$S (0x%2$S) pub-sec +specificPubKeyFilename=%1$S (0x%2$S) pub +specificPubSecKeyFilename=%1$S (0x%2$S) pub-sec defaultPubKeyFilename=کلیدهای-عمومی-صادرشده -# defaultPubSecKeyFilename=Exported-public-and-secret-keys -# noSecretKeys=No secret keys found.\n\nDo you want to generate your own key now? +defaultPubSecKeyFilename=کلیدهای-خروجی-و-عمومی-برون-برده-شده sendKeysOk=کلید(ها) با موفقیت ارسال شدند sendKeysFailed=ارسال کلید ها با خطا روبرو شد receiveKeysOk=کلید(ها) با موفقیت آپلود شدند receiveKeysFailed=دانلود کلید ها با خطا روبرو شد +keyUpload.verifyEmails=سرور کلید برای شما یک ایمیل برای هر آدرس ایمیل در کلید آپلود شده شما ارسال خواهد کرد. برای تایید انتشار کلید خود، نیاز است تا روی لینک در هر ایمیل دریافت شده کلیک کنید. importFromClip=آیا میخواهید کلید(هایی) را از کلیپ بورد ایمپورت کنید؟ importFromUrl=دانلود کلید عمومی از این آدرس: copyToClipbrdFailed=کلید(های) انتخاب شده بر کلیپ بورد کپی نشدند. copyToClipbrdOK=کلید(ها) بر روی کلیپ بورد کپی شدند -# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, and you cannot revoke your key anymore.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? -# deleteMix=WARNING: You are about to delete secret keys!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key.\n\nDo you really want to delete BOTH, the selected secret and public keys? -# deletePubKey=Do you want to delete the public key\n'%S'? +deleteSecretKey=هشدار: شما در حال پاک کردن یک کلید خصوصی میباشید!\nاگر کلید خصوصی خود را پاک کنید، دیگر قادر به رمزگشایی هیچ پیام رمزنگاری شده برای آن کلید نخواهید بود، همچنین شما قادر به فسخ آن نخواهید بود.\n\nآیا واقعا میخواهید تا هردو آن ها را پاک کنید، کلید عمومی و کلید خصوصی\n'S%'؟ +deleteMix=هشدار: شما در حال پاک کردن کلید های خصوصی خود می باشید!\nاگر کلید های خصوصی خود را پاک کنید، دیگر قادر نخواهید بود تا هیچ یک از پیام های رمزنگاری شده برای آن کلید را رمزگشایی کنید.\n\nآیا مایل هستید تا هردو، کلید های انتخاب شده خصوصی و عمومی را پاک کنید؟ +deletePubKey=آیا می خواهید کلید عمومی\n'%S' را حذف کنید؟ deleteSelectedPubKey=آیا قصد حذف کردن کلید های عمومی را دارید؟ -# deleteKeyFailed=The key could not be deleted. -# revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? -# revokeKeyOk=The key has been revoked. If your key is available on a key server, it is recommended to re-upload it, so that others can see the revocation. -# revokeKeyFailed=The key could not be revoked. -# revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! -# revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. -# refreshAllQuestion=You did not select any key. Would you like to refresh ALL keys? -# refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? -# refreshKey.warn=Warning: depending on the number of keys and the connection speed, refreshing all keys could be quite a lengthy process! -# downloadContactsKeys.warn=Warning: depending on the number of contacts and the connection speed, downloading all keys could be quite a lengthy process! -# downloadContactsKeys.importFrom=Import contacts from address book '%S'? -# keyMan.button.exportSecKey=Export &Secret Keys -# keyMan.button.exportPubKey=Export &Public Keys Only +deleteKeyFailed=کلید نمی تواند پاک شود. +revokeKeyQuestion=شما در حال منقضی کردن کلید '%S می باشید.\n\nشما دیگر قادر نخواهید بود با این کلید امضا کنید، زمانی که توزیع یافت دیگران قادر نخواهند بود تا با آن کلید رمزنگاری کنند. شما قادر خواهید بود تا از آن کلید برای رمزگشایی پیام های قدیمی استفاده کنید.\n\nآیا می خواهید ادامه دهید؟ +revokeKeyOk=کلید فسخ شده است. اگر کلید شما در سرور کلید موجود می باشد، توصیه می شود تا آن را به صورت مجدد آپلود کنید، تا دیگران بتوانند فسخ را ببینند. +revokeKeyFailed=کلید قابل فسخ نبود. +revokeKeyNotPresent=شما هیچ کلیدی (0x%S) ندارید که با این گواهی فسخ تطابق داشته باشد!\n\nاگر کلید خود را از دست داده اید، شما باید آن را به درون ببرید (مثلا از یک سرور کلید) قبل از اینکه گواهی فسخ را به درون ببرید! +revokeKeyAlreadyRevoked=کلید 0x%S فسخ شده است. +refreshAllQuestion=شما هیچ کلیدی را انتخاب نکرده اید. آیا مایل هستید تا تمام کلید ها را رفرش کنید؟ +refreshKeyServiceOn.warn=هشدار: کلید های شما در پس زمینه در حال تازه سازی تا جای ممکن به صورت امن می باشند.\nتازه سازی تمام کلید های شما در یک لحظه باعث آشکار شدن اطلاعاتی ناخواسته درباره شما خواهد شد.\nآیا واقعا مایل به انجام این کار هستید؟ +refreshKey.warn=هشدار: بسته به تعداد کلید ها و سرعت اتصال، تازه سازی تمام کلید ها میتواند یک رویه زمان بر باشد! +downloadContactsKeys.warn=هشدار: بسته به تعداد مخاطبان و سرعت اتصال، دانلود تمام کلید ها میتواند یک رویه طولانی باشد! +downloadContactsKeys.importFrom=ایمپورت مخاطبان از کتاب آدرس '%S'؟ +keyMan.button.exportSecKey=خروجی گرفتن &کلید های خصوصی +keyMan.button.exportPubKey=خروجی گرفتن فقط از &کلید های عمومی keyMan.button.import=&ایمپورت -# keyMan.button.refreshAll=&Refresh All Keys -# keyMan.button.revokeKey=&Revoke Key -# keyMan.button.skip=&Skip Key +keyMan.button.refreshAll=&رفرش تمام کلیدها +keyMan.button.revokeKey=&انقضا کلید keylist.noOtherUids=هیچ هویتی دیگری ندارد keylist.hasOtherUids=همچنین شناخته شده با عنوان @@ -549,22 +550,23 @@ keylist.hasPhotos=تصاویر keyMan.addphoto.filepicker.title=انتخاب عکس برای افزودن -# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files because the keys get very large by this. -# keyMan.addphoto.noJpegFile=The selected file does not appear to be a JPEG file. Please choose a different file. -# keyMan.addphoto.failed=The photo could not be added. -# noWksIdentity=The key %S does not have a WKS identity. - -# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? -# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? -# keyman.addBlacklistKey.button=&Blacklist the key -# keyman.removeBlacklistKey.button=&Remove key from Blacklist +keyMan.addphoto.warnLargeFile=فایلی که انتخاب کرده اید بیشتر از 25 کلیوبایت می باشد.\nتوصیه نمی شود که فایل های بسیار حجیم را اضافه کنید چون باعث کلید های بسیار سنگین و حجیم خواهد شد. +keyMan.addphoto.noJpegFile=فایل انتخاب شده به نظر نمی آید که یک فایل JPEG باشد. لطفا یک فایل متفاوت انتخاب کنید. +keyMan.addphoto.failed=تصویر نمی تواند افزوده شود. +noWksIdentity=کلید %S دارای هویت WKS نمی باشد. +wksUpload.noKeySupported=آپلود موفق نبود - ارائه دهنده شما به نظر از WKS پشتیبانی نمی کند. + +keyman.addBlacklistKey.msg=آیا واقعا میخواهید تا p≡p استفاده از کلید '%1$S (%2$S)' برای پیام های رمزنگاری شده را متوقف کنید؟ +keyman.removeBlacklistKey.msg=آیا واقعا می خواهید به p≡p اجازه دهید تا از کلید '%1$S (%2$S)' برای پیام های آینده استفاده کند؟ +keyman.addBlacklistKey.button=&نوشتن کلید در لیست سیاه +keyman.removeBlacklistKey.button=&حذف کلید از لیست سیاه # Strings in enigmailManageUidDlg.xul changePrimUidFailed=تغییر آیدی اصلی کاربر با خطا روبرو شد changePrimUidOK=آیدی اصلی کاربر با موفقیت تغییر یافت -# revokeUidFailed=Revoking the user ID %S failed -# revokeUidOK=User ID %S was revoked successfully. If your key is available on a key server, it is recommended to re-upload it, so that others can see the revocation. -# revokeUidQuestion=Do you really want to revoke the user ID %S? +revokeUidFailed=فسخ آیدی کاربر %S ناموفق بود +revokeUidOK=آیدی کاربر S% با موفقیت فسخ شد. اگر کلید شما روی یک سرور کلید موجود میباشد، توصیه می شود تا آن را مجدد آپلود کنید، تا دیگران بتوانند فسخ آن را ببینند. +revokeUidQuestion=آیا میخواهید آیدی کاربر %S را فسخ کنید؟ # Strings in enigmailKeyImportInfo.xul importInfoTitle=موفقیت! کلید ها ایمپورت شدند @@ -578,7 +580,7 @@ keyTypePublic=کلید عمومی keyTypePrimary=کلید اصلی keyTypeSubkey=کلید فرعی -# keyTypePair=key pair +keyTypePair=جفت کلید keyExpiryNever=هیچ وقت keyAlgorithm_1=آراس‌ای keyAlgorithm_2=آراس‌ای @@ -591,45 +593,51 @@ keyAlgorithm_22=EDDSA keyUsageEncrypt=رمزنگاری keyUsageSign=امضا -# keyUsageCertify=Certify +keyUsageCertify=تصدیق keyUsageAuthentication=احراز هویت keyDoesNotExpire=کلید منقضی نمی شود # Strings in enigmailGenCardKey.xul -# keygen.started=Please wait while the key is being generated .... +keygen.started=لطفا صبر داشته باشید تا زمانی که کلید تولید شود .... keygen.completed=کلید تولید شد. آیدی جدید کلید: 0x%S -# keygen.keyBackup=The key is backed up as %S -# keygen.passRequired=Please specify a passphrase if you want to create a backup copy of your key outside your SmartCard. +keygen.keyBackup=از کلید با عنوان %S بک آپ گرفته شده است +keygen.passRequired=لطفا یک عبارت عبور مشخص کنید اگر می خواهید تا یک کپی پشتیبان از کلید خود خارج از اسمارت کارت ایجاد کنید. # Strings in enigmailSetCardPin.xul cardPin.processFailed=خطا در تغییر پین -# Strings in enigRetrieveProgres.xul -# keyserverProgress.refreshing=Refreshing keys, please wait ... +# Strings in enigRetrieveProgres.js +keyserverProgress.refreshing=در حال رفرش کلیدها، لطفا صبر کنید ... keyserverProgress.uploading=در حال آپلود کلید ها، لطفا صبر کنید ... -# keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service -# keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. +keyserverProgress.wksUploadFailed=ناتوانی در آپلود کلید شما بر سرویس Web Key +keyserverProgress.wksUploadCompleted=کلید عمومی شما با موفقیت به ارائه دهنده ارسال شد. شما یک ایمیل دریافت خواهید کرد که تایید میکند تا آپلود را آغاز کرده اید. keyserverTitle.refreshing=رفرش کلید ها keyserverTitle.uploading=آپلود کلید +keyserver.result.download.none=هیچ کلیدی دانلود نشد. +keyserver.result.download.1of1=کلید با موفقیت دانلود شد. +keyserver.result.download.1ofN=1 از S% کلید با موفقیت دانلود شد. +keyserver.result.download.NofN=%1$S کلید از %2$S با موفقیت دانلود شد. +keyserver.result.uploadOne=1 کلید با موفقیت آپلود شد. +keyserver.result.uploadMany=S% کلید با موفقیت آپلود شد. # Strings in enigmailSetupWizard -# passphrase.min8keys=Your passphrase should contain at least 8 characters! -# setupWizard.reallyCancel=Do you really want to close the Enigmail Setup Wizard? -# setupWizard.invalidGpg=The file you specified is not a GnuPG executable. Please specify a different file. -# setupWizard.specifyFile=You need to at least specify a public key file in order to proceed. -# setupWizard.installFailed=It seems that the installation was not successful. Please either retry the installation, or install GnuPG manually and locate it using the Browse button. -# setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. +setupWizard.invalidGpg=فایلی که شما مشخص کردید به عنوان یک فایل قابل اجرا GnuPG نمی باشد. لطفا یک فایل دیگر را مشخص کنید. +setupWizard.installFailed=به نظر می آید که نصب ناموفق بود. لطفا یا نصب را دوباره انجام دهید، یا به صورت دستی GnuPG را نصب کنید و آن را از طریق دکمه جستجو مکان یابی کنید. +setupWizard.downloadForbidden=برای امنیت خود شما، ما GnuPG را دانلود نخواهیم کرد. لطفا برای دانلود GnuPG به https://gnupg.org/ مراجعه کنید. setupWizard.downloadImpossible=الان نمی توانیم GnuPG را دانلود کنیم. لطفا بعدا امتحان کنید یا به https://gnupg.org/ رفته و GnuPG را دانلود کنید. -# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or manipulated. Do you want to continue the installation anyway? +setupWizard.hashSumError=ویزارد نمی تواند تمامیت فایل دانلود شده را تایید کند. فایل ممکن است خراب شده باشد یا دستکاری شده باشد. به هر حال مایل به ادامه نصب می باشید؟ setupWizard.importSettingsFile=مشخص کردن فایل پشتیبانی برای بارگذاری -# setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. -# setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? -# setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. -# setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +setupWizard.invalidSettingsFile=فایل مشخص شده یک فایل پشتیبان تنظیمات Enigmail معتبر نمی باشد +setupWizard.gpgConfExists=فایل پیکربندی GnuPG هم اکنون موجود است. آیا می خواهید تا آن را با یکی از نصب های قدیمی خود بازنویسی کنید؟ +setupWizard.noGpgHomeDir=به نظر می آید که شما 'S%' را پیکربندی کرده اید تا با GnuPG استفاده شود. هرچند، این یک دایرکتوری نیست - شما نمی توانید از آن استفاده کنید. +setupWizard.unmachtedIds=هویت های آمده از نصب قدیمی شما قابلیت تطابق ندارند:\nS%\nتنظیمات برای این هویت ها از قلم انداخته شده است. +setupWizard.foundAcSetupMessage=پیام نصب Autocrypt یافت شد. برای آغاز رویه نصب Autocrypt، روی دکمه شروع نصب آمده در پایین کلیک کنید. +setupWizard.foundAcNoSetupMsg=ما متوجه شدیم که شما در حال استفاده از کلاینت ایمیل سازگار با Autocrypt می باشید، اما نمی توانیم هیچ پیام نصب Autocrypt را پیدا کنیم. ما توصیه میکنیم که شما یک پیام نصب Autocrypt جدید روی دستگاه موجود ایجاد کنید و روی اسکن دوباره ورودی کلیک کنید. در غیر اینصورت، شما می توانید تنظیمات خود و کلید های نصب فعلی Enigmail را به بیرون برده، و این تنظیمات را بازیابی کنید. +setupWizard.setupComplete=Enigmail هم اکنون به درستی پیکربندی شده است و آماده استفاده میباشد. برای اطلاعات بشتر درباره استفاده از Enigmail به صفحه اصلی ما مراجعه کنید. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=در هنگام دانلود GnuPG خطایی رخ داد. لطفا لاگ کنسول را برای جزییات بیشتر چک کنید. -# installGnuPG.installFailed=An error occurred while installing GnuPG. Please check the console log for further details. +installGnuPG.installFailed=خطایی در هنگام نصب GnuPG رخ داد. لطفا لاگ کنسول را برای اطلاعات بیشتر چک کنید. # Strings in enigmailAddUidDlg.xul addUidDlg.nameOrEmailError=شما باید نام و آدرس ایمیل را پر کنید @@ -637,113 +645,114 @@ addUidDlg.invalidEmailError=شما باید یک آدرس ایمیل موجود را مشخص کنید # Strings in enigmailCardDetails.js -# Carddetails.NoASCII=OpenPGP Smartcards only support ASCII characters in Firstname/Name. +Carddetails.NoASCII=اسمارت کارت های OpenPGP فقط از کاراکتر های ASCII در نام کوچک/نام پشتیبانی میکنند. # network error types -# errorType.SecurityCertificate=The security certificate presented by the web service is not valid. +errorType.SecurityCertificate=گواهی امنیتی نشان داده شده توسط وب سرویس نامعتبر است. errorType.SecurityProtocol=پروتکل امنیتی استفاده شده توسط وب سرویس ناشناخته است. errorType.Network=یک خطا شبکه رخ داده است. # filter stuff filter.folderRequired=باید پوشه مورد نظر را مشخص کنید -# filter.decryptMove.label=Decrypt permanently (Enigmail) +filter.decryptMove.label=رمزگشایی دائمی (Enigmail) filter.decryptCopy.label=ایجاد نسخه رمزنگاری نشده (ِEnigmail) -# filter.decryptMove.warnExperimental=Warning - the filter action "Decrypt permanently" may lead to destroyed messages.\n\nWe strongly recommend that you first try the "Create decrypted Copy" filter, test the result carefully, and only start using this filter once you are satisified with the result. -# filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted +filter.decryptMove.warnExperimental=هشدار - عمل فیلتر "رمزگشایی دائمی" می تواند منجر به پیام های خراب شده شود.\n\nما توصیه اکید داریم تا اول از فیلتر "ایجاد کپی رمزگشایی شده" استفاده کنید، نتیجه را با دقت آزمایش کنید، و فقط این فیلتر را زمانی آغاز کنید که از نتیجه راضی می باشید. +filter.tempPepFilterDesc=فیلتر موقت برای نگهداری پیام رمزنگاری نشده ارسال شده filter.term.pgpencrypted.label=OpenPGP رمزنگاری شده -# filter.encrypt.label=Encrypt to key (Enigmail) +filter.encrypt.label=رمزنگاری بر کلید (Enigmail) filter.keyRequired=باید کلید گیرنده را مشخص کنید. -# filter.keyNotFound=Could not find an encryption key for "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +filter.keyNotFound=ناتوانی در یافتن یک کلید رمزنگاری برای 'S%'. +filter.warn.keyNotSecret=هشدار - عمل فیلتر "رمزنگاری بر کلید" گیرندگان را جایگزین خواهد کرد.\n\nاگر شما دارای کلید خصوصی برای 'S%' نمی باشید شما دیگر قادر به خواندن ایمیل ها نخواهید بود. # strings in enigmailConvert.jsm -# converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? -# converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? +converter.decryptBody.failed=ناتوانی در رمزگشایی پیام با موضوع\n'S%'.\nآیا میخواهید تا با یک عبارت عبور متفاوت تلاش کنید یا مایل به پرش پیام می باشید؟ +converter.decryptAtt.failed=ناتوانی در رمزگشایی پیوست'%1$S'\nاز پیام با موضوع\n '%2$S'.\nآیا میخواهید تا با یک عبارت عبور متفاوت تلاشی دیگر انجام دهید یا مایل به پرش از پیام می باشید؟ saveLogFile.title=ذخیره لاگ # strings in gpg.jsm unknownSigningAlg=الگوریتم امضاء ناشناخته (آیدی: S%) -# unknownHashAlg=Unknown cryptographic hash (ID: %S) +unknownHashAlg=هش رمزنگاری ناشناخته (آیدی:%S) # strings in keyRing.jsm keyring.photo=تصویر -# keyRing.pubKeyRevoked=The key %1$S (key ID %2$S) is revoked. -# keyRing.pubKeyExpired=The key %1$S (key ID %2$S) has expired. -# keyRing.pubKeyNotForSigning=The key %1$S (key ID %2$S) cannot be used for signing. -# keyRing.pubKeyNotForEncryption=The key %1$S (key ID %2$S) cannot be used for encryption. -# keyRing.keyDisabled=The key %1$S (key ID %2$S) is disabled; it cannot be used. -# keyRing.keyNotTrusted=The key %1$S (key ID %2$S) is not trusted enough. Please set the trust level of your key to "ultimate" to use it for signing. -# keyRing.keyInvalid=The key %1$S (key ID %2$S) is not valid. Please consider verifying it correctly. Alternatively use the Default encryption settings in the Enigmail preferences dialog. -# keyRing.signSubKeysRevoked=All signing-subkeys of key %1$S (key ID %2$S) are revoked. -# keyRing.signSubKeysExpired=All signing-subkeys of key %1$S (key ID %2$S) have expired. -# keyRing.signSubKeysUnusable=All signing-subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. -# keyRing.encSubKeysRevoked=All encryption subkeys of key %1$S (key ID %2$S) are revoked. -# keyRing.encSubKeysExpired=All encryption subkeys of key %1$S (key ID %2$S) have expired. -# keyRing.noSecretKey=You do not seem to have the secret key for %1$S (key ID %2$S) on your keyring; you cannot use the key for signing. -# keyRing.encSubKeysUnusable=All encryption subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. +keyRing.pubKeyRevoked=کلید %1$S (آیدی کلید %2$S) منقضی شد.\n +keyRing.pubKeyExpired=کلید %1$S ( آیدی کلید %2$S) انقضا یافته است. +keyRing.pubKeyNotForSigning=کلید %1$S (آیدی کلید %2$S) نمی تواند برای امضا کردن استفاده شود. +keyRing.pubKeyNotForEncryption=کلید %1$S ( آیدی کلید %2$S) نمی تواند برای رمزنگاری استفاده شود. +keyRing.keyDisabled=کلید %1$S ( آیدی کلید %2$S) غیرفعال شده است؛ قابل استفاده نمی باشد. +keyRing.keyNotTrusted=کلید %1$S ( آیدی کلید %2$S) به اندازه کافی مورد اعتماد نمی باشد. لطفا سطح اعتماد کلید خود را برای امضا کردن روی "نهایی" بگذارید. +keyRing.keyInvalid=کلید %1$S ( آیدی کلید %2$S) معتبر نمی باشد. لطفا سعی کنید آن را به درستی تایید کنید. در غیر این صورت از تنظیمات رمزنگاری پیشفرض در دیالوگ ترجیحات Enigmail استفاده کنید. +keyRing.signSubKeysRevoked=تمام امضاهای-زیرکلیدهای کلید کلید %1$S ( آیدی کلید %2$S) فسخ شده اند. +keyRing.signSubKeysExpired=تمام امضاهای-زیرکلیدهای کلید کلید %1$S ( آیدی کلید %2$S)  انقضا یافته اند. +keyRing.signSubKeysUnusable=تمام زیر کلید های امضا شده از کلید %1$S (آیدی کلید %2$S) فسخ شده اند، انقضا یافته یا قابل استفاده نمی باشند. +keyRing.encSubKeysRevoked=تمام زیرکلید های رمزنگاری شده کلید %1$S (آیدی کلید %2$S) فسخ شده اند. +keyRing.encSubKeysExpired=تمام زیر کلید های رمزنگاری کلید %1$S ( آیدی کلید %2$S) انقضا یافته است. +keyRing.noSecretKey=به نظر می آید شما کلید خصوصی برای کلید %1$S ( آیدی کلید %2$S)  در حلقه کلید خود ندارید؛ شما نمی توانید از کلید برای امضا استفاده کنید. +keyRing.encSubKeysUnusable=تمام زیرکلید های رمزنگاری کلید کلید %1$S ( آیدی کلید %2$S) فسخ شده اند، انقضا یافته اند یا به شکلی دیگر قابل استفاده نیستند. #strings in exportSettingsWizard.js -# cannotWriteToFile=Cannot save to file '%S'. Please select a different file. +cannotWriteToFile=ناتوانی در ذخیره سازی بر فایل 'S%'. لطفا یک فایل متفاوت را انتخاب کنید. dataExportError=خطایی در هنگام اکسپورت داده شما رخ داد. -# enigmailSettings=EnigmailSettings +enigmailSettings=تنظیماتEnigmail defaultBackupFileName=اکسپورت-Enigmail specifyExportFile=مشخص سازی نام فایل برای اکسپورت کردن -# homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. +homedirParamNotSUpported=پارامتر های اضافی که مسیر ها را پیکربندی میکنند مثل homedir-- و keyring-- برای برون برد/بازیابی تنظیمات شما پشتیبانی نمی شوند. لطفا از روش های دیگر مثل تنظیم متغیر محلی GNUPGHOME استفاده کنید. #strings in expiry.jsm -# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. -# expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. +expiry.keyExpiresSoon=کلید %1$S شما در کمتر از %2$S  روز انقضا خواهد یافت.\n\nما پیشنهاد می کنیم تا یک جفت کلید جدید ایجاد کنید و حساب های کاربری متناظر برای استفاده از آن را پیکربندی کنید. +expiry.keysExpireSoon=کلید های آمده شما در کمتر از %1$S روز انقضا خواهد یافت:\n%2$S. ما توصیه میکنیم تا کلید های جدید ایجاد کنید و حساب های کاربری متناظر را برای استفاده از آن ها پیکربندی کنید. +expiry.keyMissingOwnerTrust=کلید خصوصی S% شما فاقد اعتماد می باشد.\n\nما توصیه میکنیم "وابستگی به گواهی نامه ها" را به "نهایی" در ویژگی های کلید تنظیم کنید. +expiry.keysMissingOwnerTrust=کلید های خصوصی آمده فاقد اعتماد می باشند.\nS%.\nما توصیه میکنیم تا "شما وابسته به گواهی ها هستید" را "نهایی" در ویژگی های کلید تنظیم کنید. expiry.OpenKeyManager=باز کردن مدیریت کلید Enigmail -# expiry.OpenKeyProperties=Open Key Properties +expiry.OpenKeyProperties=باز کردن ویژگی های کلید #strings in pEpDecrypt.jsm -# pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. +pEpDecrypt.cannotDecrypt=این یک پیام رمزنگاری شده می باشد. متاسفانه شما کلید خصوصی برای رمزگشایی آن را ندارید. #strings in gpgAgent.jsm -# gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. -# gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. -# gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. -# gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +gpghomedir.notexists=دایرکتوری 'S%' حاوی کلید های OpenPGP شما موجود نمی باشد و نمی تواند ایجاد شود. +gpghomedir.notwritable=دایرکتوری '%S' شامل کلید های OpenPGP شما قابل نوشتن نمی باشد. +gpghomedir.notdirectory=دایرکتوری '%S' دربردارنده کلید های OpenPGP به جای یک دایرکتوری یک فایل می باشد. +gpghomedir.notusable=لطفا دسترسی های دایرکتوری را اصلاح کرده یا مکان دایرکتوری "خانه" GnuPG را تغییر دهید. GnuPG در غیر اینصورت به درستی کار نخواهد کرد. +gpgAgent.noAutostart=شما در حال استفاده از نسخه S% برنامه GnuPG می باشید. در این نسخه آغاز gpg-agent قبل از شروع Thunderbird ضروری می باشد، و متغیر محیطی "GPG_AGENT_INFO" از قبل بارگذاری شده است.\n\nاین پیش شرایط برقرار نشده اند - شما نمی توانید تا زمان حل این مسئله از Enigmail استفاده کنید. #strings in pepTrustWords.js -# pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. +pepTrustWords.cannotVerifyOwnId=ناتوانی در تایید کلمات اعتماد p≡p برای حساب خود. pepTrustWords.cannotFindKey=کلید برای S% پیدا نشد. pepTrustWords.cannotStoreChange=ناتوانی در تغییر اعتماد برای S%. -# pepTrustWords.generalFailure=Cannot obtain trustwords for %S. +pepTrustWords.generalFailure=ناتوانی در بدست آوردن کلمات اعتماد برای S%. pepTrustWords.partnerFingerprint=اثرانگشت برای S%: #strings in mimeWkdHandler.jsm -# wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. -# wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. +wkdMessage.body.req=ارائه دهنده ایمیل شما درخواست شما برای آپلود کلید عمومی خود بر دایرکتوری کلید وب OpenPGP را پردازش کرده است.\n\nلطفا روی دکمه تایید در هدر Enigmail کلیک کنید تا انتشار کلید عمومی خود را کامل کنید. +wkdMessage.body.process=این یک ایمیل مرتبط با پردازش خودکار برای آپلود کلید عمومی شما به دایرکتوری کلید وب OpenPGP می باشد.\n\nشما نیاز به انجام هیچ عملیات دستی در این مرحله ندارید. #strings in pepHandshake.js pepPrivacyStatus.RatingBrokenSuggestion=شما یا ارسال کننده باید دوباره پیام را بفرستید. pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=اگر شما این پیام را نوشتید، کلیدتان موجود نیست. -# pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. -# pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. +pepPrivacyStatus.RatingMistrustSuggestion=برقرارسازی دوباره اتصال به هم صحبت شما و تلاش برای تکمیل یک هندشیک دیگر. +pepPrivacyStatus.RatingReliableSuggestion=تکمیل یک دست دهی با هم صحبت خود از طریق تبادل کلمات اعتماد به صورت حضوری یا پشت تلفن. یک دست دهی تنها یکبار برای هر شریک مورد ضروری است و یک مکالمه امن و قابل اعتماد را تضمین می کند. pepPrivacyStatus.RatingTrustedSuggestion=به هیچ عملی نیاز نیست! -# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. +pepPrivacyStatus.RatingUndefinedSuggestionIncoming=آگاه باشید که این پیام ممکن است امن نباشد. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=لطفا اطلاعات ضروری را بیافزایید. -# pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. -# pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. +pepPrivacyStatus.RatingUnderAttackSuggestion=تایید محتوای این پیام با شریک ارتباطی خود از طریق یک کانال متفاوت +pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=اطمینان حاصل کنید که وضعیت حریم خصوصی برای هر هم صحبت لیست شده حداقل "امن" می باشد. +pepPrivacyStatus.RatingUnencryptedSuggestion=از هم صحبت خود بخواهید تا از یک راه حل رمزنگاری استفاده کند یا p≡p را نصب کند. +pepPrivacyStatus.RatingUnreliableSuggestion=این پیام دارای هیچ رمزنگاری قابل اعتمادی نمی باشد یا امضا ندارد. از هم صحبت خود بخواهید تا راه حل رمزنگاری خود را آپگرید کرده یا p≡p را نصب کند. -# pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. +pepPrivacyStatus.RatingBrokenExplanation=این پیام دارای رمزنگاری یا فرمت ناقص می باشد. pepPrivacyStatus.RatingHaveNoKeyExplanation=این پیام قابل رمزگشایی نیست چون کلید آن موجود نمی باشد. -# pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. +pepPrivacyStatus.RatingMistrustExplanation=این پیام یک هم صحبت دارد که قبلا به عنوان غیرقابل اعتماد علامت گذاری شده است. pepPrivacyStatus.RatingReliableExplanation=این پیام امن می باشد اما شما همچنان نیاز دارید تا هویت کسی که با آن در حال مکالمه هستید را تایید کنید. pepPrivacyStatus.RatingTrustedExplanation=این پیام امن و مورد اعتماد می باشد. pepPrivacyStatus.RatingUndefinedExplanation=این پیام اطلاعات کافی برای مشخص بودن امن بودن یا نبودن را شامل نمی شود. -# pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. +pepPrivacyStatus.RatingUnderAttackExplanation=این ‍پیام امن نمی باشد و دستکاری شده است. pepPrivacyStatus.RatingUnencryptedExplanation=این پیام امن نمی باشد. -# pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. +pepPrivacyStatus.RatingUnencryptedForSomeExplanation=این پیام برای برخی از هم صحبت ها ناامن می باشد. pepPrivacyStatus.RatingUnreliableExplanation=این پیام دارای محافظت غیرقابل اعتماد می باشد. pepPrivacyStatus.RatingBrokenText=خراب @@ -758,53 +767,91 @@ pepPrivacyStatus.RatingUnreliableText=امنیت غیرقابل اعتماد handshakeDlg.button.initHandshake=هندشیک... -# handshakeDlg.button.stopTrust=Stop Trusting -# handshakeDlg.button.reTrust=Stop Mistrusting +handshakeDlg.button.stopTrust=توقف اعتماد +handshakeDlg.button.reTrust=توقف بی اعتمادی handshakeDlg.label.outgoingMessage=پیام خروجی handshakeDlg.label.incomingMessage=پیام دریافتی -# handshakeDlg.error.noPeers=Cannot handshake without any correspondents. -handshakeDlg.error.noProtection=لطفا محافظت را فعال کنید تا بتوانید از عملیات هندشیک استفاده کنید. +handshakeDlg.error.noPeers=ناتوانی در دست دهی با هیچ یک از هم صحبت ها. +handshakeDlg.error.noProtection=لطفا محافظت را برای استفاده از عمل "دست دهی" فعال کنید. -# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device -# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup +enigmail.acSetupPasswd.descEnterPasswd=لطفا کد نصب که روی دستگاه دیگر نمایش داده شده است را وارد کنید. +enigmail.acSetupPasswd.descCopyPasswd=لطفا کد نصب آمده در پایین را روی دسگاه دیگر خود برای ادامه نصب وارد کنید. #strings in autocrypt.jsm -# autocrypt.setupMsg.subject=Autocrypt Setup Message -# autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +autocrypt.setupMsg.subject=پیام نصب Autocrypt +autocrypt.setupMsg.msgBody=برای برپا کردن Autocrypt برای دستگاه جدید خود، دستور العمل های نشان داده شده توسط دستگاه جدید خود را دنبال کنید. +autocrypt.setupMsg.fileTxt=این فایل نصب Autocrypt برای انتقال تنظیمات و کلیدها بین کلاینت ها مورد استفاده قرار میگیرد. شما میتوانید آن را با استفاده از کد نصب نمایش داده شده روی دستگاه قدیمی خود، رمزگشایی کرده و سپس کلید را از آن به درون حلقه کلید خود ببرید. #strings in upgradeInfo.html -# upgradeInfo.doctitle=What's New in Enigmail v2.0? -# upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! -# upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: -# upgradeInfo.encSubject.title=Encrypting the Message Subject -# upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) -# upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons -# upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. -# upgradeInfo.autocrypt.title=Support for Autocrypt -# upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. -# upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. -# upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. - -# pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +upgradeInfo.doctitle=چه چیزی در Enigmail v2.0 جدید می باشد؟ +upgradeInfo.welcome1=به نسخه Enigmail 2.0 خوش آمدید! +upgradeInfo.welcome2=این ریلیز شامل ویژگی های تغییر یافته و جدید زیادی میباشد. لطفا یک دقیقه وقت بگذارید و ببینید چه چیزهایی جدید است: +upgradeInfo.encSubject.title=در حال رمزنگازی موضوع پیام +upgradeInfo.encSubject.desc=ما یک روش جدید توسعه داده ایم که موضوع ایمیل را به داخل پیام رمزنگاری شده می برد، و موضوع قابل مشاهده را با "پیام رمزنگاری شده" جابجا خواهد کرد. زمانی که چنین پیامی رمزگشایی شد، موضوع اصلی به صورت خودکار جایگزین خواهد شد. پنهان سازی موضوع به صورت پیشفرض فعال است؛ یک ترجیح برای خاموش کردن آن در صورتی که مایل به آن نیستید موجود میباشد. (توجه: این ویژگی نیاز دارد تا پیام از طریق PGP/MIME ارسال شود.) +upgradeInfo.buttons.title=رفتار دکمه های امضا و رمزنگاری تغییر یافت +upgradeInfo.buttons.desc=دکمه های رمزنگاری و امضا در پنجره پیام نویسی هم اکنون هم برای پروتکل های OpenPGP و S/MIME کار می کند. اگر هر دو الگوریتم قابل استفاده باشند، در این صورت Enigmail سعی خواهد کرد تا آنی که برای تمام کلید ها موجود میباشد تا ترجیح خواهد داد. +upgradeInfo.autocrypt.title=پشتیبانی برای Autocrypt +upgradeInfo.autocrypt.desc=Enigmail هم اکنون از Autocrypt پشتیبانی میکند، یک استاندارد جدید برای توزیع کلید ها به عنوان بخشی از پیام های ارسال شده. Enigmail به صورت خودکار کلید ها را از پیام های سازگار با Autocrypt به درون خواهد برد، که با گذز زمان ایمیل های بیشتری رمزنگاری خواهند شد. +upgradeInfo.pEp.title=حالت جونیور p≡p جدید (Pretty Easy Privacy) +upgradeInfo.pEp.desc=Enigmail اکنون حاوی حالت جونیور p≡p می باشد. حالت جونیور p≡p به شما اجازه می دهد تا از رمزنگاری OpenPGP به صورت شفاف تا حد امکان استفاده کنید. دیگر نیازی نیست تا نگران مدیریت کلید و همگام سازی کلید ها بین دستگاه ها باشید. +upgradeInfo.bottom.desc=لطفا به مستندات ما به منظور کمک در استفاده از Enigmail مراجعه کنید. + +#strings in pEpAdapter.jsm +pep.missingGnuPG=برای استفاده از Enigmail/p≡p، نیاز به GnuPG می باشد. از آنجایی که ما نتوانستیم آن را پیدا کنیم، می توانیم آن را برای شما دانلود و نصب کنیم. +pep.updateAvailable=یک نسخه جدید از Enigmail/p≡p crypto-engine موجود می باشد. آیا مایل به دانلود و نصب به روز رسانی می باشید؟ #strings in enigmailAbout.html aboutEnigmail.tabName=درباره Enigmail aboutEnigmail.title=پشتیبانی OpenPGP تامین شده از جانب Enigmail -# aboutEnigmail.team=Enigmail is developed by the Enigmail Team: -# aboutEnigmail.projectLeader=Lead Developer: -# aboutEnigmail.usability=Usability: -# aboutEnigmail.documentation=Documentation: -# aboutEnigmail.testing=Testing: +aboutEnigmail.team=Enigmail توسط تیم Enigmail توسعه یافته است: +aboutEnigmail.projectLeader=توسعه دهنده اصلی: +aboutEnigmail.usability=قابلیت استفاده: +aboutEnigmail.documentation=مستندات +aboutEnigmail.testing=تست: aboutEnigmail.userSupport=پشتیبانی کاربر: -# aboutEnigmail.localization=Localization: See the Enigmail Language Packs page -# aboutEnigmail.Credits=Credits: -# aboutEnigmail.origAuthor=Original author of the Enigmail extension +aboutEnigmail.userSupport.team=تیم و اعضا انجمن/لیست +aboutEnigmail.localization=بومی سازی: به صفحه پک های زبان Enigmail نگاه کنید +aboutEnigmail.Credits=اعتبارات: +aboutEnigmail.origAuthor=سازنده اصلی افزونه Enigmail aboutEnigmail.icons=آیکون ها: -# aboutEnigmail.formerMembers=Former team members: +aboutEnigmail.formerMembers=اعضا قبلی تیم: aboutEnigmail.projectHosting=میزبانی پروژه: -# aboutEnigmail.licenseSupportTitle=License & Support -# aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S +aboutEnigmail.licenseSupportTitle=لایسنس & پشتیبانی +aboutEnigmail.license=Enigmail OpenPGP متن باز بوده و دارای لایسنس S% می باشد aboutEnigmail.support=پشتیبانی و دانلود از طریق www.enigmail.net موجود می باشد. + +#strings in updateGnuPG.html +updateGnuPG.tabName=به روز رسانی GnuPG +updateGnuPG.title=به روز رسانی ها برای GnuPG +updateGnuPG.introduction.desc=Enigmail نیاز به GnuPG دارد تا بتواند عملیات های رمزنگاری اش را انجام دهد. ما توصیه میکنیم تا نصب GnuPG خود را به روز نگه دارید. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +updateGnuPG.noUpdateRequired=GnuPG به روز می باشد. +updateGnuPG.cannotUpdate.header=Enigmail فقط از به روز رسانی پکیج های آمده پشتیبانی میکند: +updateGnuPG.cannotUpdate.footer=به نظر می آید شما در حال استفاده از نوع دیگری GnuPG می باشید؛ متاسفانه برای Enigmail به روز رسانی نصب GnuPG ممکن نمی باشد. +updateGnuPG.installUpdate=نصب به روز رسانی +updateGnuPG.noMoreUpdates=بررسی نکردن به روز رسانی های آینده +updateGnuPG.checkUpdate=بررسی برای بروزرسانی های GnuPG + + +#strings in keyserver.jsm +keyserver.error.aborted=لغو شد +keyserver.error.unknown=خطا ناشناخته ای رخ داد +keyserver.error.serverError=سرور کلید یک خطا گزارش کرد. +keyserver.error.importError=ناتوانی در درون برد برای کلید دانلود شده. +keyserver.error.unavailable=سرور کلید موجود نمی باشد. +keyserver.error.securityError=سرور کلید دسترسی رمزنگاری شده را پشتیبانی نمی کند. +keyserver.error.certificateError=گواهی سرور کلید معتبر نمی باشد. +keyserver.error.unsupported=سرور کلید توسط Enigmail پشتیبانی نمی شود. + +#strings in mimeDecrypt.jsm +mimeDecrypt.encryptedPart.attachmentLabel=بخش رمزنگاری شده پیام +mimeDecrypt.encryptedPart.concealedData=این یک بخش رمزنگاری شده پیام میباشد. نیاز است تا آن را در یک پنجره جدا با کلیک بر روی پیوست باز کنید. + +#strings in gnupg-key.jsm +import.secretKeyImportError=خطایی در وارد کردن کلید های خصوصی در GnuPG رخ داده است. واردات موفق نبود. + +#strings in importSettings.js +importSettings.errorNoFile=فایلی که شما مشخص کرده اید یک فایل عادی نمی باشد! +importSettings.cancelWhileInProgress=بازیابی در حال انجام است. آیا واقعا می خواهید این رویه را لغو کنید؟ +importSettings.button.abortImport=&لغو رویه diff -Nru enigmail-2.0.12+ds1/lang/fi/enigmail.dtd enigmail-2.1.3+ds1/lang/fi/enigmail.dtd --- enigmail-2.0.12+ds1/lang/fi/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/fi/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ - - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,11 +63,8 @@ - - - @@ -89,12 +77,13 @@ + - + @@ -117,6 +106,9 @@ + + + @@ -209,6 +201,7 @@ + @@ -217,8 +210,8 @@ - - + + @@ -345,7 +338,7 @@ - + @@ -368,7 +361,6 @@ - @@ -456,8 +448,8 @@ - - + + @@ -542,7 +534,7 @@ - + @@ -623,7 +615,7 @@ - + @@ -665,127 +657,35 @@ - - + - - - - - - - - - - - - - - - - - -Huom.: Enigmail varmentaa jokaisen sähköpostin - - - allekirjoitukset riippumatta tilistä tai käyttäjätunnuksesta"> - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Kiitos Enigmail-tiimin puolesta."> - - - - - - - - - + + + + + + + + + + + - + @@ -801,7 +701,9 @@ - + + + @@ -860,9 +762,19 @@ - + + - + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/fi/enigmail.properties enigmail-2.1.3+ds1/lang/fi/enigmail.properties --- enigmail-2.0.12+ds1/lang/fi/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/fi/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=Enigmail-hälytys -enigConfirm=Enigmail-vahvistus +# enigConfirm=Enigmail Confirmation # enigInfo=Enigmail Information enigError=Enigmail-virhe enigPrompt=Enigmail-kehote @@ -78,7 +78,7 @@ passSpaceProblem=Teknisistä syistä, tunnuslauseen voi aloittaa tai päättää välilyöntiin changePassFailed=Salasanan vaihtaminen epäonnistui. -keyConfirm=Luodaanko julkinen ja salain avain käyttäjälle "%S"? +# keyConfirm=Generate public and secret key for '%S'? keyMan.button.generateKey=&Luo avain keyAbort=Peruutetaanko avaimen luonti? keyMan.button.generateKeyAbort=&Keskeytä avainten luonti @@ -86,14 +86,14 @@ expiryTooLong=Avaimen vanhenemisaika ei voi ylittää 100:a vuotta. expiryTooLongShorter=Et pysty määrittämään avaimen vanhenenemista yli 90 vuoden päähän. expiryTooShort=Avain ei voi vanheta alle päivässä. -keyGenFailed=Avaimen luonti epäonnistui. Tarkista yksityiskohdat Enigmail-konsolin viesteistä (Valitse Enigmail > Enigmail:n virheenjäljitys). +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. setKeyExpirationDateFailed=Päättymispäivää ei ole muutettu # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail-turvallisuustietoja\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Tämän viestin liitteitä ei ole allekirjoitettu tai salattu*\n\n +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=Viesti on mahdollisesti PGP/MIME-salattu tai -allekirjoitettu. Napsauta Pura-painiketta varmistaaksesi saveAttachmentHeader=Enigmail: Tallenna purettu liitetiedosto @@ -102,7 +102,7 @@ beginPgpPart=********* *SALATTU tai ALLEKIRJOITETTU OSA ALKAA* ********* endPgpPart=********** *SALATTU tai ALLEKIRJOITETTU OSA LOPPUU* ********** -notePartEncrypted=Enigmail: *Osia viestistä EI OLE allekirjoitettu tai salattu* +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *Viesti on jaettu useaan lohkoon -- Salauksen purku tai allekirjoituksen varmistus peruutettiin* decryptOkNoSig=Varoitus\n\nSalauksen purkaminen onnistui, mutta allekirjoitus ei varmistunut oikein @@ -114,6 +114,7 @@ # fixBrokenExchangeMsg.failed=Did not succeed to repair message. enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. @@ -148,10 +149,9 @@ minimalLineWrapping=Viestit rivittyvät tällä hetkellä %S merkin leveyteen. Jotta viestejä voi salata tai allekirjoittaa, merkkejä täytyy mahtua riville vähintään 68.\nMuutetaanko riville mahtuvien merkkien määrä 68:ksi? warning=Varoitus signIconClicked=Olet muokannut allekirjoitusta. Tämän takia kirjoittaessasi tätä viestiä, allekirjoittaminen ja viestin salaaminen eivät enää riipu toisistaan. -# 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. +# 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.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. # msgCompose.internalEncryptionError=Internal Error: promised encryption disabled @@ -164,7 +164,6 @@ # msgCompose.toolbarTxt.disabled=Enigmail is disabled for the selected identity # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject -# msgCompose.encryptedSubjectStub=Encrypted Message # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject @@ -179,7 +178,7 @@ # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -# pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=Tallennetaanko %S viesti vastaanottajalle %S lähtevien viestien kansioon? onlineSend=Lähetä %S viesti vastaanottajalle %S? -encryptKeysNote=Huom.: viesti on salattu seuraavilla käyttäjätunnuksilla / avaimilla: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S # hiddenKey= -signFailed=Enigmail-virhe. Salaus tai allekirjoitus epäonnistui. Lähetetäänkö viesti salaamatta? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=Lähetä salaamaton viesti recipientsSelectionHdr=Valitse vastaanottajat joiden viestit salataan @@ -225,9 +224,9 @@ # signOffWithReason=Signing: OFF (%S) # reasonEnabledByDefault=enabled by default # reasonManuallyForced=manually forced -# reasonByRecipientRules=forced by recipient rules +# reasonByRecipientRules=forced by per-recipient rules # reasonByAutoEncryption=forced by auto encryption -# reasonByConflict=due to conflict in recipient rules +# reasonByConflict=due to conflict in per-recipient rules # reasonByEncryptionMode=due to encryption mode # should not be used anymore: @@ -252,9 +251,9 @@ # pgpmimeNo=Inline PGP will be used # Attach own key status (tooltip strings): -# attachOwnKeyNo=Your own key will not be attached -# attachOwnKeyYes=Your own key will be attached -# attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Vastaanottajakohtaisissa säännöissä ristiriitoja\n%S\n\nLähetetäänkö viesti näillä asetuksilla? msgCompose.button.configure=&Määritä @@ -269,6 +268,10 @@ # clickDetailsButton=; click on 'Details' button for more information # clickImportButton=; click on the 'Import Key' button to import the key # keyTypeUnsupported=; the key type is not supported by your version of GnuPG +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Pura salaus msgPart=Osa viestistä %S msgSigned=allekirjoitettu # msgSignedUnkownKey=signed with unknown key @@ -280,8 +283,10 @@ needKey=Virhe - salauksen purkaminen vaatii salaisen avaimen failedDecrypt=Virhe - salauksen purkaminen epäonnistui badPhrase=Virhe - väärä salasana +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=Virhe - salauksen purkaminen tai viestin varmistus epäonnistui viewInfo=. Näytä > Viestin turvallisuustiedot lukeaksesi lisätietoja +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=Viesti, jonka salaus on purettu # decryptedMsgWithFormatError=Decrypted message (restored broken PGP email format probably caused by an old Exchange server, so that the result might not be perfect to read) @@ -326,6 +331,7 @@ # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. @@ -337,6 +343,8 @@ prefs.warnAskNever=Varoitus: Asetuksen seurauksena sähköpostiviestit lähetetään salaamatta siitä erikseen ilmoittamatta jos jollekin vastaanottajista ei löydy avainta! # prefs.warnIdleTimeForUnknownAgent=Cannot connect to gpg-agent. Maybe your system uses a specialized tool for passphrase handling (e.g. gnome-keyring, seahorse-agent, KDE wallet manager, ...). Unfortunately Enigmail cannot control the passphrase timeout for the tool you are using. Therefore the respective timeout settings in Enigmail are disregarded. # prefEnigmail.oneKeyserverOnly=Error - you can only specify one keyserver for automatic downloading of missing OpenPGP keys. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +# aboutLicense.desc=Enigmail is open source and licensed under the Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=Virhe - salasanaa ei ole annettu noPGPblock=Virhe - Ei löydetty kelvollista koodattua OpenPGP-dataosiota unverifiedReply=Viestin sisennettyä osaa (vastausta) on luultavasti muokattu -# keyInMessageBody=Key in message body found. Click 'Import Key' to import the key +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=Virhe - Allekirjoitus ei ole täsmää -cantImport=Julkisen avaimen tuonnissa tapahtui virhe\n\n +# cantImport=Error importing public key\n\n # doImportOne=Import %1$S (%2$S)? # doImportMultiple=Import the following keys?\n\n%S # previewFailed=Can't read public key file. @@ -366,14 +374,15 @@ # sc.removeCard=The operation requires no SmartCard to be in the reader.\nPlease remove your SmartCard and repeat the operation. sc.noCardAvailable=Älykorttia ei löydetty lukijasta.\nAseta älykortti kortinlukijaan ja yritä uudestaan sc.noReaderAvailable=Älykortinlukijaan ei saatu yhteyttä\nKiinnitä älykortinlukija tietokoneeseen, aseta kortti lukijaan ja yritä uudestaan -# keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. -# keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. # keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. # missingPassphrase=Missing passphrase # errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. # errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=GnuPG-ohjelmaa %S ei löytynyt.\nTarkista, että GnuPG:n ohjelmatiedoston kansio on asetettu oikein Enigmail:n asetuksissa @@ -384,9 +393,8 @@ prefBad=VääRä allekirjoitus lähettäjältä %S failCancel=Virhe - Avaimen nouto peruutettiin -failNoServer=Virhe - Ei annettu avainpalvelinta, jolta avain noudetaan -failNoID=Virhe - Ei annettu käyttäjätunnusta, jolle avain noudetaan failKeyExtract=Virhe - avaimen tuonti viestistä epäonnistui +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=Virhe - Ensimmäinen OpenPGP-osio ei ole julkinen avain importKeyConfirm=Tuodaanko viestiin sisällytetyt avaimet? failKeyImport=Virhe - avainten tuonti epäonnistui @@ -425,6 +433,8 @@ identityName=Käyttäjätiedot: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Salaus on otettu käyttöön, mutta yhtäkään avainta ei ole valittu. Salataksesi osoitteeseen %S lähetettävät viestit, valitse avainlistasta yksi tai useampi voimassaoleva avaimesi. Poistetaanko salaus käytöstä osoitteelle %S? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=Valitsemasi toiminto ei ole käytettävissä ilman verkkoyhteyttä. Siirry verkkoyhteystilaan ja yritä uudelleen. -protocolNotSupported=OpenPGP-avaimia ei voi noutaa käyttäen antamaasi yhteyskäytäntöä "%S://". -gpgkeysDisabled=Asetuksen "extensions.enigmail.useGpgKeysTool" ottaminen käyttöön voisi olla avuksi. noKeyserverConn=Yhteys avainpalvelimeen %S epäonnistui. -keyDownloadFailed=Avaimen nouto avainpalvelimelta epäonnistui. Virheilmoitus oli:\n%S internalError=Tapahtui sisäinen virhe. Avainten nouto tai tuonti epäonnistui. -noKeyFound=Ikävä kyllä yhtään avainta annetulle sähköpostiosoitteelle ei löytynyt. -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Avainten haku tai nouto avainpalvelimelta epäonnistui: ohjelmaa gpgkeys_%S ei kyetty suorittamaan. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Avaimen omistajan luottamustason asettaminen epäonnistui @@ -490,7 +493,6 @@ asciiArmorFile=ASCII-koodatut tiedostot (*.asc) importKeyFile=Tuo OpenPGP avain tiedoston gnupgFile=GnuPG-tiedostot -# createKeyOK=Your Key has been generated saveRevokeCertAs=Luo ja tallenna mitätöintivarmenne # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=Mitätöintivarmenteen luonti epäonnistui. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%S (0x%S) julk-sal defaultPubKeyFilename=Viedyt-julkiset-avaimet defaultPubSecKeyFilename=Viedyt-julkiset-ja-salaiset-avaimet -noSecretKeys=Salaisia avaimia ei löytynyt.\n\nLuodaanko avain nyt? sendKeysOk=Avaimet lähetittiin onnistuneesti sendKeysFailed=Avainten lähettäminen epäonnistui receiveKeysOk=Avainten päivitys onnistui receiveKeysFailed=Avainten nouto epäonnistui +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=Tuodaanko leikepöydällä olevat avaimet? # importFromUrl=Download public key from this URL: copyToClipbrdFailed=Avainten vienti leikepöydälle epäonnistui. copyToClipbrdOK=Avaimet kopioitiin leikepöydälle -deleteSecretKey=VAROITUS: Olet poistamassa salaista avainta!\nAvaimelle salattuja viestejä ei voida enää purkaa jos avain poistetaan.\n\nPoistetaanko SEKÄ julkinen ETTÄ salainen avain\n"%S"? +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=VAROITUS: Olet poistamassa salaisia avaimia!\nAvaimelle salattuja viestejä ei voida enää purkaa jos avain poistetaan.\n\nPoistetaanko SEKÄ valitut julkiset ETTÄ salaiset avaimet? deletePubKey=Poistetaanko julkinen avain tunnukselle\n%S? deleteSelectedPubKey=Poistetaanko julkinen avain? @@ -529,7 +531,7 @@ # revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? revokeKeyOk=Avain on mitätöity. Jos avain on saatavilla avainpalvelimelta, siirrä mitätöity avain palvelimelle, jotta muutkin näkevät mitätöinnin. revokeKeyFailed=Avaimen mitätöinti epäonnistui. -# revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Yhtään avainta ei valittu. Päivitetäänkö kaikki avaimet? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? @@ -541,21 +543,21 @@ keyMan.button.import=&Tuo keyMan.button.refreshAll=&Päivitä kaikki avaimet keyMan.button.revokeKey=&Peruuta avain -keyMan.button.skip=&Ohita avain keylist.noOtherUids=Ei ole muuta identiteettiä # keylist.hasOtherUids=Also known as -keylist.noPhotos=Ei valokuvaa saatavilla -keylist.hasPhotos=Valokuvat +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos keyMan.addphoto.filepicker.title=Valokuva -# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files because the keys get very large by this. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. # keyMan.addphoto.noJpegFile=The selected file does not appear to be a JPEG file. Please choose a different file. keyMan.addphoto.failed=Valokuvaa ei voitu lisätä # noWksIdentity=The key %S does not have a WKS identity. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? -# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=PIN-koodin vaihtaminen ei onnistunut -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Päivitetään avaimia, ole hyvä ja odota... keyserverProgress.uploading=Siirretään avaimia avainpalvelimella, ole hyvä ja odota... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Päivitetään avaimia keyserverTitle.uploading=Avainten siirto +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=Salasanan tulee olla ainakin 8-kirjainta pitkä. -setupWizard.reallyCancel=Peruutetaanko Enigmail:n ohjattu asennus? # setupWizard.invalidGpg=The file you specified is not a GnuPG executable. Please specify a different file. -# setupWizard.specifyFile=You need to at least specify a public key file in order to proceed. # setupWizard.installFailed=It seems that the installation was not successful. Please either retry the installation, or install GnuPG manually and locate it using the Browse button. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. -# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or manipulated. Do you want to continue the installation anyway? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? # setupWizard.importSettingsFile=Specify backup file to load from -# setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. # setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? -# setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm # installGnuPG.downloadFailed=An error occurred while trying to download GnuPG. Please check the console log for further details. @@ -654,12 +662,12 @@ # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. -# filter.keyNotFound=Could not find an encryption key for "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -# converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? -# converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? # saveLogFile.title=Save Log File @@ -691,13 +699,13 @@ # enigmailSettings=EnigmailSettings # defaultBackupFileName=Enigmail-export # specifyExportFile=Specify file name for exporting -# homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm -# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. -# expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties @@ -709,6 +717,7 @@ # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. @@ -728,12 +737,12 @@ # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! -# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. -# pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. @@ -763,16 +772,16 @@ # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. -# handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device -# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? @@ -785,10 +794,12 @@ # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. +#strings in pEpAdapter.jsm # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=Tietoja Enigmail:stä @@ -799,6 +810,7 @@ # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: +# aboutEnigmail.userSupport.team=the team and the list/forum members # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension @@ -808,3 +820,38 @@ # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/fr/enigmail.dtd enigmail-2.1.3+ds1/lang/fr/enigmail.dtd --- enigmail-2.0.12+ds1/lang/fr/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/fr/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,15 +2,13 @@ -license public Mozilla 2.0."> - - + @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,9 +43,11 @@ + - + + @@ -72,17 +63,9 @@ - - - - -Le transfert de clé Autocrypt exige que le client de courriel de l’autre appareil soit conforme Autocrypt. -Bien que ce soit la solution la plus facile, seul un nombre limité de clients prennent cette norme en charge actuellement. -L’autre manière est de sauvegarder et restaurer vos paramètres. -Cela créera un fichier ZIP contenant tous les renseignements et clés nécessaires que vous pourrez copier sur votre nouvel appareil. -Enigmail peut importer ces paramètres directement ; pour les autres clients de courriel, le fichier ZIP peut être décompressé et traité manuellement."> + - + @@ -94,12 +77,13 @@ + - +  »"> @@ -122,6 +106,9 @@ + + + @@ -214,6 +201,7 @@ + @@ -309,15 +297,15 @@ - - - - - - - - - + + + + + + + + + @@ -326,7 +314,7 @@ - + @@ -341,7 +329,7 @@ - + @@ -350,7 +338,7 @@ - + @@ -373,13 +361,12 @@ -Autocrypt est une norme qui définit la mise en place commode du chiffrement de bout en bout des courriels. Elle définit la négociation par les programmes de courriel des capacités de chiffrement en utilisant des courriels ordinaires."> - + @@ -392,9 +379,9 @@ - + - + @@ -426,7 +413,7 @@ - + @@ -446,14 +433,14 @@ - + - + @@ -461,15 +448,15 @@ - - + + - + - + @@ -479,10 +466,10 @@ - + - + @@ -547,12 +534,12 @@ - + - + @@ -651,7 +638,7 @@ - + @@ -670,133 +657,39 @@ - - - - - - - - - - - - - - - - - - - - -Note : Enigmail vérifiera toujours les signatures des courriels pour tous les comptes et identités, qu’il soit activé ou non."> - + + - - +Si vous le souhaitez, cliquez sur le bouton « Installer GnuPG » pour télécharger et installer GnuPG."> + - - - - - - - - - - - - - - - - -clé publique permet aux autres de vous envoyer des courriels chiffrés. Vous pouvez la distribuer à tout le monde."> -clé privée vous permet de déchiffrer ces courriels et d’envoyer des courriels signés. -Vous ne devriez la donner à personne."> -clé privée vous permet de déchiffrer ces courriels et d’envoyer des courriels signés. -Vous ne devriez la donner à personne. -Pour protéger votre clé privée, vous serez invité à saisir une phrase de passe dans les deux boîtes de dialogue suivantes."> -phrase de passe protège votre clé privée. Elle prévient l’usage abusif de votre clé privée."> -ne sont pas recommandés."> - - - - - - - - - - - - - - - - - - - - - - - - -Votre mot de passe vous sera demandé. Veuillez transférer le certificat vers un support qui peut être rangé en toute sécurité comme un CD ou une clé USB. Si quelqu’un accédait à ce certificat, il pourrait s’en servir pour rendre votre clé inutilisable."> - - - - - - - - - - - -exporter vos données du premier ordinateur en utilisant l’assistant de sauvegarde dans le préférences d’Enigmail - importer les données dans le second ordinateur en utilisant cet assistant. -"> - - - - - - -Nous vous remercions d’utiliser Enigmail."> -Si vous souhaitez le faire, veuillez confirmer la demande que vous trouverez dans votre boîte de réception."> - - - - - - - + + + + + + + + + + + - - - + - + @@ -810,17 +703,15 @@ - + - -exporter vos données du premier ordinateur en utilisant cet assistant - importer les données dans le second ordinateur en utilisant l’assistant de configuration. -"> + + + - @@ -835,7 +726,7 @@ - + @@ -852,7 +743,7 @@ - + @@ -862,7 +753,7 @@ - + @@ -876,12 +767,21 @@ - -Veuillez sélectionner ci-dessous le compte pour lequel vous souhaitez transférer votre clé. -Un code de configuration (mot de passe) sera affiché sur l’écran suivant. Vous devrez le saisir sur votre appareil afin d’importer votre clé et les paramètres associés."> + + -Veuillez maintenant passer sur l’autre appareil et ouvrir le courriel. Un code de sécurité vous sera demandé. Veuillez alors saisir les chiffres suivants :"> + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/fr/enigmail.properties enigmail-2.1.3+ds1/lang/fr/enigmail.properties --- enigmail-2.0.12+ds1/lang/fr/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/fr/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,8 +6,8 @@ ##################################################################### enigAlert=Alerte Enigmail -enigConfirm=Confirmation Enigmail -enigInfo=Informations Enigmail +enigConfirm=Confirmation d’Enigmail +enigInfo=Renseignements Enigmail enigError=Erreur Enigmail enigPrompt=Invite Enigmail @@ -33,7 +33,7 @@ noRepeat=\n\nCette alerte ne sera pas répétée jusqu’à la mise à niveau d’Enigmail. pgpNotSupported=Vous semblez utiliser Enigmail avec PGP 6.x.\n\nMalheureusement, PGP 6.x présente un certain nombre de problèmes qui empêchent Enigmail de fonctionner correctement. C’est pourquoi Enigmail ne prend plus en charge PGP 6.x ; veuillez plutôt utiliser GnuPG (GPG).\n\nPour de l’aide sur le passage à GnuPG, consulter la section Aide de la page d’accueil d’Enigmail. -initErr.howToFixIt=GnuPG est exigé pour utiliser Enigmail. Si vous n’avez pas encore installé GnuPG, le bouton « Assistant d’installation » ci-dessous vous permet de le faire, facilement. +initErr.howToFixIt=GnuPG est exigé pour utiliser Enigmail. Si vous n’avez pas encore installé GnuPG, le bouton « Assistant d’installation » ci-dessous vous permet de le faire, facilement. initErr.setupWizard.button=A&ssistant de configuration passphraseCleared=La phrase de passe n’est plus mémorisée. cannotClearPassphrase=Vous utilisez un outil atypique (comme le trousseau gnome-keyring) pour gérer les phrases de passe. Il est donc impossible d’effacer la phrase de passe à partir d’Enigmail. @@ -46,13 +46,13 @@ # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Cette nouvelle version d’Enigmail offre des changements importants dans la manière de gérer les préférences et options. Nous avons essayé de transférer les anciens paramètres vers cette nouvelle version. Cependant, nous ne pouvons pas traiter tous les cas automatiquement. Veuillez vérifier les nouvelles préférences et options générées ainsi. enigmailCommon.checkPreferences=Vérifier les préférences… -preferences.defaultToPgpMime=Nous avons changé l’encodage par défaut dans Enigmail de PGP intégré (inline) à PGP/MIME. Nous vous recommandons de conserver ce réglage.\n\nSi vous souhaitez quand même utiliser PGP intégré par défaut, vous pouvez le configurer dans Paramètres de compte > Sécurité OpenPGP +preferences.defaultToPgpMime=Nous avons changé l’encodage par défaut des courriels dans Enigmail de PGP intégré à PGP/MIME. Nous vous recommandons de conserver ce réglage.\n\nSi vous souhaitez quand même utiliser PGP intégré par défaut, vous pouvez le configurer dans Paramètres de compte > Sécurité OpenPGP ##################################################################### # Strings in enigmailAbout.js ##################################################################### -usingVersion=Enigmail version %S est utilisé +usingVersion=Enigmail version %S est utilisée enigmailPepVersion=Enigmail/p≡p version %S usingAgent=L’exécutable %1$S %2$S est utilisé pour chiffrer et déchiffrer agentError=ERREUR : échec d’accès au service principal d’Enigmail ! @@ -78,7 +78,7 @@ passSpaceProblem=Pour des raisons techniques, votre phrase de passe ne peut ni commencer ni se terminer par une espace. changePassFailed=Échec de modification de la phrase de passe. -keyConfirm=Générer les clés publique et privée pour %S ? +keyConfirm=Générer une clé publique et secrète pour « %S » ? keyMan.button.generateKey=&Générer une clé keyAbort=Abandonner la génération de clé ? keyMan.button.generateKeyAbort=&Abandonner la génération de clé @@ -86,41 +86,42 @@ expiryTooLong=Vous ne pouvez pas créer une clé qui expirera dans plus de 100 ans. expiryTooLongShorter=Vous ne pouvez pas créer une clé qui expirera dans plus de 90 ans. expiryTooShort=Votre clé doit être valide pendant au moins un jour. -keyGenFailed=Échec de génération de la clé. Veuillez consulter la console Enigmail (Menu Enigmail > Options de débogage) pour plus de détails. +keyGenFailed=La génération de la clé a échoué. Veuillez consulter la console d’Enigmail (Menu Enigmail > Options de débogage) pour plus de précisions. setKeyExpirationDateFailed=Impossible de modifier la date d’expiration # Strings in enigmailMessengerOverlay.js securityInfo=Informations de sécurité d’Enigmail\n\n enigHeader=Enigmail : -enigContentNote=Enigmail : *les pièces jointes à ce courriel n’ont été ni signées ni chiffrées*\n\n +enigContentNote=Enigmail : *Les fichiers joints à ce courriel n’ont été ni signés ni chiffrés*\n\n possiblyPgpMime=Possiblement un courriel chiffré ou signé avec PGP/MIME ; utiliser la fonction Déchiffrer/vérifier pour le vérifier -saveAttachmentHeader=Enigmail : enregistrer la pièce jointe déchiffrée +saveAttachmentHeader=Enigmail : enregistrer le fichier joint déchiffré noTempDir=Impossible de trouver un répertoire temporaire vers lequel écrire\nVeuillez définir la variable d’environnement TEMP -attachmentPgpKey=La pièce jointe « %S » que vous souhaitez ouvrir semble être un fichier de clé OpenPGP.\n\nCliquer sur Importer pour importer la clé contenue ou Visualiser pour visualiser le contenu du fichier dans une fenêtre de navigation +attachmentPgpKey=Le fichier joint « %S » que vous souhaitez ouvrir semble être un fichier de clé OpenPGP.\n\nCliquer sur Importer pour importer la clé contenue ou Visualiser pour visualiser le contenu du fichier dans une fenêtre de navigation beginPgpPart=********* *DÉBUT DE LA PARTIE CHIFFRÉE ou SIGNÉE* ********* endPgpPart=********** *FIN DE LA PARTIE CHIFFRÉE ou SIGNÉE* ********** notePartEncrypted=Enigmail : *Des parties du courriel n’ont été NI signées NI chiffrées* -noteCutMessage=Enigmail : *plusieurs blocs de courriel ont été trouvés — le déchiffrement, la vérification ont été abandonnés* +noteCutMessage=Enigmail : *plusieurs blocs de courriel ont été trouvés – le déchiffrement, la vérification ont été abandonnés* decryptOkNoSig=Avertissement\n\nLe déchiffrement a réussi, mais la signature n’a pas pu être vérifiée correctement msgOvl.button.contAnyway=&Continuer quand même -signature.verifiedOK=La signature pour la pièce jointe %S a été vérifiée avec succès -signature.verifyFailed=Impossible de vérifier la signature de la pièce jointe %S -attachment.noMatchToSignature=Impossible de faire correspondre la pièce jointe « %S » à un fichier de signature -attachment.noMatchFromSignature=Impossible de faire correspondre le fichier de signature « %S » à une pièce jointe +signature.verifiedOK=La signature a été vérifiée avec succès pour le fichier joint %S +signature.verifyFailed=Impossible de vérifier la signature du fichier joint %S +attachment.noMatchToSignature=Impossible de faire correspondre le fichier joint « %S » à un fichier de signature +attachment.noMatchFromSignature=Impossible de faire correspondre le fichier de signature « %S » à un fichier joint fixBrokenExchangeMsg.failed=La réparation du courriel n’a pas été possible. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +detailsDlg.importKey=Importer la clé wksNoIdentity=Cette clé n’est liée à aucun de vos comptes de courriel. Veuillez ajouter un compte pour au moins l’une des adresses courriel suivantes :\n\n%S wksConfirmSuccess=Le courriel de confirmation a été envoyé. wksConfirmFailure=Échec d’envoi du courriel de confirmation. autocrypt.importSetupKey.accountPreconfigured=Votre compte est déjà configuré correctement pour Autocrypt.\n\nVoulez-vous vraiment remplacer vos paramètres par ce courriel de configuration ? autocrypt.importSetupKey.selfCreated=Ce courriel a été créé par votre instance actuelle d’Enigmail.\n\nVeuillez basculer vers le client de courriel vers lequel vous souhaitez transférer les paramètres et cliquer sur le courriel s’y trouvant pour importer les paramètres. -autocrypt.importSetupKey.invalidMessage=Erreur — impossible de lire le courriel de configuration. Le courriel semble corrompu. Veuillez essayer de créer un nouveau courriel de configuration sur votre « autre » appareil. -autocrypt.importSetupKey.invalidKey=Erreur — impossible d’importer la clé. La clé n’est soit pas prise en charge par cette version de GnuPG, soit corrompue. +autocrypt.importSetupKey.invalidMessage=Erreur – impossible de lire le courriel de configuration. Le courriel semble corrompu. Veuillez essayer de créer un nouveau courriel de configuration sur votre « autre » appareil. +autocrypt.importSetupKey.invalidKey=Erreur – impossible d’importer la clé. La clé n’est soit pas prise en charge par cette version de GnuPG, soit corrompue. autocrypt.importSetupKey.wrongPasswd=Le mot de passe que vous avez saisi est erroné. Souhaitez-vous ressayer ? autocrypt.importSetupKey.success=Le courriel de configuration Autocrypt a été traité avec succès. Autocrypt est maintenant proposé pour votre compte « %S » @@ -140,19 +141,18 @@ sendWithShownBcc=Chiffrer normalement sendingNews=L’opération d’envoi chiffré a été annulée.\n\nCe courriel ne peut pas être chiffré, car certains destinataires sont des forums. Veuillez renvoyer le courriel sans chiffrement. sendToNewsWarning=Avertissement : Vous êtes sur le point d’envoyer un courriel chiffré à un forum.\n\nCela est déconseillé, car il ne serait logique de le faire que si tous les membres du forum peuvent déchiffrer le courriel, c.-à-d. que le courriel doit être chiffré avec les clés de tous les membres du forum. Veuillez n’envoyer ce courriel que si vous savez exactement ce que vous faites.\n\nContinuer ? -hasHTML=Avertissement de courriel HTML :\nCe courriel contient peut-être du HTML, ce qui pourrait entraîner l’échec de la signature ou du chiffrement. Pour éviter cela à l’avenir, vous devriez appuyer sur la touche Maj en cliquant sur le bouton Rédiger/Répondre pour envoyer un courriel signé.\nSi vous signez les courriels par défaut, vous devriez décocher le paramètre « Rédiger les courriels en HTML » afin de désactiver de façon permanente les courriels HTML pour ce compte de courriel. -strippingHTML=Le courriel contient des informations de formatage HTML qui seront perdues lors de la conversion en texte clair pour la signature ou le chiffrement. Souhaitez-vous continuer ? +hasHTML=Avertissement de courriel HTML :\nCe courriel comprend peut-être du HTML, ce qui pourrait entraîner l’échec de la signature ou du chiffrement. Pour éviter cela à l’avenir, vous devriez appuyer sur la touche Maj en cliquant sur le bouton Rédiger/Répondre pour envoyer un courriel signé.\nSi vous signez les courriels par défaut, vous devriez décocher le paramètre « Rédiger les courriels en HTML » afin de désactiver de façon permanente les courriels HTML pour ce compte de courriel. +strippingHTML=Le courriel comprend des renseignements de formatage HTML qui seront perdus lors de la conversion en texte clair pour la signature ou le chiffrement. Souhaitez-vous continuer ? msgCompose.button.sendAnyway=&Envoyer le courriel quand même -attachWarning=Les pièces jointes de ce courriel ne sont pas locales, elles ne peuvent donc pas être chiffrées. Afin de chiffrer les pièces jointes, enregistrez-les d’abord localement, puis joignez-les. Souhaitez-vous quand même envoyer le courriel ? -quotedPrintableWarn=Vous avez activé l’encodage « quoted-printable (citation imprimable) » pour l’envoi de courriels. Cela peut entraîner un déchiffrement ou une vérification incorrects de votre courriel.\nSouhaitez-vous désactiver maintenant l’envoi de courriels avec cette option ? +attachWarning=Les fichiers joints de ce courriel ne sont pas locaux, ils ne peuvent donc pas être chiffrés. Afin de chiffrer les fichiers joints, enregistrez-les d’abord localement, puis joignez-les. Souhaitez-vous quand même envoyer le courriel ? +quotedPrintableWarn=Vous avez activé l’encodage « citation imprimable » pour l’envoi de courriels. Cela peut entraîner un déchiffrement ou une vérification incorrects de votre courriel.\nSouhaitez-vous désactiver maintenant l’envoi de courriels avec cette option ? minimalLineWrapping=Vous avez défini le retour à la ligne automatique à %S caractères. Pour un chiffrement ou une signature corrects, cette valeur doit être d’au moins 68.\nSouhaitez-vous définir le retour à la ligne automatique à 68 caractères maintenant ? warning=Avertissement signIconClicked=Vous avez modifié la signature manuellement. De ce fait, pendant la rédaction de ce courriel, l’activation ou la désactivation de la signature ne dépend plus de l’activation ou de la désactivation du chiffrement. -errorOwnKeyUnusable=L’ID de clé « %S » configuré pour l’identité courante ne produit pas de clé OpenPGP valide.\n\nVeuillez vous assurer que la clé OpenPGP est valide, non expirée et que les paramètres de votre compte sont dirigés vers cette clé.\nSi votre clé n’est pas expirée, vérifiez ensuite si vous avez bien défini le niveau de confiance envers le propriétaire à élevé ou absolu. +errorOwnKeyUnusable=L’ID de clé « %S » configuré pour l’identité courante ne produit pas de clé OpenPGP valide.\n\nVeuillez vous assurer que la clé OpenPGP est valide, qu’elle n’est pas expirée et que les paramètres de votre compte font appel à cette clé.\nSi votre clé n’est pas expirée, vérifiez ensuite si vous avez bien défini le niveau de confiance envers le propriétaire à « pleine » ou « absolue ». msgCompose.cannotSaveDraft=Erreur d’enregistrement du brouillon -msgCompose.partiallyEncrypted.short=Méfiez-vous de ne pas divulguer des renseignements délicats — le courriel est chiffré partiellement. -msgCompose.partiallyEncrypted.mimeMsg=Le courriel auquel vous répondez contenait à la fois des parties non chiffrées et chiffrées. Certaines parties chiffrées du courriel sont invisibles à vos yeux.\n\nSi l’expéditeur n’a pas réussi à déchiffrer initialement les parties cachées du courriel, vous divulguerez peut-être des renseignements confidentiels que l’expéditeur n’a pas réussi à déchiffrer.\n\nNous vous recommandons de ne pas répondre au courriel, mais d’en créer un nouveau contenant votre réponse. -msgCompose.partiallyEncrypted.inlinePGP=Le courriel auquel vous répondez contient à la fois des parties non chiffrées et chiffrées. Si l’expéditeur n’a pas réussi à déchiffrer initialement les parties cachées du courriel, vous divulguerez peut-être des renseignements confidentiels que l’expéditeur n’a pas réussi à déchiffrer.\n\nVeuillez envisager d’effacer tout texte cité de votre réponse à cet expéditeur. +msgCompose.partiallyEncrypted.short=Méfiez-vous de ne pas divulguer des renseignements délicats – le courriel est chiffré partiellement. +msgCompose.partiallyEncrypted.inlinePGP=Le courriel auquel vous répondez comprend à la fois des parties non chiffrées et chiffrées. Si l’expéditeur n’a pas réussi à déchiffrer initialement les parties cachées du courriel, vous divulguerez peut-être des renseignements confidentiels que l’expéditeur n’a pas réussi à déchiffrer.\n\nVeuillez envisager d’effacer tout texte cité de votre réponse à cet expéditeur. msgCompose.internalEncryptionError=Erreur interne : le chiffrement promis est désactivé msgCompose.internalError=Une erreur interne est survenue. @@ -161,10 +161,9 @@ msgCompose.toolbarTxt.signOnly=Ce courriel sera signé msgCompose.toolbarTxt.encryptOnly=Ce courriel sera chiffré msgCompose.toolbarTxt.noEncryption=Ce courriel ne sera ni signé ni chiffré -msgCompose.toolbarTxt.disabled=Enigmail est désactivé pour l’identité sélectionnée +msgCompose.toolbarTxt.disabled=Enigmail est désactivée pour l’identité sélectionnée msgCompose.protectSubject.tooltip=Protéger l’objet du courriel msgCompose.noSubjectProtection.tooltip=Ne pas protéger l’objet du courriel -msgCompose.encryptedSubjectStub=Courriel chiffré msgCompose.protectSubject.dialogTitle=Activer la protection de l’objet du courriel ? msgCompose.protectSubject.question=Les courriels ordinaires non chiffrés contiennent l’objet non dissimulé.\n\nNous avons établi une norme pour cacher l’objet original du courriel chiffré et le remplacer par un faux texte afin que l’objet ne soit visible qu’une fois le courriel déchiffré.\n\nSouhaitez-vous protéger l’objet des courriels chiffrés ? msgCompose.protectSubject.yesButton=&Protéger l’objet @@ -178,8 +177,8 @@ msgCompose.pepSendSecure=Sécurisé msgCompose.pepSendTrusted=Sécurisé et de confiance -pep.alert.disabledForIdentity=p≡p est désactivé pour l’identité actuelle. Veuillez activer p≡p dans les préférences Enigmail/p≡p. -pep.alert.weakReply=Vous êtes sur le point de répondre à un courriel sécurisé ou de le transférer de manière non sécurisée. Si vous choisissez de poursuivre, des renseignements confidentiels pourraient être divulgués, ce qui vous exposerait, ainsi que votre partenaire de communication, à des risques. Voulez-vous vraiment continuer ? +pep.alert.disabledForIdentity=p≡p est désactivé pour l’identité actuelle. Veuillez activer p≡p dans les préférences d’Enigmail/p≡p. +pep.alert.weakReply=Vous êtes sur le point de répondre à un courriel sécurisé ou de le transférer, mais le courriel que vous enverrez ne sera pas sécurisé. Si vous choisissez de poursuivre, des renseignements confidentiels pourraient être divulgués, ce qui vous exposerait, ainsi que votre partenaire de communication, à des risques. Voulez-vous vraiment poursuivre ? # note: should end with double newline: @@ -200,7 +199,7 @@ offlineSave=Enregistrer le courriel %1$S à %2$S dans le dossier « Courriels non envoyés » ? onlineSend=Envoyer le courriel %1$S à %S ? -encryptKeysNote=Note : Le courriel est chiffré pour les ID utilisateurs et clés suivants : %S +encryptKeysNote=Note : Le courriel est chiffré pour les clés et ID utilisateurs suivants : %S hiddenKey= signFailed=Erreur Enigmail : échec de chiffrement ou de signature. Envoyer le courriel non chiffré ? @@ -227,7 +226,7 @@ reasonManuallyForced=forcé manuellement reasonByRecipientRules=forcé par les règles par destinataire reasonByAutoEncryption=forcé par le chiffrement automatique -reasonByConflict=à cause d’un conflit dans les règles par destinataire +reasonByConflict=en raison d’un conflit dans les règles par destinataire reasonByEncryptionMode=à cause du mode de chiffrement # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=PGP intégré sera utilisé # Attach own key status (tooltip strings): -attachOwnKeyNo=Votre propre clé ne sera pas jointe -attachOwnKeyYes=Votre propre clé sera jointe -attachOwnKeyDisabled=Votre propre clé ne peut pas être jointe. Pour activer cette fonction, vous devez sélectionner une clé précise dans la section OpenPGP des paramètres de compte. +attachOwnKeyNo=Votre propre clé publique ne sera pas jointe +attachOwnKeyYes=Votre propre clé publique sera jointe +attachOwnKeyDisabled=Votre propre clé publique ne peut pas être jointe. Vous devez sélectionner une clé précise dans la section OpenPGP des Paramètres de compte pour activer cette fonction. rulesConflict=Un conflit de règles par destinataire a été détecté\n%S\n\nEnvoyer le courriel avec ces paramètres ? msgCompose.button.configure=&Configurer @@ -262,14 +261,18 @@ msgCompose.button.save=Enregi&strer le courriel # Strings in enigmailMsgHdrViewOverlay.js -keyNeeded=La clé publique « %S » est exigée pour vérifier la signature +keyNeeded=La clé publique « %S » est exigée pour vérifier la signature keyUsed=La clé publique %S a été utilisée pour vérifier la signature clickDecrypt= ; utiliser la fonction Déchiffrer/Vérifier clickDecryptRetry=  ; utiliser la fonction « Déchiffrer/Vérifier » pour ressayer -clickDetailsButton= ; cliquer sur le bouton « Détails » pour de plus amples informations -clickImportButton= ; cliquer sur le bouton « Importer la clé » pour l’importer +clickDetailsButton= ; cliquez sur le bouton « Détails » pour de plus amples informations +clickImportButton= ; cliquez sur le bouton « Importer la clé » pour l’importer keyTypeUnsupported= ; le type de clé n’est pas pris en charge par votre version de GnuPG -msgPart=Partie du courriel %S +decryptManually= ; cliquer sur le bouton « Déchiffrer » pour déchiffrer le message +verifyManually= ; cliquer sur le bouton « Vérifier » pour vérifier la signature +headerView.button.verify=Vérifier +headerView.button.decrypt=Déchiffrer +msgPart=Une partie du courriel est %S msgSigned=signé msgSignedUnkownKey=signé avec une clé inconnue msgEncrypted=chiffré @@ -277,11 +280,13 @@ unverifiedSig=La signature n’a pas été vérifiée incompleteDecrypt=Le déchiffrement n’a pas abouti -needKey=Erreur — aucune clé privée n’a été trouvée pour déchiffrer le courriel -failedDecrypt=Erreur — échec de déchiffrement -badPhrase=Erreur — phrase de passe erronée -failedDecryptVerify=Erreur — échec du déchiffrement ou de la vérification +needKey=Erreur – aucune clé privée n’a été trouvée pour déchiffrer le courriel +failedDecrypt=Erreur – échec de déchiffrement +badPhrase=Erreur – phrase de passe erronée +missingMdcError=Erreur – protection de l’intégrité manquante ou brisée (MDC) +failedDecryptVerify=Erreur – échec du déchiffrement ou de la vérification viewInfo= ; pour plus de détails, Affichage > Infos de sécurité Enigmail +brokenExchangeMessage=Courriel PGP/MIME brisé de MS-Exchange. decryptedMsg=Courriel déchiffré  decryptedMsgWithFormatError=Courriel déchiffré (restauration d’un format de courriel PGP défectueux probablement causé par un ancien serveur Exchange ; le résultat pourrait ne pas être complètement lisible) @@ -293,7 +298,7 @@ pepStatusInfo.title.m1=Non digne de confiance pepStatusInfo.info.m1=Un des partenaires de communication de ce courriel a précédemment été marqué comme non digne de confiance pepStatusInfo.title.r0=Inconnu -pepStatusInfo.info.r0=Ce courriel ne contient pas suffisamment d’informations pour déterminer s’il est sécurisé. +pepStatusInfo.info.r0=Ce courriel ne comprend pas suffisamment de renseignements pour déterminer s’il est sécurisé. pepStatusInfo.title.r1=Impossible de déchiffrer pepStatusInfo.info.r1=Ce courriel ne peut pas être déchiffré, car la clé n’est pas disponible. pepStatusInfo.title.r2=Impossible de déchiffrer @@ -322,10 +327,11 @@ autocryptSetupReq=Lancer la configuration Autocrypt autocryptSetupReq.button.label=Lancer la configuration -autocryptSetupReq.setupMsg.desc=Ce courriel contient tous les renseignements pour transférer vos paramètres Autocrypt ainsi que votre clé privée de manière sûre à partir de votre appareil d’origine. +autocryptSetupReq.setupMsg.desc=Ce courriel comprend tous les renseignements pour transférer vos paramètres Autocrypt ainsi que votre clé privée de manière sûre à partir de votre appareil d’origine. autocryptSetupReq.setupMsg.backup=Vous pouvez conserver ce courriel et l’utiliser comme sauvegarde de votre clé privée. Si vous souhaitez le faire, vous devriez noter le mot de passe et le conservez à l’abri. autocryptSetupReq.message.import=Pour importer les paramètres et clés dans Enigmail, veuillez cliquer sur le bouton « Lancer la configuration » dans la barre d’état. autocryptSetupReq.message.sent=Veuillez cliquer sur le courriel sur votre nouvel appareil et suivre les instructions pour importer les paramètres. +postbox.cannotUseQuickReply.message=Vous répondez à un courriel chiffré. Veuillez cliquer sur l’icône « Développer » dans le coin supérieur droit de la fenêtre de texte pour ouvrir votre réponse dans une nouvelle fenêtre, et y envoyer votre message. # strings in pref-enigmail.js oldGpgVersion20=Échec d’initialisation d’Enigmail.\n\nVous utilisez GnuPG version %1$S, qui n’est plus prise en charge. Enigmail exige GnuPG version %2$S ou ultérieure. Veuillez mettre à niveau votre installation de GnuPG, ou Enigmail ne fonctionnera pas. @@ -334,9 +340,11 @@ warningsAreReset=Tous les avertissement ont été réinitialisés. prefs.gpgFound=GnuPG a été trouvé dans %S prefs.gpgNotFound=Impossible de trouver GnuPG -prefs.warnAskNever=Avertissement : Activer cette option entraînera l’envoi de courriels non chiffrés sans autre notification si l’un des destinataires n’a pas de clé — Enigmail ne vous signalera pas de tels cas ! -prefs.warnIdleTimeForUnknownAgent=Impossible de se connecter à gpg-agent. Votre système utilise peut-être un outil spécialisé pour gérer les phrases de passe (p. ex. les trousseaux gnome-keyring, seahorse-agent ou le gestionnaire de porte-monnaie KDE…). Malheureusement Enigmail ne peut pas contrôler le délai de mémorisation pour l’outil que vous utilisez. Par conséquent, les paramètres de délai de mémorisation d’Enigmail seront ignorés. -prefEnigmail.oneKeyserverOnly=Erreur — vous ne pouvez indiquer qu’un seul serveur de clés pour le téléchargement automatique des clés OpenPGP manquantes. +prefs.warnAskNever=Avertissement : Activer cette option entraînera l’envoi de courriels non chiffrés sans autre notification si l’un des destinataires n’a pas de clé – Enigmail ne vous signalera pas de tels cas ! +prefs.warnIdleTimeForUnknownAgent=Impossible de se connecter à gpg-agent. Votre système utilise peut-être un outil spécialisé pour gérer les phrases de passe (p. ex. les trousseaux gnome-keyring, seahorse-agent ou le gestionnaire de porte-monnaie KDE…). Malheureusement, Enigmail ne peut pas contrôler le délai de mémorisation pour l’outil que vous utilisez. Par conséquent, les paramètres de délai de mémorisation d’Enigmail seront ignorés. +prefEnigmail.oneKeyserverOnly=Erreur – vous ne pouvez indiquer qu’un seul serveur de clés pour le téléchargement automatique des clés OpenPGP manquantes. +acSetupMessage.desc=Transférer votre clé vers un autre appareil compatible Autocrypt. (Qu’est-ce qu’Autocrypt [site an anglais]) +aboutLicense.desc=Enigmail est à code source ouvert et distribuée selon les termes de la license public Mozilla 2.0. (page en anglais). # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -344,17 +352,17 @@ enterAdminPin=Veuillez saisir le NIP d’administration de votre carte à puce intelligente enterCardPin=Veuillez saisir le NIP de votre carte à puce intelligente -notInit=Erreur — le service Enigmail n’est pas encore initialisé -badCommand=Erreur — échec de la commande de chiffrement +notInit=Erreur – le service Enigmail n’est pas encore initialisé +badCommand=Erreur – échec de la commande de chiffrement cmdLine=ligne de commande et sortie : -notRequired=Erreur — aucun chiffrement nécessaire -notComplete=Erreur — la génération de clé n’est pas encore terminée -invalidEmail=Erreur — adresses courriel invalides -noPassphrase=Erreur — aucune phrase de passe n’a été saisie -noPGPblock=Erreur — aucun bloc de données OpenPGP blindé valide n’a été trouvé +notRequired=Erreur – aucun chiffrement nécessaire +notComplete=Erreur – la génération de clé n’est pas encore terminée +invalidEmail=Erreur – adresses courriel invalides +noPassphrase=Erreur – aucune phrase de passe n’a été saisie +noPGPblock=Erreur – aucun bloc de données OpenPGP blindé valide n’a été trouvé unverifiedReply=La partie indentée du courriel (réponse) a probablement été modifiée keyInMessageBody=Une clé a été trouvée dans le corps du courriel. Cliquer sur « Importer la clé » pour l’importer -sigMismatch=Erreur — la signature ne correspond pas +sigMismatch=Erreur – la signature ne correspond pas cantImport=Erreur d’importation de la clé publique\n\n doImportOne=Importer %1$S (%2$S) ? doImportMultiple=Importer les clés suivantes ?\n\n%S @@ -369,12 +377,13 @@ keyError.keySpecNotFound=L’adresse courriel « %S » ne correspond à aucune clé de votre trousseau. keyError.keyIdNotFound=L’ID de clé « %S » configuré ne se trouve pas dans votre trousseau. keyError.resolutionAction=Veuillez sélectionner une clé valide dans la section OpenPGP de vos paramètres de compte. -missingPassphrase=Phrase de passe manquante +missingPassphrase=La phrase de passe manquante n’a pas été saisie errorHandling.gpgAgentInvalid=Votre système utilise une version de gpg-agent qui n’est pas adaptée à votre version de GnuPG. errorHandling.gpgAgentError=GnuPG a signalé une erreur de communication avec gpg-agent (un composant de GnuPG). errorHandling.dirmngrError=GnuPG a signalé une erreur de communication avec dirmngr (un composant de GnuPG). errorHandling.pinentryError=GnuPG ne peut demander votre phrase de passe avec pinentry. -errorHandling.readFaq=Ceci est une erreur de configuration du système qui empêche Enigmail de fonctionner correctement et qui ne peut pas être corrigée automatiquement.\n\nNous vous conseillons vivement de consulter notre page Web de soutien https://enigmail.net/faq +errorHandling.pinentryCursesError=Votre installation de GnuPG est configurée pour utiliser pinentry dans la console. Cependant, si vous utilisez Enigmail, il vous faut une version graphique de pinentry. +errorHandling.readFaq=Ceci est une erreur de configuration du système qui empêche Enigmail de fonctionner correctement et qui ne peut pas être corrigée automatiquement.\n\nNous vous conseillons vivement de consulter notre page Web de soutien https://enigmail.net/faq (en anglais) gpgNotFound=Impossible de trouver le programme GnuPG « %S ».\nAssurez-vous d’avoir correctement défini le chemin de l’exécutable GnuPG dans les préférences d’Enigmail. gpgNotInPath=Impossible de trouver l’exécutable GnuPG dans le chemin.\nAssurez-vous d’avoir correctement défini le chemin de l’exécutable GnuPG dans les préférences d’Enigmail. @@ -383,13 +392,12 @@ prefGood=Signature valide de %S prefBad=MAUVAISE signature de %S -failCancel=Erreur — la réception de clé a été annulé par l’utilisateur -failNoServer=Erreur — aucun serveur de clés n’a été indiqué pour en recevoir des clés -failNoID=Erreur — aucun ID de clé n’a été indiqué pour en recevoir la clé -failKeyExtract=Erreur — échec de la commande d’extraction de clé -notFirstBlock=Erreur — le premier bloc de données OpenPGP n’est pas un bloc de clé publique +failCancel=Erreur – la réception de clé a été annulé par l’utilisateur +failKeyExtract=Erreur – échec de la commande d’extraction de clé +failKeyNoSubkey=Aucune clé ni sous-clé valide +notFirstBlock=Erreur – le premier bloc de données OpenPGP n’est pas un bloc de clé publique importKeyConfirm=Importer les clés publiques intégrées au courriel ? -failKeyImport=Erreur — échec d’importation de la clé +failKeyImport=Erreur – échec d’importation de la clé fileWriteFailed=Échec d’écriture dans le fichier %S importKey=Importer la clé publique %S du serveur de clés : @@ -425,13 +433,15 @@ identityName=Identité : %S switchPepMode=Vous utilisez actuellement le mode « p≡p junior » d’Enigmail.\n\nEn activant OpenPGP ou S/MIME pour un compte, vous désactivez p≡p et utilisez le mode ordinaire sans p≡p. enableEnigmail=&Désactiver p≡p +amPrefAutocrypt.desc=Autocrypt (site en anglais) est une norme qui définit la mise en place commode du chiffrement de bout en bout des courriels. Elle définit la négociation par les programmes de courriel des capacités de chiffrement en utilisant des courriels ordinaires. + # Strings used in enigmailSingleRcptSettings.js -noEncryption=Vous avez activé le chiffrement mais vous n’avez pas sélectionné de clé. Afin de chiffrer les courriels envoyés à %1$S, vous devez indiquer une ou plusieurs clés valides de votre liste de clés. Souhaitez-vous désactiver le chiffrement pour %2$S ? -noKeyToUse=(aucune — aucun chiffrement) +noEncryption=Vous avez activé le chiffrement, mais vous n’avez pas sélectionné de clé. Afin de chiffrer les courriels envoyés à %1$S, vous devez indiquer une ou plusieurs clés valides de votre liste de clés. Souhaitez-vous désactiver le chiffrement pour %2$S ? +noKeyToUse=(aucune – aucun chiffrement) noEmptyRule=La règle ne peut pas être vide ! Veuillez définir une adresse courriel dans le champ Règle. invalidAddress=Les adresses courriel que vous avez saisies ne sont pas valides. Vous ne devriez pas définir le nom des destinataires, seulement leur adresse courriel. Par exemple :\nInvalide : Un nom \nValide : un.nom@adresse.net -noCurlyBrackets=Les accolades {} ont une signification particulière et ne devraient pas être utilisées dans une adresse courriel. Si vous souhaitez modifier le comportement de correspondance pour cette règle, utilisez l’option « Appliquer la règle si le destinataire... ».\nLe bouton Aide donne plus de renseignements à ce sujet. +noCurlyBrackets=Les accolades {} ont une signification particulière et ne devraient pas être utilisées dans une adresse courriel. Si vous souhaitez modifier le comportement de correspondance pour cette règle, utilisez l’option « Appliquer la règle si le destinataire… ».\nLe bouton Aide donne plus de renseignements à ce sujet. # Strings used in enigmailRulesEditor.js never=Jamais @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=La fonction que vous avez sélectionnée n’est pas proposée en mode hors ligne. Veuillez passer en ligne et ressayer. -protocolNotSupported=Le protocole « %S:// » que vous avez sélectionné n’est pas pris en charge pour télécharger des clés OpenPGP. -gpgkeysDisabled=Il pourrait être bon d’activer l’option « extensions.enigmail.useGpgKeysTool ». noKeyserverConn=Impossible de se connecter au serveur de clés %S. -keyDownloadFailed=Échec de téléchargement de la clé à partir du serveur de clés. Le courriel d’état est :\n%S internalError=Une erreur interne est survenue. Les clés n’ont pas pu être téléchargées ni importées. -noKeyFound=Impossible de trouver une clé qui corresponde aux critères de recherche indiqués. -keyDownload.keyUnavailable=Nous sommes désolés, mais la clé portant l’ID %S ne se trouve pas sur ce serveur de clés. Le propriétaire de la clé ne l’a probablement pas téléversée vers le serveur de clés.\n\nVeuillez demander à l’expéditeur du courriel de vous envoyer sa clé par courriel. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Échec de recherche ou de téléchargement de la clé à partir du serveur de clés : impossible d’exécuter gpgkeys_%S. - +noKeyFound=Il nous a été impossible de trouver une clé qui correspond aux critères de recherche indiqués. +keyDownload.keyUnavailable=La clé dont l’ID est %S ne se trouve pas sur le serveur de clés. Le propriétaire de la clé ne l’a probablement pas téléversée vers le serveur de clés.\n\nVeuillez demander à l’expéditeur du courriel de vous envoyer sa clé publique par courriel. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Échec de définition du niveau de confiance envers le propriétaire @@ -479,7 +482,7 @@ keyTrust.untrusted=non fiable keyTrust.marginal=confiance modérée keyTrust.full=fiable -keyTrust.ultimate=confiance absolue +keyTrust.ultimate=absolue keyTrust.group=(groupe) keyType.public=pub keyType.publicAndSec=pub/priv @@ -490,7 +493,6 @@ asciiArmorFile=Fichiers blindés ASCII (*.asc) importKeyFile=Importer un fichier de clé OpenPGP gnupgFile=Fichiers GnuPG -createKeyOK=Votre clé a été générée saveRevokeCertAs=Créer et enregistrer un certificat de révocation revokeCertOK=Le certificat de révocation a été créé avec succès. Vous pouvez l’utiliser pour invalider votre clé publique, en cas de perte de votre clé privée par exemple. revokeCertFailed=Impossible de créer le certificat de révocation. @@ -509,12 +511,12 @@ specificPubSecKeyFilename=%1$S (0x%2$S) pub-priv defaultPubKeyFilename=Clés-publiques-exportées defaultPubSecKeyFilename=Clés-publique-et-privée-exportées -noSecretKeys=Aucune clé privée n’a été trouvée.\n\nSouhaitez-vous générer votre propre clé maintenant ? sendKeysOk=Les clés ont été envoyées avec succès sendKeysFailed=Échec d’envoi des clés receiveKeysOk=Les clés ont été mises à jour avec succès receiveKeysFailed=Échec de téléchargement des clés +keyUpload.verifyEmails=Le serveur de clé vous enverra un courriel pour chaque adresse courriel de votre clé téléversée. Pour confirmer la publication de votre clé, vous devrez cliquer sur le lien qui se trouve dans chaque courriel que vous recevrez. importFromClip=Souhaitez-vous importer des clés du presse-papiers ? importFromUrl=Télécharger une clé publique à partir de cette URL : @@ -529,7 +531,7 @@ revokeKeyQuestion=Vous êtes sur le point de révoquer la clé « %S ».\n\nVous ne serez plus en mesure de signer avec cette clé, et une fois que la révocation sera propagée, les autres ne pourront plus chiffrer avec cette clé. Vous pouvez encore l’utiliser pour déchiffrer les courriels anciens.\n\nVoulez-vous continuer ? revokeKeyOk=La clé a été révoquée. Si votre clé se trouve sur un serveur de clés, il est recommandé de la retéléverser afin que les autres voient la révocation. revokeKeyFailed=La clé n’a pas pu être révoquée. -revokeKeyNotPresent=Vous n’avez aucune clé (0x%S) qui corresponde à ce certificat de révocation !\n\nSi vous avez perdu votre clé, vous devez l’importer (p. ex. d’un serveur de clés), avant d’utiliser ce certificat de révocation ! +revokeKeyNotPresent=Vous ne possédez pas de clé (0x%S) qui correspond à ce certificat de révocation !\n\nSi vous avez perdu votre clé, vous devez l’importer (p. ex. d’un serveur de clés) avant d’importer le certificat de révocation. revokeKeyAlreadyRevoked=La clé 0x%S a déjà été révoquée. refreshAllQuestion=Vous n’avez sélectionné aucune clé. Souhaitez-vous actualiser TOUTES les clés ? refreshKeyServiceOn.warn=Avertissement : Vos clés sont en cours d’actualisation en arrière-plan, de manière aussi sécurisée que possible.\nL’actualisation de toutes vos clés en même temps divulguera inutilement des renseignements à votre sujet.\nSouhaitez-vous vraiment le faire ? @@ -541,20 +543,20 @@ keyMan.button.import=&Importer keyMan.button.refreshAll=&Actualiser toutes les clés keyMan.button.revokeKey=&Révoquer la clé -keyMan.button.skip=&Ignorer la clé keylist.noOtherUids=N’a pas d’autre identité keylist.hasOtherUids=Aussi connu sous les noms -keylist.noPhotos=Il n’y a pas de photo +keylist.noPhotos=Aucune photo keylist.hasPhotos=Photos keyMan.addphoto.filepicker.title=Sélectionner une photo à ajouter -keyMan.addphoto.warnLargeFile=Le fichier que vous avez choisi fait plus de 25 ko.\nIl n’est pas recommandé d’ajouter de très gros fichiers, car cela entraîne de très grosses clés. +keyMan.addphoto.warnLargeFile=Le fichier que vous avez choisi fait plus de 25 ko.\nIl n’est pas recommandé d’ajouter de très gros fichiers, car cela entraîne de très grosses clés. keyMan.addphoto.noJpegFile=Le fichier sélectionné ne semble pas être un fichier JPEG. Veuillez en choisir un autre. keyMan.addphoto.failed=Impossible d’ajouter la photo. noWksIdentity=La clé %S n’a pas d’identité WKS. +wksUpload.noKeySupported=Le téléversement a échoué. Il semble que votre fournisseur ne prenne pas en charge WKS. -keyman.addBlacklistKey.msg=Voulez-vous vraiment que p≡p arrête d’utiliser la clé « %1$S (%2$S) » pour chiffrer les courriels ? +keyman.addBlacklistKey.msg=Voulez-vous vraiment que p≡p cesse d’utiliser la clé « %1$S (%2$S) » pour chiffrer les courriels ? keyman.removeBlacklistKey.msg=Voulez-vous autoriser p≡p à utiliser la clé « %1$S (%2$S) » pour les courriels futurs ? keyman.addBlacklistKey.button=&Mettre la clé sur liste noire keyman.removeBlacklistKey.button=&Retirer la clé de la liste noire @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Échec de modification du NIP -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Actualisation des clés, veuillez patienter… keyserverProgress.uploading=Téléversement des clés, veuillez patienter… keyserverProgress.wksUploadFailed=Impossible de téléverser votre clé vers le service de clés Web (WKS) keyserverProgress.wksUploadCompleted=Votre clé publique a été transmise à votre fournisseur avec succès. Vous recevrez un courriel pour confirmer que vous avez déclenché le téléversement. keyserverTitle.refreshing=Actualiser les clés keyserverTitle.uploading=Téléversement de clés +keyserver.result.download.none=Aucune clé n’a été téléchargée. +keyserver.result.download.1of1=La clé a été téléchargée avec succès. +keyserver.result.download.1ofN=1 clé sur %S a été téléchargée avec succès. +keyserver.result.download.NofN=%1$S clés sur %2$S ont été téléchargées avec succès. +keyserver.result.uploadOne=1 clé a été téléchargée avec succès. +keyserver.result.uploadMany=%S clés ont été téléchargées avec succès. # Strings in enigmailSetupWizard -passphrase.min8keys=Votre phrase de passe doit comprendre au moins 8 caractères ! -setupWizard.reallyCancel=Voulez-vous vraiment fermer l’assistant de configuration d’Enigmail ? setupWizard.invalidGpg=Le fichier que vous avez indiqué n’est pas un exécutable GnuPG. Veuillez en indiquer un autre. -setupWizard.specifyFile=Vous devez au moins indiquer un fichier de clé publique pour poursuivre. setupWizard.installFailed=Il semble que l’installation n’ait pas réussi. Veuillez soit ressayer l’installation soit installer GnuPG manuellement et le localiser avec le bouton Parcourir. setupWizard.downloadForbidden=Pour votre sécurité, GnuPG ne sera pas téléchargé. Veuillez visiter https://gnupg.org/ pour télécharger GnuPG. setupWizard.downloadImpossible=Impossible de télécharger GnuPG pour le moment. Veuillez ressayer plus tard ou visiter https://gnupg.org/ pour télécharger GnuPG. -setupWizard.hashSumError=L’assistant n’a pas pu vérifier l’intégrité du fichier téléchargé. Le fichier pourrait être endommagé ou altéré. Souhaitez-vous quand même poursuivre l’installation ? +setupWizard.hashSumError=L’assistant ne peut pas vérifier l’intégrité du fichier téléchargé. Le fichier peut être corrompu ou altéré. Souhaitez-vous quand même poursuivre l’installation ? setupWizard.importSettingsFile=Indiquer un fichier de sauvegarde à partir duquel importer -setupWizard.invalidSettingsFile=Le fichier indiqué n’est pas un fichier de sauvegarde valide de paramètres d’Enigmail. +setupWizard.invalidSettingsFile=Le fichier indiqué n’est pas une sauvegarde valide des paramètres d’Enigmail. setupWizard.gpgConfExists=Le fichier de configuration GnuPG existe déjà. Souhaitez-vous le remplacer par celui de votre ancienne installation ? -setupWizard.noGpgHomeDir=Il semblerait que vous ayez configuré %S pour être utilisé avec GnuPG. Cependant, ce n’est pas un répertoire. Vous ne pouvez pas l’utiliser. +setupWizard.noGpgHomeDir=Il semblerait que votre configuration fait appel à %S pour être utilisé avec GnuPG. Cependant, il ne s’agit pas d’un répertoire ; vous ne pouvez pas l’utiliser. setupWizard.unmachtedIds=Il a été impossible de faire correspondre les identités suivantes de votre ancienne configuration :\n%S\nLes paramètres de ces identités ont été ignorés. +setupWizard.foundAcSetupMessage=Un message de configuration Autocrypt a été trouvé. Pour lancer la procédure de configuration d’Autocrypt, cliquez sur le bouton Lancer la configuration ci-dessous. +setupWizard.foundAcNoSetupMsg=Nous avons établi que vous utilisez un client de courriel conforme à Autocrypt, mais nous n’avons pas trouvé de message de configuration Autocrypt. Nous vous recommandons d’en créer un sur votre appareil existant et de cliquer ensuite sur Réanalyser la boîte de réception. Vous pouvez autrement exporter vos paramètres et clés d’une installation existante d’Enigmail pour les restaurer ensuite ici. +setupWizard.setupComplete=Enigmail est maintenant correctement configurée et prête à être utilisée. Pour plus de renseignements sur l’utilisation d’Enigmail, veuillez visiter notre page d’accueil. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Une erreur est survenue en tentant de télécharger GnuPG. Veuillez consulter le journal de la console pour plus de détails. @@ -659,7 +667,7 @@ # strings in enigmailConvert.jsm converter.decryptBody.failed=Impossible de déchiffrer le courriel dont l’objet est\n« %S ».\nVoulez-vous recommencer avec une phrase de passe différente ou plutôt ignorer ce courriel ? -converter.decryptAtt.failed=Impossible de déchiffrer la pièce jointe « %1$S »\ndu courriel dont l’objet est\n« %2$S ».\nVoulez-vous recommencer avec une phrase de passe différente ou plutôt ignorer ce courriel ? +converter.decryptAtt.failed=Impossible de déchiffrer le fichier joint « %1$S »\ndu courriel dont l’objet est\n« %2$S ».\nVoulez-vous recommencer avec une phrase de passe différente ou plutôt ignorer ce courriel ? saveLogFile.title=Enregistrer le fichier journal @@ -691,13 +699,13 @@ enigmailSettings=ParamètresEnigmail defaultBackupFileName=Enigmail-exportation specifyExportFile=Préciser le nom du fichier pour l’exportation -homedirParamNotSUpported=Les paramètres supplémentaires qui configurent les chemins, comme « --homedir » et « --keyring », ne sont pas pris en charge pour importer/exporter vos paramètres. Veuillez utiliser d’autres méthodes, comme définir la variable d’environnement GNUPGHOME. +homedirParamNotSUpported=Les paramètres supplémentaires tels que --homedir et --keyring qui configurent des chemins ne sont pas pris en charge pour importer ni exporter vos paramètres. Veuillez utiliser d’autres méthodes telles que définir la variable d’environnement GNUPGHOME. #strings in expiry.jsm -expiry.keyExpiresSoon=Votre clé %1$S arrivera à expiration dans moins de %2$S jours.\n\nNous vous recommandons de créer une nouvelle biclé et de configurer les comptes correspondants pour utiliser la nouvelle clé. -expiry.keysExpireSoon=Vos clés suivantes arriveront à expiration dans moins de %1$S jours :\n%2$S.\nNous vous recommandons de créer de nouvelles clés et de configurer vos comptes pour qu’ils les utilisent. -expiry.keyMissingOwnerTrust=Votre clé privée %S n’a pas de déclaration de confiance.\n\nNous vous recommandons de définir «Vous comptez sur des certifications» sur «confiance absolue» dans les propriétés de la clé. -expiry.keysMissingOwnerTrust=Vos clés privées suivantes n’ont pas de déclaration de confiance.\n%S.\nNous vous recommandons de définir « Vous comptez sur des certifications » sur « confiance absolue » dans les propriétés de la clé. +expiry.keyExpiresSoon=Votre clé %1$S expirera dans moins de %2$S jours.\n\nNous vous recommandons de créer une nouvelle biclé et de configurer les comptes correspondants pour l’utiliser. +expiry.keysExpireSoon=Vos clés suivantes expireront dans moins de % 1$S jours :\n% 2 $ S Nous vous recommandons de créer de nouvelles clés et de configurer les comptes correspondants pour les utiliser. +expiry.keyMissingOwnerTrust=Votre clé privée %S ne possède pas de déclaration de confiance.\n\nNous vous recommandons de définir « Vous comptez sur des certifications » sur « absolue » dans les propriétés de cette clé. +expiry.keysMissingOwnerTrust=Vos clés publique suivantes ne possèdent pas de déclaration de confiance.\n%S\nNous vous recommandons de définir « Vous comptez sur des certifications » sur « absolue » dans les propriétés de ces clés. expiry.OpenKeyManager=Ouvrir la gestion des clés d’Enigmail expiry.OpenKeyProperties=Ouvrir les propriétés de la clé @@ -709,6 +717,7 @@ gpghomedir.notwritable=Le dossier « %S » contenant vos clés OpenPGP n’est pas accessible en écriture. gpghomedir.notdirectory=Le répertoire « %S » contenant vos clés OpenPGP est un fichier et non un répertoire. gpghomedir.notusable=Veuillez corriger les permissions du répertoire ou changer l’emplacement de votre répertoire « home » pour GnuPG. GnuPG ne pourra pas fonctionner correctement sans cela. +gpgAgent.noAutostart=Vous utilisez GnuPG version %S. Cette version exige que vous démarriez gpg-agent avant que Thunderbird ne démarre, et que la variable d’environnement GPG_AGENT_INFO soit préchargée. Ces préalables ne sont pas remplis. Vous ne pourrez pas utiliser Enigmail tant que vous n’aurez pas résolu ce problème. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=Impossible de vérifier les mots de confiance p≡p pour votre propre compte. @@ -728,19 +737,19 @@ pepPrivacyStatus.RatingMistrustSuggestion=Rétablissez la connexion avec votre partenaire de communication et tentez d’initier une nouvelle poignée de main. pepPrivacyStatus.RatingReliableSuggestion=Confirmez la poignée de main avec votre partenaire de communication en échangeant vos mots de confiance en personne ou par téléphone. Une seule poignée de main est nécessaire par correspondant pour garantir des communications sécurisées, en toute confiance. pepPrivacyStatus.RatingTrustedSuggestion=Aucune action n’est requise ! -pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Attention : ce courriel pourrait ne pas être sécurisé. +pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Soyez conscient que ce courriel pourrait ne pas être sécurisé. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Veuillez ajouter les renseignements requis. -pepPrivacyStatus.RatingUnderAttackSuggestion=Vérifier par un autre moyen le contenu de ce courriel avec votre partenaire de communication. -pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Assurez-vous que l’état de confidentialité de chacun de vos partenaires de communication est au moins sécurisé. +pepPrivacyStatus.RatingUnderAttackSuggestion=Vérifiez par un autre moyen le contenu de ce courriel avec votre partenaire de communication. +pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Assurez-vous que l’état de confidentialité de chacun de vos partenaires de communication est au moins « sécurisé ». pepPrivacyStatus.RatingUnencryptedSuggestion=Veuillez demander à votre partenaire de communication d’utiliser une solution de chiffrement ou d’installer p≡p. -pepPrivacyStatus.RatingUnreliableSuggestion=Ce courriel n’a pas de chiffrement ni de signature fiable. Demandez à votre partenaire de communication de mettre à niveau sa solution de chiffrement ou d’installer p≡p. +pepPrivacyStatus.RatingUnreliableSuggestion=Ce courriel n’a pas de chiffrement fiable ni de signature. Demandez à votre partenaire de communication de mettre à niveau sa solution de chiffrement ou d’installer p≡p. pepPrivacyStatus.RatingBrokenExplanation=Le chiffrement ou le formatage de ce courriel sont endommagés. pepPrivacyStatus.RatingHaveNoKeyExplanation=Ce courriel ne peut pas être déchiffré, car la clé correspondante n’est pas disponible. pepPrivacyStatus.RatingMistrustExplanation=Un des partenaires de communication de ce courriel a précédemment été marqué comme non digne de confiance pepPrivacyStatus.RatingReliableExplanation=Ce courriel est sécurisé, mais vous devez quand même vérifier l’identité de votre partenaire de communication. pepPrivacyStatus.RatingTrustedExplanation=Ce courriel est sécurisé et de confiance. -pepPrivacyStatus.RatingUndefinedExplanation=Ce courriel ne contient pas suffisamment d’informations pour déterminer s’il est sécurisé. +pepPrivacyStatus.RatingUndefinedExplanation=Ce courriel ne comprend pas suffisamment de renseignements pour déterminer s’il est sécurisé. pepPrivacyStatus.RatingUnderAttackExplanation=Ce courriel n’est pas sécurisé et a été altéré. pepPrivacyStatus.RatingUnencryptedExplanation=Ce courriel n’est pas sécurisé. pepPrivacyStatus.RatingUnencryptedForSomeExplanation=Ce courriel n’est pas sécurisé pour certains partenaires de communication. @@ -763,21 +772,21 @@ handshakeDlg.label.outgoingMessage=Courriel sortant handshakeDlg.label.incomingMessage=Courriel entrant handshakeDlg.error.noPeers=Impossible d’initier une poignée de main sans destinataire. -handshakeDlg.error.noProtection=Veuillez activer la protection afin d’utiliser la fonction de poignée de main. +handshakeDlg.error.noProtection=Veuillez activer la protection afin d’utiliser la fonction « poignée de main ». -enigmail.acSetupPasswd.descEnterPasswd=Veuillez saisir le code de configuration affiché sur l’autre appareil -enigmail.acSetupPasswd.descCopyPasswd=Veuillez saisir le code de configuration ci-dessous sur votre autre appareil pour poursuivre la configuration +enigmail.acSetupPasswd.descEnterPasswd=Veuillez saisir le code de configuration qui est affiché sur l’autre appareil. +enigmail.acSetupPasswd.descCopyPasswd=Veuillez saisir le code de configuration ci-dessous sur votre autre appareil pour poursuivre la configuration. #strings in autocrypt.jsm autocrypt.setupMsg.subject=Courriel de configuration Autocrypt autocrypt.setupMsg.msgBody=Pour configurer votre nouvel appareil pour Autocrypt, veuillez suivre les instructions qui devraient être affichées par votre nouvel appareil. -autocrypt.setupMsg.fileTxt=Ceci est le fichier de configuration Autocrypt utilisé pour transférer paramètres et clés entre clients. Vous pouvez le déchiffrer en utilisant le code de configuration affiché sur votre ancien appareil, puis importer dans votre trousseau la clé incluse. +autocrypt.setupMsg.fileTxt=Voici le fichier de configuration Autocrypt utilisé pour transférer les paramètres et clés entre clients. Vous pouvez le déchiffrer en utilisant le code de configuration affiché sur votre ancien appareil, puis en important la clé dans votre trousseau. #strings in upgradeInfo.html upgradeInfo.doctitle=Quoi de neuf dans Enigmail v2.0 ? upgradeInfo.welcome1=Bienvenue dans la nouvelle version 2.0 d’Enigmail ! -upgradeInfo.welcome2=La version contient de nombreuses fonctions nouvelles ou modifiées. Veuillez prendre le temps de les découvrir : +upgradeInfo.welcome2=La version comprend de nombreuses fonctions nouvelles ou modifiées. Veuillez prendre le temps de les découvrir : upgradeInfo.encSubject.title=Chiffrement de l’objet du courriel upgradeInfo.encSubject.desc=Nous avons développé une nouvelle méthode qui déplace l’objet dans le courriel chiffré et remplace l’objet visible par « Courriel chiffré ». Une fois qu’un tel courriel est déchiffré, l’objet original est remplacé automatiquement. La dissimulation de l’objet est activée par défaut ; il existe toutefois une option pour la désactiver si vous le souhaitez. (Note : Cette fonction exige que le courriel soit envoyé avec PGP/MIME.) upgradeInfo.buttons.title=Nouveau comportement des boutons Chiffrer et Signer @@ -785,26 +794,64 @@ upgradeInfo.autocrypt.title=Prise en charge d’Autocrypt upgradeInfo.autocrypt.desc=Enigmail prend désormais en charge Autocrypt, une nouvelle norme pour distribuer des clés comme faisant partie des courriels envoyés. Enigmail importe automatiquement les clés des courriels conformes à Autocrypt, permettant ainsi de chiffrer de plus en plus de courriels avec le temps. upgradeInfo.pEp.title=Nouveau mode p≡p junior (confidentialité plutôt facile [Pretty Easy Privacy]). -upgradeInfo.pEp.desc=Enigmail contient désormais un mode p≡p junior. Vous devez actuellement installer p≡p pour pouvoir l’utiliser, mais cela changera dans une version future. Le mode p≡p junior vous permet d’utiliser le chiffrement OpenPGP de manière aussi transparente que possible ; vous n’avez plus à vous soucier de la gestion des clés ni de leurs synchronisations entre vos appareils. -upgradeInfo.bottom.desc=Veuillez consulter notre documentation pour obtenir de l’aide sur l’utilisation d’Enigmail. +upgradeInfo.pEp.desc=Enigmail comprend désormais un mode p≡p junior. Le mode p≡p junior vous permet d’utiliser le chiffrement OpenPGP de manière aussi transparente que possible ; vous n’avez plus à vous soucier de la gestion des clés ni de leur synchronisation entre vos appareils. +upgradeInfo.bottom.desc=Veuillez consulter notre documentation (site en anglais) pour obtenir de l’aide sur l’utilisation d’Enigmail. +#strings in pEpAdapter.jsm pep.missingGnuPG=Afin d’utiliser Enigmail ou p≡p, GnuPG est exigé. Comme nous ne l’avons pas trouvé, nous vous suggérons de le télécharger et de l’installer pour vous. +pep.updateAvailable=Une nouvelle version du moteur cryptographique Enigmail/p≡p est proposée. Souhaitez-vous télécharger et installer cette mise à jour ? #strings in enigmailAbout.html aboutEnigmail.tabName=À propos d’Enigmail aboutEnigmail.title=La prise en charge d’OpenPGP est fournie par Enigmail -aboutEnigmail.team=Enigmail est développé par l’Équipe Enigmail : +aboutEnigmail.team=Enigmail est développée par l’Équipe Enigmail : aboutEnigmail.projectLeader=Développeur principal : aboutEnigmail.usability=Utilisabilité : aboutEnigmail.documentation=Documentation : aboutEnigmail.testing=Tests : aboutEnigmail.userSupport=Assistance technique : -aboutEnigmail.localization=Traduction : consulter la page des paquets de langue d’Enigmail +aboutEnigmail.userSupport.team=l’équipe et les membres de la liste de diffusion et du forum +aboutEnigmail.localization=Traduction : consulter la page des paquets de langue d’Enigmail (en anglais) aboutEnigmail.Credits=Crédits : aboutEnigmail.origAuthor=auteur original de l’extension Enigmail aboutEnigmail.icons=Icônes : aboutEnigmail.formerMembers=Anciens membres de l’équipe : aboutEnigmail.projectHosting=Hébergement du projet : aboutEnigmail.licenseSupportTitle=Licence et assistance -aboutEnigmail.license=Enigmail OpenPGP est un logiciel à code source ouvert sous licence %S -aboutEnigmail.support=L’assistance et les téléchargements sont proposés sur www.enigmail.net. +aboutEnigmail.license=Enigmail OpenPGP est à code source ouvert et distribuée selon les termes de la licence « %S » +aboutEnigmail.support=L’assistance et les téléchargements sont offerts sur www.enigmail.net (site en anglais). + +#strings in updateGnuPG.html +updateGnuPG.tabName=Mise à jour de GnuPG +updateGnuPG.title=Mises à jour pour GnuPG +updateGnuPG.introduction.desc=Enigmail exige GnuPG pour exécuter ses fonctions cryptographiques. Nous vous recommandons de garder votre installation de GnuPG à jour. +updateGnuPG.updateRequired=Une version plus récente de GnuPG est proposée. Nous vous recommandons fortement de garder votre installation de GnuPG à jour. Veuillez cliquer sur le bouton « Installer la mise à jour » pour la télécharger et l’installer. +updateGnuPG.noUpdateRequired=GnuPG est à jour. +updateGnuPG.cannotUpdate.header=Enigmail ne prend en charge que la mise à jour des paquets suivants : +updateGnuPG.cannotUpdate.footer=Il semble que vous utilisez quelque variante de GnuPG ; par conséquent, Enigmail ne peut malheureusement pas mettre à jour votre installation de GnuPG. +updateGnuPG.installUpdate=Installer la mise à jour +updateGnuPG.noMoreUpdates=Ne pas vérifier la présence de mises à jour à venir +updateGnuPG.checkUpdate=Vérifier la présence de mises à jour de GnuPG + + +#strings in keyserver.jsm +keyserver.error.aborted=Abandonné +keyserver.error.unknown=Une erreur inconnue est survenue +keyserver.error.serverError=Le serveur de clés a signalé une erreur. +keyserver.error.importError=Échec d’importation de la clé téléchargée. +keyserver.error.unavailable=Le serveur de clés n’est pas accessible. +keyserver.error.securityError=Le serveur de clés ne prend pas en charge l’accès chiffré. +keyserver.error.certificateError=Le certificat du serveur de clés n’est pas valide. +keyserver.error.unsupported=Le serveur de clés n'est pas pris en charge par Enigmail. + +#strings in mimeDecrypt.jsm +mimeDecrypt.encryptedPart.attachmentLabel=Partie chiffrée du courriel +mimeDecrypt.encryptedPart.concealedData=Cette partie du courriel est chiffrée. Vous devez l’ouvrir dans une fenêtre séparée en cliquant sur le fichier joint. + +#strings in gnupg-key.jsm +import.secretKeyImportError=Une erreur s’est produite dans GnuPG lors de l’importation des clés privées. L’importation a échoué. + +#strings in importSettings.js +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 diff -Nru enigmail-2.0.12+ds1/lang/gd/enigmail.dtd enigmail-2.1.3+ds1/lang/gd/enigmail.dtd --- enigmail-2.0.12+ds1/lang/gd/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/gd/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ -Mozilla Public License 2.0."> - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,15 +63,7 @@ - - - - - Iarraidh “Tar-chur na h-iuchrach Autocrypt” gum bi comas Autocrypt aig a’ chliant puist-d air an uidheam eile. - Ged as e am fuasgladh as simplidhe a th’ ann, cha chuir ach cuid a chliantan taic ris aig an àm seo. - ’S e “Lethbhreac-glèidhidh ⁊ aiseag” dhe na roghainnean agad a tha san dòigh eile. - Cruthaichidh sin faidhle ZIP leis an fhiosrachadh is na h-iuchraichean uile air a bheil feum ’na bhroinn agus ’s urrainn dhut lethbhreac dheth a chur air an uidheam ùr an uairsin. - ’S urrainn dha Enigmail na roghainnean sin ion-phortadh gun duilgheadas; airson cliantan puist-d eile, gabhaidh am faidhle ZIP a dhì-dhùmhlachadh agus dèiligeadh ris a làimh."> + @@ -94,15 +77,16 @@ + - + -”"> +”"> @@ -120,15 +104,18 @@ - + + + + - + - + @@ -214,6 +201,7 @@ + @@ -222,8 +210,8 @@ - - + + @@ -254,8 +242,8 @@ - - + + @@ -332,7 +320,7 @@ - + @@ -350,7 +338,7 @@ - + @@ -373,7 +361,6 @@ -Autocrypt a mhìnicheas ciamar a nithear crioptachadh puist-d o cheann gu ceann a tha furasta cleachdadh. Tha e a’ sònrachadh ciamar a nì prògraman puist-d rèiteachadh air comasan crioptachaidh slighe phost-d àbhaisteach."> @@ -416,7 +403,7 @@ -” mì-dhligheach"> +” mì-dhligheachChan eil “Mac màthar ” dligheach"> @@ -461,8 +448,8 @@ - - + + @@ -547,7 +534,7 @@ - + @@ -632,7 +619,7 @@ - + @@ -670,133 +657,40 @@ - - - - - - - - - - - - - - - - - - - - -An aire: Nì Enigmail dearbhadh air soidhneadh - puist-d airson gach cunntas no dearbh-aithne an-còmhnaidh ge b’ e a chaidh a chur an comas gus nach deach"> - + + - - + Mas e seo a bu toigh leat dèanamh, briog air a’ phutan “Stàlaich GnuPG” gus GnuPG a luchdadh a-nuas is a stàladh."> + - - - - - - - - - - - - - - - - - -iuchair phoblach agad ann do chàch ach an cuir iad puist-d chrioptaichte thugad. ’S urrainn dhut a sgaoileadh dhan a h-uile duine."> -iuchair phrìobhaideach agad ann dhut fhèin ach an dì-chrioptaich thu na puist-d sin agus gus puist-d le soidhneadh a chur. Na doir do dhuine beò i."> -iuchair phrìobhaideach agad ann dhut fhèin ach an dì-chrioptaich thu na puist-d sin agus gus puist-d le soidhneadh a chur. Na doir do dhuine beò i. -Gus an iuchair phrìobhaideach agad a chumail tèarainte, thèid abairt-fhaire iarraidh ort san da chòmhradh a leanas."> -abairt-fhaire agad a dhìonas an iuchair phrìobhaideach agad. Cuiridh i casg air droch chleachdadh na h-iuchrach prìobhaidich agad."> -Cha mholamaid gun cuireadh tu sràcan (m.e. à, ù) no caractaran sònraichte do chànan innte."> - - - - - - - - - - - - - - - - - - - - - - - - -Thèid iarraidh ort gun cuir thu a-steach am facal-faire agad airson seo. Feuch an tar-chuir thu an teisteanas gu meadhan a ghabhas a stòradh gu sàbhailte, can CD no UB stick. Ma gheibh cuideigin eile greim air an teisteanas seo, ’s urrainn dhaibh an iuchair agad a chur à feum."> - - - - - - - - - - - - às-phortaich an dàta agad on t-seann choimpiutair agad le draoidh às-phortadh o na roghainnean Enigmail - ion-phortaich an dàta dhan choimpiutair ùr agad leis an draoidh seo. - "> - - - - - - -Mòran taing airson Enigmail a chleachdadh."> -Dearbhaich an t-iarrtas a gheibh thu sa bhogsa a-steach agad mas e seo a tha thu ag iarraidh."> - - - - - - - - + + + + + + + + + + + - + @@ -812,12 +706,10 @@ - - às-phortaich an dàta agad on t-seann choimpiutair agad leis an draoidh seo - ion-phortaich an dàta dhan choimpiutair ùr agad le draoidh an rèiteachaidh. - "> + + + @@ -836,15 +728,15 @@ - - - + + + - + @@ -864,7 +756,7 @@ - + @@ -878,12 +770,21 @@ - - Tagh an cunntas gu h-ìosal gus an iuchair aige a thar-chur. - Seallaidh sinn còd suidheachaidh dhut (facal-faire) air an ath-sgrìn a dh’fheumas tu cur a-steach air an uidheam eile gus an iuchair agad agus na roghainnean ceangailte rithe ion-phortadh."> + + -Cleachd an t-uidheam eile a-nis agus fosgail an teachdaireachd seo air-san. Thèid còd suidheachaidh iarraidh ort. Sgrìobh na h-àireamhan seo ann:"> + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/gd/enigmail.properties enigmail-2.1.3+ds1/lang/gd/enigmail.properties --- enigmail-2.0.12+ds1/lang/gd/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/gd/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -45,7 +45,7 @@ # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=Thàinig atharrachadh mòr air mar a thèid roghainnean a làimhseachadh leis an tionndadh ùr seo de dh’Enigmail. Dh’fheuch sinn ris na seann roghainnean a thar-aiseag dhan tionndadh ùr seo. Co-dhiù, chan urrainn dhut dèiligeadh ris a h-uile roghainn gu fèin-obrachail. Thoir sùil air na roghainnean ùra a fhuair thu mar thoradh. -enigmailCommon.checkPreferences=Dearbhaich na roghainnean… +enigmailCommon.checkPreferences=Dearbh na roghainnean… preferences.defaultToPgpMime=Dh’atharraich sinn còdachadh tùsail nan teachdaireachdan ann an Enigmail o PGP ion-loidhne gu PGP/MIME. Mholamaid gun cum thu seo mar a’ bhun-roghainn.\n\nNam bu toigh leat PGP ion-loidhne a chleachdadh a ghnàth fhathast, ’s urrainn dhut seo a dhèanamh ann an “Roghainnean nan cunntasan” fo “Tèarainteachd OpenPGP”. ##################################################################### @@ -65,7 +65,7 @@ onlyGPG=Chan obraich gintinn iuchraichean ach le GnuPG (chan obraich e le PGP)! keygenComplete=Tha na h-iuchraichean air an gintinn! Thèid an dearbh-aithne <%S> a chleachdadh airson soidhneadh. -revokeCertRecommended=Mholamaid gun cruthaich thu teisteanas cùl-ghairm dhen iuchair agad. ’S urrainn dhut an teisteanas a chleachdadh gus an iuchair agad a dhèanamh mì-dhligheach, m.e. ma thèid an iuchair phrìobhaideach agad air a call no briseadh a-steach oirre. A bheil thu airson teisteanas cùl-ghairm a chruthachadh an-dràsta? +revokeCertRecommended=Dian-mholamaid gun cruthaich thu teisteanas cùl-ghairm dhen iuchair agad. A bheil thu airson teisteanas cùl-ghairm a chruthachadh an-dràsta?A bheil thu airson teisteanas cùl-ghairm a chruthachadh an-dràsta? keyMan.button.generateCert=&Gin teisteanas genCompleteNoSign=Tha gintinn nan iuchraichean coileanta! genGoing=Tha iuchraichean ’gan gintinn mar-thà! @@ -78,7 +78,7 @@ passSpaceProblem=Air adhbharan teicnigeach, chan fhaod an abairt-fhaire agad tòiseachadh no crìochnachadh le beàrn. changePassFailed=Dh’fhàillig le atharrachadh na h-abairt-fhaire. -keyConfirm=A bheil thu airson iuchraichean poblach is prìobhaideach a ghintinn airson “%S”? +keyConfirm=A bheil thu airson iuchair phoblach ’s dhìomhair a gintinn airson “%S”? keyMan.button.generateKey=&Gin iuchair keyAbort=A bheil thu airson sgur de ghintinn nan iuchair? keyMan.button.generateKeyAbort=&Sguir de ghintinn nan iuchair @@ -86,15 +86,15 @@ expiryTooLong=Chan urrainn dhut iuchair a chruthachadh a dh’fhalbhas an ùine air an ceann corr is 100 bliadhna. expiryTooLongShorter=Chan urrainn dhut iuchair a chruthachadh a dh’fhalbhas an ùine air an ceann corr is 90 bliadhna. expiryTooShort=Feumaidh an iuchair agad a bhith dligheach fad latha air a char as lugha. -keyGenFailed=Dh’fhàillig le gintinn nan iuchraichean. Thoir sùil air consoil Enigmail (clàr-taice “Enigmail” > “Dì-bhugachadh Enigmail”) airson barrachd fiosrachaidh. +keyGenFailed=Dh’fhàillig le gintinn na h-iuchrach. Thoir uil air consoil Enigmail (clàr-taice Enigmail > Roghainnean dì-bhugachaidh) airson mion-fhiosrachadh. setKeyExpirationDateFailed=Cha b’ urrainn dhuinn a’ chrìoch ùine atharrachadh # Strings in enigmailMessengerOverlay.js securityInfo=Fiosrachadh tèarainteachd Enigmail\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Cha deach na ceanglachain aig an teachdaireachd seo a shoidhneadh no a chrioptachadh*\r\n\r\n -possiblyPgpMime=Teachdaireachd air a crioptachadh no soidhneadh le PGP/MIME ’s dòcha; cleachd an gleus “Dì-chrioptaich/Dearbhaich” gus a dhearbhadh +enigContentNote=Enigmail: *Cha deach ceanglachain na teachdaireachd seo a shoidhneadh no a chrioptachadh*\n\n +possiblyPgpMime=Teachdaireachd air a crioptachadh no soidhneadh le PGP/MIME ’s dòcha; cleachd an gleus “Dì-chrioptaich/Dearbh” gus a dhearbhadh saveAttachmentHeader=Enigmail: Sàbhail ceanglachan air a dhì-chrioptachadh noTempDir=Cha deach leinn pasgan sealach a lorg gus sgrìobhadh ann\nFeuch an suidhich thu an caochladair àrainneachd TEMP @@ -102,7 +102,7 @@ beginPgpPart=***** *TOISEACH NA PÀIRT CRIOPTAICHTE no AIR A SOIDHNEADH* ***** endPgpPart=***** *DEIREADH NA PÀIRT CHRIOPTAICHTE no AIR A SOIDHNEADH* ***** -notePartEncrypted=Enigmail: *CHA DEACH a h-uile pàirt dhen teachdaireachd a shoidhneadh no a chrioptachadh* +notePartEncrypted=Enigmail: *CHA DEACH a h-uile pàirt dhen teachdaireachd seo a shoidhneadh no a chrioptachadh* noteCutMessage=Enigmail: *Chaidh iomadh bloca teachdaireachd a lorg – chaidh sgur dhen dì-chrioptachadh/dearbhadh* decryptOkNoSig=Rabhadh\n\nShoirbhich leis an dì-chrioptachadh ach cha b’ urrainn dhuinn an soidhneadh a dhearbhadh mar bu chòir @@ -114,6 +114,7 @@ fixBrokenExchangeMsg.failed=Cha deach leinn an teachdaireachd a chàradh. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key wksNoIdentity=Cha deach an iuchair seo ceangal ri gin dhe na cunntasan puist-d agad. Cuir cunntas ris airson co-dhiù aon dhe na seòlaidhean puist-d seo:\n\n%S wksConfirmSuccess=Chaidh post-d dearbhaidh a chur. wksConfirmFailure=Dh’fhàillig le cur a’ phuist-d dearbhaidh. @@ -134,7 +135,7 @@ windowLocked=Tha an uinneag sgrìobhaidh glaiste; chaidh sgur dhen chur sendUnencrypted=Dh’fhàillig le tòiseachadh Enigmail.\nA bheil thu airson an teachdaireachd a chur gun chrioptachadh? -composeSpecifyEmail=Sònraich am prìomh sheòladh puist-d agad a chleachdas sinn gus iuchair an t-soidhnidh a thaghadh airson teachdaireachdan a-mach.\nMa dh’fhàgas tu bàn e, thèid an seòladh O aig an teachdaireachd a chleachdadh gus iuchair an t-soidhnidh a thaghadh. +composeSpecifyEmail=Sònraich am prìomh sheòladh puist-d agad a chleachdas sinn gus iuchair an t-soidhnidh a thaghadh airson teachdaireachdan a-mach.\nMa dh’fhàgas tu bàn e, thèid an seòladh O aig an teachdaireachd a chleachdadh gus iuchair an t-soidhnidh a thaghadh.\n Ma dh’fhàgas tu bàn e, thèid seòladh “O” na teachdaireachd a chleachdadh airson iuchair an t-soidhnidh a thaghadh. sendingHiddenRcpt=Tha faightearan BCC (lethbhreac dall) aig an teachdaireachd seo. Ma thèid an teachdaireachd seo a chrioptachadh, gabhaidh na faightearan BCC fhalach ach chan urrainn do chuid a bhathair-bhog (can PGP Corp.) a chleachdas faightear ma dh’fhaoidte an teachdaireachd a dhì-chrioptachadh. Air sàilleibh seo, mholamaid gun seachnaich thu puist-d BCC le crioptachadh. sendWithHiddenBcc=Falaich na faightearan BCC sendWithShownBcc=Crioptaich gu h-àbhaisteach @@ -148,10 +149,9 @@ minimalLineWrapping=Shuidhich thu pasgadh nan loidhnichean air %S caractar. Airson crioptachadh/soidhneadh mar bu chòir, feumaidh an luach seo a bhith 68 no nas motha.\nA bheil thu airson pasgadh nan loidhnichean atharrachadh gu 68 caractar a-nis? warning=Rabhadh signIconClicked=Dh’atharraich thu an soidhneadh a làimh. Mar sin, fad ’s a bhios tu a’ sgrìobhadh na teachdaireachd seo, cha bhi cur an/à comas an t-soidhnidh an eisimeil air cur an/à comas a’ chrioptachaidh tuilleadh. -errorOwnKeyUnusable=Cha lìbhrig ID na h-iuchrach “%S” a chaidh a rèiteachadh airson na h-aithne làithrich iuchair OpenPGP a ghabhas cleachdadh.\n\nDèan cinnteach gu bheil iuchair OpenPGP dhligheach agad nach do dh’fhalbh an ùine oirre agus gun tomh roghainnean a’ chunntais agad ris an iuchair sin.\nMur an do dh’fhalbh an ùine air an iuchair agad, dearbhaich gun do shuidhich thu earbsa an t-seilbheadair air “earbsach” no “cho earbsach ’s a ghabhas”. +errorOwnKeyUnusable=Chan fhaighear iuchair OpenPGP a ghabhas cleachdadh à ID na h-iuchrach “%S” a chaidh a rèiteachadh dhan dearbh-aithne làithreach.\n\nDèan cinnteach gu bheil iuchair OpenPGP dhligheach agad nach do dh’fhalbh an ùine oirre agus gun tomh roghainnean a’ chunntais agad ris an iuchair sin.\nMur an do dh’fhalbh an ùine air an iuchair agad, thoir sùil an do shuidhich thu earbsa an t-sealbhadair air “full (Làn-earbsa)” no “ultimate (Cho earbsach ’s a ghabhas)”. msgCompose.cannotSaveDraft=Mearachd le sàbhaladh an dreachd 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.mimeMsg=Chaidh cuid dhen teachdaireachd seo a tha thu a’ freagairt rithe a chrioptachadh is tha cuid eile gun chrioptachadh. Tha cuid chrioptaichte aice nach fhaic thu.\n\nMura deach leis an t-seòladair a chuir thugad i a’ chuid chrioptaichte a dhì-chrioptachadh, dh’fhaoidte gun nochd thu fiosrachadh dìomhair do dhaoine nach deach leis an t-seòladair sin fhèin a dhì-chrioptachadh.\n\nMholamaid nach cuir thu freagairt dhan teachdaireachd seo ach gun cruthaich thu teachdaireachd ùr airson na freagairte agad. msgCompose.partiallyEncrypted.inlinePGP=Chaidh cuid dhen teachdaireachd seo a tha thu a’ freagairt rithe a chrioptachadh is tha cuid eile gun chrioptachadh. Mura deach leis an t-seòladair a chuir thugad i a’ chuid chrioptaichte a dhì-chrioptachadh, dh’fhaoidte gun nochd thu fiosrachadh dìomhair dha nach deach leis an t-seòladair sin fhèin a dhì-chrioptachadh.\n\nSaoil an doir thu air falbh gach iomradh teacsa on fhreagairt agad dhan t-seòladair sin? msgCompose.internalEncryptionError=Mearachd taobh a-staigh: Chaidh an crioptachadh geallta a chur à comas @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=Chaidh Enigmail a chur à comas airson na dearbh-aithne a thagh thu msgCompose.protectSubject.tooltip=Dìon cuspair na teachdaireachd msgCompose.noSubjectProtection.tooltip=Na dìon cuspair na teachdaireachd -msgCompose.encryptedSubjectStub=Teachdaireachd chrioptaichte msgCompose.protectSubject.dialogTitle=A bheil thu airson dìon nan cuspairean a chur an coma? msgCompose.protectSubject.question=Chan fhalaich teachdaireachdan crioptaichte àbhaisteach an cuspair.\n\nStèidhich sinn stannard a dh’fhalaicheas an cuspair tùsail san teachdaireachd chrioptaichte ’s a chuireas teacsa fuadain ’na àite gus nach faicear an cuspair mus deach am post-d a dhì-chrioptachadh.\n\nA bheil thu airson cuspairean nan teachdaireachdan crioptaichte a dhìon? msgCompose.protectSubject.yesButton=&Dìon an cuspair @@ -179,7 +178,7 @@ msgCompose.pepSendTrusted=Tèarainte ⁊ earbsach pep.alert.disabledForIdentity=Tha p≡p à comas airson na dearbh-aithne làithrich. Cuir an comas p≡p ann an roghainnean Enigmail/p≡p. -pep.alert.weakReply=Tha thu an impis freagairt do theachdaireachd thèarainte a chur no a sìneadh air adhart mar theachdaireachd nach eil tèarainte tuilleadh. Ma leanas tu air adhart, dh’fhaoidte gun dèid fiosrachadh cugallach fhoillseachadh a chuireas tu fhèin agus an co-sgrìobhaiche agad fo chunnart. A bheil thu cinnteach gu bheil thu airson leantainn air adhart? +pep.alert.weakReply=Tha thu an impis teachdaireachd thèarainte a shìneadh air adhart no fhreagairt rithe ach cha bhi an teachdaireachd a chuireas tu tèarainte. Ma leanas tu air adhart, dh’fhaoidte gun dèid fiosrachadh dìomhair leigeil air èalaidh a chuireas tu fhèin ’s com-pàirtiche a’ chonaltraidh ann an cunnart. A bheil thu cinnteach gu bheil thu airson leantainn air adhart? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=A bheil thu airson an teachdaireachd %1$S a shàbhaladh gu %2$S ann am pasgan nan teachdaireachdan nach deach a chur? onlineSend=A bheil thu airson an teachdaireachd %1$S a chur gu %2$S? -encryptKeysNote=An aire: Tha an teachdaireachd ’ga crioptachadh le IDan/iuchraichean a’ chleachdaiche seo: %S +encryptKeysNote=An aire: Chaidh an teachdaireachd a chrioptachadh dha na IDan cleachdaiche / iuchraichean seo: %S hiddenKey= -signFailed=Mearachd le Enigmail; dh’fhàillig leis a’ chrioptachadh/an t-soidhnidh; an cuir sinn an teachdaireachd gun chrioptachadh? +signFailed=Mearachd ann an Enigmail: dh’fhàillig leis a’ chrioptachadh/an t-soidhnidh. A bheil thu airson an teachdaireachd a chur gun chrioptachadh? msgCompose.button.sendUnencrypted=&Cuir an teachdaireachd gun chrioptachadh recipientsSelectionHdr=Tagh na faightearan airson a’ chrioptachaidh @@ -225,9 +224,9 @@ signOffWithReason=Soidhneadh: DHETH (%S) reasonEnabledByDefault=an comas a ghnàth reasonManuallyForced=air a sparradh a làimh -reasonByRecipientRules=air a sparradh le riaghailtean an fhaighteir +reasonByRecipientRules=air a sparradh le riaghailt a-rèir an fhaighteir reasonByAutoEncryption=air a sparradh leis a’ chrioptachadh fhèin-obrachail -reasonByConflict=ri linn còmhstri ann an riaghailtean an fhaighteir +reasonByConflict=ri linn còmhstri ann an riaghailtean a-rèir an fhaighteir reasonByEncryptionMode=ri linn modh a’ chrioptachaidh # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=Thèid PGP ion-loidhne a chleachdadh # Attach own key status (tooltip strings): -attachOwnKeyNo=Cha dèid an iuchair agad fhèin a chur ris -attachOwnKeyYes=Thèid an iuchair agad fhèin a chur ris -attachOwnKeyDisabled=Chan urrainn dhuinn an iuchair agad fhèin a chur ris mar cheanglachan. Feumaidh tu iuchair shònraichte a thaghadh\nann an earrann OpenPGP aig “Roghainnean nan cunntasan” gus an gleus seo a chur an comas. +attachOwnKeyNo=Cha dèid an iuchair phoblach agad fhèin a cheangal ris +attachOwnKeyYes=Tèid an iuchair phoblach agad fhèin a cheangal ris +attachOwnKeyDisabled=Cha ghabh an iuchair phoblach agad fhèin a cheangal ris. Feumaidh tu iuchair shònraichte a thaghadh\nann an earrann OpenPGP dhe “Roghainnean nan cunntasan” gus an gleus seo a chur an coma. rulesConflict=Mhothaich sinn do chòmhstri ann an riaghailtean a-rèir faighteir\n%S\n\nA bheil thu airson an teachdaireachd a chur leis na roghainnean seo? msgCompose.button.configure=&Rèitich @@ -264,11 +263,15 @@ # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Tha feum air an iuchair phoblach %S gus an soidhneadh a dhearbhadh keyUsed=An iuchair phoblach %S a chaidh a chleachdadh gus an soidhneadh a dhearbhadh -clickDecrypt=; cleachd an gleus “Dì-chrioptaich/Dearbhaich” -clickDecryptRetry=; cleachd an gleus “Dì-chrioptaich/Dearbhaich” gus feuchainn ris a-rithist +clickDecrypt=; cleachd an gleus “Dì-chrioptaich/Dearbh” +clickDecryptRetry=; cleachd an gleus “Dì-chrioptaich/Dearbh” gus feuchainn ris a-rithist clickDetailsButton=; briog air a’ phutan “Mion-fhiosrachadh” airson barrachd fiosrachaidh clickImportButton=; briog air a’ phutan “Ion-phortaich iuchair” gus an iuchair ion-phortadh keyTypeUnsupported=; cha chuir an tionndadh agad de GhnuPG taic ris an seòrsa iuchrach seo +decryptManually=; briog air a’ phutan “Dì-chrioptaich” airson an teachdaireachd seo a dhì-chrioptachadh +verifyManually=; briog air a’ phutan “Dearbh” airson an soidhneadh a dhearbhadh +headerView.button.verify=Dearbh +headerView.button.decrypt=Dì-chrioptaich msgPart=Pàirt dhen teachdaireachd %S msgSigned=air a soidhneadh msgSignedUnkownKey=air a shoidhneadh le iuchair nach aithne dhuinn @@ -277,11 +280,13 @@ unverifiedSig=Soidhneadh gun dearbhadh incompleteDecrypt=Chan eil an dì-chrioptachadh coileanta -needKey=Mearachd - cha deach iuchair phrìobhaideach fhreagarrach a lorg gus an teachdaireachd a dhì-chrioptachadh -failedDecrypt=Mearachd - dh’fhàillig leis an dì-chrioptachadh -badPhrase=Mearachd - droch abairt-fhaire -failedDecryptVerify=Mearachd - dh’fhàillig leis an dì-chrioptachadh/dearbhadh +needKey=Mearachd – cha deach iuchair dhìomhair fhreagarrach a lorg gus an teachdaireachd a dhì-chrioptachadh +failedDecrypt=Mearachd – dh’fhàillig leis an dì-chrioptachadh +badPhrase=Mearachd – droch abairt-fhaire +missingMdcError=Mearachd – tha dìon an treibhdhireis (MDC) a dhìth no briste +failedDecryptVerify=Mearachd – dh’fhàillig leis an dì-chrioptachadh/dearbhadh viewInfo=; Sealladh > Tèarainteachd na teachdaireachd airson barrachd fiosrachaidh +brokenExchangeMessage=Teachdaireachd PGP/MIME briste o MS-Exchange. decryptedMsg=Teachdaireachd air a dì-chrioptachadh decryptedMsgWithFormatError=Teachdaireachd air a dì-chrioptachadh (chaidh fòrmat puist-d PGP briste aiseag a dh’adhbharaich seann fhrithealaiche Exchange ma dh’fhaoidte, mar sin chan eil sinn an dùil gum bi an toradh foirfe ri leughadh) @@ -317,15 +322,16 @@ pepRevokeTrust.doRevoke=Cuir crìoch air an &earbsa wksConfirmationReq=Iarrtas air dearbhadh eòlaire Web Key -wksConfirmationReq.message=Chaidh an teachdaireachd seo a chur leis an t-solaraiche puist-d agad a dhearbhadh gun deach an iuchair phoblach OpenPGP agad a luchdadh suas\ngun eòlaire Web Key aca.\nMa dh’fhoillsicheas tu an iuchair phoblach agad, bidh e nas fhasa do chàch an iuchair agad a lorg agus teachdaireachdan crioptaichte a chur thugad.\n\nMa tha thu airson an iuchair agad fhoillseachadh san eòlaire Web Key an-ràsta, briog air a’ phutan “Dearbhaich an t-iarrtas” air a’ bhàr-inbhe.\nMur eil, leig seachad an teachdaireachd seo. -wksConfirmationReq.button.label=Dearbhaich an t-iarrtas +wksConfirmationReq.message=Chaidh an teachdaireachd seo a chur leis an t-solaraiche puist-d agad a dhearbhadh gun deach an iuchair phoblach OpenPGP agad a luchdadh suas\ngun eòlaire Web Key aca.\nMa dh’fhoillsicheas tu an iuchair phoblach agad, bidh e nas fhasa do chàch an iuchair agad a lorg agus teachdaireachdan crioptaichte a chur thugad.\n\nMa tha thu airson an iuchair agad fhoillseachadh san eòlaire Web Key an-ràsta, briog air a’ phutan “Dearbh an t-iarrtas” air bàr na staid.\nMur eil, leig seachad an teachdaireachd seo. +wksConfirmationReq.button.label=Dearbh an t-iarrtas autocryptSetupReq=Dèan suidheachadh Autocrypt -autocryptSetupReq.button.label=Tòisich air an rèiteachadh -autocryptSetupReq.setupMsg.desc=Tha am fiosrachadh uile san teachdaireachd seo gus na roghainnean Autocrypt is an iuchair phrìobhaideach agad a thar-aiseag on uidheam tùsail agad gu tèarainte. -autocryptSetupReq.setupMsg.backup=’S urrainn dhut an teachdaireachd seo a chumail ’na lethbhreac-glèidhidh dhen iuchair phrìobhaideach agad. Ma tha thu airson sin a dhèanamh, bu chòir dhut am facal-faire a sgrìobhadh air pìos pàipeir agus a ghlèidheadh gu tèarainte. -autocryptSetupReq.message.import=Gus na roghainnean is iuchraichean ion-phortadh gu Enigmail, briog air a’ phutan “Tòisich air an rèiteachadh” air a' bhàr-inbhe. +autocryptSetupReq.button.label=Tòisich air an t-suidheachadh +autocryptSetupReq.setupMsg.desc=Tha am fiosrachadh uile san teachdaireachd seo gus na roghainnean Autocrypt is an iuchair dhìomhair agad a thar-aiseag on uidheam tùsail agad gu tèarainte. +autocryptSetupReq.setupMsg.backup=’S urrainn dhut an teachdaireachd seo a chumail ’na lethbhreac-glèidhidh dhen iuchair dhìomhair agad. Ma tha thu airson sin a dhèanamh, bu chòir dhut am facal-faire a sgrìobhadh air pìos pàipeir agus a ghlèidheadh gu tèarainte. +autocryptSetupReq.message.import=Gus na roghainnean is iuchraichean ion-phortadh gu Enigmail, briog air a’ phutan “Tòisich air an t-suidheachadh” air bàr na staid. autocryptSetupReq.message.sent=Briog air an teachdaireachd air an uidheam ùr agad agus lean ris an stiùireadh gus na roghainnean ion-phortadh. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js oldGpgVersion20=Cha deach leinn Enigmail a thòiseachadh.\n\nTha thu a’ cleachdadh GnuPG tionndadh %1$S ris nach cuir sinn taic tuilleadh. Feumaidh Enigmail GnuPG tionndadh %2$S no nas ùire. Chan obraich Enigmail gus an àrdaich thu an stàladh dhe GnuPG agad. @@ -334,9 +340,11 @@ warningsAreReset=Chaidh gach rabhadh ath-shuidheachadh. prefs.gpgFound=Chaidh GnuPG a lorg an-seo: %S prefs.gpgNotFound=Cha deach GnuPG a lorg -prefs.warnAskNever=Rabhadh: ma chuireas tu an roghainn seo an comas, bidh teachdaireachdan gun chrioptachadh agad gun fhiosrachadh a bharrachd sam bith mur eil iuchair airson aon dhe na faightearan ann -- chan innis Enigmail dhut nuair a thachras seo! -prefs.warnIdleTimeForUnknownAgent=Chan urrainn dhuinn ceangal ri gpg-agent. ’S dòcha gun cleachd an siostam agad inneal sònraichte gus abairtean-faire a làimhseachadh (m.e. gnome-keyring, seahorse-agent, KDE wallet manager, …). Gu mì-fhortanach, chan eil smachd aig Enigmail air nuair a dh’fhalbhas an ùine air abairt-fhaire airson an inneal a tha thu a’ chleachdadh. Mar sin, thèid roghainnean falbh na h-ùine aig Enigmail a leigeil seachad. -prefEnigmail.oneKeyserverOnly=Mearachd - chan urrainn dhut barrachd air aon fhrithealaiche iuchraichean a shònrachadh airson luchdadh a-nuas fèin-obrachail nan iuchraichean OpenPGP a tha a dhìth. +prefs.warnAskNever=Rabhadh: ma chuireas tu an roghainn seo an comas, bidh teachdaireachdan gun chrioptachadh agad gun fhiosrachadh a bharrachd sam bith mur eil iuchair airson aon dhe na faightearan ann – chan innis Enigmail dhut nuair a thachras seo! +prefs.warnIdleTimeForUnknownAgent=Chan urrainn dhuinn ceangal ri gpg-agent. ’S dòcha gun cleachd an siostam agad inneal sònraichte gus abairtean-faire a làimhseachadh (m.e. gnome-keyring, seahorse-agent, KDE wallet manager, …). Gu mì-fhortanach, chan eil smachd aig Enigmail air nuair a dh’fhalbhas an ùine air abairt-fhaire airson an inneal a tha thu a’ chleachdadh.Mar sin, thèid roghainnean falbh na h-ùine aig Enigmail a leigeil seachad. +prefEnigmail.oneKeyserverOnly=Mearachd – chan urrainn dhut barrachd air aon fhrithealaiche iuchraichean a shònrachadh airson luchdadh a-nuas fèin-obrachail nan iuchraichean OpenPGP a tha a dhìth. +acSetupMessage.desc=Tar-chur an iuchair agad gu uidheam eile air a bheil Autocrypt an comas. (Dè a th’ ann an Autocrypt?) +aboutLicense.desc=Tha an còd aig Enigmail fosgailte agus ri fhaighinn fo cheadachas Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -344,18 +352,18 @@ enterAdminPin=Cuir a-steach PIN an RIANAIRE airson a’ SmartCard agad enterCardPin=Cuir a-steach PIN a’ SmartCard agad -notInit=Mearachd - chan eil seirbheis Enigmail air a tòiseachadh fhathast -badCommand=Mearachd - dh’fhàillig le àithne crioptachaidh +notInit=Mearachd – chan eil seirbheis Enigmail air a tòiseachadh fhathast +badCommand=Mearachd – dh’fhàillig le àithne crioptachaidh cmdLine=loidhne-àithne is às-chur: -notRequired=Mearachd - chan eil crioptachadh riatanach -notComplete=Mearachd - chan eil gintinn na h-iuchrach deiseil fhathast -invalidEmail=Mearachd - seòladh no seòlaidhean puist-d mì-dhligheach -noPassphrase=Mearachd - cha deach abairt-fhaire a sholar -noPGPblock=Mearachd - cha deach bloca dàta OpenPGP armaichte dligheach a lorg +notRequired=Mearachd – chan eil crioptachadh riatanach +notComplete=Mearachd – chan eil gintinn na h-iuchrach deiseil fhathast +invalidEmail=Mearachd – seòladh no seòlaidhean puist-d mì-dhligheach +noPassphrase=Mearachd – cha deach abairt-fhaire a sholar +noPGPblock=Mearachd – cha deach bloca dàta OpenPGP armaichte dligheach a lorg unverifiedReply=Tha amharas oirnn gun deach pàirt dhen teachdaireachd a tha eagaichte (an fhreagairt) atharrachadh -keyInMessageBody=Lorg sinn iuchair ann am bodhaig na teachdaireachd. Briog air “Ion-phortaich iuchair” gus an iuchair ion-phortadh -sigMismatch=Mearachd - soidhneadh neo-ionnann -cantImport=Mearachd le ion-phortadh na h-iuchrach poblaich\n\n +keyInMessageBody=Chaidh iuchair a lorg ann am bodhaig na teachdaireachd. Briog air “Ion-phortaich iuchair” gus an iuchair ion-phortadh +sigMismatch=Mearachd – soidhneadh neo-ionnann +cantImport=Mearachd ag ion-phortadh na h-iuchrach poblaich\n\n doImportOne=A bheil thu airson %1$S (%2$S) ion-phortadh? doImportMultiple=A bheil thu airson na h-iuchraichean seo ion-phortadh?\n\n%S previewFailed=Chan urrainn dhuinn faidhle nan iuchraichean poblach a leughadh. @@ -366,14 +374,15 @@ sc.removeCard=Tha an t-obrachadh ag iarraidh nach eil SmartCard san inneal-leughaidh agad.\nThoir air falbh an SmartCard agad is feuch ris a-rithist. sc.noCardAvailable=Cha deach SmartCard a lorg san inneal-leughaidh agad.\nCuir a-steach an SmartCard agad is feuch ris a-rithist. sc.noReaderAvailable=Cha b’ urrainn dhuinn an t-inneal-leughaidh SmartCard agad inntrigeadh\nCeangail an t-inneal-leughaidh SmartCard agad, cuir a-steach a’ chairt agad agus feuch ris a-rithist. -keyError.keySpecNotFound=Cha do lorg sinn iuchair air an dul-iuchrach agad a fhreagras ris an t-seòladh puist-d “%S”. -keyError.keyIdNotFound=Cha do lorg sinn ID na h-iuchrach “%S” rèitichte air an dul-iuchrach agad. +keyError.keySpecNotFound=Tha do lorg sinn iuchair air an dul-iuchrach agad airson an seòlaidh puist-d “%S”. +keyError.keyIdNotFound=Tha do lorg sinn ID na h-iuchrach “%S” a rèitich thu air an dul-iuchrach agad. keyError.resolutionAction=Tagh iuchair dhligheach ann an earrann OpenPGP dhe “Roghainnean nan cunntasan”. missingPassphrase=Tha abairt-fhaire a dhìth errorHandling.gpgAgentInvalid=Tha an siostam agad a’ ruith tionndadh dhe gpg-agent nach eil iomchaidh airson an tionndaidh agad dhe GnuPG. errorHandling.gpgAgentError=Dh’aithris GnuPG mearachd sa chonaltradh le gpg-agent (seo co-phàirt dhe GnuPG). errorHandling.dirmngrError=Dh’aithris GnuPG mearachd sa chonaltradh le dirmngr (seo co-phàirt dhe GnuPG). errorHandling.pinentryError=Chan urrainn dha GnuPG an abairt-fhaire agad iarraidh le pinentry. +errorHandling.pinentryCursesError=Chaidh an stàladh agad dhe GnuPG a rèiteachadh ach an cleachd e a’ chonsoil airson PIN a chur a-steach le pinentry. Gidheadh, feumaidh tu tionndadh grafaigeach dhe pinentry airson chleachdadh le Enigmail. errorHandling.readFaq=Seo mearachd le suidheachadh no rèiteachadh an t-siostaim nach leig le Enigmail obair mar bu chòir ’s a ghabh a càradh gu fèin-obrachail.\n\nDian-mholamaid gun doir thu sùil air an làrach-lìn taice againn air https://enigmail.net/faq. gpgNotFound=Cha deach am prògram GnuPG “%S” a lorg.\nDèan cinnteach gun do shònraich thu slighe an fhaidhle sho-ghnìomhaichte GnuPG mar bu chòir ann an roghainnean Enigmail. @@ -383,13 +392,12 @@ prefGood=Deagh shoidhneadh o %S prefBad=DROCH shoidhneadh o %S -failCancel=Mearachd - chaidh sgur de dh’fhaighinn na h-iuchrach leis a’ chleachdaiche -failNoServer=Mearachd - Cha deach frithealaiche iuchraichean a shònrachadh gus iuchair fhaighinn uaithe -failNoID=Mearachd - Cha deach ID na h-iuchrach a shònrachadh gus iuchair fhaighinn air a son -failKeyExtract=Mearachd - Dh’fhàillig le àithne às-tharraing na h-iuchrach -notFirstBlock=Mearachd - Chan eil a’ chiad bhloca OpenPGP ’na bhloca iuchrach poblaich +failCancel=Mearachd – chaidh sgur de dh’fhaighinn na h-iuchrach leis a’ chleachdaiche +failKeyExtract=Mearachd – dh’fhàillig le àithne às-tharraing na h-iuchrach +failKeyNoSubkey=Chan eil (fo-)iuchair dhligheach ann +notFirstBlock=Mearachd – chan eil a’ chiad bhloca OpenPGP ’na bhloca iuchrach poblaich importKeyConfirm=A bheil thu airson an iuchair/na h-iuchraichean a tha leabaichte san teachdaireachd ion-phortadh? -failKeyImport=Mearachd - Dh’fhàillig le ion-phortachadh iuchrach +failKeyImport=Mearachd – dh’fhàillig le ion-phortachadh iuchrach fileWriteFailed=Cha deach leinn sgrìobhadh gun fhaidhle %S importKey=Ion-phortaich an iuchair phoblach %S on fhrithealaiche iuchraichean: @@ -409,7 +417,7 @@ atLeastOneKey=Cha deach iuchair a thaghadh! Feumaidh tu iuchair no dhà a thaghadh airson gabhail ris a’ chòmhradh seo fewerKeysThanRecipients=Thagh thu uiread nas lugha de dh’iuchraichean na tha faightearan ris. A bheil thu cinnteach gu bheil liosta nan iuchraichean crioptachaidh coileanta? userSel.button.goBack=Tagh barrachd iuchraichean -userSel.secretKeySel.title=Tagh iuchair OpenPGP phrìobhaideach gus na teachdaireachdan agad a shoidhneadh +userSel.secretKeySel.title=Tagh iuchair OpenPGP dhìomhair gus na teachdaireachdan agad a shoidhneadh userSel.problemNoKey=Gun iuchair dhligheach userSel.problemMultipleKeys=Iomadh iuchair # should be same as thunderbird ENTITY sendLaterCmd.label: @@ -425,10 +433,12 @@ identityName=Dearbh-aithne: %S switchPepMode=Tha thu a’ cleachdadh a’ “mhodh furasta p≡p” aig Enigmail.\n\nMa chuireas tu an comas OpenPGP no S/MIME airson cunntas, cuiridh tu p≡p à comas agus cleachdaidh tu am modh “àbhaisteach” aig Enigmail às aonais p≡p. enableEnigmail=&Cuir à comas p≡p +amPrefAutocrypt.desc=’S e stannard a th’ ann an Autocrypt a mhìnicheas mar a thèid puist-d a chrioptachadh gu goireasach on dàrna ceann dhan cheann eile. Tha e a’ sònrachadh mar a cho-rèiticheas prògraman puist-d comasan crioptachaidh slighe puist-d àbhaisteach. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Ghnìomhaich thu an crioptachadh ach cha do thagh thu iuchair. Feumaidh tu iuchair dhligheach no dhà a shònrachadh o liosta nan iuchraichean gus puist-d a chuireas tu gu %1$S a chrioptachadh. A bheil thu airson an crioptachadh a chur à comas airson %2$S? -noKeyToUse=(gun iuchair - gun chrioptachadh) +noKeyToUse=(gun iuchair – gun chrioptachadh) noEmptyRule=Chan fhaod an riaghailt a bhith falamh! Suidhich seòladh puist-d ann an raon na riaghailt. invalidAddress=Chan eil an seòladh/na seòlaidhean puist-d a chuir thu a-steach dligheach. Cha bu chòir dhut ainmean nam faightearan a shònrachadh, na sònraich ach na seòlaidhean puist-d fhèin. M.e.:\nMì-dhligheach: Ainm \nDligheach: ainm@seòladh.net noCurlyBrackets=Tha ciall sònraichte air na camagan dualach {} agus cha bu chòir dhut an cleachdadh ann an seòladh puist-d. Ma tha thu airson atharrachadh cò ris a fhreagras an riaghailt seo, cleachd an roghainn “Cuir an riaghailt an sàs ma … an fhaightear”.\nGheibh thu barrachd fiosrachadh le putan na cobharach. @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=Chan eil an gleus a thagh thu ri fhaighinn sa mhodh far loidhne. Rach air loidhne is feuch ris a-rithist. -protocolNotSupported=Cha chuir sinn taic ris a’ phròtacal “%S://” a thagh thu gus iuchraichean OpenPGP a luchdadh a-nuas. -gpgkeysDisabled=’S dòcha gum b’ fheairrde thu an roghainn “extensions.enigmail.useGpgKeysTool” a chur an comas. noKeyserverConn=Cha b’ urrainn dhuinn ceangal ri frithealaiche iuchraichean air %S. -keyDownloadFailed=Cha deach leinn an iuchair a luchdadh a-nuas on fhrithealaiche iuchraichean. Seo teachdaireachd na staide:\n%S internalError=Thachair mearachd taobh a-staigh. Cha b’ urrainn dhuinn na h-iuchraichean a luchdadh a-nuas no an ion-phortadh. -noKeyFound=Tha sinn duilich ach cha deach leinn iuchair a lorg a fhreagras ris na faclan-luirg. -keyDownload.keyUnavailable=Tha sinn duilich ach chan eil an iuchair air a bheil ID %S ri faighinn air an fhrithealaiche iuchraichean. Mar as trice ’s ann nach do luchdaich sealbhadair na h-iuchrach suas gun fhrithealaiche iuchraichean i.\n\nIarr air seòladair na teachdaireachd gun cuir iad an iuchair thugad air a’ post-d. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Cha deach leinn an iuchair a lorg no a luchdadh a-nuas on fhrithealaiche iuchraichean: cha b’ urrainn dhuinn gpgkeys_%S a ghnìomhachadh. - +noKeyFound=Tha do lorg sinn iuchair a fhreagras ris na h-abairtean luirg. +keyDownload.keyUnavailable=Chan eil iuchair air a bheil ID %S ri fhaighinn air an fhrithealaiche iuchraichean. Mar as trice, cha do luchdaidh sealbhadair na h-iuchrach suas i dhan fhrithealaiche iuchraichean.\n\nIarr air seòladair na teachdaireachd gun cuir iad an iuchair phoblach aca thugad air a’ phost-d. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Dh’fhàillig le suidheachadh earbsa an t-seilbheadair @@ -462,10 +465,10 @@ # Strings in enigmailSignKeyDlg.js signKeyFailed=Dh’fhàillig le soidhneadh na h-iuchrach -alreadySigned.label=An aire: chaidh an iuchair %S a shoidhneadh leis an iuchair phrìobhaideach a thagh thu mar-thà. -alreadySignedexportable.label=An aire: chaidh an iuchair %S a shoidhneadh leis an iuchair phrìobhaideach a thagh thu mar thè a ghabhas às-phortadh. Chan eil soidhneadh ionadail gu ciall sam bith. -partlySigned.label=An aire: chaidh cuid dhe na IDan cleachdaiche aig an iuchair %S a shoidhneadh leis an iuchair phrìobhaideach a thagh thu mar-thà. -noTrustedOwnKeys=Cha deach iuchair iomchaidh a lorg gus a shoidhneadh! Feumaidh iuchair phrìobhaideach le làn-earbsa innte a bhith agad mus urrainn dhut iuchraichean a shoidhneadh. +alreadySigned.label=An aire: chaidh an iuchair %S a shoidhneadh leis an iuchair dhìomhair a thagh thu mu thràth. +alreadySignedexportable.label=An aire: chaidh an iuchair %S a shoidhneadh leis an iuchair dhìomhair a thagh thu mar thè a ghabhas às-phortadh. Chan eil soidhneadh ionadail gu ciall sam bith. +partlySigned.label=An aire: chaidh cuid dhe na IDan cleachdaiche aig an iuchair %S a shoidhneadh leis an iuchair dhìomhair a thagh thu mu thràth. +noTrustedOwnKeys=Cha deach iuchair iomchaidh a lorg gus a shoidhneadh! Feumaidh iuchair dhìomhair le làn-earbsa innte a bhith agad mus urrainn dhut iuchraichean a shoidhneadh. # Strings in enigmailKeyManager.js keyMan.loadingKeys=A’ luchdadh nan iuchraichean, fuirich greis… @@ -490,17 +493,16 @@ asciiArmorFile=Faidhlichean ASCII armaichte (*.asc) importKeyFile=Ion-phortaich faidhle iuchrach OpenPGP gnupgFile=Faidhlichean GnuPG -createKeyOK=Chaidh an iuchair agad a ghintinn saveRevokeCertAs=Cruthaich ⁊ sàbhail teisteanas cùl-ghairm -revokeCertOK=Chaidh an teisteanas cùl-ghairm a chruthachadh. ’S urrainn dhut a chleachdadh gus comharrachadh nach eil an iuchair phoblach agad dligheach tuilleadh, can ma bhios tu air an iuchair phrìobhaideach agad a chall. +revokeCertOK=Chaidh an teisteanas cùl-ghairm a chruthachadh. ’S urrainn dhut a chleachdadh gus comharrachadh nach eil an iuchair phoblach agad dligheach tuilleadh, can ma bhios tu air an iuchair dhìomhair agad a chall.’S urrainn dhut a chleachdadh airson comharrachadh nach eil an iuchair phoblach agad dligheach tuilleadh, can ma chaill thu an iuchair dhìomhair agad. revokeCertFailed=Cha b’ urrainn dhuinn an teisteanas cùl-ghairm a chruthachadh. addUidOK=Chaidh ID a’ chleachdaiche a chur ris addUidFailed=Cha deach leinn ID a’ chleachdaiche a chur ris noKeySelected=Bu chòir dhut iuchair no dhà a thaghadh gus na thagh thu a dhèanamh exportToFile=Às-phortaich an iuchair phoblach gu faidhle -exportKeypairToFile=Às-phortaich an iuchair phrìobhaideach is phoblach gu faidhle -exportSecretKey=A bheil thu airson an iuchair phrìobhaideach a ghabhail a-steach san fhaidhle iuchrach OpenPGP air a shàbhaladh? +exportKeypairToFile=Às-phortaich an iuchair dhìomhair is phoblach gu faidhle +exportSecretKey=A bheil thu airson an iuchair dhìomhair a ghabhail a-steach san fhaidhle iuchrach OpenPGP air a shàbhaladh? saveKeysOK=Chaidh na h-iuchraichean a shàbhaladh saveKeysFailed=Cha deach leinn na h-iuchraichean a shàbhaladh importKeysFailed=Cha deach leinn na h-iuchraichean ion-phortadh @@ -509,39 +511,38 @@ specificPubSecKeyFilename=%1$S (0x%2$S) pobl-priobh defaultPubKeyFilename=Iuchraichean-poblach-air-as-phortadh defaultPubSecKeyFilename=Iuchraichean-poblach-is-priobhaideach-air-as-phortadh -noSecretKeys=Cha deach iuchair phrìobhaideach a lorg.\n\nA bheil thu airson an iuchair agad fhèin a ghintinn a-nis? sendKeysOk=Chaidh an iuchair/na h-iuchraichean a chur sendKeysFailed=Dh’fhàillig le cur nan iuchraichean receiveKeysOk=Chaidh an iuchair/na h-iuchraichean ùrachadh receiveKeysFailed=Dh’fhàillig le luchdadh a-nuas nan iuchraichean +keyUpload.verifyEmails=Cuiridh am frithealaiche iuchraichean post-d thugad airson gach seòladh puist-d dhen iuchair a luchdaich thu suas. Airson foillseachadh na h-iuchrach agad a dhearbhadh, feumaidh tu briogadh air a’ cheangal sa h-uile post-d a gheibh thu. importFromClip=A bheil thu airson iuchair no dhà ion-phortadh on stòr-bhòrd? importFromUrl=Luchdaich a-nuas iuchair phoblach on URL seo: copyToClipbrdFailed=Cha b’ urrainn dhuinn lethbhreac dhen iuchair/dhe na h-iuchraichean a chur air an stòr-bhòrd. copyToClipbrdOK=Chaidh lethbhreac dhen iuchair/dhe na h-iuchraichean a chur air an stòr-bhòrd. -deleteSecretKey=RABHADH: Tha thu gu bhith iuchair phrìobhaideach a sguabadh às!\nMa sguabas tu às an iuchair phrìobhaideach agad, chan urrainn dhut teachdaireachd sam bith a chaidh a chrioptachadh air a son a dhì-chrioptachadh agus chan urrainn dhut an iuchair agad a chùl-ghairm tuilleadh.\n\nA bheil thu cinnteach gu bheil thu airson AN DÀ CHUID an iuchair phrìobhaideach is an iuchair phoblach\n“%S”\na sguabadh às? -deleteMix=RABHADH: Tha thu gu bhith iuchraichean prìobhaideach a sguabadh às!\nMa sguabas tu às iuchair phrìobhaideach agad, chan urrainn dhut teachdaireachd sam bith a chaidh a chrioptachadh air a son a dhì-chrioptachadh tuilleadh.\n\nA bheil thu cinnteach gu bheil thu airson AN DÀ CHUID na h-iuchraichean prìobhaideach is na h-iuchraichean poblach a sguabadh às? +deleteSecretKey=RABHADH: Tha thu gu bhith iuchair dhìomhair a sguabadh às!\nMa sguabas tu às iuchair dhìomhair agad, chan urrainn dhut teachdaireachd sam bith a chaidh a chrioptachadh air a son a dhì-chrioptachadh no a cùl-ghairm tuilleadh.\n\nA bheil thu cinnteach gu bheil thu airson AN DÀ CHUID, an iuchair dhìomhair ’s an iuchair phoblach \n“%S” a sguabadh às? +deleteMix=RABHADH: Tha thu gu bhith iuchraichean dìomhair a sguabadh às!\nMa sguabas tu às iuchair dhìomhair agad, chan urrainn dhut teachdaireachd sam bith a chaidh a chrioptachadh air a son a dhì-chrioptachadh tuilleadh.\n\nA bheil thu cinnteach gu bheil thu airson AN DÀ CHUID na h-iuchraichean dìomhair ’s na h-iuchraichean poblach a sguabadh às? deletePubKey=A bheil thu airson an iuchair phoblach\n“%S”\na sguabadh às? deleteSelectedPubKey=A bheil thu airson na h-iuchraichean poblach a sguabadh às? deleteKeyFailed=Cha b’ urrainn dhuinn an iuchair a sguabadh às. -revokeKeyQuestion=Tha thu gu bhith an iuchair “%S” a chùl-ghairm.\n\nChan urrainn dhut soidhneadh leis an iuchair seo agus nuair a bhios i air a sgaoileadh, chan urrainn do chàch soidhneadh leatha tuilleadh. ’S urrainn dhut an iuchair a chleachdadh fhathast gus seann theachdaireachdan a dhì-chrioptachadh.\n\nA bheil thu airson leantainn air adhart? +revokeKeyQuestion=Tha thu gu bhith an iuchair “%S” a chùl-ghairm.\n\nChan urrainn dhut soidhneadh leis an iuchair seo agus nuair a bhios i air a sgaoileadh, chan urrainn do chàch soidhneadh leatha tuilleadh. ’S urrainn dhut an iuchair a chleachdadh fhathast gus seann theachdaireachdan a dhì-chrioptachadh.\n\nA bheil thu airson leantainn air adhart?’S urrainn dhut an iuchair a chleachdadh fhathast airson seann-teachdaireachdan a dhì-chrioptachadh.\n\nA bheil thu airson leantainn air adhart? revokeKeyOk=Chaidh an iuchair a chùl-ghairm. Ma tha an iuchair agad ri fhaighinn air frithealaiche iuchraichean, mholamaid gun luchdaidh thu suas a-rithist i ach am faic càch gun deach a cùl-ghairm. revokeKeyFailed=Cha b’ urrainn dhuinn an iuchair a chùl-ghairm. -revokeKeyNotPresent=Chan eil iuchair (0x%S) agad a fhreagras ris an teisteanas cùl-ghairm!\n\nMa chaill thu an iuchair agad, feumaidh tu a h-ion-phortadh (can o fhrithealaiche iuchraichean) ron teisteanas cùl-ghairm! +revokeKeyNotPresent=Chan eil iuchair (0x%S) agad a fhreagras ris an teisteanas cùl-ghairm!\n\nMa chail thu an iuchair agad, feumaidh tu a h-ion-phortadh (can o fhrithealaiche iuchraichean) mus ion-phortaich thu an teisteanas cùl-ghairm! revokeKeyAlreadyRevoked=Chaidh an iuchair 0x%S a chùl-ghairm mu thràth. refreshAllQuestion=Cha do thagh thu iuchair. Am bu toil leat a h-UILE iuchair ath-nuadhachadh? refreshKeyServiceOn.warn=Rabhadh: Tha na h-iuchraichean agad ’gan ath-nuadhachadh sa chùlaibh air dòigh cho sàbhailte ’s a ghabhas.\nMa nì thu ath-nuadhachadh air na h-iuchraichean uile agad aig an aon àm, nochdaidh sin fiosrachadh mu do dhèidhinn gun fheum air sin.\nA bheil thu cinnteach gu bheil thu airson seo a dhèanamh? refreshKey.warn=Rabhadh: a-rèir uiread nan iuchraichean is luaths a’ cheangail, dh’fhaoidte gun doir e fada fada gus a h-uile iuchair ath-nuadhachadh! downloadContactsKeys.warn=Rabhadh: a-rèir uiread an luchd-aithne is luaths a’ cheangail, dh’fhaoidte gun doir e fada fada gus a h-uile iuchair a luchdadh a-nuas! downloadContactsKeys.importFrom=A bheil thu airson an luchd-aithne o leabhar nan seòladh “%S” ion-phortadh? -keyMan.button.exportSecKey=À&s-phortaich na h-iuchraichean prìobhaideach +keyMan.button.exportSecKey=À&s-phortaich na h-iuchraichean dìomhair keyMan.button.exportPubKey=Na às-phortaich ach na h-iuchraichean &poblach keyMan.button.import=&Ion-phortaich keyMan.button.refreshAll=Ath-nuadhaich a h-uile iuchai&r keyMan.button.revokeKey=Cùl-ghai&rm an iuchair -keyMan.button.skip=&Gearr leum thar na h-iuchrach keylist.noOtherUids=Chan eil dearbh-aithne eile aig an neach seo keylist.hasOtherUids=Tha seo air cuideachd: @@ -549,13 +550,14 @@ keylist.hasPhotos=Dealbhan keyMan.addphoto.filepicker.title=Tagh dealbh gus a chur ris -keyMan.addphoto.warnLargeFile=Tha am faidhle a thagh thu nas motha na 25 kB.\nCha mholamaid gun cuir thu faidhle glè mhòr ris on a gheibh thu iuchair glè mhòr an uairsin. +keyMan.addphoto.warnLargeFile=Tha a faidhle a thagh thu nas motha na 25 kB.\nCha mholamaid gun cuir thu faidhlichean glè mhòra ris on a dh’adhbharaicheas sin iuchraichean glè mhòra. keyMan.addphoto.noJpegFile=Tha coltas nach eil am faidhle a thagh thu ’na fhaidhle JPEG. Feuch an tagh thu faidhle eile. keyMan.addphoto.failed=Cha b’ urrainn dhuinn an dealbh a chur ris. noWksIdentity=Chan eil dearbh-aithne WKS aig an iuchair %S. +wksUpload.noKeySupported=Cha deach leis an luchdadh suas – tha coltas nach cuir an solaraiche agad taic ri WKS. -keyman.addBlacklistKey.msg=A bheil thu airson ’s gun sguir p≡p de chleachdadh na h-iuchrach “%1$S (%2$S)” a chum crioptachadh nan teachdaireachdan? -keyman.removeBlacklistKey.msg=A bheil thu airson cead a thoirt do p≡p gus an iuchair “%1$S (%2$S)” a chleachdadh san àm ri teachd? +keyman.addBlacklistKey.msg=A bheil thu cinnteach gum bu mhiann leat gun sguir p≡p a chleachdadh na h-iuchrach “%1$S (%2$S)” airson teachdaireachdan a chrioptachadh? +keyman.removeBlacklistKey.msg=A bheil thu airson cead a thoirt dha p≡p gun cleachd e an iuchair “%1$S (%2$S)” airson teachdaireachdan ri teachd? keyman.addBlacklistKey.button=Cuir an iuchair ris an &dubh-liosta keyman.removeBlacklistKey.button=Thoi&r an iuchair far na dubh-liosta @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Cha deach leinn am PIN atharrachadh -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Ag ath-nuadhachadh nan iuchraichean, fuirich greis… keyserverProgress.uploading=A’ luchdadh suas nan iuchraichean, fuirich greis… keyserverProgress.wksUploadFailed=Cha b’ urrainn dhuinn an iuchair agad a luchdadh suas gu seirbheis Web Key keyserverProgress.wksUploadCompleted=Chaidh an iuchair phoblach agad a chur a-null dhan t-solaraiche agad. Gheibh thu post-d a dhearbhas gun do rinn thu fhèin air an luchdadh suas. keyserverTitle.refreshing=Ath-nuadhaich na h-iuchraichean keyserverTitle.uploading=Luchdadh suas iuchraichean +keyserver.result.download.none=Cha deach iuchair a luchdadh a-nuas. +keyserver.result.download.1of1=Chaidh an iuchair a luchdadh a-nuas. +keyserver.result.download.1ofN=Chaidh 1 à %S iuchair/iuchraichean a luchdadh a-nuas. +keyserver.result.download.NofN=Chaidh %1$S à %2$S iuchair/iuchraichean a luchdadh a-nuas. +keyserver.result.uploadOne=Chaidh an iuchair a luchdadh suas. +keyserver.result.uploadMany=Chaidh %S iuchair/iuchraichean a luchdadh suas. # Strings in enigmailSetupWizard -passphrase.min8keys=Bu chòir do 8 caractaran a bhith san abairt-fhaire agad air a char a lugha! -setupWizard.reallyCancel=A bheil thu cinnteach gu bheil thu airson draoidh an rèiteachaidh Enigmail a dhùnadh? setupWizard.invalidGpg=Chan eil am faidhle a shònraich thu ’na fhaidhle so-ghnìomhaichte GnuPG. Feuch an sònraich thu faidhle eile. -setupWizard.specifyFile=Feumaidh tu faidhle iuchrach poblaich a shònrachadh mus urrainn dhut leantainn air adhart. setupWizard.installFailed=Tha coltas nach do shoirbhich leis an stàladh. Feuch ris an stàladh a-rithist no stàlaich GnuPG a làimh agus lorg e leis a’ phutan “Rùraich”. setupWizard.downloadForbidden=A chum do thèarainteachd fhèin, cha luchdaich sinn a-nuas GnuPG. Tadhail air https://gnupg.org/ a luchdadh a-nuas GnuPG. setupWizard.downloadImpossible=Chan urrainn dhuinn GnuPG a luchdadh a-nuas an-dràsta. Feuch ris a-rithist an ceann greis no tadhail air https://gnupg.org/ gus GnuPG a luchdadh a-nuas. -setupWizard.hashSumError=Cha b’ urrainn dhan draoidh treibhdhireas an fhaidhle air a luchdadh a-nuas a dhearbhadh. Dh’fhaoidte gu bheil am faidhle briste no gun deach beantainn ris. A bheil thu airson leantainn air adhart leis an stàladh co-dhiù? +setupWizard.hashSumError=Cha b’ urrainn dhan draoidh treibhdhireas an fhaidhle a chaidh a luchdadh a-nuas a dhearbhadh. Dh’fhaoidte gu bheil am faidhle briste no gun deach beantainn ris. A bheil thu airson leantainn air adhart leis an stàladh co-dhiù? setupWizard.importSettingsFile=Sònraich faidhle lethbhric-ghlèidhidh gus a luchdadh uaithe -setupWizard.invalidSettingsFile=Chan eil am faidhle a shònraich thu ’na fhaidhle lethbhric-ghlèidhidh cheart airson roghainnean Enigmail. +setupWizard.invalidSettingsFile=Chan eil am faidhle seo ’na lethbhreac-glèidhidh dligheach de roghainnean Enigmail. setupWizard.gpgConfExists=Tha faidhle rèiteachaidh GnuPG ann mar-thà. A bheil thu airson sgrìobhadh thairis air leis an fhear on t-seann-stàladh agad? -setupWizard.noGpgHomeDir=Tha coltas gun do rèitich thu %S airson cleachdadh le GnuPG. Gidheadh, chan e pasgan a tha seo – chan urrainn dhut a chleachdadh. +setupWizard.noGpgHomeDir=Tha coltas gun do rèitich thu %S ach an dèid a chleachdadh le GnuPG. Gidheadh, chan e pasgan a th’ ann – chan urrainn dhut a chleachdadh. setupWizard.unmachtedIds=Tha aithne no dhà san t-seann shuidheachadh agad nach b’ urrainn dhuinn a mhaidseadh:\n%S\nLeum sinn thairis air na roghainnean aca-san. +setupWizard.foundAcSetupMessage=Lorg sinn teachdaireachd suidheachadh Autocrypt. Airson tòiseachadh air Autocrypt a shuidheachadh, briog air a’ phutan Tòisich air an t-suidheachadh gu h-ìosal. +setupWizard.foundAcNoSetupMsg=Mhothaich sinn gu bheil thu a’ cleachdadh cliant puist-d a ghèilleas ri Autocrypt ach cha do lorg sinn teachdaireachd suidheachadh Autocrypt. Mholamaid gun cruthaich thu teachdaireachd suidheachadh Autocrypt air an uidheam eile a th’ agad ’S gum briog thu air Sganaich am bogsa a-steach a-rithist an uairsin. Mar roghainn eile, ’s urrainn dhut na roghainnean is na h-iuchraichean agad às-phortadh o stàladh eile dhe Enigmail a th’ agad agus na roghainnean sin aiseag an-seo. +setupWizard.setupComplete=Tha Enigmail air a rèiteachadh mar bu chòir is ullamh ri chleachdadh a-nis. Airson barrachd fiosrachaidh air mar a chleachdas tu Enigmail, tadhail air an duilleag dhachaigh againn. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Thachair mearachd rè luchdadh a-nuas GnuPG. Thoir sùil air loga na consoil airson barrachd fiosrachaidh. @@ -649,17 +657,17 @@ filter.folderRequired=Feumaidh tu pasgan-uidhe a thaghadh. filter.decryptMove.label=Dì-chrioptaich gu buan (Enigmail) filter.decryptCopy.label=Cruthaich lethbhreac dì-chrioptaichte dheth (Enigmail) -filter.decryptMove.warnExperimental=Rabhadh - dh’fhaoidte gum mill an roghainn criathraidh “Dì-chrioptaich gu buan” teachdaireachdan.\n\nDian-mholamaid gum feuch thu ris a’ chriathrag “Cruthaich lethbhreac dì-chrioptaichte” an toiseach, gun dearbhaich thu an toradh gu cùramach agus nach cleachd thu a’ chriathrag seo ach ma tha thu toilichte leis an toradh. +filter.decryptMove.warnExperimental=Rabhadh – dh’fhaoidte gum mill an roghainn criathraidh “Dì-chrioptaich gu buan” teachdaireachdan.\n\nDian-mholamaid gum feuch thu ris a’ chriathrag “Cruthaich lethbhreac dì-chrioptaichte” an toiseach, gun dearbh thu an toradh gu cùramach agus nach cleachd thu a’ chriathrag seo ach ma tha thu toilichte leis an toradh. filter.tempPepFilterDesc=Criathrag shealach gus an teachdaireachd air a cur a stòradh gun chrioptachadh filter.term.pgpencrypted.label=Le crioptachadh OpenPGP filter.encrypt.label=Crioptaich gu iuchair (Enigmail) filter.keyRequired=Feumaidh tu iuchair an fhaighteir a thaghadh. filter.keyNotFound=Cha do lorg sinn iuchair crioptachaidh airson “%S”. -filter.warn.keyNotSecret=Rabhadh – cuiridh an gnìomh criathraidh “Crioptaich gu iuchair” faightear eile an àite nam faightearan tùsail.\n\nMur eil an iuchair phrìobhaideach airson “%S” agad, chan urrainn dhut na puist-d a leughadh tuilleadh. +filter.warn.keyNotSecret=Rabhadh – cuiridh gnìomh “Crioptaich gu iuchair” na criathraige rud ùr an àite nam faightearan.\n\nMur eil an iuchair dhìomhair agad airson “%S”, chan urrainn dhut na puist-d a leughadh tuilleadh. # strings in enigmailConvert.jsm -converter.decryptBody.failed=Cha deach leinn an teachdaireachd a dhì-chrioptachadh air a bheil an cuspair\n“%S”.\nA bheil thu airson feuchainn ris a-rithist le abairt-fhaire eile no a bheil thu airson leum a ghearradh thar na teachdaireachd? -converter.decryptAtt.failed=Cha deach leinn an ceanglachan “%1$S”\na dhì-chrioptachadh aig an teachdaireachd air a bheil an cuspair\n“%2$S”.\nA bheil thu airson feuchainn ris a-rithist le abairt-fhaire eile no a bheil thu airson leum a ghearradh thar na teachdaireachd? +converter.decryptBody.failed=Cha b’ urrainn dhuinn an teachdaireachd leis a’ chuspair\n“%S”\na dhì-chrioptachadh. Am bu toigh leat feuchainn ris a-rithist le abairt-fhaire eile no am bu toigh leat leum a ghearradh thar na teachdaireachd? +converter.decryptAtt.failed=Cha b’ urrainn dhuinn ceanglachan “%1$S”\ndhen teachdaireachd leis a’ chuspair\n“%2$S”\na dhì-chrioptachadh. Am bu toigh leat feuchainn ris a-rithist le abairt-fhaire eile no am bu toigh leat leum a ghearradh thar na teachdaireachd? saveLogFile.title=Sàbhail faidhle loga @@ -675,13 +683,13 @@ keyRing.pubKeyNotForEncryption=Cha ghabh an iuchair %1$S (ID na h-iuchrach: %2$S) cleachdadh airson crioptachadh. keyRing.keyDisabled=Chaidh an iuchair %1$S (ID na h-iuchrach: %2$S) a chur à comas; cha ghabh a cleachdadh. keyRing.keyNotTrusted=Chan eil earbsa gu leòr san iuchair %1$S (ID na h-iuchrach: %2$S). Suidhich ìre earbsa na h-iuchrach agad air “cho earbsach ’s a ghabhas” gus a cleachdadh airson soidhneadh. -keyRing.keyInvalid=Chan eil an iuchair %1$S (ID na h-iuchrach %2$S) dhligheach. Feuch an dearbhaich thu i mar bu chòir no cleachd “Roghainnean crioptachaidh furasta”. +keyRing.keyInvalid=Chan eil an iuchair %1$S (ID na h-iuchrach %2$S) dhligheach. Feuch an dearbh thu i mar bu chòir no cleachd “Roghainnean crioptachaidh furasta”.Mar roghainn eile, sleachd roghainnean tùsail a’ chrioptachaidh ann an còmhradh roghainnean Enigmail. keyRing.signSubKeysRevoked=Chaidh gach fo-iuchair soidhnidh aig an iuchair %1$S (ID na h-iuchrach: %2$S) a chùl-ghairm. keyRing.signSubKeysExpired=Dh’fhalbh an ùine air gach fo-iuchair soidhnidh aig an iuchair %1$S (ID na h-iuchrach: %2$S). keyRing.signSubKeysUnusable=Chaidh gach fo-iuchair soidhnidh aig an iuchair %1$S (ID na h-iuchrach: %2$S) a chùl-ghairm, dh’fhalbh an ùine orra no cha ghabh an cleachdadh air adhbhar air choireigin eile. keyRing.encSubKeysRevoked=Chaidh gach fo-iuchair crioptachaidh aig an iuchair %1$S (ID na h-iuchrach: %2$S) a chùl-ghairm. keyRing.encSubKeysExpired=Dh’fhalbh an ùine air gach fo-iuchair crioptachaidh aig an iuchair %1$S (ID na h-iuchrach: %2$S). -keyRing.noSecretKey=Chan eil an iuchair phrìobhaideach airson %1$S (ID na h-iuchrach: %2$S) air an dul-iuchrach agad a-rèir coltais; chan urrainn dhut an iuchair a chleachdadh airson soidhneadh. +keyRing.noSecretKey=Chan eil an iuchair dhìomhair airson %1$S (ID na h-iuchrach: %2$S) air an dul-iuchrach agad a-rèir coltais; chan urrainn dhut an iuchair a chleachdadh airson soidhneadh. keyRing.encSubKeysUnusable=Chaidh gach fo-iuchair crioptachaidh aig an iuchair %1$S (ID na h-iuchrach: %2$S) a chùl-ghairm, dh’fhalbh an ùine orra no cha ghabh an cleachdadh air adhbhar air choireigin eile. @@ -691,24 +699,25 @@ enigmailSettings=RoghainneanEnigmail defaultBackupFileName=Enigmail-às-phortadh specifyExportFile=Sònraich ainm faile airson an às-phortaidh -homedirParamNotSUpported=Cha chuir sinn taic ri paramadairean a bharrachd a rèiticheas slighean, can --homedir agus --keyring rè às-phortadh/aiseag nan roghainnean agad. Cleachd dòighean eile, can suidheachadh a’ chaochladair àrainneachd GNUPGHOME. +homedirParamNotSUpported=Cha chuir sinn taic ri paramadairean a bharrachd a rèiticheas slighean, can --homedir agus --keyring, a chùm às-phortadh/ion-phortadh nan roghainnean agad. Cleachd dòighean eile, can suidheachadh caochladair àrainneachd GNUPGHOME. #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. -expiry.keyMissingOwnerTrust=Tha earbsa a dhìth air an iuchair phrìobhaideach %S agad.\n\nMholamaid gun cuir thu “Cho earbsach ’s a ghabhas“ air “Tha thu ag earbsadh nan teisteanasan” ann an roghainnean na h-iuchrach. -expiry.keysMissingOwnerTrust=Tha earbsa a dhìth air na h-iuchraichean prìobhaideachd seo agad:\n%S.\nMholamaid gun cuir thu “Cho earbsach ’s a ghabhas“ air “Tha thu ag earbsadh nan teisteanasan” ann an roghainnean na h-iuchrach. +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 co-cheangailte airson a chleachdadh. +expiry.keysExpireSoon=Falbhaidh an ùine air na h-iuchraichean seo ro %1$S là(ithean):\n%2$S. Mholamaid gun cruthaich thu càraidean iuchrach ùr ’s gun rèitich thu na cunntasan co-cheangailte airson an cleachdadh. +expiry.keyMissingOwnerTrust=Tha earbsa a dhìth air an iuchair dhìomhair %S agad.\n\nMholamaid gun suidhich thu “Tha thu ag earbsadh nan teisteanasan” gu “Cho earbsach ’s a ghabhas” ann an roghainnean na h-iuchrach. +expiry.keysMissingOwnerTrust=Tha earbsa a dhìth na h-iuchraichean dìomhair seo:\n%S.\nMholamaid gun suidhich thu “Tha thu ag earbsadh nan teisteanasan” gu “Cho earbsach ’s a ghabhas” ann an roghainnean na h-iuchrach. expiry.OpenKeyManager=Fosgail stiùireadh nan iuchraichean Enigmail expiry.OpenKeyProperties=Fosgail roghainnean na h-iuchrach #strings in pEpDecrypt.jsm -pEpDecrypt.cannotDecrypt=Seo teachdaireachd chrioptaichte. Gu mì-fhortanach, chan eil an iuchair phrìobhaideach agad gus an teachdaireachd a dhì-chrioptachadh. +pEpDecrypt.cannotDecrypt=Seo teachdaireachd chrioptaichte. Gu mì-fhortanach, chan eil an iuchair dhìomhair agad gus an teachdaireachd a dhì-chrioptachadh. #strings in gpgAgent.jsm gpghomedir.notexists=Chan eil am pasgan “%S” far a bheil na h-iuchraichean OpenPGP agad ann ’s cha ghabh a chruthachadh. gpghomedir.notwritable=Gha ghabh sgrìobhadh sa phasgan “%S” sa bheil na h-iuchraichean OpenPGP agad. gpghomedir.notdirectory=’S e faidhle seach pasgan a th’ ann an “%S” far a bheil na h-iuchraichean OpenPGP agad ann. -gpghomedir.notusable=Càraich ceadan a’ phasgain no atharraich an t-ionad “dachaigh” aig a’ GnuPG agad- Chan obraich GnuPG mar bu chòir mura dèan thu seo. +gpghomedir.notusable=Càraich ceadan a’ phasgain no atharraich an t-ionad “dachaigh” aig a’ GnuPG agad.Chan obraich GnuPG mar bu chòir mura dèan thu seo. +gpgAgent.noAutostart=Tha thu a’ cleachdadh tionndadh %S dhe GnuPG. Iarraidh an tionndadh seo gun tòisich thu gpg-agent mus tòisich thu Thunderdbird agus gun deach caochladair “GPG_AGENT_INFO” na h-àrainneachd a luchdadh ro làimh.\n\nCha deach na cumhaidhean seo a choileanadh – chan urrainn dhut Enigmail a chleachdadh mus fhuasgail thu an duilgheadas seo. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=Chan urrainn dhuinn na faclan-earbsa p≡p airson a’ chunntais agad fhèin a dhearbhadh. @@ -730,10 +739,10 @@ pepPrivacyStatus.RatingTrustedSuggestion=Chan fheum thu dad a dhèanamh! pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Thoir an aire nach eil an teachdaireachd seo tèarainte ma dh’fhaoidte. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Cuir ris am fiosrachadh a tha a dhìth -pepPrivacyStatus.RatingUnderAttackSuggestion=Dearbhaich susbaint na teachdaireachd seo gu sònraichte leis a’ cho-sgrìobhaiche agad. -pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Dèan cinnteach gu bheil ìre “Tèarainte” air a char as lugha air staid na prìobhaideachd airson gach co-sgrìobhaiche air an liosa. +pepPrivacyStatus.RatingUnderAttackSuggestion=Dearbh susbaint na teachdaireachd seo le com-pàirtiche a’ chonaltraidh slighe seanail eile. +pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Dèan cinnteach gun deach staid na prìobhaideachd airson gach com-pàirtiche a’ chonaltraidh a shuidheachadh air “tèarainte” air a char as ìsle. pepPrivacyStatus.RatingUnencryptedSuggestion=Iarr air a’ cho-sgrìobhaiche agad gun cleachd iad dòigh crioptachaidh no gun stàlaich iad p≡p. -pepPrivacyStatus.RatingUnreliableSuggestion=Chan eil crioptachadh no soidhneadh earbsach aig an teachdaireachd seo. Iarr air a’ cho-sgrìobhaiche agad gun àrdaich iad an dòigh crioptachaidh aca no gun stàlaich iad p≡p. +pepPrivacyStatus.RatingUnreliableSuggestion=Chan eil crioptachadh earbsach aig an teachdaireachd seo air neo tha soidhneadh a dhìth oirre. Iarr air a’ cho-sgrìobhaiche agad gun àrdaich iad am prògram crioptachaidh aca no gun stàlaich iad p≡p. pepPrivacyStatus.RatingBrokenExplanation=Tha crioptachadh no fòrmatadh briste air an teachdaireachd seo. pepPrivacyStatus.RatingHaveNoKeyExplanation=Cha ghabh an teachdaireachd seo a dhì-chrioptachadh air sgàth ’s nach eil an iuchair ri làimh. @@ -763,16 +772,16 @@ handshakeDlg.label.outgoingMessage=Teachdaireachd a-mach handshakeDlg.label.incomingMessage=Teachdaireachd a-steach handshakeDlg.error.noPeers=Cha ghabh crathadh-làimhe a dhèanamh às aonais co-sgrìobhaiche. -handshakeDlg.error.noProtection=Cuir an dìon an comas ach an cleachd thu gleus nan crathaidhean-làimhe. +handshakeDlg.error.noProtection=Cuir dìon an comas ach an cleachd thu foincsean “crathadh-làimhe”. -enigmail.acSetupPasswd.descEnterPasswd=Cuir a-steach an còd suidheachaidh a chì thu air an uidheam eile -enigmail.acSetupPasswd.descCopyPasswd=Cuir a-steach an còd suidheachadh a chì thu gu h-ìosal air an uidheam eile agad gus leantainn air adhart leis an t-suidheachadh +enigmail.acSetupPasswd.descEnterPasswd=Cuir a-steach an còd suidheachaidh a chì thu air an uidheam eile. +enigmail.acSetupPasswd.descCopyPasswd=Cuir a-steach an còd suidheachaidh gu h-ìosal air an uidheam eile ’s lean air adhart leis an t-suidheachadh. #strings in autocrypt.jsm autocrypt.setupMsg.subject=Teachdaireachd suidheachadh Autocrypt autocrypt.setupMsg.msgBody=Gus Autocrypt a shuidheachadh air an uidheam ùr agad, lean ris an stiùireadh a bu chòir dhut fhaicinn air an uidheam ùr agad. -autocrypt.setupMsg.fileTxt=Seo faidhle suidheachadh Autocrypt a thèid a chleachdadh gus roghainnean is iuchraichean a thar-aiseag eadar cliantan. ’S urrainn dhut a dì-chrioptachadh leis a’ chòd shuidheachaidh a chì thu air an t-seann-uidheam agad agus an iuchair a tha ’na broinn ion-phortadh dhan dul-iuchrach agad an uairsin. +autocrypt.setupMsg.fileTxt=Seo faidhle suidheachaidh Autocrypt a chleachdar airson roghainnean is iuchraichean a thar-chur o chliant gu cliant. ’S urrainn dhut a dhì-chrioptachadh leis a’ chòd suidheachaidh a chì thu air an t-seann-uidheam agad agus a iuchair ion-phortadh dhan dul-iuchrach agad an uairsin. #strings in upgradeInfo.html upgradeInfo.doctitle=Na tha ùr ann an Enigmail v2.0 @@ -785,10 +794,12 @@ upgradeInfo.autocrypt.title=Taic ri Autocrypt upgradeInfo.autocrypt.desc=Cuiridh Enigmail taic ri Autocrypt a-nis, seo stannard ùr a chum sgaoileadh iuchraichean mar phàirt de theachdaireachdan a thèid a chur. Ion-phortaichidh Enigmail iuchraichean o theachdaireachdan a ghèilleas ri Autocrypt gu fèin-obrachail ach an gabh barrachd phost-d a chrioptachadh san àm ri teachd. upgradeInfo.pEp.title=Modh p≡p furasta ùr (Pretty Easy Privacy) -upgradeInfo.pEp.desc=Tha modh furasta p≡p aig Enigmail a-nis. Feumaidh tu p≡p a stàladh a làimh aig an àm seo; tha sinn ag amas piseach a chur air sin san àm ri teachd. Leigidh am modh furasta p≡p leat crioptachadh OpenPGP a chleachdadh air dòigh as soilleire; cha leig thu leas bodraigeadh le stiùireadh no sioncronachadh nan iuchraichean eadar uidheaman tuilleadh. +upgradeInfo.pEp.desc=Tha modh furasta p≡p am broinn Enigmail a-nis. Leigidh am modh furasta p≡p leat crioptachadh OpenPGP a chleachdadh cho soilleir ’s a ghabhas; cha leig thu leas dèiligeadh ri stiùireadh nan iuchraichean no sioncronachadh nan iuchraichean eadar uidheaman tuilleadh. upgradeInfo.bottom.desc=Tadhail air an docamaideadh againn airson cobhair le cleachdadh Enigmail. +#strings in pEpAdapter.jsm pep.missingGnuPG=Feumaidh GnuPG a bhith agad mus urrainn dhut Enigmail/p≡p a chleachdadh. Cha do lorg sinn e agus mholamaid gun luchdaich sinn a-nuas is gun stàlaich sinn e air do shon. +pep.updateAvailable=Tha tionndadh ùr de dh’Enigmail/p≡p crypto-engine ri fhaighinn. Dè am bu toigh leat an t-ùrachadh a luchdadh a-nuas is a stàladh? #strings in enigmailAbout.html aboutEnigmail.tabName=Mu Enigmail @@ -799,6 +810,7 @@ aboutEnigmail.documentation=Docamaideadh: aboutEnigmail.testing=Deuchainnean: aboutEnigmail.userSupport=Taic: +aboutEnigmail.userSupport.team=an sgioba agus buill na liosta/a’ bhùird-bhrath aboutEnigmail.localization=Eadar-theangachadh: Faic duilleag nam pacaidean cànain Enigmail aboutEnigmail.Credits=Urram: aboutEnigmail.origAuthor=Ùghdar tùsail leudachan Enigmail @@ -808,3 +820,38 @@ aboutEnigmail.licenseSupportTitle=Ceadachas ⁊ taic aboutEnigmail.license=’S e bathar-bog le tùs fosgailte a th’ ann an Enigmail OpenPGP agus fo cheadachas %S aboutEnigmail.support=Tha taic is luchdaidhean a-nuas ri am faighinn air www.enigmail.net. + +#strings in updateGnuPG.html +updateGnuPG.tabName=Ùrachadh GnuPG +updateGnuPG.title=Ùrachaidhean airson GnuPG +updateGnuPG.introduction.desc=Feumaidh Enigmail GnuPG airson crioptachadh a dhèanamh. Mholamaid gun cùm thu an stàladh agad dhe GnuPG cho ùr ’s a ghabhas. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +updateGnuPG.noUpdateRequired=Tha GnuPG cho ùr ’s a ghabhas. +updateGnuPG.cannotUpdate.header=Cha chuir Enigmail taic ri ùrachadh ach airson nam pacaidean seo: +updateGnuPG.cannotUpdate.footer=Tha coltas gu bheil thu a’ cleachdadh dreach eile dhe GnuPG; gu mì-fhortanach, chan urrainn do dh’Enigmail an stàladh agad dhe GnuPG ùrachadh dhut. +updateGnuPG.installUpdate=Stàlaich an t-ùrachadh +updateGnuPG.noMoreUpdates=Na doir sùil airson ùrachaidhean +updateGnuPG.checkUpdate=Thoir sùil airson ùrachaidhean GnuPG + + +#strings in keyserver.jsm +keyserver.error.aborted=Sguireadh dheth +keyserver.error.unknown=Thachair mearachd nach aithne dhuinn +keyserver.error.serverError=Dh’aithris am frithealaiche iuchraichean mearachd. +keyserver.error.importError=Cha deach leinn an iuchair a chaidh a luchdadh a-nuas ion-phortadh. +keyserver.error.unavailable=Chan eil am frithealaiche iuchraichean ri làimh. +keyserver.error.securityError=Cha chuir am frithealaiche iuchraichean taic ri inntrigeadh crioptaichte. +keyserver.error.certificateError=Chan eil teisteanas an fhrithealaiche iuchraichean dligheach. +keyserver.error.unsupported=Cha chuir Enigmail raic ris an fhrithealaiche iuchraichean. + +#strings in mimeDecrypt.jsm +mimeDecrypt.encryptedPart.attachmentLabel=Pàirt chrioptaichte na teachdaireachd +mimeDecrypt.encryptedPart.concealedData=Seo pàirt chrioptaichte teachdaireachd. Feumaidh tu fhosgladh ann an uinneag fa leth ’s tu a’ briogadh air a’ cheanglachan. + +#strings in gnupg-key.jsm +import.secretKeyImportError=Thachair mearachd ann an GnuPG rè ion-phortadh nan iuchraichean dìomhair. Cha deach leis an ion-phortadh. + +#strings in importSettings.js +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 diff -Nru enigmail-2.0.12+ds1/lang/gl/enigmail.dtd enigmail-2.1.3+ds1/lang/gl/enigmail.dtd --- enigmail-2.0.12+ds1/lang/gl/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/gl/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ -Mozilla Public License 2.0."> - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,11 +63,8 @@ - - - @@ -89,12 +77,13 @@ + - + @@ -117,6 +106,9 @@ + + + @@ -209,6 +201,7 @@ + @@ -217,8 +210,8 @@ - - + + @@ -345,7 +338,7 @@ - + @@ -368,7 +361,6 @@ - @@ -456,8 +448,8 @@ - - + + @@ -542,7 +534,7 @@ - + @@ -623,7 +615,7 @@ - + @@ -665,146 +657,38 @@ - - - - - - - - - - - - - - - - - - - - -Nota: Enigmail verificará sempre sinaturas - -nos correos para todas as contas ou identidades, estean ou non activadas"> - + + - - + - - - - - - - - - - - - - - - - - -chave pública é para que outros lle poidan enviar os correos electrónicos cifrados. Pode distribuirlla a quen desexe."> -chave privada é só para que vostede poida descifrar estes correos e mais enviar correos asinados. -Non debería darlla a ninguén."> -chave privada é só para que vostede poida descifrar estes correos e mais enviar correos asinados. - -Non debería darlla a ninguén. - -Para asegurar a chave privada, pediráselle a frase secreta nos seguintes dous diálogos."> -frase secreta protexe a chave privada impedindo un mal uso dela."> -non se recomendan."> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - exportar os datos usando o asistente de copias de seguranza nas preferencias do Enigmail -importar os datos ao novo computador usando este asistente. -"> - - - - - - -Grazas por usar Enigmail."> - - - - - - - - - + + + + + + + + + + + - + @@ -820,12 +704,9 @@ - - exportar os datos desde o computador antigo usando este asistente -importar os datos ao novo computador usando o asistente de configuración. -"> + + + @@ -845,7 +726,7 @@ - + @@ -872,7 +753,7 @@ - + @@ -886,9 +767,19 @@ - + + - + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/gl/enigmail.properties enigmail-2.1.3+ds1/lang/gl/enigmail.properties --- enigmail-2.0.12+ds1/lang/gl/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/gl/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=Alerta do Enigmail -enigConfirm=Confirmación do Enigmail +# enigConfirm=Enigmail Confirmation enigInfo=Información do Enigmail enigError=Erro do Enigmail enigPrompt=Diálogo do Enigmail @@ -78,7 +78,7 @@ passSpaceProblem=Debido a razóns técnicas, a frase secreta non pode comezar ou rematar cun espazo. changePassFailed=Produciuse un fallo ao cambiar a frase secreta. -keyConfirm=Xerar chaves pública e privada para '%S'? +# keyConfirm=Generate public and secret key for '%S'? keyMan.button.generateKey=Xerar chave keyAbort=Desexa interromper a xeración de chaves? keyMan.button.generateKeyAbort=Cancelar a xeración da chave @@ -86,14 +86,14 @@ expiryTooLong=Non é posíbel crear unha chave con unha caducidade de máis de 100 anos. expiryTooLongShorter=Non é posíbel crear unha chave que caduque en máis de 90 anos. expiryTooShort=A súa chave debe ser válida alomenos durante un día. -keyGenFailed=Produciuse un fallo durante a xeración da chave. Comprobe a consola de Enigmail (Menú Enigmail > Depuración Enigmail) para saber os detalles. +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. setKeyExpirationDateFailed=Non foi posíbel cambiar a data de caducidade # Strings in enigmailMessengerOverlay.js securityInfo=Información de seguridade de Enigmail\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Os anexos de esta mensaxe non foron asinados nin cifrados*\n\n +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=Posíbelmente é unha mensaxe PGP/MIME cifrada ou asinada; prema no botón Descifrar para verificalo saveAttachmentHeader=Enigmail: Gardar anexo descifrado @@ -102,7 +102,7 @@ beginPgpPart=********* *INICIO DA PARTE CIFRADA OU ASINADA* ********* endPgpPart=********** *FIN DA PARTE CIFRADA OU ASINADA* ********** -notePartEncrypted=Enigmail: *Hai partes da mensaxe que NON están asinadas ou cifradas* +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *Atopáronse múltiples bloques da mensaxe -- interrompeuse o descifrado/verificación* decryptOkNoSig=Aviso\n\nDescifrouse satisfactoriamente, mais a sinatura non se puido verificar correctamente. @@ -114,6 +114,7 @@ fixBrokenExchangeMsg.failed=Non se conseguiu repara a mensaxe. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key wksNoIdentity=Esta chave non está vencellada a ningunha das súas contas de correo. Engada unha conta para cando menos un dos seguintes enderezo(s):\n\n%S wksConfirmSuccess=Correo electrónico de confirmación enviado. wksConfirmFailure=Produciuse un fallo no envío do correo de confirmación. @@ -148,10 +149,9 @@ minimalLineWrapping=Definiu o axuste de liña a %S caracteres. Para un cifrado ou sinatura correcta, este valor ten que ser como mínimo 68.\nQuere mudar o axuste de liña a 68 caracteres agora? warning=Aviso signIconClicked=Modificou manualmente a sinatura de mensaxes. Polo tanto, mentres que compón esta mensaxe, (des)activar a sinatura non depende de (des)activar o cifrado. -errorOwnKeyUnusable=O ID da chave «%S» configurado para a identidade actual non fornece unha chave OpenPGP válida.\n\nAsegúrese que ten unha chave OpenPGP non caducada e que os axustes da conta dirixen a esta chave.\nSe a chave non está caducada, comprobe que ten a confianza no propietario estabelecida como Completa ou Definitiva. +# 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=Produciuse un erro gardando o borrador msgCompose.partiallyEncrypted.short=Teña tino co filtrado de información sensitiva - correo parcialmente cifrado. -# msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. msgCompose.partiallyEncrypted.inlinePGP=A mensaxe á que vostede está respondendo contiña partes cifradas e sen cifrar. Se o remitente non foi quen de descifrar algunhas partes da mensaxe en orixe, pode que vostede estea filtrando información confidencial que o remitente non puido descifrar.\n\nConsidere eliminar todas as citas da súa resposta a este remitente. msgCompose.internalEncryptionError=Erro interno: desactivouse o cifrado prometido. @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=Desactivouse o Enigmail para a identidade seleccionada msgCompose.protectSubject.tooltip=Protexer o asunto da mensaxe msgCompose.noSubjectProtection.tooltip=Non protexer o asunto da mensaxe -msgCompose.encryptedSubjectStub=Mensaxe cifrada msgCompose.protectSubject.dialogTitle=Activar a protección do axunto? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? msgCompose.protectSubject.yesButton=&Protexer o Asunto @@ -179,7 +178,7 @@ msgCompose.pepSendTrusted=Segura e confiábel pep.alert.disabledForIdentity=p≡p está desactivado para a identidade actual. Active p≡p nas preferencias do Enigmail/p≡p. -pep.alert.weakReply=Está a piques de reenviar ou responder a unha mensaxe segura como se fose insegura. Se continúa pódese filtrar información confidencial poñéndose vostede e o seu interlocutor en risco. Confirma que desexa continuar? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=Gardar %S mensaxe a %S no cartafol de mensaxes sen enviar? onlineSend=Enviar %S mensaxe a %S? -encryptKeysNote=Nota: a mensaxe está cifrada co seguinte ID de usuario/a / Chaves: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S hiddenKey= -signFailed=Produciuse un erro en Enigmail; fallou Cifrado/sinatura; enviar mensaxe sen cifrar? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=Enviar mensaxe sen cifrar recipientsSelectionHdr=Seleccionar destinatarios para o cifrado @@ -225,9 +224,9 @@ signOffWithReason=Asinado: DESACTIVADO (%S) reasonEnabledByDefault=activado de forma predeterminada reasonManuallyForced=forzado manualmente -reasonByRecipientRules=forzado polas regras do destinatario +# reasonByRecipientRules=forced by per-recipient rules reasonByAutoEncryption=forzado polo cifrado automático -reasonByConflict=debido a un conflito nas regras do destinatario +# reasonByConflict=due to conflict in per-recipient rules reasonByEncryptionMode=debido ao modo de cifrado # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=Usarase o Inline PGP # Attach own key status (tooltip strings): -attachOwnKeyNo=Non se anexará a súa chave -attachOwnKeyYes=Anexarase a súa chave -attachOwnKeyDisabled=Non pode anexar a súa chave. Ten que seleccionar unha chave na\nsección de OpenPGP nos axustes da conta para activar esta función. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Detectáronse conflitos nas regras por destinatario%S\n\nEnviar a mensaxe con esta configuración? msgCompose.button.configure=&Configurar @@ -269,6 +268,10 @@ clickDetailsButton=; premer no botón 'Detalles' para ver máis información clickImportButton=; prema no botón «Importar chave» para descargar a chave keyTypeUnsupported=; o tipo de chave non é compatíbel coa versión de GnuPG +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Descifrar msgPart=Parte da mensaxe %S msgSigned=asinado msgSignedUnkownKey=asinado cunha chave descoñecida @@ -280,8 +283,10 @@ needKey=Erro - precísase a chave privada para descifrar a mensaxe failedDecrypt=Erro - fallou o descifrado badPhrase=Erro - mala frase secreta +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=Erro - fallou o descifrado/verificación viewInfo=; Ver > Información de seguridade da mensaxe para ver os detalles +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=Mensaxe descifrada decryptedMsgWithFormatError=Mensaxe descifrada (restabeleceuse o formato de correo PGP, roto probabelmente por un servidor Exchange antigo, así que o resultado pode non ser perfecto para a súa lectura) @@ -326,6 +331,7 @@ autocryptSetupReq.setupMsg.backup=Pode conservar esta mensaxe e usala como copia de seguranza da súa chave secreta. Se desexa facelo, debería escribir o contrasinal e gardalo de forma segura. autocryptSetupReq.message.import=Para importar os axustes e chave(s) ao Enigmail. Prema no botón «Iniciar configuración» na barra de estado. autocryptSetupReq.message.sent=Prema na mensaxe do seu dispositivo novo e siga as instrucións para importar os axustes. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js oldGpgVersion20=Produciuse un fallo iniciando o Enigmail.\n\nEstá usando a versión %1$S do GnuPG que xa non compatíbel. O Enigmail require a versión %2$S ou unha máis recente. Anove a instalación do GnuPG ou o Enigmail non funcionará. @@ -337,6 +343,8 @@ prefs.warnAskNever=Aviso: activar esta opción causará que non se cifre ningún correo se falta algunha das chaves dos/das destinatarios/as -- Enigmail non informará disto cando suceda! prefs.warnIdleTimeForUnknownAgent=Non é posíbel conectar co gpg-agent. Quizais o seu sistema usa unha ferramenta especializada para manexar frases secretas (como gnome-keyring ou seahorse-agent, KDE wallet manager...). Desafortunadamente Enigmail non pode controlar o tempo límite das frases secretas na ferramenta que está usando. Polo tanto a configuración do tempo límite respectivo en Enigmail é ignorada. prefEnigmail.oneKeyserverOnly=Erro - so se pode especificar un servidor de chaves para a descarga automática das chaves OpenPGP que falten. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +aboutLicense.desc=Enigmail é software de fontes abertas coa licenza Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=Erro - non se proporcionou a frase secreta noPGPblock=Erro - non se atopou un bloque de datos armado OpenPGP válido unverifiedReply=Probabelmente modificouse a parte sangrada da mensaxe (resposta) -keyInMessageBody=Hai unha chave no corpo da mensaxe. Prema «Importar chave» para importala +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=Erro - A sinatura non coincide -cantImport=Produciuse un erro importando a chave pública\n\n +# cantImport=Error importing public key\n\n doImportOne=Desexa importar %1$S (%2$S)? doImportMultiple=Desexa importar as seguintes chaves?\n\n%S previewFailed=Non é posíbel ler o ficheiro da chave pública. @@ -366,14 +374,15 @@ sc.removeCard=A operación non require que teña a súa SmartCard no lector.\nRetire a súa SmartCard e repita a operación. sc.noCardAvailable=Non se puido atopar ningunha SmartCard no seu lector\nInsira de novo a SmartCard e repita a operación. sc.noReaderAvailable=Non se puido acceder ao lector de tarxetas SmartCard \nConecte o lector de tarxetas, insira a SmartCard, e repita a operación. -keyError.keySpecNotFound=O enderezo de correo-e «%S» non obtivo ningunha coincidencia cunha chave do anel de chaves. -keyError.keyIdNotFound=O ID da chave configurada «%S» non se atopa no anel de chaves. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. keyError.resolutionAction=Seleccione unha chave válida na sección OpenPGP dos axustes da conta missingPassphrase=Falta a frase secreta errorHandling.gpgAgentInvalid=O sistema está executando unha versión do gpg-agent que non é axeitada para a súa versión de GnuPG. errorHandling.gpgAgentError=GnuPG informou dun erro na comunicación co gpg-agent (un compoñente do GnuPG). errorHandling.dirmngrError=GnuPG informou dun erro na comunicación co dirmngr (un compoñente do GnuPG). errorHandling.pinentryError=GnuPG non puido consultar a frase secreta por medio de pinentry, +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. errorHandling.readFaq=Este é un erro de configuración do sistema que impide que o Enigmail funcione correctamente. Non se pode arranxar automaticamente.\n\nRecomendámoslle moito que consulte o noso sitio de asistencia en https://enigmail.net/faq. gpgNotFound=Non se puido localizar o programa GnuPG '%S'.\nAsegúrese de que a ruta ao executábel GnuPG é correcto nas Preferencias de Enigmail. @@ -384,9 +393,8 @@ prefBad=Sinatura INCORRECTA de %S failCancel=Erro - A descarga da chave foi cancelada polo usuario -failNoServer=Erro- Non se especificou un servidor do que descargar as chaves -failNoID=Erro - Non se especificou un ID de chave para descargar failKeyExtract=Erro - fallou o comando de extración de chave +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=Erro - o primeiro bloque OpenPGP non é un bloque de chave pública importKeyConfirm=Importar chave(s) pública(s) integradas na mensaxe? failKeyImport=Erro - fallou a importación de chaves @@ -425,6 +433,8 @@ identityName=Identidade: %S switchPepMode=Está usando actualmente o modo «p≡p Junior» do Enigmail.\n\nActivando o OpenPGP ou S/MIME para unha conta, está desactivando p≡p e usando o modo normal do Enigmail sen p≡p. enableEnigmail=&Desactivar p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Activou o cifrado, mais non seleccionou unha chave. Para cifrar correos enviados a %S, precisa especificar unha ou varias chaves válidas da súa lista de chaves. Quere desactivar o cifrado para %S? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=A función seleccionada non está dispoñíbel en modo sen conexión. Conéctese e ténteo de novo. -protocolNotSupported=O protocolo '%S://' que seleccionou non está soportado para a descarga de chaves OpenPGP. -gpgkeysDisabled=Activar a opción 'extensions.enigmail.useGpgKeysTool' podería axudar. noKeyserverConn=Non foi posíbel conectar co servidor de chaves en %S. -keyDownloadFailed=Houbo un erro ao descargar a chave do servidor. A mensaxe de estado é:\n%S internalError=Produciuse un erro interno. Non se puido descargar ou importar as chaves. -noKeyFound=Sentímolo, non se puido atopar ningunha chave que coincida cos criterios de busqueda especificados.\nOs ID's de chave deberían ter como prefixo \\"0x\\" (e.g. 0xABCDEF12). -keyDownload.keyUnavailable=Sentímolo pero a chave co ID %S non está dispoñíbel no servidor de chaves. Probabelmente, o propietario da chave non enviou a súa ao servidor.\n\nPídalle ao remitente da mensaxe que lle envíe a súa chave por correo electrónico. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Produciuse un erro ao buscar ou descargar a chave do servidor: non se puido executar gpgkeys_%S. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Fallou ao definir a confianza no propietario @@ -490,7 +493,6 @@ asciiArmorFile=Ficheiros con armadura ASCII (*.asc) importKeyFile=Importar o ficheiro coa chave OpenPGP gnupgFile=Ficheiros GnuPG -createKeyOK=Xerouse a súa chave saveRevokeCertAs=Crear e gardar certificado de revogación revokeCertOK=O certificado de revogación creouse correctamente. Pode usalo para invalidar a súa chave pública, por exemplo, no caso de que a perdese. revokeCertFailed=Non se puido crear o certificado de revogación. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%1$S (0x%2$S) pub-sec defaultPubKeyFilename=Chaves-públicas-exportadas defaultPubSecKeyFilename=Chaves-públicas-e-privadas-exportadas -noSecretKeys=Non se atopou ningunha chave privada.\n\nQuere xerar a súa propia chave agora? sendKeysOk=As chaves foron enviadas correctamente sendKeysFailed=Produciuse un fallo ao enviar as chaves receiveKeysOk=As chaves foron actualizadas correctamente receiveKeysFailed=Produciuse un erro ao descargar as chaves +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=Quere importar algunha(s) chaves do portarretallos? importFromUrl=Descargue a chave pública nesta URL: copyToClipbrdFailed=Non foi posíbel copiar a(s) chave(s) seleccionada(s) ao portarretallos. copyToClipbrdOK=Chave(s) copiada(s) ao portarretallos -deleteSecretKey=AVISO: Vai eliminar unha chave privada!\nSe elimina a súa chave privada, non poderá descifrar ningunha mensaxe cifrada para esa chave, e tampouco poderá revogar a súa chave.\n\nEstá seguro de que quere eliminar AMBAS as chaves, a chave privada e a pública '%S'? +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=AVISO: vai eliminar chaves privadas!\nSe elimina a súa chave privada non poderá descifrar calquera mensaxe cifrado para esa chave.\n\nEstá seguro de que quere eliminar AMBAS as chaves, as chaves privadas e públicas seleccionadas? deletePubKey=Desexa eliminar a chave pública\n'%S'? deleteSelectedPubKey=Desexa eliminar as chaves públicas? @@ -529,7 +531,7 @@ revokeKeyQuestion=Vai a revogar a chave «%S»\n\nXa non lle será posíbel volver asinar con esta chave. Unha vez revogada, os demais non serán quen de cifrar con ela. Pode seguir a usar a chave para descifrar as mensaxes antigas.\n\nDesexa continuar?\n\n revokeKeyOk=A chave foi revogada. Se a súa chave está dispoñíbel nalgún servidor de chaves, é recomendábel que a suba de novo, para que outras persoas poidan ver a revogación. revokeKeyFailed=Non se puido revogar a chave. -revokeKeyNotPresent=Vostede non ten ningunha chave (0x%S) que se axuste a este certificado de revogación.\n\nSe perdeu a chave, debe importala (p.e.: dun servidor de chaves) antes do certificado de revogación. +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! revokeKeyAlreadyRevoked=A chave 0x%S xa foi revogada. refreshAllQuestion=Non seleccionou ningunha chave. Desexa recargar TODAS as chaves? refreshKeyServiceOn.warn=Aviso: as súas chaves están actualizańdose en segundo plano con tanta seguranza como é\nposíbel. Actualizar todas as chaves dunha vez descubrirá innecesariamente información sobre vostede.\nConfirma que desexa facelo? @@ -541,21 +543,21 @@ keyMan.button.import=&Importar keyMan.button.refreshAll=&Recargar todas as chaves keyMan.button.revokeKey=&Revogar chave -keyMan.button.skip=&Saltar a chave keylist.noOtherUids=Non ten outras identidades keylist.hasOtherUids=Tamén coñecido como -keylist.noPhotos=Non hai fotografías dispoñíbeis -keylist.hasPhotos=Fotografías +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos keyMan.addphoto.filepicker.title=Seleccione unha foto para engadir -keyMan.addphoto.warnLargeFile=O ficheiro seleccionado é maior de 25kB.\nNon é recomendábel engadir ficheiros grandes porque a chave resulta longa de máis. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. keyMan.addphoto.noJpegFile=O ficheiro seleccionado non semella un ficheiro JPEG. Seleccione outro diferente. keyMan.addphoto.failed=Non foi posíbel engadir a foto. noWksIdentity=A chave %S non ten unha identidade no servizo web de chaves. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -keyman.addBlacklistKey.msg=Desexa realmente que o p≡p deixe de usar a chave «%1$S (%2$S)» para as mensaxes cifradas? -keyman.removeBlacklistKey.msg=Desexa permitir que o p≡p use a chave «%1$S (%2$S)» nas futuras mensaxes? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? keyman.addBlacklistKey.button=Engadir a chave á &Lista negra keyman.removeBlacklistKey.button=&Eliminar a chave da lista negra @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Produciuse un erro ao cambiar o PIN -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Recargando chaves, agarde ... keyserverProgress.uploading=Subindo chaves, agarde ... keyserverProgress.wksUploadFailed=Non foi posíbel enviar a súa chave ao servidor de chaves keyserverProgress.wksUploadCompleted=A súa chave pública enviouse correctamente ao provedor. Recibirá un correo electrónico para confirmar que vostede fixo o envío. keyserverTitle.refreshing=Recargar chaves keyserverTitle.uploading=Subir chave +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=A frase secreta debería conter polo menos 8 caracteres! -setupWizard.reallyCancel=Está seguro que quere pechar o Asistente de instalación de Enigmail? setupWizard.invalidGpg=O ficheiro especificado non é un executábel de GnuPG. Indique outro ficheiro. -setupWizard.specifyFile=Debe especificar polo menos un ficheiro coa chave pública para continuar. setupWizard.installFailed=Parece que a instalación non se realizou correctamente. Tente facela de novo ou instale GnuPG manualmente e localíceo usando o botón Explorar. setupWizard.downloadForbidden=Pola súa seguranza non descargaremos o GnuPG. Visite https://gnupg.org/ con fin de descargalo. setupWizard.downloadImpossible=Non é posíbel descargar o GnuPG agora mesmo. Ténteo máis tarde ou visite https://gnupg.org/ con fin de descargalo. -setupWizard.hashSumError=O asistente non puido verificar a integridade do ficheiro descargado. Pode que estea roto ou manipulado. Desexa continuar a instalación? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? setupWizard.importSettingsFile=Especificar a copia de seguridade que cargar -setupWizard.invalidSettingsFile=O ficheiro indicado non é unha copia de seguridade dos axustes de Enigmail correcta. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. setupWizard.gpgConfExists=O ficheiro config de GnuPG xa existe. Desexa sobrescribilo co ficheiro da instalación antiga? -setupWizard.noGpgHomeDir=Semella que vostede configurou %S para usalo no GnuPG. Con todo, este non é un cartafol. Vostede non pode utilizalo. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. setupWizard.unmachtedIds=Non foi posíbel emparellar as seguintes identidades da súa vella instalación:\n%S\nOmitíronse os axustes destas identidades. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Produciuse un erro mentres se tentaba descargar GnuPG. Comprobe o rexistro da consola para máis información. @@ -654,12 +662,12 @@ filter.term.pgpencrypted.label=OpenPGP cifrado # filter.encrypt.label=Encrypt to key (Enigmail) filter.keyRequired=Debe seleccionar unha chave de destinatario. -filter.keyNotFound=Non foi posíbel atopar unha chave de cifrado para «%S». -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -converter.decryptBody.failed=Non foi posíbel descifrar a mensaxe\n«%S».\nDesexa tentalo cunha frase secreta diferente ou prefire saltar a mensaxe? -converter.decryptAtt.failed=Non foi posíbel descifrar o anexo «%1$S»\nda mensaxe co asunto\n«%2$S».\nDesexa tentalo de novo cunha frase de paso distinta ou prefire saltar a mensaxe? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? saveLogFile.title=Gardar o ficheiro do rexistro @@ -691,13 +699,13 @@ enigmailSettings=Axustes do Enigmail defaultBackupFileName=Exportar-export. specifyExportFile=Especificar o nome do ficheiro para exportar -homedirParamNotSUpported=Os parámetros adicionais que configuran a ruta, tales como --homedir e --keyring non se aceptan para exportar/restabelecer os seus axustes. Use métodos alternativos como axustar a variábel de contorno GNUPGHOME. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #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 seguintes chaves caducarán en menos de %1$S días:\n %2$S\nRecomendámoslle que cree chaves novas e configure as súas contas para usalas. -expiry.keyMissingOwnerTrust=A súa chave secreta %S perdeu a confianza.\n%S.\nRecomendámoslle que estabeleza «Vostede confía nos certificados» como Definitiva nas propiedades da chave. -expiry.keysMissingOwnerTrust=As seguintes chaves secretas súas perderon a confianza.\n%S.\nRecomendámoslle que estabeleza «Vostede confía nos certificados» como Definitiva nas propiedades da chave. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. expiry.OpenKeyManager=Abrir a xestión de chaves do Enigmail expiry.OpenKeyProperties=Abrir propiedades da chave @@ -709,6 +717,7 @@ gpghomedir.notwritable=O directorio «%S» coas as súas chaves OpenPGP non é escribíbel. gpghomedir.notdirectory=O cartafol «%S» que contén as súas chaves OpenPGP é un ficheiro no canto dun cartafol. gpghomedir.notusable=Modifique os permisos do cartafol ou cambie a localización do seu cartafol «home» do GnuPG. Noutro caso o GnuPG non poderá traballar correctamente. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=Non foi posíbel verificar as palabras de control do p≡p da súa conta. @@ -728,12 +737,12 @@ pepPrivacyStatus.RatingMistrustSuggestion=Restabeleza a conexión co seu interlocutor e tente realizar outra negociación de enlace ou «handshake». pepPrivacyStatus.RatingReliableSuggestion=Complete a negociación de enlace ou «handshake» co seu interlocutor intercambiando palabras de control en persoa ou por teléfono. Unha negociación de enlace só se precisa facer unha vez por interlocutor e proporcionará unha comunicación segura e fiábel. pepPrivacyStatus.RatingTrustedSuggestion=Non precisa facer nada! -pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Sexa consciente de que esta mensaxe pode non ser segura. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Engada a información necesaria. -pepPrivacyStatus.RatingUnderAttackSuggestion=Por separado verifique o contido desta mensaxe co interlocutor. -pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Comprobe que o estado da privacidade de cada interlocutor da lista é cando menos seguro. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". pepPrivacyStatus.RatingUnencryptedSuggestion=Pídalle ao interlocutor que use unha solución de cifrado ou instale p≡p. -pepPrivacyStatus.RatingUnreliableSuggestion=Esta mensaxe non ten un cifrado ou sinatura fiábeis. Pídalle ao seu interlocutor que actualice a súa solución de cifrado ou instale p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. pepPrivacyStatus.RatingBrokenExplanation=Esta mensaxe ten un cifrado ou formatado rotos. pepPrivacyStatus.RatingHaveNoKeyExplanation=Esta mensaxe non se pode descifrar porque a chave non está dispoñíbel. @@ -763,16 +772,16 @@ handshakeDlg.label.outgoingMessage=Mensaxe saínte handshakeDlg.label.incomingMessage=Mensaxe entrante handshakeDlg.error.noPeers=Non é posíbel negociar un enlace ou «handshake» sen interlocutores. -handshakeDlg.error.noProtection=Active a protección para usar a función de negociación de enlace ou «handshake». +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -enigmail.acSetupPasswd.descEnterPasswd=Introduza o código de configuración que se mostra no outro dispositivo -enigmail.acSetupPasswd.descCopyPasswd=Introduza o seguinte código de configuración no seu outro dispositivo para continuar cos axustes. +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm autocrypt.setupMsg.subject=Mensaxe de configuración do Autocrypt autocrypt.setupMsg.msgBody=Para configurar o seu novo dispositivo para o Autocrypt siga as instrucións que se deberían ver no dispositivo novo. -autocrypt.setupMsg.fileTxt=Este é o ficheiro de configuración do Autocrypt usado para transferir os axustes e chaves entre clientes. Pode descifralo usando o código de configuración mostrado no seu dispositivo antigo e despois importar a chave ao seu anel de chaves. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html upgradeInfo.doctitle=Que novidades hai no Enigmail v2.0? @@ -785,10 +794,12 @@ upgradeInfo.autocrypt.title=Compatibilidade para o Autocrypt upgradeInfo.autocrypt.desc=O Enigmail xa é compatíbel co Autocrypt, un novo estándar para distribuír chaves como parte das mensaxes enviadas. O Enigmail importa automaticamente estas chaves das mensaxes que cumpren coas normas do Autocrypt, deste xeito cada vez máis correos electrónicos poderán ser cifrados. upgradeInfo.pEp.title=Novo modo Junior do p≡p (Pretty Easy Privacy) -upgradeInfo.pEp.desc=Enigmail xa dispón do Modo Junior p≡p. Con este propósito debe instalar manualmente o p≡p; isto cambiará en futuras versións. O Modo Junior p≡p permítelle usar o cifrado OpenPGP con tanta transparencia como é posíbel; vostede xa non precisa preocuparse da xestión e sincronización de chaves entre dispositivos. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. upgradeInfo.bottom.desc=Lea a nosa documentación para obter axuda no uso do Enigmail. +#strings in pEpAdapter.jsm pep.missingGnuPG=Para poder usar o Enigmail/p≡p é necesario o GnuPG. Como non foi posíbel atopalo, podemos descargalo e instalalo por vostede. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=Sobre Enigmail @@ -799,6 +810,7 @@ aboutEnigmail.documentation=Documentación: aboutEnigmail.testing=Probando: aboutEnigmail.userSupport=Asistencia ao usuario: +# aboutEnigmail.userSupport.team=the team and the list/forum members aboutEnigmail.localization=Localización: vexa a páxina de paquetes de idiomas do Enigmail aboutEnigmail.Credits=Créditos: aboutEnigmail.origAuthor=Autor orixinal do engadido Enigmail @@ -808,3 +820,38 @@ aboutEnigmail.licenseSupportTitle=Licenza e asistencia aboutEnigmail.license=O OpenPGP do Enigmail é software aberto e con licenza %S aboutEnigmail.support=Asistencia e descargas dispoñíbeis en www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/hr/enigmail.dtd enigmail-2.1.3+ds1/lang/hr/enigmail.dtd --- enigmail-2.0.12+ds1/lang/hr/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/hr/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ - - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,11 +63,8 @@ - - - @@ -89,12 +77,13 @@ + - + @@ -117,6 +106,9 @@ + + + @@ -209,6 +201,7 @@ + @@ -217,8 +210,8 @@ - - + + @@ -345,7 +338,7 @@ - + @@ -368,7 +361,6 @@ - @@ -456,8 +448,8 @@ - - + + @@ -542,7 +534,7 @@ - + @@ -623,7 +615,7 @@ - + @@ -665,161 +657,37 @@ - - - - - - - - - - - - - - - - - - - - -Obavijest: Enigmail će uvijek provjeravati potpise -na email-ovima za svaki račun i identitet, bez obzira da li je omogućen ili ne"> - + + - - + - - - - - - - - - - - - - - - - - -javni ključ je za druge da Vam pošalju enkriptirane email-ove. Možete ga distribuirati svima."> -privatni ključ je za Vas tako da možete dekriptirati i slati potpisane email-ove. -Ne bi ga trebali dati nikom."> -privatni ključ je za Vas da bi dekriptirali ove email-ove i slali potpisane email-ove. -Ne bi ga trebali dati nikom. -Da bi osigurali Vaš privatni ključ, bit ćete upitani za lozinku u sljedeća dva dijaloga."> -lozinka je lozinka za zaštitu Vašeg privatnog ključa. Spriječava zloupotrebu Vašeg privatnog ključa."> -nisu preporučeni."> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -izvezite svoje podatke sa svog starog računala koristeći čarobnjak za sigurnosne kopije iz Enigmail postavki - -uvezite podatke na novo računalo koristeći ovaj čarobnjak. - -"> - - - - - - -Hvala Vam što koristite Enigmail."> - - - - - - - - - + + + + + + + + + + + - + @@ -835,17 +703,9 @@ - - -izvezite svoje podatke sa starog računala koristeći ovaj čarobnjak - -uvezite podatke na novo računalo koristeći Čarobnjak za postavljanje. - -"> + + + @@ -908,9 +768,19 @@ - + + - + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/hr/enigmail.properties enigmail-2.1.3+ds1/lang/hr/enigmail.properties --- enigmail-2.0.12+ds1/lang/hr/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/hr/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=Enigmail upozorenje -enigConfirm=Enigmail potvrda +# enigConfirm=Enigmail Confirmation # enigInfo=Enigmail Information enigError=Enigmail greška enigPrompt=Enigmail prompt @@ -78,7 +78,7 @@ passSpaceProblem=Zbog tehničkih razloga Vaša lozinka ne može započeti ili završiti s razmakom. changePassFailed=Promjena lozinke nije uspjela. -keyConfirm=Generiraj javni i privatni ključ za '%S'? +# keyConfirm=Generate public and secret key for '%S'? keyMan.button.generateKey=&Generiraj ključ keyAbort=Prekini generiranje ključa? keyMan.button.generateKeyAbort=&Prekini generiranje ključa @@ -86,14 +86,14 @@ expiryTooLong=Ne možete stvoriti ključ koji ističe za više od 100 godina. expiryTooLongShorter=Ne možete stvoriti ključ koji ističe za više od 90 godina. expiryTooShort=Vaš ključ mora biti valjan za najmanje jedan dan. -keyGenFailed=Generiranje ključa nije uspjelo. Molimo Vas provjerite Enigmail konzolu (Izbornik Enigmail > Otklanjanje pogreški Enigmail-a) za detalje. +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. setKeyExpirationDateFailed=Datum isteka nije mogao biti promjenjen # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail sigurnosne informacije\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Privitci ove poruke nisu potpisani ili enkriptirani*\n\n +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=Potencionalno PGP/MIME enkriptirana ili potpisana poruka; kliknite gumb Dekriptiraj za provjeru saveAttachmentHeader=Enigmail: Pohrani dekriptirani privitak @@ -102,7 +102,7 @@ beginPgpPart=********* *POČNI ENKRIPTRANI ili POTPISANI DIO* ********* endPgpPart=********** *ZAVRŠI ENKRIPTIRANI ili POTPISANI DIO* ********** -notePartEncrypted=Enigmail: *Dijelovi poruke NISU potpisani ili enkriptirani* +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *Pronađeni višestruki blokovi poruke -- dekripcija/provjera prekinuta* decryptOkNoSig=Upozorenje!\n\nDekripcija je provedena uspješno, ali potpisa nije mogao biti provjeren točno @@ -114,6 +114,7 @@ fixBrokenExchangeMsg.failed=Popravak poruke nije uspio. enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. @@ -148,10 +149,9 @@ minimalLineWrapping=Postavili ste omatanje linije na %S znakova. Za ispravnu enkripciju i/ili potpisivanje, ova vrijednost mora biti najmanje 68.\nŽelite li promjeniti omatanje linije na 68 znakova sad? warning=Upozorenje signIconClicked=Ručno ste modificirali potpisivanje, stoga, dok stvarate ovu poruku, (de)aktiviranje potpisivanja ne ovisi više o (de)aktiviranju enkripcije. -errorOwnKeyUnusable=ID '%S' ključa konfiguriranog za trenutni identitet ne daje iskoristiv OpenPGP ključ.\n\nUvjerite se da imate važeći, ne istekli OpenPGP ključ i da postavke Vašeg računa pokazuju na taj ključ.\nAko Vaš ključ nije istekao, provjerite jeste li postavili povjerenje prema vlasniku na puno ili ultimativno. +# 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=Pogreška prilikom spremanja predloška # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. -# msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=Interna pogreška: obećana enkripcija onemogućena @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=Enigmail je onemogućen za odabrani identitet # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject -msgCompose.encryptedSubjectStub=Enkriptirana poruka # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject @@ -179,7 +178,7 @@ # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -# pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=Pohrani %1$S poruku za %2$S u mapi neposlanih poruka? onlineSend=Pošalji %1$S poruku %2$S? -encryptKeysNote=Napomena: poruka je enkriptirana za sljedeće ID-e korisnika / ključeve: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S hiddenKey= -signFailed=Pogreška u Enigmail-u; Enkripcija/potpisivanje nije uspjelo; pošalji neenkriptiranu poruku? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=&Pošalji neenkriptiranu poruku recipientsSelectionHdr=Odaberi primatelje za enkripciju @@ -225,9 +224,9 @@ signOffWithReason=Potpisivanje: ISKLJUČENO (%S) reasonEnabledByDefault=omogućeno pod zadano reasonManuallyForced=prisiljeno ručno -reasonByRecipientRules=prisiljeno po pravilima primatelja +# reasonByRecipientRules=forced by per-recipient rules reasonByAutoEncryption=prisiljeno po auto enkripciji -reasonByConflict=zbog sukoba u pravilima primatelja +# reasonByConflict=due to conflict in per-recipient rules reasonByEncryptionMode=zbog enkripcijskog načina rada # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=Inline PGP će biti korišten # Attach own key status (tooltip strings): -attachOwnKeyNo=Vaš ključ neće biti privijen -attachOwnKeyYes=Vaš ključ će biti privijen -attachOwnKeyDisabled=Vaš ključ ne može biti privijen. Morate odabrati specifičan ključ\nu OpenPGP sekciji Postavki računa kako bi omogućili ovu značajku. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Otkrivena konfliktna pravila po primatelju\n%S\n\nPošalji poruku s ovim postavkama? msgCompose.button.configure=&Postavi @@ -269,6 +268,10 @@ clickDetailsButton=; kliknite na 'Detalji' za više informacija clickImportButton=; kliknite na 'Uvezi ključ' da bi preuzeli ključ keyTypeUnsupported=; vrsta ključa nije podržana od strane Vaše verzije GnuPG-a +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Dekriptiraj msgPart=Dio poruke %S msgSigned=potpisan msgSignedUnkownKey=potpisano nepoznatim ključem @@ -280,8 +283,10 @@ needKey=Greška - nije pronađen odgovarajući privatni/tajni ključ za dekripciju poruke failedDecrypt=Greška - dekripcija nije uspjela badPhrase=Greška - loša lozinka +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=Greška - dekripcija/verifikacija nije uspjela viewInfo=; Pogledajte > Informacije o sigurnosti poruke za detalje +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=Dekriptiraj poruku decryptedMsgWithFormatError=Dekriptirana poruka (obnovljen potrgani PGP email format vjerovatno uzrokovan starim Exchange poslužitelje, tako da bi rezultat mogao biti nesavršen za čitanje) @@ -326,6 +331,7 @@ # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. @@ -337,6 +343,8 @@ prefs.warnAskNever=Upozorenje: aktiviranje ove opcije će rezultirati neenkriptiranim email-ovima bez daljnjih informacija u slučaju nedostatka ključa za nekog od primatelja -- Enigmail Vas neće obavijestiti ako se to dogodi! prefs.warnIdleTimeForUnknownAgent=Nije moguće spajanje s gpg-agent. Možda Vaš sustav koristi specijalizirani alat za upravljanje lozinkama (npr. gnome-keyring, seahorse-agent, KDE wallet manager...). Nažalost Enigmail ne može kontrolirati timeout lozinki za alat koji koristite. Zbog toga su pripadajuće postavke timeout-a u Enigmailu zanemarene. prefEnigmail.oneKeyserverOnly=Pogreška - možete odrediti samo jedan poslužitelj ključeva za automatsko preuzimanje OpenPGP ključeva koji nedostaju. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +# aboutLicense.desc=Enigmail is open source and licensed under the Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=Pogreška - nije dana lozinka noPGPblock=Pogreška - nije pronađen valjan oklopljeni OpenPGP blok podataka unverifiedReply=Uvučeni dio poruke (odgovor) je vjerovatno modificiran -keyInMessageBody=Pronađen ključ u tjelu poruke. Stisnite 'Uvezi ključ' kako bi uvezli ključ +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=Pogreška - potpisi se ne slažu -cantImport=Pogreška pri uvozu javnog ključa\n\n +# cantImport=Error importing public key\n\n doImportOne=Uvezi %1$S (%2$S)? doImportMultiple=Uvezi sljedeće ključeve?\n\n%S previewFailed=Ne mogu pročitati datoteku javnog ključa. @@ -366,14 +374,15 @@ sc.removeCard=Operacija ne zahtjeva SmartCard u čitaču.\nMolimo uklonite svoju SmartCard i ponovite operaciju. sc.noCardAvailable=Nije pronađena nijedna SmartCard u Vašem čitaču\nMolimo Vas umetnite SmartCard i ponovite operaciju. sc.noReaderAvailable=Vašoj SmartCard se ne može pristupiti\nMolimo spojite Vaš SmartCard čitač, umetnite karticu i ponovite operaciju. -keyError.keySpecNotFound=Email adresa "%S" ne može biti uspoređena sa ključem na Vašem privjesku ključeva. -keyError.keyIdNotFound=Konfigurirani ID "%S" ključa ne može biti pronađen na Vašem privjesku ključeva. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. keyError.resolutionAction=Molimo odaberite ispravan ključ u OpenPGP odjelu u Postavkama računa. missingPassphrase=Nedostaje lozinka errorHandling.gpgAgentInvalid=Vaš sustav koristi verziju gpg-agent koja ne odgovara Vašoj GnuPG verziji. errorHandling.gpgAgentError=GnuPG je prijavio pogrešku u komunikaciji s gpg-agent -om (komponenta GnuPG-a). errorHandling.dirmngrError=GnuPG je prijavio pogrešku u komunikaciji s dirmngr-om (komponenta GnuPG-a). errorHandling.pinentryError=GnuPG ne može poslati upit za Vašu lozinku putem unosa pin-a. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. errorHandling.readFaq=Ovo je greška sustava ili konfiguracije koja onemogućava da Enigmail radi ispravno i ne može biti popravljena automatski.\n\nPreporučamo da se posavjetujete s našom stranicom https://enigmail.net/faq. gpgNotFound=Nije pronađen GnuPG program '%S'.\nBudite sigurni da ste postavili točnu putanju do izvršne datoteke u Enigmail postavkama. @@ -384,9 +393,8 @@ prefBad=LOŠ potpis od %S failCancel=Pogreška - primanje ključa otkazano od strane korisnika -failNoServer=Pogreška - nije određen poslužitelj ključeva s kojeg bi se preuzeo ključ -failNoID=Pogreška - nije određen ID ključa za koji se preuzima ključ failKeyExtract=Pogreška - naredba ekstrakcije ključa nije uspjela +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=Pogreška - Prvi OpenPGP blok nije blok javnog ključa importKeyConfirm=Uvezi javni ključ(eve) ugrađen(e) u poruku? failKeyImport=Pogreška - uvoz ključa nije uspio @@ -425,6 +433,8 @@ identityName=Identitet: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Aktivirali ste enkripciju ali niste odabrali ključ. Kako bi enkriptirali email-ove poslane prema %1$S morate odrediti jedan ili više važećih ključeva iz Vašeg popisa ključeva. Želite li onemogućiti enkripciju za %2$S? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=Funkcija koju ste odabrali nije dostupna u izvanmrežnom načinu rada. Molimo Vas da se povežete s mrežom i probate opet. -protocolNotSupported=Protokol '%S://' koji ste odabrali nije podržan za preuzimanje OpenPGP ključeva. -gpgkeysDisabled=Možda bi pomoglo da omogućite opciju 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=Spajanje na poslužitelj ključeva %S nije uspjelo. -keyDownloadFailed=Preuzimanje ključa s poslužitelja ključeva nije uspjelo. Poruka je:\n%S internalError=Dogodila se interna pogreška. Ključevi se nisu mogli preuzeti ili uvesti. -noKeyFound=Žao nam je, ali nismo mogli pronaći ključ koji odgovara zadanim kriterijima pretrage.\nMolimo Vas da obratite pozornost da bi ID ključa trebao početi s "0x= (npr. 0xABCDEF12). -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Pretraga ili preuzimanje ključa sa poslužitelja ključeva nijo uspjelo: gpgkeys_%S nije moguće izvršiti. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Postavljanje povjerenja valsnika nije uspjelo @@ -490,7 +493,6 @@ asciiArmorFile=ASCII oklopljene datoteke (*.asc) importKeyFile=Uvezi OpenPGP datoteku ključa gnupgFile=GnuPG datoteke -# createKeyOK=Your Key has been generated saveRevokeCertAs=Stvori i pohrani certifikat za opoziv # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=Certifikat za opoziv nije mogao biti stvoren. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%1$S (0x%2$S) javni-tajni defaultPubKeyFilename=Izvezeni-javni-ključevi defaultPubSecKeyFilename=Izvezeni-javni-i-tajni-ključevi -noSecretKeys=Nisu pronađeni tajni ključevi.\n\nŽelite li generirati svoj ključ sad? sendKeysOk=Ključ(evi) poslan(i) uspješno sendKeysFailed=Slanje ključeva nije uspjelo receiveKeysOk=Ključ(evi) uspješno ažuriran(i) receiveKeysFailed=Preuzimanje ključeva nije uspjelo +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=Želite li uvesti neke ključeve iz međuspremnika? importFromUrl=Preuzmite javni ključ sa ovog URL-a: copyToClipbrdFailed=Kopiranje odabranih ključeva u međuspremnik nije moguće. copyToClipbrdOK=Ključ(evi) kopiran(i) u međuspremnik -deleteSecretKey=UPOZORENJE: Pokušavate obrisati tajni ključ!\nAko obrišete tajni ključ, nećete više moći dekriptirati poruke enkriptirane za taj ključ, i nećete više moći opozvati svoj ključ.\n\nŽelite li uistinu obrisati OBA ključa, tajni i javni?\n'%S' +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=UPOZORENJE: Pokušavate obrisati tajne ključeve!\nAko obrišete tajni ključ, nećete više moći dekriptirati poruke enkriptirane za taj ključ.\n\nŽelite li uistinu obrisati odabrane ključeve, tajne i javne? deletePubKey=Želite li obrisati javni ključ\n'%S'? deleteSelectedPubKey=Želite li obrisati javne ključeve? @@ -529,7 +531,7 @@ revokeKeyQuestion=Opozvati će te ključ '%S'.\n\nViše nećete biti u mogućnosti potpisivati ovim ključem, i jednom distribuirano, ostali neće moći dekriptirati s tim ključem. Još uvjek možete koristit ključ za dekripciju starih poruka.\n\nŽelite li nastaviti? revokeKeyOk=Ključ je opozvan. Ako je Vaš ključ dostupan na poslužitelju ključeva, preporuča se ponovno postavljanje tako da drugi mogu vidjeti opoziv. revokeKeyFailed=Ključ se ne može opozvati. -# revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Niste odabrali nijedan ključ. Želite li osvježiti SVE ključeve? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? @@ -541,21 +543,21 @@ keyMan.button.import=&Uvezi keyMan.button.refreshAll=&Osvježi sve ključeve keyMan.button.revokeKey=&Opozovi ključ -keyMan.button.skip=&Preskoči ključ keylist.noOtherUids=Nema drugih identiteta keylist.hasOtherUids=Također poznat kao -keylist.noPhotos=Slika nije dostupna -keylist.hasPhotos=Slike +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos keyMan.addphoto.filepicker.title=Odaberite sliku za dodavanje -keyMan.addphoto.warnLargeFile=Datoteka koju ste odabrali je veća od 25 kB.\nNije preporučeno dodavati vrlo velike datoteke jer se tako povećavaju ključevi. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. keyMan.addphoto.noJpegFile=Izgleda da odabrana datoteka nije JPEG datoteka. Molimo Vas da odaberete drugu datoteku. keyMan.addphoto.failed=Slika se ne može dodati. # noWksIdentity=The key %S does not have a WKS identity. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? -# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Promjena PIN-a nije uspjela -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Osvježujem ključeve, pričekajte... keyserverProgress.uploading=Postavljam ključeve, pričekajte... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Osvježi ključeve keyserverTitle.uploading=Postavljanje ključa +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=Vaša lozinka bi trebala sadržavati najmanje 8 znakova! -setupWizard.reallyCancel=Želite li stvarno zatvoriti Enigmail čarobnjak za postavljanje? setupWizard.invalidGpg=Datoteka koju ste odredili nije izvršna datoteka GnuPG-a. Molimo odredite drugu datoteku. -setupWizard.specifyFile=Morate odrediti barem javni ključ da bi nastavili. setupWizard.installFailed=Izgleda da instalacija nije uspjela. Ili ponovno pokušajte ili instalirajte GnuPG ručno te ga locirajte koristeći Pregledaj gumb. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. -setupWizard.hashSumError=Čarobnjak nije mogao potvrditi integritet preuzete datoteke. Datoteka može biti oštećena ili obrađivana od treće strane. Želite li svejedno nastaviti instalaciju? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? setupWizard.importSettingsFile=Odredite datoteku sigurnosne kopije iz koje će se učitavati -setupWizard.invalidSettingsFile=Specificirana datoteka nije točna Enigmail datoteka sigurnosne kopije postavki. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. setupWizard.gpgConfExists=Datoteka GnuPG postavki već postoji. Želite li ju prepisati s onom iz stare instalacije? -# setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Dogodila se pogreška pri preuzimanju GnuPG-a. Molimo provjerite konzolni zapis za daljnje detalje. @@ -654,12 +662,12 @@ # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. -# filter.keyNotFound=Could not find an encryption key for "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -converter.decryptBody.failed=Nije uspjelo dekriptiranje poruke s predmetom\n"%S".\nŽelite li pokušati ponovno s drugom lozinkom ili želite preskočiti poruku? -converter.decryptAtt.failed=Nije uspjelo dekriptiranje privitka "%1$S"\nporuke s predmetom\n"%2$S".\nŽelite li pokušati ponovno s drugom lozinkom ili želite preskočiti poruku? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? saveLogFile.title=Pohrani datoteku zapisa @@ -691,13 +699,13 @@ enigmailSettings=EnigmailPostavke defaultBackupFileName=Enigmail-izvoz specifyExportFile=Odredite ime za izvoz -homedirParamNotSUpported=Dodatni parametri koji konfiguriraju putanje, primjerice --homedir i --keyring nisu podržani za izvoz/uvoz Vaših postavki. Molimo koristite alternativne metode, primjerice postavite varijablu okoline na GNUPGHOME. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #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=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties @@ -709,6 +717,7 @@ # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. @@ -728,12 +737,12 @@ # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! -# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. -# pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. @@ -763,16 +772,16 @@ # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. -# handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device -# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? @@ -785,10 +794,12 @@ # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. +#strings in pEpAdapter.jsm # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=O Enigmail-u @@ -799,6 +810,7 @@ # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: +# aboutEnigmail.userSupport.team=the team and the list/forum members # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension @@ -808,3 +820,38 @@ # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/hu/enigmail.dtd enigmail-2.1.3+ds1/lang/hu/enigmail.dtd --- enigmail-2.0.12+ds1/lang/hu/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/hu/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ -Mozilla Public License 2.0 szerint licencelt."> - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -51,9 +40,11 @@ - + + + @@ -61,7 +52,7 @@ - + @@ -72,11 +63,8 @@ - - - @@ -89,12 +77,13 @@ + - + @@ -117,6 +106,9 @@ + + + @@ -209,6 +201,7 @@ + @@ -232,7 +225,7 @@ - + @@ -345,7 +338,7 @@ - + @@ -366,9 +359,8 @@ - + - @@ -458,8 +450,8 @@ - - + + @@ -544,7 +536,7 @@ - + @@ -667,138 +659,39 @@ - - - + - - - - - - - - - - - - - - - - - -Megjegyzés: Az Enigmail minden e-mail esetén ellenőrzi az aláírást, figyelmen kívül hagyva a postafiókok és azonosítók beállításait."> - - - + - - - - - - - - - - - - - - - - - -nyilvános kulcs-át odaadhatjamásoknak, akik így tudnak Önnek titkosított levelet küldeni. A nyilvános kulcs bárkinek odaadható."> -titkos kulcs-át kizárólag Ön használja. Ezzel tudja visszafejteni az Önnek küldött leveleket és aláírni az Ön által küldött leveleket. -Soha, semmilyen körülmény között ne adja oda másnak."> -titkos kulcs-át kizárólag Ön használja. Ezzel tudja visszafejteni az Önnek küldött leveleket és aláírni az Ön által küldött leveleket. -Soha, semmilyen körülmény között ne adja oda másnak. -A titkos kulcs biztonságos tárolásához jelmondatot kell megadnia a következő két párbeszédablakon."> -jelmondat a jelszó, amit a titkos kulcsát védi. Megvédi titkos kulcsát az illetéktelen használattól."> -kerülendő."> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -adatok mentése a régi számítógépről az Enigmail Beállítások közül elérhető Mentő Tündér segítségével, - -adatok betöltése az új számítógépen ennek a tündérnek a segítségével. - -"> - - - - - - -Köszönjük, hogy az Enigmail programot használja."> - - - - - - - - - + + + + + + + + + + + - + @@ -814,19 +707,9 @@ - - -adatok mentése a régi számítógépről ezen varázsló segítségével, - -adatok betöltése az új számítógépen a Beállításvarázsló segítségével. - -"> + + + @@ -837,9 +720,9 @@ a Thunderbird levelezőklienst, és az Enigmail menüből válassza ki a Beállításvarázslót"> - + - + @@ -861,17 +744,17 @@ - + - + - + @@ -889,9 +772,19 @@ - + + - + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/hu/enigmail.properties enigmail-2.1.3+ds1/lang/hu/enigmail.properties --- enigmail-2.0.12+ds1/lang/hu/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/hu/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=Enigmail figyelmeztetés -enigConfirm=Enigmail jóváhagyás +enigConfirm=Enigmail megerősítés enigInfo=Enigmail információ enigError=Enigmail hiba enigPrompt=Enigmail kérdés @@ -114,6 +114,7 @@ fixBrokenExchangeMsg.failed=Az üzenet megjavítása nem sikerült. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S wksConfirmSuccess=Jóváhagyó üzenet elküldve. wksConfirmFailure=Jóváhagyó üzenet elküldése nem sikerült. @@ -148,10 +149,9 @@ minimalLineWrapping=Beállította a sortördelést %S karakterre. A helyes titkosításhoz, illetve aláíráshoz ennek az értéknek legalább 68-nak kell lennie.\nSzeretné átállítani a sortördelést 68 karakterre most? warning=Figyelem signIconClicked=Manuálisan módosította a postafiók Enigmail beállítását! Amennyiben folytatja a levél írását, úgy a postafiókhoz beállított Enigmail funkció (titkosítás, aláírás) érvényét veszti. -errorOwnKeyUnusable=Az aktuális azonosítónál beállított „%S” kulcs nem használható az OpenPGP számára.\n\nGyőződjön meg róla, hogy a használandó kulcs érvényes, nem lejárt OpenPGP kulcs, és ellenőrizze, hogy Postafiók beállításainál megfelelő kulcs van megadva.\nHa a kulcs nem járt le, akkor ellenőrizze, hogy a tulajdonos megbízhatóság teljesen- vagy véglegesen megbízhatóra van állítva. +# 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=Hiba lépett fel a piszkozat mentése közben # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. -# msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=Belső hiba: az ígért titkosítási támogatás le van tiltva @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=Az Enigmail le van tiltva a kijelölt postafiókhoz msgCompose.protectSubject.tooltip=Üzenet tárgyának védelme msgCompose.noSubjectProtection.tooltip=Ne védje az üzenet tárgyát -msgCompose.encryptedSubjectStub=Titkosított üzenet msgCompose.protectSubject.dialogTitle=Be kívánja kapcsolni az üzenet tárgyának védelmét? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? msgCompose.protectSubject.yesButton=&Tárgy védelme @@ -179,7 +178,7 @@ msgCompose.pepSendTrusted=Biztonságos és megbízható # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -# pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=Mentse a(z) %1$S üzenetet %2$S részére a Postázandó üzenetek közé? onlineSend=Küldje el a(z) %1$S üzenetet %2$S részére? -encryptKeysNote=Megjegyzés: az üzenet titkosítva van a következő felhasználói azonosítókkal/kulcsokkal: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S hiddenKey= -signFailed=Hiba az Enigmail programban: titkosítási illetve aláírási hiba. Elküldi a levelet titkosítás nélkül? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=&Titkosítatlan üzenet küldése recipientsSelectionHdr=Válassza ki a címzetteket a titkosításhoz @@ -225,9 +224,9 @@ signOffWithReason=Aláírás: KI (%S) reasonEnabledByDefault=mindig bekapcsolva reasonManuallyForced=kézzel kényszerítve -reasonByRecipientRules=címzettenkénti szabállyal kényszerítve +reasonByRecipientRules=Címzettenkénti szabályok alapján kényszerítve reasonByAutoEncryption=automatikus titkosítással kényszerítve -reasonByConflict=a címzettenkénti szabályok ütközése miatt +# reasonByConflict=due to conflict in per-recipient rules reasonByEncryptionMode=az automatikus titkosítás miatt # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=Beágyazott PGP használatával # Attach own key status (tooltip strings): -attachOwnKeyNo=A saját kulcs nem lesz mellékelve. -attachOwnKeyYes=A saját kulcs mellékelve lesz. -attachOwnKeyDisabled=A saját kulcs nem mellékelhető. A szolgáltatás engedélyezéséhez\nki kell választania egy kulcsot a Postafiók beállításai párbeszédablakban az OpenPGP részben. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=A címzettenkénti szabályok többszörösen egyeznek:\n%S\n\nElküldi az üzenetet ezekkel a beállításokkal? msgCompose.button.configure=&Beállítás @@ -269,6 +268,10 @@ clickDetailsButton=; További információkért kattintson a „Részletek” gombra clickImportButton=; kattintson az „Importálás” gombra a kulcs letöltéséhez keyTypeUnsupported=; ezt a kulcstípust nem támogatja a telepített GnuPG verzió +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Visszafejtés msgPart=A levél része: %S msgSigned=aláírt msgSignedUnkownKey=ismeretlen kulccsal aláírt @@ -280,8 +283,10 @@ needKey=Hiba – Titkos kulcs szükséges az üzenet visszafejtéséhez failedDecrypt=Hiba – Visszafejtés sikertelen badPhrase=Hiba – Rossz jelmondat +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=Hiba – A visszafejtés és az ellenőrzés sikertelen viewInfo=; további részletek: „Nézet → Üzenet biztonsági adatai” +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=Visszafejtett üzenet decryptedMsgWithFormatError=Üzenet visszafejtése (visszaállítás hibás PGP levélformátumból, amelyet valószínűleg egy régi Exchange kiszolgáló okozott, így az eredménye esetleg nem lesz tökéletes) @@ -326,6 +331,7 @@ # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js oldGpgVersion20=Enigmail indítási hiba.\n\nA GnuPG %1$S verzióját használja, amely már nem támogatott verzió. Az Enigmail legalább GnuPG %2$2 verziót vagy újabbat igényel. Frissítse a rendszerre telepített GnuPG verziót. ellenkező esetben az Enigmail nem fog működni. @@ -337,6 +343,8 @@ prefs.warnAskNever=Figyelmeztetés: Az opció kiválasztása mindenféle további figyelmeztetés nélkül hatással lesz a nem titkosított levelekre, ha nincs kulcs valamelyik címzettnél -- Enigmail nem fogja értesíteni, ha ez történik. prefs.warnIdleTimeForUnknownAgent=Nem sikerült csatlakozni a gpg-agent programhoz. Előfordulhat hogy az Ön rendszere speciális eszközt – gnome-keyring vagy seahorse-agent – használ a jelmondatok kezeléséhez. Sajnos az Enigmail így nem tudja befolyásolni az jelmondatok lejáratát az Ön által használt eszközben. Ennek megfelelően az Enigmail programban megadott lejárati idők figyelmen kívül lesznek hagyva. prefEnigmail.oneKeyserverOnly=Hiba – Csak egy kulcskiszolgálót adhat meg a hiányzó OpenPGP-kulcsok automatikus letöltéséhez. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +aboutLicense.desc=Az Enigmail nyílt forráskódú és a Mozilla Public License 2.0 szerint licencelt. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,7 +361,7 @@ noPassphrase=Hiba – Nincs jelmondat megadva noPGPblock=Hiba – Nem található érvényes védett OpenPGP-adatblokk unverifiedReply=A beljebb kezdett üzenetrész (válasz) valószínűleg módosult -keyInMessageBody=Az üzenettörzsben kulcs található. kattintson az „Importálás” gombra a kulcs importálásához. +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=Hiba – Eltérő aláírás cantImport=Hiba a nyilvános kulcs importálásakor\n\n doImportOne=Importálja a következőt: %1$S (%2$S)? @@ -366,14 +374,15 @@ sc.removeCard=A művelet végrehajtásához nincs szükség intelligens kártyára.\nKérem, távolítsa el az intelligens kártyát és ismételje meg a műveletet. sc.noCardAvailable=Nem található intelligens kártya az olvasóban.\nKérem, helyezze be az Intelligens kártyát és ismételje meg a műveletet. sc.noReaderAvailable=Az intelligens kártyaolvasó nem elérhető.\nKérem, csatlakoztassa az Intelligens kártyaolvasót, helyezze be a kártyát, majd ismételje meg a műveletet. -keyError.keySpecNotFound=A(z) „%S” e-mail cím nem egyeztethető össze a kulcstartón található kulccsal. -keyError.keyIdNotFound=A beállított „%S” azonosítójú kulcs nem található meg a kulcstartón. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. keyError.resolutionAction=Adjon meg egy érvényes OpenPGP kulcsot a Postafiók beállításai párbeszédablakban az OpenPGP részben. missingPassphrase=Hiányzó jelmondat errorHandling.gpgAgentInvalid=A számítógépen olyan gpg-agent verzió található, amely nem működik együtt a telepített GnuPG verzióval. errorHandling.gpgAgentError=A GnuPG nem képes kommunikálni a gpg-agent programmal (amely a GnuPG része). errorHandling.dirmngrError=A GnuPG nem képes kommunikálni a dirmngr programmal (amely a GnuPG része). errorHandling.pinentryError=A GnuPG nem tudja lekérdezni a jelmondatot a pinentry segítségével. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. errorHandling.readFaq=Ez egy rendszer telepítési vagy beállítási hiba, amely meggátolja az Enigmail programot a helyes működésben. Ez a hiba nem javítható automatikusan.\n\nA hibaelhárítással kapcsolatos teendőkért látogassa meg az Enigmail terméktámogatási weboldalát:https://enigmail.net/faq. gpgNotFound=A GnuPG program („%S”) nem található.\nGyőződjön meg róla, hogy a GnuPG útvonala megfelelően van beállítva az Enigmail beállításainál. @@ -384,9 +393,8 @@ prefBad=ROSSZ aláírás: %S failCancel=Hiba – Kulcslekérés a felhasználó által megszakítva -failNoServer=Hiba – Nincs kulcskiszolgáló megadva, ahonnan letölthető a kulcs -failNoID=Hiba – Nincs kulcsazonosító megadva a kulcs lekéréséhez failKeyExtract=Hiba – A kulcskinyerő parancs sikertelen volt +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=Hiba – Az első OpenPGP-blokk nem nyilvános kulcs blokkja importKeyConfirm=Importálja a levélbe ágyazott nyilvános kulcsokat? failKeyImport=Hiba – A kulcsok importálása sikertelen @@ -425,6 +433,8 @@ identityName=Azonosító: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Aktiválta a titkosítást, de nem jelölt ki egy kulcsot. Ha %1$S számára küldött leveleit titkosítani szeretné, meg kell adnia egy vagy több kulcsot a kulcslistáról. Szeretné kikapcsolni a titkosítást %2$S számára? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=A kiválasztott funkció nem érhető el kapcsolat nélküli módban. Kérem, jelentkezzen be az Internetre, és próbálja ismét. -protocolNotSupported=OpenPGP-kulcsok letöltését a kiválasztott protokoll ('%S://') nem támogatja. -gpgkeysDisabled=Segíthet, ha engedélyezi az 'extensions.enigmail.useGpgKeysTool' lehetőséget. noKeyserverConn=Nem lehet kapcsolódni a kulcskiszolgálóhoz: %S. -keyDownloadFailed=A kulcskiszolgálóról nem sikerült letölteni a kulcsot. Állapotüzenet:\n%S internalError=Belső hiba lépett fel. A kulcsot nem lehetett letölteni, illetve importálni. -noKeyFound=Nem található egyetlen kulcs sem, amely megfelel a megadott keresési feltételeknek.\nKérem, jegyezze meg azt a kulcsazonosítót, amely „0x”-el kezdődik (például: 0xABCDEF12). -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=A kulcsot nem találtam, illetve nem tudtam letölteni a kulcskiszolgálóról: gpgkeys_%S nem futtatható. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Nem sikerült a tulajdonos megbízhatóságát beállítani. @@ -490,7 +493,6 @@ asciiArmorFile=ASCII-adat fájlok (*.asc) importKeyFile=OpenPGP-kulcsfájl importálása gnupgFile=GnuPG fájlok -createKeyOK=A kulcs elkészült saveRevokeCertAs=Visszavonási tanúsítvány készítése és mentés # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=A visszavonási tanúsítvány létrehozása nem sikerült. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%1$S (0x%2$S) nyilvános-titkos defaultPubKeyFilename=Mentett-nyilvanos-kulcsok defaultPubSecKeyFilename=Mentett-nyilvanos-es-titkos-kulcsok -noSecretKeys=Nem található titkos kulcs.\n\nSzeretne most létrehozni egy saját kulcsot? sendKeysOk=Kulcs(ok) elküldése sikerült sendKeysFailed=Nem sikerült a kulcs(ok) elküldése receiveKeysOk=Kulcs(ok) frissítése sikerült receiveKeysFailed=Kulcs(ok) letöltése nem sikerült +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=Szeretné a vágólapról betölteni a kulcs(ok)at? importFromUrl=Nyilvános kulcs letöltése erről az URL-címről: copyToClipbrdFailed=Nem sikerült a vágólapra másolni a kijelölt kulcs(ok)at. copyToClipbrdOK=A kulcs(ok) a vágólapra kerültek -deleteSecretKey=FIGYELMEZTETÉS: A titkos kulcs törlését kezdeményezte.\nHa letörli a titkos kulcsot, akkor a korábban ezzel a kulccsal titkosított leveleit soha többé nem tudja visszafejteni, illetve a kulcsot sem tudja visszavonni többé.\n\nBiztosan törölni akarja MINDKÉT, a titkos és a nyilvános kulcsot is\n„%S”? +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=FIGYELMEZTETÉS: A titkos kulcsok törlését kezdeményezte.\nHa letörli a titkos kulcsot, akkor a korábban ezzel a kulccsal titkosított leveleit soha többé nem tudja visszafejteni.\n\nBiztosan törölni akar MINDEN kiválasztott titkos és nyilvános kulcsot? deletePubKey=Szeretné törölni a következő nyilvános kulcsot\n„%S”? deleteSelectedPubKey=Szeretné törölni a kijelölt nyilvános kulcsokat? @@ -529,7 +531,7 @@ revokeKeyQuestion=A következő kulcs visszavonását kezdte el: „%S”.\n\nA kulcs visszavonása után Ön nem tud majd aláírni ezzel a kulccsal és a visszavonás közreadása után, mások sem tudnak majd – ehhez a kulcshoz tartozó – titkosított üzenetet küldeni. Továbbra is használhatja a kulcsot a régi üzenetek visszafejtésére.\n\nKívánja folytatni a visszavonást? revokeKeyOk=A kulcs visszavonása sikerült. Ha a kulcs elérhető a kulcskiszolgálón, javasoljuk, hogy töltse fel oda is, hogy a nyilvánosság felé is látszódjon a visszavonás. revokeKeyFailed=A kulcs nem vonható vissza. -# revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! revokeKeyAlreadyRevoked=A(z) „0x%S” kulcs már vissza lett vonva. refreshAllQuestion=Nincs kiválasztva egyetlen kulcs sem. Szeretné frissíteni az összes kulcsot? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? @@ -541,28 +543,28 @@ keyMan.button.import=&Importálás keyMan.button.refreshAll=Összes kulcs f&rissítése keyMan.button.revokeKey=Kulcs &visszavonás -keyMan.button.skip=Kulcs kihagyá&sa keylist.noOtherUids=Nincs több azonosító keylist.hasOtherUids=Más néven -keylist.noPhotos=Nem érhető el fotó -keylist.hasPhotos=Fotók +# keylist.noPhotos=No photo available +keylist.hasPhotos=Fényképek keyMan.addphoto.filepicker.title=Válassza ki a fotót -keyMan.addphoto.warnLargeFile=A kiválasztott fájl nagyobb mint 25 kilobyte.\nNem ajánlatos túl nagy fájlt kiválasztani, mert a kulcs nagyon nagy méretű lesz. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. keyMan.addphoto.noJpegFile=A kiválasztott fájl nem tűnik JPEG-fájlnak. Válasszon ki egy JPEG-fájlt. keyMan.addphoto.failed=A fotó nem adható hozzá. # noWksIdentity=The key %S does not have a WKS identity. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -keyman.addBlacklistKey.msg=Valóban p≡p nem kívánja üzenet titkosításra használni ezt a kulcsot: „%1$S (%2$S)”? -# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? keyman.addBlacklistKey.button=Kulcs &felvétele a feketelistára keyman.removeBlacklistKey.button=Kulcs &eltávolítása a feketelistától # Strings in enigmailManageUidDlg.xul changePrimUidFailed=Az elsődleges felhasználói azonosító módosítása sikertelen. changePrimUidOK=Sikerült módosítani az elsődleges felhasználói azonosítót. -revokeUidFailed=%S felhasználó azonosítójának visszavonása nem sikerült +revokeUidFailed=A(z) %S felhasználó azonosítójának visszavonása nem sikerült revokeUidOK=%S felhasználói azonosító visszavonása sikerült. Ha a kulcs elérhető a kulcskiszolgálón, javasoljuk, hogy töltse fel oda is, hogy a nyilvánosság felé is látszódjon a visszavonás. revokeUidQuestion=Valóban szeretné visszavonni a(z) %S felhasználó azonosítót? @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=PIN-kód módosítása nem sikerült. -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Kulcsok frissítése, kérem várjon… keyserverProgress.uploading=Kulcsok feltöltése, kérem várjon… # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Kulcsok frissítése keyserverTitle.uploading=Kulcs feltöltése +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=A jelszavának legalább 8 karaktert kell tartalmaznia. -setupWizard.reallyCancel=Valóban ki szeretne lépni az Enigmail Beállítás Tündérből? setupWizard.invalidGpg=A megadott fájl nem egy GnuPG végrehajtható fájl. Adjon meg egy másik fájlt. -setupWizard.specifyFile=Legalább a nyilvános kulcsot meg kell adnia a művelet végrehajtásához. setupWizard.installFailed=Az telepítés nem sikerült. Próbálja meg újra a telepítést, vagy telepítse a GnuPG programot kézzel és adja meg az elérési útját a „Tallózás” gombbal. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. -setupWizard.hashSumError=A tündér nem tudja ellenőrizni a letöltött fájl érvényességét. A fájl esetleg hibás vagy rossz szándékkal megváltoztatott lehet. Ennek ellenére folytatni kívánja a telepítést? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? setupWizard.importSettingsFile=Adja meg a betöltendő mentés fájlt -setupWizard.invalidSettingsFile=A megadott fájl nem érvényes Enigmail beállítások mentésfájl. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. setupWizard.gpgConfExists=A GnuPG beállítófájl már létezik. Felül kívánja írni a fájlt egy régebbi telepítésből származó fájllal? -# setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Hiba lépett fel a GnuPG letöltése során. További részleteket a konzol naplóban talál. @@ -654,12 +662,12 @@ filter.term.pgpencrypted.label=OpenPGP titkosított # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. -filter.keyNotFound=Nem található titkosítókulcs a következőhöz: „%S” -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -converter.decryptBody.failed=Nem fejthető vissza az üzenet, amelynek tárgya:\n„%S”.\nMegpróbálja visszafejteni egy másik jelmondattal, vagy kihagyja ezt az üzenetet? -converter.decryptAtt.failed=Nem fejthető vissza a(z) „%1$S”\nüzenet mellékelte, amelynek tárgya:\n„%2$S”.\nMegpróbálja visszafejteni egy másik jelmondattal, vagy kihagyja ezt az üzenetet? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? saveLogFile.title=Naplófájl mentése @@ -691,13 +699,13 @@ enigmailSettings=EnigmailBeallitasok defaultBackupFileName=Enigmail-export specifyExportFile=Adja meg a fájlnevet az exportáláshoz -homedirParamNotSUpported=További paraméterek, amelyek az elérési utat állítják be – például: „--homedir” és „--keyring” – nem támogatottak a beállítások mentésekor és visszatöltésekor. Használjon más megoldást, például a „GNUPGHOME” környezeti változót. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #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=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. expiry.OpenKeyManager=Enigmail Kulcskezelő megnyitása expiry.OpenKeyProperties=Kulcs tulajdonságainak megjelenítése @@ -709,6 +717,7 @@ # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=Nem lehet ellenőrizni a p≡p bizalmi szavakat a saját fiókját. @@ -728,12 +737,12 @@ # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. pepPrivacyStatus.RatingReliableSuggestion=A bizalmi szavak személyesen vagy telefonon történő cseréjével készítsen egy kézfogást a kommunikációs partnerével. A kézfogás partnerenként csak egyszer szükséges, és biztonságos és megbízható kommunikációt biztosít. pepPrivacyStatus.RatingTrustedSuggestion=Nincs szükség beavatkozásra. -# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Adja meg a szükséges információkat. -# pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. pepPrivacyStatus.RatingHaveNoKeyExplanation=Ez az üzenet nem visszafejthető, mert a kulcs nem elérhető. @@ -763,16 +772,16 @@ handshakeDlg.label.outgoingMessage=Kimenő üzenet handshakeDlg.label.incomingMessage=Beérkezett üzenet # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. -# handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device -# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html upgradeInfo.doctitle=Milyen újdonságok vannak az Enigmail v2.0 verziójában? @@ -785,10 +794,12 @@ # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. +#strings in pEpAdapter.jsm # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=Az Enigmail névjegye @@ -799,6 +810,7 @@ aboutEnigmail.documentation=Dokumentáció: aboutEnigmail.testing=Tesztelés: aboutEnigmail.userSupport=Felhasználói támogatás: +# aboutEnigmail.userSupport.team=the team and the list/forum members # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: aboutEnigmail.origAuthor=Az Enigmail kiterjesztés eredeti készítője @@ -808,3 +820,38 @@ aboutEnigmail.licenseSupportTitle=Licenc és támogatás # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +keyserver.error.serverError=A kulcskiszolgáló hibát jelzett. +# keyserver.error.importError=Failed to import the downloaded key. +keyserver.error.unavailable=A kulcskiszolgáló nem elérhető. +keyserver.error.securityError=A kulcskiszolgáló nem támogatja a titkosított hozzáférést. +keyserver.error.certificateError=A kulcskiszolgáló által megadott biztonsági tanúsítvány nem érvényes. +keyserver.error.unsupported=Az Enigmail nem támogatja kulcskiszolgálót. + +#strings in mimeDecrypt.jsm +mimeDecrypt.encryptedPart.attachmentLabel=Titkosított üzenetrész +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +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 diff -Nru enigmail-2.0.12+ds1/lang/it/enigmail.dtd enigmail-2.1.3+ds1/lang/it/enigmail.dtd --- enigmail-2.0.12+ds1/lang/it/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/it/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ -Mozilla Public License 2.0.."> - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -62,7 +53,7 @@ - + @@ -73,15 +64,7 @@ - - - - - 'Trasferimento chiave di Autocrypt' richiede che il client email dell'altro dispositivo abbia il supporto per Autocrypt. - Sebbene questa è la soluzione più semplice, al momento solo poche applicazioni supportano questo standard. - L'altro modo è di eseguire un 'Backup e ripristino' delle tue impostazioni. - Sarà creato un file ZIP con tutte le informazioni e le chiavi che dovrà essere copiato sul nuovo dispositivo. - Enigmail può importare direttamente queste impostazioni; con gli altri client email, il file ZIP dovrà essere scompattato e gestito manualmente."> + @@ -95,12 +78,13 @@ + - + '"> @@ -123,6 +107,9 @@ + + + @@ -215,6 +202,7 @@ + @@ -223,8 +211,8 @@ - - + + @@ -351,7 +339,7 @@ - + @@ -374,7 +362,6 @@ - @@ -462,8 +449,8 @@ - - + + @@ -548,7 +535,7 @@ - + @@ -629,7 +616,7 @@ - + @@ -671,136 +658,37 @@ - - - - - - - - - - - - - - - - - - - - -Nota: Enigmail verificherà comunque le firme sulle email di tutti gli account o identità, indipendentemente dal fatto che sia abilitato o meno"> - + + - - + - - - - - - - - - - - - - - - - - -chiave pubblica serve agli altri per inviare a te messaggi cifrati. Puoi distribuirla a chiunque."> -chiave privata serve solo a te per decifrare le email che ti arrivano per inviare messaggi firmati. -Non dovresti fornirla a nessuno."> -chiave privata serve solo a te per decifrare questi messaggi e per inviare messaggi firmati. -Non dovresti fornirla a nessuno. -Per proteggere la tua chiave privata, ti sarà richiesta una frase segreta nelle due finestre seguenti."> -frase segreta è una password per proteggere la tua chiave privata. Impedisce utilizzi impropri della tua chiave privata."> -non sono consigliati."> - - - - - - - - - - - - - - - - - - - - - - - - -Ti verrà richiesto di inserire la tua password. Per favore sposta il certificato su un dispositivo che può essere conservato in sicurezza come un CD o una chiavetta USB. Se qualcuno dovesse accedere a questo certificato potrebbe usarlo per rendere la tua chiave inutilizzabile."> - - - - - - - - - - - -esporta i tuoi dati dal vecchio computer utilizzando la procedura di backup dalle preferenze di Enigmail -importa i dati nel nuovo computer utilizzando questa procedura. -"> - - - - - - -Grazie per aver scelto Enigmail."> - - - - - - - - - + + + + + + + + + + + - + @@ -816,12 +704,9 @@ - -esporta i tuoi dati dal vecchio computer utilizzando questa procedura -importa i dati nel nuovo computer utilizzando la procedura di configurazione. -"> + + + @@ -841,7 +726,7 @@ - + @@ -868,7 +753,7 @@ - + @@ -882,9 +767,19 @@ - + + - + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/it/enigmail.properties enigmail-2.1.3+ds1/lang/it/enigmail.properties --- enigmail-2.0.12+ds1/lang/it/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/it/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=Avviso Enigmail -enigConfirm=Conferma Enigmail +enigConfirm=Conferma di Enigmail enigInfo=Informazioni Enigmail enigError=Errore Enigmail enigPrompt=Richiesta Enigmail @@ -78,7 +78,7 @@ passSpaceProblem=Due to technical reasons, your passphrase may not start or end with a space character. changePassFailed=Cambiamento della frase segreta non riuscito. -keyConfirm=Creare chiave pubblica e privata per '%S'? +keyConfirm=Vuoi generare chiave pubblica e privata per '%S'? keyMan.button.generateKey=&Genera chiave keyAbort=Interrompere la creazione della chiave? keyMan.button.generateKeyAbort=&Interrompi la creazione della chiave @@ -86,14 +86,14 @@ expiryTooLong=Non puoi creare una chiave che scadrà tra più di 100 anni. expiryTooLongShorter=You cannot create a key that expires in more than 90 years. expiryTooShort=La tua chiave deve essere valida per almeno un giorno. -keyGenFailed=Creazione della chiave non riuscita. Controlla la console di Enigmail (Menu Enigmail -> Debug di Enigmail) per maggiori dettagli. +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. setKeyExpirationDateFailed=La data di scadenza non dovrebbe essere modificata # Strings in enigmailMessengerOverlay.js securityInfo=Informazioni di sicurezza Enigmail\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Gli allegati di questo messaggio non sono stati firmati o cifrati*\n\n +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=Il messaggio potrebbe essere firmato o cifrato nel formato PGP/MIME; fai clic sul pulsante Decifra per verificare saveAttachmentHeader=Enigmail: salva allegato decifrato @@ -102,7 +102,7 @@ beginPgpPart=********* *INIZIO PARTE CIFRATA o FIRMATA* ********* endPgpPart=********** *FINE PARTE CIFRATA o FIRMATA* ********** -notePartEncrypted=Enigmail: *Alcune parti del messaggio NON sono state cifrate o firmate* +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *Sono stati trovati blocchi di messaggio multipli -- decifratura/verifica interrotta* decryptOkNoSig=Attenzione\n\nLa decifratura è riuscita, ma non è stato possibile verificare correttamente la firma @@ -114,6 +114,7 @@ fixBrokenExchangeMsg.failed=La riparazione del messaggio non è riuscita. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key wksNoIdentity=Questa chiave non è collegata a nessuno dei tuoi account di posta. Aggiungi un account per almeno uno dei seguenti indirizzi di posta:\n\n%S wksConfirmSuccess=Messaggio di conferma inviato. wksConfirmFailure=Invio del messaggio di conferma non riuscito. @@ -148,10 +149,9 @@ minimalLineWrapping=Hai impostato l'interruzione di riga automatica ogni %S caratteri. Per una corretta cifratura e/o firma, questo valore deve essere almeno 68.\nVuoi impostare subito l'interruzione di riga dopo 68 caratteri? warning=Attenzione signIconClicked=Hai modificato manualmente la firma. Pertanto, durante la composizione di questo messaggio, (dis)attivare la firma non dipende più dalla (dis)attivazione della cifratura. -errorOwnKeyUnusable=L'ID della chiave '%S' configurato per l'identità corrente non fornisce una chiave OpenPGP utilizzabile.\n\nAssicurati di avere una chiave OpenPGP valida e non scaduta e che le impostazioni del tuo account puntino a tale chiave.\nSe la tua chiave non è scaduta, controlla se hai impostato la fiducia nel proprietario a completa o definitiva. +# 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=Errore durante il salvataggio della bozza msgCompose.partiallyEncrypted.short=Attenzione alle fughe di informazioni sensibili - messaggio cifrato parzialmente. -# msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=Errore interno: cifratura promessa disabilitata @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=Enigmail è disabilitato per l'identità selezionata msgCompose.protectSubject.tooltip=Proteggi l'oggetto del messaggio msgCompose.noSubjectProtection.tooltip=Non proteggere l'oggetto del messaggio -msgCompose.encryptedSubjectStub=Messaggio cifrato msgCompose.protectSubject.dialogTitle=Vuoi abilitare la protezione dell'oggetto? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? msgCompose.protectSubject.yesButton=&Proteggi oggetto @@ -179,7 +178,7 @@ msgCompose.pepSendTrusted=Sicuro e affidabile pep.alert.disabledForIdentity=p≡p è disabilitato per l'identità attuale. Abilita p≡p dalle preferenze di Enigmail/p≡p. -pep.alert.weakReply=Stai per inoltrare o rispondere a un messaggio sicuro in modo non sicuro. Se scegli di continuare, informazioni confidenziali potrebbero essere sottratte, mettendo a rischio te e il tuo interlocutore. Sei sicuro di voler continuare? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=Salvo il messaggio %S destinato a %S nella cartella 'Da inviare'? onlineSend=Invio il messaggio %S destinato a %S? -encryptKeysNote=Nota: il messaggio è cifrato con i seguenti ID utente / chiavi: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S hiddenKey= -signFailed=Errore in Enigmail; Cifratura/firma non riuscita; spedire il messaggio in chiaro? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=&Invia messaggio in chiaro recipientsSelectionHdr=Scegli i destinatari per la cifratura @@ -225,9 +224,9 @@ signOffWithReason=Firma: DISATTIVA (%S) reasonEnabledByDefault=abilitato in modo predefinito reasonManuallyForced=forzato manualmente -reasonByRecipientRules=forzato dalle regole per destinatario +# reasonByRecipientRules=forced by per-recipient rules reasonByAutoEncryption=forzato dalla cifratura automatica -reasonByConflict=a causa di un conflitto nelle regole per destinatario +# reasonByConflict=due to conflict in per-recipient rules reasonByEncryptionMode=a causa della modalità di cifratura # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=Sarà utilizzato PGP in linea # Attach own key status (tooltip strings): -attachOwnKeyNo=La tua chiave non sarà allegata -attachOwnKeyYes=La tua chiave sarà allegata -attachOwnKeyDisabled=La tua chiave non può essere allegata. Devi selezionare una chiave specifica\nnella sezione OpenPGP delle impostazioni account per abilitare questa funzionalità. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Alcune delle regole impostate per i destinatari sono in conflitto fra di loro\n%S\n\nInviare il messaggio con queste impostazioni? msgCompose.button.configure=&Configura @@ -269,6 +268,10 @@ clickDetailsButton=; fai clic sul pulsante 'Dettagli' per ulteriori informazioni clickImportButton=; fai clic sul pulsante 'Importa chiave' per scaricare la chiave keyTypeUnsupported=; il tipo di chiave non è supportato dalla tua versione di GnuPG +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Decifra msgPart=Parte del messaggio %S msgSigned=firmato msgSignedUnkownKey=firmato con una chiave sconosciuta @@ -280,8 +283,10 @@ needKey=Errore - serve la chiave segreta per decifrare il messaggio failedDecrypt=Errore - decifratura non riuscita badPhrase=Errore - frase segreta non valida +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=Errore - decifratura/verifica non riuscita viewInfo=; Visualizza > Informazioni di sicurezza messaggio per i dettagli +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=Messaggio decifrato decryptedMsgWithFormatError=Messaggio decifrato (ripristinato formato dell'email PGP danneggiata, probabilmente a causa di un server Exchange datato. Il risultato potrebbe non essere perfettamente leggibile) @@ -326,6 +331,7 @@ # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. autocryptSetupReq.message.import=Per importare le impostazioni e le chiavi in Enigmail, fai clic sul pulsante "Avvia configurazione" nella barra di stato. autocryptSetupReq.message.sent=Fai clic sul messaggio sul tuo nuovo dispositivo e segui le istruzioni per importare le impostazioni. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js oldGpgVersion20=Inizializzazione di Enigmail non riuscita.\n\nStai utilizzando la versione %1$S di GnuPG, che non è più supportata. Enigmail richiede la versione %2$S o superiore di GnuPG. Aggiorna la tua installazione di GnuPG, o Enigmail non funzionerà. @@ -337,6 +343,8 @@ prefs.warnAskNever=Attenzione: l'attivazione di questa opzione implica l'invio automatico di email in chiaro senza nessuna ulteriore comunicazione in mancanza di chiavi disponibili per anche uno solo dei destinatari -- Enigmail non mostrerà nessun messaggio di avvertimento nel caso in cui questa eventualità si verifichi! prefs.warnIdleTimeForUnknownAgent=Impossibile connettersi a gpg-agent. Il tuo sistema utilizza uno strumento specializzato per la gestione della chiave segreta come gnome-keyring o seahorse-agent. Sfortunatamente, Enigmail non può controllare il timeout della frase segreta per lo strumento utilizzato. Perciò le relative impostazioni di timeout in Enigmail sono ignorate. prefEnigmail.oneKeyserverOnly=Errore - puoi specificare un solo server per lo scaricamento automatico delle chiavi OpenPGP mancanti. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +aboutLicense.desc=Enigmail è open source e rilasciato nei termini della licenza Mozilla Public License 2.0.. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=Errore - passphrase non inserita noPGPblock=Errore - non è stato trovato nessun blocco valido di dati OpenPGP unverifiedReply=La parte di messaggio citata (in risposta) è stata probabilmente modificata -keyInMessageBody=Trovata chiave nel corpo del messaggio. Fai clic su 'Importa chiave' per importare la chiave +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=Errore - firma non corrispondente -cantImport=Errore nell'importazione della chiave pubblica\n\n +# cantImport=Error importing public key\n\n doImportOne=Vuoi importare %1$S (%2$S)? doImportMultiple=Vuoi importare le seguenti chiavi?\n\n%S previewFailed=Impossibile leggere il file della chiave pubblica. @@ -366,14 +374,15 @@ sc.removeCard=L'operazione richiede che non ci siano smartcard nel lettore.\nRimuovi la tua smartcard e ripeti l'operazione. sc.noCardAvailable=Nessuna smartcard trovata nel lettore\nInserisci la smartcard e ripeti l'operazione. sc.noReaderAvailable=Impossibile accedere al lettore di smartcard \nCollega il lettore, inserisci la scheda e ripeti l'operazione. -keyError.keySpecNotFound=L'indirizzo email "%S" non può corrisponde a una chiave nel tuo portachiavi. -keyError.keyIdNotFound=L'ID della chiave configurata "%S" non può essere trovato nel tuo portachiavi. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. keyError.resolutionAction=Seleziona un chiave valida nella sezione OpenPGP delle impostazioni del tuo account. missingPassphrase=Frase segreta mancante errorHandling.gpgAgentInvalid=Il tuo sistema esegue una versione di gpg-agent non appropriata alla tua versione di GnuPG. errorHandling.gpgAgentError=GnuPG ha segnalato un errore nella comunicazione con gpg-agent (un componente di GnuPG). errorHandling.dirmngrError=GnuPG ha segnalato un errore nella comunicazione con dirmngr (un componente di GnuPG). errorHandling.pinentryError=GnuPG non è in grado di interrogare la tua frase segreta tramite pinentry. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. errorHandling.readFaq=Questa è una configurazione di sistema o un errore di configurazione che impedisce a Enigmail di funzionare correttamente e non può essere corretta automaticamente.\n\nTi consigliamo di consultare il nostro sito web di supporto su https://enigmail.net/faq. gpgNotFound=Impossibile trovare l'eseguibile di GnuPG '%S'.\nAssicurati di aver impostato correttamente il percorso dell'eseguibile di GnuPG nelle impostazioni di Enigmail. @@ -384,9 +393,8 @@ prefBad=Firma NON autentica per %S failCancel=Errore - ricezione chiave annullata dall'utente -failNoServer=Errore - nessun server specificato da cui ricevere la chiave -failNoID=Errore - non è stato specificato nessun ID chiave per cui scaricare la chiave failKeyExtract=Errore - comando di estrazione chiave non riuscito +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=Errore - il primo blocco di dati OpenPGP non è una chiave pubblica importKeyConfirm=Importare la/e chiave/i pubblica/he inserita/e nel messaggio? failKeyImport=Errore - importazione chiave non riuscita @@ -425,6 +433,8 @@ identityName=Identità: %S switchPepMode=Stai utilizzando attualmente la modalità 'p≡p Junior' di Enigmail.\n\nAbilitando OpenPGP o S/MIME per un account, stai disabilitando p≡p e utilizzi la modalità 'normale' di Enigmail senza p≡p. enableEnigmail=&Disabilita p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Hai attivato la cifratura, ma non hai selezionato nessuna chiave. Per cifrare i messaggi inviati a %S, devi specificare una o più chiavi valide dalla tua lista delle chiavi. Vuoi disattivare la cifratura per %S? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=La funzione che hai selezionato non è disponibile nella modalità non in linea. Vai in linea e riprova. -protocolNotSupported=Il protocollo '%S://' che hai selezionato non è supportato per lo scaricamento delle chiavi OpenPGP. -gpgkeysDisabled=Potrebbe aiutare abilitare l'opzione 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=Impossibile collegarsi al server delle chiavi a %S. -keyDownloadFailed=Scaricamento della chiave dal server non riuscito. Il messaggio di stato è:\n%S internalError=Si è verificato un errore interno. Non è stato possibile né scaricare le chiavi, né importarle. -noKeyFound=Spiacenti, non è stata trovata alcuna chiave che corrisponda ai criteri di ricerca specificati.\nRicorda che l'ID della chiave deve essere preceduto da "0x" (ad es. 0xABCDEF12). -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Impossibile cercare o scaricare la chiave dal server: non è stato possibile eseguire gpgkeys_%S. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Impostazione della fiducia nel proprietario non riuscita @@ -490,7 +493,6 @@ asciiArmorFile=File con armatura ASCII (*.asc) importKeyFile=Importa file di chiave OpenPGP gnupgFile=File di GnuPG -createKeyOK=La tua chiave è stata generata saveRevokeCertAs=Crea e salva certificato di revoca revokeCertOK=Il certificato di revoca è stato creato correttamente. Puoi usarlo per togliere validità alla tua chiave pubblica, come nel caso in cui tu perda la tua chiave privata. revokeCertFailed=Il certificato di revoca non può essere creato. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%S (0x%S) pub-sec defaultPubKeyFilename=Chiavi-pubbliche-esportate defaultPubSecKeyFilename=Chiavi-pubbliche-e-private-esportate -noSecretKeys=Non sono state trovate chiavi segrete.\n\nVuoi generare la tua chiave ora? sendKeysOk=Chiave/i inviata/e correttamente sendKeysFailed=Invio delle chiavi non riuscito receiveKeysOk=Chiave/i aggiornata/e correttamente receiveKeysFailed=Scaricamento della/e chiave/i non riuscito +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=Vuoi importare alcune chiavi dagli appunti? importFromUrl=Scarica la chiave pubblica da questo URL: copyToClipbrdFailed=Impossibile copiare le chiavi selezionate negli appunti. copyToClipbrdOK=Chiave/i copiata/e negli appunti -deleteSecretKey=ATTENZIONE: stai per eliminare una chiave privata!\nSe elimini la tua chiave privata, non sarai più in grado di decifrare alcun messaggio cifrato per quella chiave.\n\nVuoi veramente eliminarle ENTRAMBE, sia la chiave privata che la chiave pubblica\n'%S'? +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=ATTENZIONE: Stai per eliminare delle chiavi private!\nSe elimini la tua chiave privata, non sarai più in grado di decifrare alcun messaggio cifrato per quella chiave.\n\nVuoi davvero eliminarle TUTTE, sia le chiavi private che le chiavi pubbliche? deletePubKey=Vuoi eliminare la chiave pubblica\n'%S'? deleteSelectedPubKey=Vuoi eliminare le chiavi pubbliche? @@ -529,7 +531,7 @@ revokeKeyQuestion=Stai per revocare la chiave '%S'.\n\nNon sarai più in grado di firmare con questa chiave, e, una volta distribuita, gli altri non saranno in grado di cifrare con la tale chiave. Puoi ancora utilizzare la chiave per decifrare i vecchi messaggi.\n\nVuoi continuare? revokeKeyOk=La chiave è stata revocata. Se la tua chiave è disponibile su un server, è consigliabile spedirgliela di nuovo, così che tutti possano vedere la revoca. revokeKeyFailed=La chiave non può essere revocata. -revokeKeyNotPresent=Non hai una chiave (0x%S) che corrisponda a questo certificato di revoca!\n\nSe hai perso la chiave, devi importarla (ad es. da un server di chiavi) prima del certificato di revoca! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! revokeKeyAlreadyRevoked=La chiave 0x%S è già stata revocata. refreshAllQuestion=Non hai selezionato nessuna chiave. Vuoi ricaricare TUTTE le chiavi? refreshKeyServiceOn.warn=Avviso: le tue chiavi sono in fase di aggiornamento sullo sfondo con la massima sicurezza possibile.\nL'aggiornamento di tutte le tue chiavi in un'unica soluzione rivelerà, senza che sia necessario, informazioni sul tuo conto.\nVuoi farlo davvero? @@ -541,21 +543,21 @@ keyMan.button.import=&Importa keyMan.button.refreshAll=&Ricarica tutte le chiavi keyMan.button.revokeKey=&Revoca chiave -keyMan.button.skip=&Salta chiave keylist.noOtherUids=Non ha altre identità keylist.hasOtherUids=Noto anche come -keylist.noPhotos=Non ci sono fotografie disponibili -keylist.hasPhotos=Fotografie +keylist.noPhotos=Nessuna foto disponibile +keylist.hasPhotos=Foto keyMan.addphoto.filepicker.title=Seleziona foto da aggiungere -keyMan.addphoto.warnLargeFile=Il file scelto è più grande di 25 kB.\nNon è consigliato aggiungere file molto grandi per non rendere eccessivamente pesanti le chiavi. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. keyMan.addphoto.noJpegFile=Il file selezionato non sembra essere un file JPEG. Scegli un altro file. keyMan.addphoto.failed=La foto non può essere aggiunta. noWksIdentity=La chiave %S non ha un'identità WKS. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -keyman.addBlacklistKey.msg=Vuoi davvero che p≡p smetta di utilizzare la chiave "%1$S (%2$S)" per cifrare i messaggi? -keyman.removeBlacklistKey.msg=Vuoi consentire a p≡p di utilizzare la chiave "%1$S (%2$S)" per i messaggi futuri? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? keyman.addBlacklistKey.button=Ins&erisci la chiave nella lista nera keyman.removeBlacklistKey.button=&Rimuovi la chiave dalla lista nera @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Cambiamento di PIN non riuscito -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Aggiornamento chiavi in corso, attendere... keyserverProgress.uploading=Invio chiavi in corso, attendere... keyserverProgress.wksUploadFailed=Impossibile caricare la tua chiave sul servizio WebKey keyserverProgress.wksUploadCompleted=La tua chiave pubblica è stata inviata correttamente al tuo fornitore. Riceverai un messaggio per confermare che hai iniziato il caricamento. keyserverTitle.refreshing=Ricarica le chiavi keyserverTitle.uploading=Invia la chiave +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=La tua frase segreta deve contenere almeno 8 caratteri! -setupWizard.reallyCancel=Vuoi veramente chiudere la procedura guidata di configurazione di Enigmail? setupWizard.invalidGpg=Il file specificato non è un eseguibile GnuPG. Scegli un altro file. -setupWizard.specifyFile=Devi specificare almeno un file di chiave pubblica per continuare. setupWizard.installFailed=Sembra che l'installazione non sia avvenuta correttamente. Prova nuovamente l'installazione o installa GnuPG manualmente e individua l'eseguibile utilizzando il pulsante Sfoglia. setupWizard.downloadForbidden=Per la tua sicurezza, non scaricheremo GnuPG. Visita https://gnupg.org/ per scaricare GnuPG. setupWizard.downloadImpossible=Impossibile scaricare GnuPG attualmente. Prova più tardi o visita https://gnupg.org/ per scaricare GnuPG. -setupWizard.hashSumError=La procedura guidata non è in grado di verificare l'integrità del file scaricato. Il file potrebbe essere danneggiato o manipolato. Vuoi continuare comunque l'installazione? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? setupWizard.importSettingsFile=Specifica il file di backup da caricare -setupWizard.invalidSettingsFile=Il file specificato non è un file di backup delle impostazioni di Enigmail corretto. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. setupWizard.gpgConfExists=Il file di configurazione di GnuPG esiste già. Vuoi sovrascriverlo con quello della tua vecchia installazione? -setupWizard.noGpgHomeDir=Sembra che tu abbia configurato %S per utilizzare GnuPG. Tuttavia, questa non è una cartella, non puoi usarla. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. setupWizard.unmachtedIds=Le seguenti identità della tua vecchia installazione potrebbero non essere verificate:\n%S\nLe impostazioni per queste identità sono state ignorate. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Si è verificato un errore durante il tentativo di scaricamento di GnuPG. Controlla il log per ulteriori dettagli. @@ -655,11 +663,11 @@ filter.encrypt.label=Cifra su chiave (Enigmail) filter.keyRequired=Devi selezionare la chiave una chiave del destinatario. filter.keyNotFound=Impossibile trovare una chiave di cifratura per "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -converter.decryptBody.failed=Impossibile decifrare il messaggio con oggetto con oggetto\n"%S".\nVuoi riprovare con una frase segreta diversa o vuoi saltare il messaggio? -converter.decryptAtt.failed=Impossibile decifrare l'allegato "%1$S"\ndel messaggio con oggetto\n"%2$S".\nVuoi riprovare con una frase segreta diversa o vuoi saltare il messaggio? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? saveLogFile.title=Salva file di registro @@ -691,13 +699,13 @@ enigmailSettings=Impostazioni di Enigmail defaultBackupFileName=Esportazione di Enigmail specifyExportFile=Specifica il nome del file per l'esportazione -homedirParamNotSUpported=I parametri aggiuntivi che configurano i percorsi come --homedir e --keyring non sono supportati per l'esportazione/ripristino delle tue impostazioni. Usa metodi alternativi come l'impostazione della variabile d'ambiente GNUPGHOME. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #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. -expiry.keyMissingOwnerTrust=La tua chiave segreta manca di fiducia.\n%S.\nTi consigliamo di impostare "Ti basi sulle certificazioni" per completare nelle proprietà della chiave. -expiry.keysMissingOwnerTrust=Le seguenti tue chiavi segrete mancano di fiducia.\n%S.\nTi consigliamo di impostare "Ti basi sulle certificazioni" per completare nelle proprietà delle chiavi. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. expiry.OpenKeyManager=Apri gestione delle chiavi di Enigmail expiry.OpenKeyProperties=Apri proprietà della chiave @@ -709,6 +717,7 @@ gpghomedir.notwritable=La cartella '%S' che contiene le tue chiavi OpenPGP non è scrivibile. gpghomedir.notdirectory=La cartella '%S' che contiene le tue chiavi OpenPGP è un file e non una cartella. gpghomedir.notusable=Correggi i permessi della cartella o cambia la posizione della tua cartella di GnuPG. Altrimenti, GnuPG non può funzionare correttamente. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=Impossibile verificare le trustword di p≡p per il proprio account. @@ -728,12 +737,12 @@ pepPrivacyStatus.RatingMistrustSuggestion=Stabilisci nuovamente la connessione con il tuo interlocutore e prova a completare un altro handshake. pepPrivacyStatus.RatingReliableSuggestion=Completa un handshake con il tuo interlocutore scambiando le trustword di persona o telefonicamente. Un handshake è necessario solo una volta per interlocutore e assicurerà comunicazioni sicure e affidabili. pepPrivacyStatus.RatingTrustedSuggestion=Nessuna azione richiesta! -pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Fai attenzione, questo messaggio potrebbe non essere sicuro. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Aggiungi le informazioni necessarie. -pepPrivacyStatus.RatingUnderAttackSuggestion=Verifica separatamente il contenuto di questo messaggio con il tuo interlocutore. -pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Assicurati che lo stato di riservatezza per ogni interlocutore sia almeno sicuro. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". pepPrivacyStatus.RatingUnencryptedSuggestion=Chiedi al tuo interlocutore di utilizzare una soluzione di cifratura o installare p≡p. -pepPrivacyStatus.RatingUnreliableSuggestion=Questo messaggio non ha una cifratura affidabile o una firma. Chiedi al tuo interlocutore di aggiornare la sua soluzione di cifratura o installare p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. pepPrivacyStatus.RatingBrokenExplanation=Questo messaggio ha una cifratura o formattazione danneggiata. pepPrivacyStatus.RatingHaveNoKeyExplanation=Questo messaggio non può essere decifrato poiché la chiave non è disponibile. @@ -763,16 +772,16 @@ handshakeDlg.label.outgoingMessage=Messaggio in uscita handshakeDlg.label.incomingMessage=Messaggio in arrivo handshakeDlg.error.noPeers=Impossibile eseguire l'handshake senza alcun interlocutore. -handshakeDlg.error.noProtection=Abilita la protezione per utilizzare la funzione Handshake. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -enigmail.acSetupPasswd.descEnterPasswd=Digita il codice di configurazione visualizzato sull'altro dispositivo -enigmail.acSetupPasswd.descCopyPasswd=Digita il codice di configurazione visualizzato sull'altro dispositivo per continuare la configurazione +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm autocrypt.setupMsg.subject=Messaggio di configurazione Autocrypt autocrypt.setupMsg.msgBody=Per configurare il tuo nuovo dispositivo per Autocrypt, segui le istruzioni che dovrebbero essere presentate dal tuo nuovo dispositivo. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html upgradeInfo.doctitle=Cosa c'è di nuovo in Enigmail v2.0? @@ -785,10 +794,12 @@ upgradeInfo.autocrypt.title=Supporto per Autocrypt upgradeInfo.autocrypt.desc=Enigmail ora supporta Autocrypt, un nuovo standard per distribuire le chiavi come parte dei messaggi inviati. Enigmail importa automaticamente la chiavi da messaggi compatibili con Autocrypt, in modo da poter cifrare ancora più messaggi di posta con il passare del tempo. upgradeInfo.pEp.title=Nuova modalità Junior di p≡p (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. upgradeInfo.bottom.desc=Visita la nostra documentazione per aiuto sull'utilizzo di Enigmail. +#strings in pEpAdapter.jsm pep.missingGnuPG=Per utilizzare Enigmail/p≡p, è richiesto GnuPG. Poiché non riusciamo a trovarlo, ti consigliamo di scaricarlo e installarlo. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=Informazioni su Enigmail @@ -799,6 +810,7 @@ aboutEnigmail.documentation=Documentazione: aboutEnigmail.testing=Test: aboutEnigmail.userSupport=Supporto utente: +# aboutEnigmail.userSupport.team=the team and the list/forum members aboutEnigmail.localization=Localizzazione: Vedi la pagina dei pacchetti della lingua di Enigmail aboutEnigmail.Credits=Ringraziamenti aboutEnigmail.origAuthor=Autore originale dell'estensione Enigmail @@ -808,3 +820,38 @@ aboutEnigmail.licenseSupportTitle=Licenza e supporto aboutEnigmail.license=Enigmail OpenPGP è open source e rilasciato nei termini della %S aboutEnigmail.support=Supporto e download disponibili su www.enigmail.net. + +#strings in updateGnuPG.html +updateGnuPG.tabName=Aggiornamento GnuPG +updateGnuPG.title=Aggiornamenti per GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +updateGnuPG.noUpdateRequired=GnuPG è aggiornato. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +updateGnuPG.installUpdate=Installa aggiornamento +updateGnuPG.noMoreUpdates=Non controllare aggiornamenti futuri +updateGnuPG.checkUpdate=Controlla aggiornamenti di GnuPG + + +#strings in keyserver.jsm +keyserver.error.aborted=Interrotto +keyserver.error.unknown=Si è verificato un errore sconosciuto +keyserver.error.serverError=Il server delle chiavi ha restituito un errore. +keyserver.error.importError=Importazione della chiave scaricata non riuscita. +keyserver.error.unavailable=Il server delle chiavi non è disponibile. +# keyserver.error.securityError=The keyserver does not support encrypted access. +keyserver.error.certificateError=Il certificato del server delle chiavi non è valido. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +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 diff -Nru enigmail-2.0.12+ds1/lang/ja/enigmail.dtd enigmail-2.1.3+ds1/lang/ja/enigmail.dtd --- enigmail-2.0.12+ds1/lang/ja/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ja/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ -Mozilla Public License 2.0 でライセンスされています"> - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -72,16 +63,8 @@ - - - 「Autocrypt Key Transfer」は、移行先のデバイスに Autocrypt に対応したメールクライアントが存在する必要があります。 - こちらは移行は容易ですが、この標準に対応したクライアントは現時点では限られています。 - もう一つの方法は、設定の「エクスポート/インポート」です。 - こちらの方法では、すべての設定と OpenPGP 鍵を ZIP ファイルに保存し、新しいデバイスで読み込みます。 - Enigmail ではこれらの設定を直接インポートすることができます。他のメールクライアントでは、ZIP ファイルを展開し、手作業で扱う必要があります。"> - @@ -94,18 +77,19 @@ + - - + + -'"> - - - +'"> + + + @@ -122,6 +106,9 @@ + + + @@ -214,6 +201,7 @@ + @@ -373,7 +361,6 @@ -Autocrypt は、メールのエンドツーエンド暗号化を簡便に達成するための標準です。通常のメールを用いて、メールクライアント間で暗号化の可否をやり取りすることができます。"> @@ -416,7 +403,7 @@ - + @@ -547,7 +534,7 @@ - + @@ -670,135 +657,35 @@ - - + - - - - - - - - - - - - - - - - - -注意: Enigmail は、有効無効に関わらず - すべてのアカウントもしくは ID 宛のメッセージの署名を検証します。"> - - - + - - - - - - - - - - - - - - - - - -公開鍵 は、あなた宛に暗号化メッセージを送るときおよび、あなたによる署名メッセージを検証するときに 第三者によって 使用されます。公開鍵は第三者に配布することができます。"> -秘密鍵 は、暗号化メッセージを復号するときおよび署名メッセージを送るときに あなた自身によって 使用されます。 - 秘密鍵を第三者に公開してはいけません。"> -秘密鍵 は、あなた宛に送られた暗号化メッセージを復号するときおよび、あなたが署名メッセージを送るときに あなた自身によって 使用されます。 - 秘密鍵を第三者に公開してはいけません。 - 秘密鍵の安全性を保つために、パスフレーズを設定することができます。以下の 2 つのダイアログにパスフレーズを入力してください。"> -パスフレーズ は、秘密鍵を保護するためのパスワードです。これにより、あなた自身による秘密鍵の誤使用や、第三者による不正使用が防止されます。"> -推奨されません。"> - - - - - - - - - - - - - - - - - - - - - - - - -失効証明書の生成のためパスフレーズを入力してください。この証明書は、CD-R や USB メモリーのようなオフラインで安全に保存できるメディアに移してください。もし、誰かがこの失効証明書を手に入れた場合、あなたの鍵を使えなくされるおそれがあります。"> - - - - - - - - - - - - 古い環境で、このウィザードからデータをエクスポートする - 新しい環境で、セットアップウィザードからデータをインポートする - "> - - - - - - -この度は、Enigmail をご利用いただきありがとうございます。"> -Web Key Directory にアップロードを希望する場合には、この後受信するメッセージに記載されている確認リクエストを承認してください。"> - - - - - - - - + + + + + + + + + + + @@ -819,12 +706,10 @@ - - 古い環境で、エクスポートウィザードからデータをエクスポートする - 新しい環境で、このウィザードからデータをインポートする - "> + + + @@ -885,12 +770,21 @@ - - 鍵移行を行いたいアカウントを選択してください。 + + -移行先のデバイスでメッセージを開いてください。セットアップコードが要求されたら、以下の数字を入力してください:"> + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/ja/enigmail.properties enigmail-2.1.3+ds1/lang/ja/enigmail.properties --- enigmail-2.0.12+ds1/lang/ja/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ja/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -102,7 +102,7 @@ beginPgpPart=********* *BEGIN ENCRYPTED or SIGNED PART* ********* endPgpPart=********** *END ENCRYPTED or SIGNED PART* ********** -notePartEncrypted=Enigmail: * Parts of the message have NOT been signed or encrypted* +notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *Multiple message blocks found -- decryption/verification aborted* decryptOkNoSig=警告\n\n復号に成功しましたが、署名は正しく検証できませんでした @@ -114,7 +114,8 @@ fixBrokenExchangeMsg.failed=メッセージを修復できませんでした enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p -wksNoIdentity=この鍵はあなたのメールアカウントのいずれにも関連付けられていません。以下のメールアドレスの少なくとも一つにアカウントを追加してください:\n\n%S +detailsDlg.importKey=鍵のインポート +wksNoIdentity=この鍵はあなたのメールアカウントのいずれにも関連付けられていません。以下のメールアドレスの少なくとも 1 つにアカウントを追加してください:\n\n%S wksConfirmSuccess=確認メールを送信しました wksConfirmFailure=確認メールの送信に失敗しました autocrypt.importSetupKey.accountPreconfigured=あなたのアカウントは既に Autocrypt を使用するよう適切に設定されています\n\nこのセットアップメッセージで設定を上書きしますか? @@ -151,8 +152,7 @@ errorOwnKeyUnusable=現在の差出人に指定されている鍵 ID '%S' は利用可能な OpenPGP 鍵に適合しませんでした\n\nアカウント設定で有効かつ期限切れでない OpenPGP 鍵が指定されているか確認してください\n鍵が期限切れではないにもかかわらずこのエラーが表示される場合には、所有者による信用度が「完全」あるいは「絶対的」になっているか確認してください msgCompose.cannotSaveDraft=下書きを暗号化して保存する際にエラーが発生しました: msgCompose.partiallyEncrypted.short=機微情報の漏洩に注意してください - 部分的に暗号化されたメッセージです -msgCompose.partiallyEncrypted.mimeMsg=あなたが返信しようとしているメッセージには、暗号化されている部分と暗号化されていない部分があります。暗号化されている部分の一部はあなたには見えていません\n\n元のメッセージの送信者が暗号化されている部分を復号できていない場合、あなたがこのメッセージに返信することで元の送信者が復号できなかった機微情報の漏洩につながる恐れがあります\n\nこのメッセージに返信するのではなく、返信内容を含んだ新規メッセージを作成することをお勧めします -msgCompose.partiallyEncrypted.inlinePGP=あなたが返信しようとしているメッセージには、暗号化されている部分と暗号化されていない部分があります。元のメッセージの送信者が暗号化されている部分を復号できていない場合、あなたがこのメッセージに返信することで元の送信者が復号できなかった機微情報の漏洩につながる恐れがあります\n\n返信メッセージから、引用部をすべて除去することをお勧めします +msgCompose.partiallyEncrypted.inlinePGP=あなたが返信しようとしているメッセージには、暗号化されている部分と暗号化されていない部分があります。元のメッセージの送信者が暗号化されている部分を復号できていない場合、あなたがこのメッセージに返信することで元の送信者が復号できなかった機微情報の漏洩につながる可能性があります\n\n返信メッセージから、引用部をすべて除去することをお勧めします msgCompose.internalEncryptionError=内部エラー: 期待された暗号化が無効化されました msgCompose.internalError=内部エラーが発生しました @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=選択した差出人について Enigmail は無効化されています msgCompose.protectSubject.tooltip=件名を保護します msgCompose.noSubjectProtection.tooltip=件名を保護しません -msgCompose.encryptedSubjectStub=Encrypted Message msgCompose.protectSubject.dialogTitle=件名の保護を有効にしますか? msgCompose.protectSubject.question=通常の暗号化されたメッセージでは、件名は保護されず改竄される可能性があります\n\n本来の件名を暗号化されたメッセージ中に埋め込んだうえで件名を代替テキストに置き換え、\n復号しない限り本来の件名を確認することができないようにすることが可能となりました\n\n暗号化されたメッセージにおける件名の保護を有効にしますか? msgCompose.protectSubject.yesButton=件名を保護する(&P) @@ -179,7 +178,7 @@ msgCompose.pepSendTrusted=安全かつ信頼している pep.alert.disabledForIdentity=p≡p は現在のアカウントに対しては無効化されています。Enigmail/p≡p 設定から p≡p を有効化してください -pep.alert.weakReply=安全なメッセージに対して返信あるいは転送を行おうとしていますが、送信しようとしているメッセージは安全ではありません。このまま続行すると、あなたと通信相手の機微情報が漏洩する恐れがあります。本当に続行しますか? +pep.alert.weakReply=安全なメッセージに対して返信あるいは転送を行おうとしていますが、送信しようとしているメッセージは安全ではありません。このまま続行すると、あなたと通信相手の機微情報が漏洩する可能性があります。本当に続行しますか? # note: should end with double newline: @@ -254,7 +253,7 @@ # Attach own key status (tooltip strings): attachOwnKeyNo=あなたの公開鍵は添付されません attachOwnKeyYes=あなたの公開鍵が添付されます -attachOwnKeyDisabled=あなたの公開鍵を添付することができません。鍵を添付するためには、アカウント設定 → OpenPGP セキュリティ\nにおいてこの機能を有効化する必要があります +attachOwnKeyDisabled=あなたの公開鍵を添付することができません\nこの機能を有効化する、アカウント設定 → OpenPGP セキュリティにおいて鍵を指定する必要があります rulesConflict=受取人ごとの設定に矛盾があります\n%S\n\nこれらの設定でメッセージを送信しますか? msgCompose.button.configure=設定する(&C) @@ -269,6 +268,10 @@ clickDetailsButton=; 詳しくは「詳細」ボタンをクリックしてください clickImportButton=; 「鍵のインポート」ボタンをクリックして鍵をインポートしてください keyTypeUnsupported=; この形式の鍵はお使いのバージョンの GnuPG ではサポートされていません +decryptManually=; 「復号」ボタンをクリックしてメッセージを復号してください +verifyManually=; 「検証」ボタンをクリックして署名を検証してください +headerView.button.verify=検証 +headerView.button.decrypt=復号 msgPart=メッセージの一部分が %S されています msgSigned=署名 msgSignedUnkownKey=不明な鍵で署名 @@ -280,8 +283,10 @@ needKey=エラー - メッセージの復号に適合する秘密鍵が見つかりません failedDecrypt=エラー - 復号に失敗しました badPhrase=エラー - 無効なパスフレーズです +missingMdcError=エラー - 整合性の保護 (MDC) が失われているか破損しています failedDecryptVerify=エラー - 復号/検証に失敗しました viewInfo=; 詳細は「メッセージのセキュリティ情報」を確認してください +brokenExchangeMessage=MS-ExchangeからのPGP/MIMEが壊れています decryptedMsg=復号されたメッセージ decryptedMsgWithFormatError=復号されたメッセージ (古い Exchange サーバーによる PGP フォーマットの破損を修復しているため、復号結果を正しく読むことができない可能性があります) @@ -320,12 +325,13 @@ wksConfirmationReq.message=このメッセージは、Web Key Directory へのアップロードを承認するかの確認のために\nあなたのメールプロバイダから送信されたものです\nあなたの公開鍵をアップロードすることで、あなたの通信相手があなたの公開鍵を見つけ、あなたに暗号化したメッセージを送信することが可能となります\n\nあなたの公開鍵のアップロードを承認する場合には、ステータスバーの「リクエストを承認」ボタンをクリックしてください\n承認しない場合にはこのメッセージを無視してください wksConfirmationReq.button.label=リクエストを承認 -autocryptSetupReq=Perform Autocrypt セットアップの実行 +autocryptSetupReq=Autocrypt セットアップの実行 autocryptSetupReq.button.label=セットアップ開始 autocryptSetupReq.setupMsg.desc=このメッセージには、あなたの秘密鍵を含めた Autocrypt のすべての設定を安全に他のデバイスから移行するための情報が含まれています autocryptSetupReq.setupMsg.backup=このメッセージをバックアップすることで、秘密鍵をバックアップすることができます。パスワードを書き留め、安全に保管してください autocryptSetupReq.message.import=設定と鍵をインポートするには、ステータスバーの「セットアップ開始」ボタンをクリックしてください autocryptSetupReq.message.sent=新しいデバイス上のメッセージをクリックし、設定のインポートの指示に従ってください +postbox.cannotUseQuickReply.message=暗号化されたメッセージに返信しようとしています。テキストボックスの右上の「expand」アイコンをクリックして返信ウインドウを開き、そこからメッセージを送信してください # strings in pref-enigmail.js oldGpgVersion20=Enigmail の初期化に失敗しました\n\nGnuPG バージョン %1$S がインストールされていますが、このバージョンの GnuPG は Enigmail では既にサポートされていません。Enigmail の動作には GnuPG バージョン %2$S 以降が必要です。GnuPG をアップグレードしてください @@ -337,6 +343,8 @@ prefs.warnAskNever=警告: この設定を有効にすると、受取人の一人にでも鍵が見つからない場合に、一切の通知もなく暗号化されなくなります。Enigmail はこのようなことが起こっても一切通知しません prefs.warnIdleTimeForUnknownAgent=gpg-agent に接続できません。このシステムではパスフレーズの管理に gpg-agent ではなく特別なツール (例:gnome-keyring、seahorse-agent、KDE wallet manager など) が使われているようです。Enigmail はこれらのツールによるパスフレーズの記憶時間を制御することができません。そのため、Enigmail でのパスフレーズの記憶時間の設定は無視されます prefEnigmail.oneKeyserverOnly=エラー - OpenPGP 鍵の自動的なダウンロードのための公開鍵サーバーは 1 つしか指定できません +acSetupMessage.desc=Autocrypt が有効なデバイスへの鍵の移行 (Autocrypt とは) +aboutLicense.desc=Enigmail はオープンソースであり、Mozilla Public License 2.0 でライセンスされています"> # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -374,6 +382,7 @@ errorHandling.gpgAgentError=GnuPG がコンポーネントの一部である gpg-agent とのコミュニケーションに関するエラーを報告しています errorHandling.dirmngrError=GnuPG がコンポーネントの一部である dirmngr とのコミュニケーションに関するエラーを報告しています errorHandling.pinentryError=GnuPG はあなたのパスフレーズを pinentry 経由で問い合わせることができませんでした +errorHandling.pinentryCursesError=コンソール版の pinentry を使用するよう GnuPG が設定されていますが、Enigmail ではグラフィカル版の pinentry が必要です errorHandling.readFaq=これはシステムのセットアップあるいは設定のエラーであり、Enigmail が自動的に修正することはできません\n\n以下のウェブサイトを参照することを推奨します: https://www.enigmail.net/faq gpgNotFound=GnuPG プログラムを '%S' に見つけることができませんでした\nEnigmail の設定で、GnuPG 実行ファイルのパスが正しく設定されているかどうか確認してください @@ -384,9 +393,8 @@ prefBad=%S による不正な署名です failCancel=エラー - ユーザーによって鍵のダウンロードが中止されました -failNoServer=エラー - 鍵をダウンロードするための鍵サーバーが指定されていません -failNoID=エラー - 鍵をダウンロードするための ID が指定されていません failKeyExtract=エラー - 鍵の展開コマンドに失敗しました +failKeyNoSubkey=正当な鍵が見つかりません notFirstBlock=エラー - 最初の OpenPGP ブロックは公開鍵ではありません importKeyConfirm=メッセージ中に埋め込まれた鍵をインポートしますか? failKeyImport=エラー - 鍵のインポートに失敗しました @@ -425,12 +433,14 @@ identityName=ID: %S switchPepMode=現在、Enigmail の 'p≡p Junior Mode' を利用しています\n\nアカウント設定で OpenPGP あるいは S/MIME を有効化すると、p≡p を無効化し Enigmail の標準モードを利用することになります enableEnigmail=p≡p を無効化(&D) +amPrefAutocrypt.desc=Autocrypt は、メールのエンドツーエンド暗号化を簡便に達成するための標準です。通常のメールを用いて、メールクライアント間で暗号化の可否をやり取りすることができます + # Strings used in enigmailSingleRcptSettings.js noEncryption=暗号化を有効にしましたが、鍵を選択していません。%1$S へ送付するメッセージを暗号化するためには、有効な鍵を鍵リストから選択する必要があります。%2$S への暗号化を無効にしますか? noKeyToUse=(無し - 暗号化しない) noEmptyRule=空のルールは無効です。ルール欄にメールアドレスを設定してください -invalidAddress=入力したメールアドレスが無効です。受取人の名前は設定できません。メールアドレスだけにしてください。例:\n 無効な例: 日本 花子 \n正しい例: hanako.nippon@address.net +invalidAddress=入力したメールアドレスが無効です。受取人の名前は設定できません。メールアドレスだけにしてください。例:\n 無効な例: Taro Yamada \n正しい例: taro.yamada@example.com noCurlyBrackets=中括弧 {} は特別な意味を持ちますので、メールアドレスに使用しないでください。このルールに当てはまる時の動作を修正したいする場合は、'受取人が上記アドレス...' オプションを使用してください\n詳細な情報はヘルプボタンを押してください # Strings used in enigmailRulesEditor.js @@ -444,18 +454,11 @@ # Strings used in enigmailSearchKey.js needOnline=選択された機能はオフラインモードでは使用できません。オンラインのときにもう一度試してください -protocolNotSupported=選択したプロトコル '%S://' は、OpenPGP 鍵のダウンロード用にはサポートされていません -gpgkeysDisabled=次のオプションを有効にすると良いかもしれません。'extensions.enigmail.useGpgKeysTool' noKeyserverConn=鍵サーバー %S に接続できませんでした -keyDownloadFailed=鍵サーバーから鍵をダウンロードすることに失敗しました。ステータスメッセージは以下の通りです:\n%S internalError=内部エラーが発生しました。鍵をダウンロードすることができませんでした noKeyFound=指定された検索条件に適合する鍵を発見できませんでした keyDownload.keyUnavailable=ID %S に適合する鍵を鍵サーバー上で発見できませんでした。鍵の持ち主が、鍵をサーバーにアップロードしていないと思われます\n\n送信元に、公開鍵をあなたに送るよう依頼してください -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=鍵サーバーでの検索もしくはダウンロードに失敗しました: gpgkeys_%S は実行できませんでした - - # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=所有者の信用度を設定できませんでした @@ -465,7 +468,7 @@ alreadySigned.label=注意: 鍵 ID %S は選択された秘密鍵によって既に署名されています alreadySignedexportable.label=注意: 鍵 ID %S は選択された秘密鍵によって既にエクスポート可能な署名がされています。これに加えてローカル署名を行う意味はありません partlySigned.label=注記: 鍵 ID %S の一部のユーザー ID は選択された秘密鍵によって既に署名されています -noTrustedOwnKeys=署名に利用可能な鍵が見つかりませんでした。鍵に署名するためには、絶対的に信用している秘密鍵を最低でも一つ所有している必要があります +noTrustedOwnKeys=署名に利用可能な鍵が見つかりませんでした。鍵に署名するためには、絶対的に信用している秘密鍵を最低でも 1 つ所有している必要があります # Strings in enigmailKeyManager.js keyMan.loadingKeys=鍵を読み込み中です。しばらくお待ちください... @@ -490,7 +493,6 @@ asciiArmorFile=ASCII 形式 (*.asc) importKeyFile=OpenPGP 鍵ファイルのインポート gnupgFile=GnuPG ファイル -createKeyOK=あなたの鍵を生成しました saveRevokeCertAs=失効証明書を生成して保存 revokeCertOK=失効証明書を生成しました。これは秘密鍵をなくしてしまったときなどに公開鍵を無効にするために使用できます revokeCertFailed=失効証明書の作成に失敗しました @@ -509,12 +511,12 @@ specificPubSecKeyFilename=%1$S (0x%2$S) pub-sec defaultPubKeyFilename=Exported-public-keys defaultPubSecKeyFilename=Exported-public-and-secret-keys -noSecretKeys=秘密鍵が見つかりません\n\n今あなたの鍵を生成しますか? sendKeysOk=鍵の送信に成功しました sendKeysFailed=鍵の送信に失敗しました receiveKeysOk=鍵の受信に成功しました receiveKeysFailed=鍵の受信に失敗しました +keyUpload.verifyEmails=鍵サーバーから、あなたがアップロードした鍵のメールアドレスごとにメッセージが送信されます。鍵の公開を承認するには、メールアドレスごとに受信したメッセージに記載されているリンクをクリックする必要があります importFromClip=鍵をクリップボードからインポートしますか? importFromUrl=公開鍵を次の URL からダウンロードします: @@ -541,7 +543,6 @@ keyMan.button.import=インポート(&I) keyMan.button.refreshAll=すべての鍵を更新(&R) keyMan.button.revokeKey=鍵の失効(&R) -keyMan.button.skip=鍵をスキップ(&S) keylist.noOtherUids=他の ID はありません keylist.hasOtherUids=別名 @@ -553,6 +554,7 @@ keyMan.addphoto.noJpegFile=選択したファイルは JPEG 形式ではないようです。違うファイルを選択してください keyMan.addphoto.failed=写真を追加できませんでした noWksIdentity=鍵 %S には Web Key Service における身元確認が存在しません +wksUpload.noKeySupported=アップロードに失敗しました - あなたのプロダイバーは Web Key Service に対応していないようです keyman.addBlacklistKey.msg=鍵 '%1$S (%2$S)' を p≡p による暗号化で使用することを禁止しますか? keyman.removeBlacklistKey.msg=鍵 '%1$S (%2$S)' を p≡p による暗号化で使用することを許可しますか? @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=PIN の変更に失敗しました -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=鍵の更新中です。しばらくお待ち下さい keyserverProgress.uploading=鍵のアップロード中です、しばらくお待ち下さい keyserverProgress.wksUploadFailed=あなたの公開鍵を Web Key Service にアップロードすることができませんでした keyserverProgress.wksUploadCompleted=あなたの公開鍵は正常にあなたのプロバイダーにアップロードされました。アップロードがあなたによるものであることを確認するためのメールが送られてきます keyserverTitle.refreshing=鍵の更新 keyserverTitle.uploading=鍵のアップロード +keyserver.result.download.none=鍵はダウンロードされませんでした +keyserver.result.download.1of1=鍵のダウンロードに成功しました +keyserver.result.download.1ofN=%S 個中 1 個の鍵のダウンロードに成功しました +keyserver.result.download.NofN=%2$S 個中 %1$S 個の鍵のダウンロードに成功しました +keyserver.result.uploadOne=1 個の鍵のアップロードに成功しました +keyserver.result.uploadMany=%S 個の鍵のアップロードに成功しました # Strings in enigmailSetupWizard -passphrase.min8keys=パスフレーズには少なくとも 8 文字指定してください -setupWizard.reallyCancel=本当に Enigmail セットアップウィザードを中止しますか? setupWizard.invalidGpg=指定されたファイルは GnuPG の実行ファイルではありません。他のファイルを指定してください -setupWizard.specifyFile=少なくとも公開鍵ファイルを指定してください setupWizard.installFailed=インストールに失敗したようです。もう一度インストールを試みるか、GnuPG を手動でインストールした後で「選択」ボタンから指定してください setupWizard.downloadForbidden=セキュリティ上の理由からダウンロードは行われません。https://www.gnupg.org/ にアクセスして GnuPG をダウンロードしてください setupWizard.downloadImpossible=GnuPG を正常にダウンロードすることができませんでした。時間をおいてからもう一度ダウンロードを試みるか、https://www.gnupg.org/ にアクセスして GnuPG をダウンロードしてください -setupWizard.hashSumError=ダウンロードしたファイルの完全性を検証できませんでした。ファイルが破損しているか、改竄されている恐れがあります。このままインストールを続行しますか? +setupWizard.hashSumError=ダウンロードしたファイルの完全性を検証できませんでした。ファイルが破損しているか、改竄されている可能性があります。このままインストールを続行しますか? setupWizard.importSettingsFile=インポートするファイルの指定 setupWizard.invalidSettingsFile=指定されたファイルは正当な Enigmail の設定情報ファイルではありません setupWizard.gpgConfExists=GnuPG の設定ファイルは既に存在します。古い環境の設定ファイルで上書きしますか? setupWizard.noGpgHomeDir=GnuPG として %S が指定されていますが、これはフォルダーではないため利用できません setupWizard.unmachtedIds=古い設定情報のうち、以下の差出人情報に適合するものがありません:\n%S\nこれらの差出人情報についての設定をスキップします +setupWizard.foundAcSetupMessage=Autocrypt セットアップメッセージを見つけました。下の「セットアップ開始」ボタンをクリックし、Autocrypt のセットアップを開始してください +setupWizard.foundAcNoSetupMsg=Autocrypt に対応しているクライアントの利用を検出しましたが、Autocrypt セットアップメッセージを見つけられませんでした。既存のデバイス上で Autocrypt セットアップメッセージを作成し、「受信ボックスの再スキャン」をクリックすることをお勧めします。あるいは、既存のインストール済みの Enigmail から設定と鍵をエクスポートし、この環境に復元することもできます +setupWizard.setupComplete=Enigmail はセットアップを正常に完了しました。さらなる情報は Enigmail ホールページ をご覧ください # Strings in installGnuPG.jsm installGnuPG.downloadFailed=GnuPG のダウンロード中にエラーが発生しました。詳細はコンソールログを確認してください @@ -637,7 +645,7 @@ addUidDlg.invalidEmailError=有効なメールアドレスではありません # Strings in enigmailCardDetails.js -Carddetails.NoASCII=OpenPGP スマートカードでは、名前に ASCII 文字のみ利用可能です +Carddetails.NoASCII=OpenPGP スマートカードでは、名前には ASCII 文字のみ利用可能です # network error types @@ -695,7 +703,7 @@ #strings in expiry.jsm expiry.keyExpiresSoon=あなたの鍵 %1$S は %2$S 日以内に期限切れとなります\n\n新しい鍵ペアを作成し、アカウント設定を適切に更新することを推奨します -expiry.keysExpireSoon=以下の鍵は %1$S 日以内に期限切れとなります:\n%2$S\n\n新しい鍵ペアを作成し、アカウント設定を適切に更新することを推奨します +expiry.keysExpireSoon=以下の鍵は %1$S 日以内に期限切れとなります:\n%2$S\n\n。新しい鍵ペアを作成し、アカウント設定を適切に更新することを推奨します expiry.keyMissingOwnerTrust=あなたの秘密鍵 %S の信用度が失われています\n\n鍵のプロパティから「所有者による信用度」を「絶対的」に設定することを推奨します expiry.keysMissingOwnerTrust=以下の秘密鍵の信用度が失われています\n%S\n鍵のプロパティから「所有者による信用度」を「絶対的」に設定することを推奨します expiry.OpenKeyManager=鍵の管理を開く @@ -709,6 +717,7 @@ gpghomedir.notwritable=あなたの OpenPGP 鍵を保存するためのフォルダー '%S' は書き込み可能ではありません gpghomedir.notdirectory=あなたの OpenPGP 鍵を保存するためのフォルダー '%S' はフォルダーではなくファイルです gpghomedir.notusable=GnuPG が正しく動作するよう、フォルダーのパーミッションを変更するか、GnuPG の "Home" フォルダーの指定を変更してください +gpgAgent.noAutostart=今お使いの GnuPG のバージョンは %S です。このバージョンでは、Thunderbird の起動の時点で gpg-agent の事前起動および環境変数 "GPG_AGENT_INFO" の事前読み込みが必要となります。\n\nこれらの条件が満たされていないため、Enigmail を利用することはできません #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=あなた自身のアカウントの Trustword を認証することができません @@ -781,14 +790,16 @@ upgradeInfo.encSubject.title=メッセージの件名の保護 upgradeInfo.encSubject.desc=これまでメッセージの件名は暗号化の対象となっていませんでしたが、新たに件名を暗号化されたメッセージ中に記録し、通常の件名には "Encrypted Mesage" と表示する機能を実装しました。このようなメッセージを復号すると、本来の件名が自動的に復元されます。メッセージの件名の保護は既定で有効となっていますが、設定から無効化することもできます。(注意: この機能は PGP/MIME メッセージのみで有効です) upgradeInfo.buttons.title=暗号化および署名ボタンの改良 -upgradeInfo.buttons.desc=メッセージ編集ウインドウ上の 暗号化 および 署名 ボタンは、OpenPGP プロトコルだけでなく S/MIME プロトコルに対しても有効となります。両方のプロトコルが利用可能な場合、Enigmail はすべての鍵が利用可能なプロトコルを選択します。 +upgradeInfo.buttons.desc=メッセージ編集ウインドウ上の 暗号化 および 署名 ボタンは、OpenPGP プロトコルだけでなく S/MIME プロトコルに対しても有効となります。両方のプロトコルが利用可能な場合、Enigmail はすべての鍵が利用可能なプロトコルを選択します upgradeInfo.autocrypt.title=Autocrypt のサポート -upgradeInfo.autocrypt.desc=Enigmail は新たな鍵配布標準である Autocrypt をサポートします。Enigmail は Autocrypt に適合したメッセージから自動的に鍵をインポートすることで、メッセージの暗号化を推進します。 +upgradeInfo.autocrypt.desc=Enigmail は新たな鍵配布標準である Autocrypt をサポートします。Enigmail は Autocrypt に適合したメッセージから自動的に鍵をインポートすることで、メッセージの暗号化を推進します upgradeInfo.pEp.title=p≡p (Pretty Easy Privacy) のサポート -upgradeInfo.pEp.desc=Enigmail は p≡p Junior Mode をサポートします。p≡p Junior Mode では、OpenPGP によるメッセージの暗号化を透過的に提供します。つまり、鍵の管理やデバイス間での鍵の同期を気にする必要がなくなります。 -upgradeInfo.bottom.desc=Enigmail 利用に関する詳細なヘルプは、オンラインドキュメント を参照してください。 +upgradeInfo.pEp.desc=Enigmail は p≡p Junior Mode をサポートします。p≡p Junior Mode では、OpenPGP によるメッセージの暗号化を透過的に提供します。つまり、鍵の管理やデバイス間での鍵の同期を気にする必要がなくなります +upgradeInfo.bottom.desc=Enigmail 利用に関する詳細なヘルプは、オンラインドキュメント を参照してください +#strings in pEpAdapter.jsm pep.missingGnuPG=Enigmail/p≡p を利用するためには GnuPG が必要ですが、あなたの環境に GnuPG がインストールされていることを確認できませんでした。GnuPG をダウンロード・インストールすることをお勧めします +pep.updateAvailable=新しいバージョンの EnigmailEnigmail/p≡p の暗号エンジンが利用可能です。この更新をダウンロード・インストールしますか? #strings in enigmailAbout.html aboutEnigmail.tabName=Enigmail について @@ -799,6 +810,7 @@ aboutEnigmail.documentation=ドキュメント: aboutEnigmail.testing=テスト: aboutEnigmail.userSupport=ユーザーサポート: +aboutEnigmail.userSupport.team=チームメンバーおよびメーリングリスト・フォーラムのメンバー aboutEnigmail.localization=ローカライズ: Enigmail Language Packs page を参照 aboutEnigmail.Credits=クレジット: aboutEnigmail.origAuthor=Enigmail 拡張機能の最初の作成者 @@ -808,3 +820,38 @@ aboutEnigmail.licenseSupportTitle=ライセンスおよびサポート aboutEnigmail.license=Enigmail はオープンソースであり、%S でライセンスされています aboutEnigmail.support=Enigmail のサポートおよびダウンロードは www.enigmail.net から利用可能です + +#strings in updateGnuPG.html +updateGnuPG.tabName=GnuPG の更新 +updateGnuPG.title=GnuPG の更新 +updateGnuPG.introduction.desc=Enigmail での暗号機能の利用には GnuPG が必要です。GnuPG を常に最新版に更新することをお勧めします +updateGnuPG.updateRequired=新しいバージョンの GnuPG が利用可能です。常に最新の GnuPG を利用することをお勧めします。「更新のインストール」ボタンをクリックし、GnuPG の更新をダウンロード、インストールしてください +updateGnuPG.noUpdateRequired=GnuPG は最新です +updateGnuPG.cannotUpdate.header=Enigmail は以下のパッケージの更新のみをサポートします: +updateGnuPG.cannotUpdate.footer=GnuPG の派生版の更新はサポートしていません; そのため、Enigmail がそれらの GnuPG を更新することはできません +updateGnuPG.installUpdate=更新のインストール +updateGnuPG.noMoreUpdates=今後更新を確認しない +updateGnuPG.checkUpdate=GnuPG の更新を確認 + + +#strings in keyserver.jsm +keyserver.error.aborted=中止しました +keyserver.error.unknown=不明なエラーが発生しました +keyserver.error.serverError=鍵サーバーからエラーが報告されました +keyserver.error.importError=ダウンロードした鍵のインポートに失敗しました +keyserver.error.unavailable=鍵サーバーが利用できません +keyserver.error.securityError=鍵サーバーが暗号化された接続に対応していません +keyserver.error.certificateError=鍵サーバーの証明書が正当ではありません +keyserver.error.unsupported=Enigmail が対応している鍵サーバーではありません + +#strings in mimeDecrypt.jsm +mimeDecrypt.encryptedPart.attachmentLabel=暗号化されたメッセージの一部 +mimeDecrypt.encryptedPart.concealedData=これはメッセージのうち暗号化された部分となります。添付ファイルをクリックして別のウインドウで開く必要があります + +#strings in gnupg-key.jsm +import.secretKeyImportError=秘密鍵のインポート中に GnuPG でエラーが発生しました。インポートに失敗しました + +#strings in importSettings.js +importSettings.errorNoFile=ファイルの形式が正常ではありません! +importSettings.cancelWhileInProgress=復元中です。プロセスを中断しますか? +importSettings.button.abortImport=プロセスを中断(&A) diff -Nru enigmail-2.0.12+ds1/lang/ko/enigmail.dtd enigmail-2.1.3+ds1/lang/ko/enigmail.dtd --- enigmail-2.0.12+ds1/lang/ko/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ko/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ - - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,11 +63,8 @@ - - - @@ -89,12 +77,13 @@ + - + @@ -117,6 +106,9 @@ + + + @@ -209,6 +201,7 @@ + @@ -217,8 +210,8 @@ - - + + @@ -345,7 +338,7 @@ - + @@ -368,7 +361,6 @@ - @@ -456,8 +448,8 @@ - - + + @@ -542,7 +534,7 @@ - + @@ -623,7 +615,7 @@ - + @@ -665,133 +657,37 @@ - - - - - - - - - - - - - - - - - - - - -주의: Enigmail는 모든 계정 또는 신원에 대하여, Enigmail가 설정된 상태이든 아니든 관계없이, 전자 메일에 있는 서명을 검증하게 된다는 점을 주의하십시오"> - + + - - + - - - - - - - - - - - - - - - - - -공개키(공개열쇠) 는 다른 사람들 이 여러분에게 암호메일을 보낼때 사용합니다. 모든 사람에게 공개열쇠를 배포해도 됩니다. "> -비밀키(비밀열쇠) 는 여러분 자신이 암호메일을 복호화할 때나 이메일에 서명할 때 사용합니다. -비밀열쇠를 다른 사람에게 보내지 마십시오. - "> -비밀키(비밀열쇠)는여러분 자신이 암호메일을 복호화할 때나 이메일에 서명할 때 사용합니다. -비밀열쇠를 다른 사람에게 보내지 마십시오. -비밀키를 안전하게 사용하기 위해 다음 대화상자에서 두번 암호문구을 입력해야 합니다."> -암호문구/html:b>은 여러분의 비밀열쇠를 지키는 패스워드입니다. 여러분의 비밀열쇠를 다른 사람이 무단으로 사용하는 것을 방지 합니다."> -절대로 안됩니다. "> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Enigmail을 선택해주셔서 감사합니다."> - - - - - - - - - + + + + + + + + + + + - + @@ -807,9 +703,9 @@ - + + + @@ -870,9 +766,19 @@ - + + - + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/ko/enigmail.properties enigmail-2.1.3+ds1/lang/ko/enigmail.properties --- enigmail-2.0.12+ds1/lang/ko/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ko/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=에니그메일 경고 -enigConfirm=에니그메일 확인 +# enigConfirm=Enigmail Confirmation # enigInfo=Enigmail Information enigError=에니그메일 에러 enigPrompt=에니그메일 프롬프트 @@ -78,7 +78,7 @@ passSpaceProblem=기술적으로 처리하기 어려우므로, 공백문자를 암호문구의 첫자와 마지막 글자로 입력할 수 없습니다. changePassFailed=패스프레이즈 변경 실패 -keyConfirm='%S'의 공개키와 개인키를 생성합니까? +# keyConfirm=Generate public and secret key for '%S'? keyMan.button.generateKey=키 생성(&G) keyAbort=키 생성을 중지합니까? keyMan.button.generateKeyAbort=키 생성 중단(&A) @@ -86,14 +86,14 @@ expiryTooLong=100년 이상의 유효기간이 있는 키는 생성 할 수 없습니다. expiryTooLongShorter=유효기간이 90년이상인 키를 생성할 수 없습니다. expiryTooShort=키는 적어도 1일간은 유효하지 않으면 안됩니다. -keyGenFailed=키 생성에 실패했습니다. 자세한 내용은 Enigmail 콘솔(메뉴 Enigmail > Enigmail 디버그)에서 확인하세요. +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. setKeyExpirationDateFailed=유효기간 만기일을 수정할 수 없습니다. # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail 보안 정보 \n\n enigHeader=Enigmail: -enigContentNote=에니그메일: 이 메시지의 첨부파일은 서명이나 암호화가 되지 않았습니다.\n\n +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=PGP/MIME 암호화 혹은 서명된 메시지 같습니다. 복호화화 버튼을 누르세요 saveAttachmentHeader=Enigmail: 복호화 한 첨부 파일을 저장 @@ -102,7 +102,7 @@ beginPgpPart=********* *BEGIN ENCRYPTED or SIGNED PART* ********* endPgpPart=********** *END ENCRYPTED or SIGNED PART* ********** -notePartEncrypted=에니그메일: 메시지의 일부분은 서명이나 암호화가 되지 않았습니다. +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=에니그메일: 메시지가 여러 블록으로 나뉘어 있습니다.복호화/검증이 실패하였습니다. decryptOkNoSig=경고\n\n복호화에 성공했으나 서명은 올바르게 검증되지 않았습니다 @@ -114,6 +114,7 @@ fixBrokenExchangeMsg.failed=메세지 수정 작업이 실패하였습니다. enigmail.msgViewColumn.label=에니그메일 # enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. @@ -148,10 +149,9 @@ minimalLineWrapping=%S 자가 될 때마다 줄 바꾸기 설정이 되어 있습니다. 제대로 암호화 그리고/또는 서명을 하려면, 적어도 이 값이 68 은 되어야합니다. \n 지금 줄 바꿈 문자 수를 68자로 변경합니까? warning=경고 signIconClicked=서명을 수동으로 변경했습니다. 따라서 이 메시지를 작성하는 동안, 서명하기 활성/비활성은 더이상 암호화 활성/비활성하기에 의존하지 않습니다. -errorOwnKeyUnusable=이 계정에 지정된 열쇠 '%S'로는 정상적인 OpenPGP 열쇠를 만들 수 없습니다. \n\n정상이고 유효기간이내인 OpenPGP 열쇠를 준비하고 이 계정에서 해당 열쇠를 지정하기를 바랍니다. \n\n열쇠의 유효기간이 아직 남아있으면 소유자 신뢰수준을 충분이나 최고수준으로 지정하였는지 점검하시기 바랍니다. +# 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=초안을 저장할 때 에러 발생 # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. -# msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=내부 에러: 해당 암호화 방법 사용 불가 @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=선택하신 아이디는 에니그메일을 사용할 수 없습니다. # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject -msgCompose.encryptedSubjectStub=메시지 암호화 완료 # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject @@ -179,7 +178,7 @@ # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -# pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=%S 메시지를 보낼 편지함 폴더에 %S (으)로 저장하시겠습니까? onlineSend=%S 메시지를 %S (으)로 보냅니까? -encryptKeysNote=주의: 이 메시지는 다음 사용자 신원 / 키로 암호화됩니다: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S hiddenKey=<키 숨김> -signFailed=Enigmail 에러; 암호화/서명하기 실패. 암호화되지 않은 메시지를 보낼까요? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=암호화되지 않은 메시지 보내기(&S) recipientsSelectionHdr=암호화하기 위해 받는 사람을 선택 @@ -225,9 +224,9 @@ signOffWithReason=서명작업:정지(%S) reasonEnabledByDefault=기본적으로 가동 reasonManuallyForced=수작업으로 적용 -reasonByRecipientRules=수신자 규칙으로 적용 +# reasonByRecipientRules=forced by per-recipient rules reasonByAutoEncryption=자동 암호화 적용 -reasonByConflict=수신자 규칙간 충돌발생으로 인해 +# reasonByConflict=due to conflict in per-recipient rules reasonByEncryptionMode=암호화 방식으로 인해 # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=Inline PGP를 사용할 예정입니다. # Attach own key status (tooltip strings): -attachOwnKeyNo=보유하신 열쇠를 첨부하지 않습니다. -attachOwnKeyYes=보유하신 열쇠를 첨부합니다. -attachOwnKeyDisabled=보유하신 열쇠를 첨부하지 안습니다. 이기능을 사용하려면 계정설정의 OpenPGP섹션에서 해당하는 열쇠를 선택하셔야 합니다. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=받는 사람 별 규칙들이 서로 모순됩니다\n%S\n\n이렇게 설정해서 메시지를 보냅니까? msgCompose.button.configure=설정(&C) @@ -269,6 +268,10 @@ clickDetailsButton=; 자세한 내용을 보려면 "상세"버튼을 누르시오. clickImportButton=; 키를 반입하려면 "키반입"버튼을 누르시오. keyTypeUnsupported=; 사용하는 GnuPG버전에서는 해당 키 타입을 지원하지 않습니다. +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=복호화 msgPart=%S 메시지의 일부분 msgSigned=서명됨 msgSignedUnkownKey=알 수 없는 키로 서명이 되었음. @@ -280,8 +283,10 @@ needKey=에러 - 메시지를 복호화하려면 비밀키가 필요함 failedDecrypt=에러 - 복호화 실패 badPhrase=에러 - 틀린 패스프레이즈 +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=에러 - 복호화/검증 실패 viewInfo=; 세부사항은 보기 > 메시지 보안 정보 +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=복호화된 메시지 decryptedMsgWithFormatError=메세지 복호화 (과거 익스체인지 서버를 사용할때 손상된 이메일이 복구되었습니다. 하지만 메시지를 읽을수 없을 수도 있습니다.) @@ -326,6 +331,7 @@ # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. @@ -337,6 +343,8 @@ prefs.warnAskNever=경고: 이 옵션을 활성화하면 받는 사람들 중 어느 한 사람에게 키가 없더라도 더는 알리지않기 때문에 전자 메일이 암호화되지 않은 상태로 방치될 수 있습니다 -- Enigmail 이런 경우가 발생해도 알려드리지 않을 것입니다! prefs.warnIdleTimeForUnknownAgent=gpg에이전트를 연결할 수 없습니다. 암호문구를 관리하기 위해 gnome-keyring, seahorse-agent, KDE wallet manager과 같은 별도 프로그램을 사용하는 것 같습니다.에니그메일은 이들 프로그램이 사용하는 암호문구 유효기일을 이용할 수 없습니다. 그래서 에니그메일은 이런 프로그램이 설정한 유효기간은 무시합니다. prefEnigmail.oneKeyserverOnly=오류 - 빠진 OpenPGP 키를 자동으로 다운로드 하기위해 하나의 키 서버만 지정할 수 있습니다. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +# aboutLicense.desc=Enigmail is open source and licensed under the Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=에러 - 주어진 패스프레이즈 없음 noPGPblock=에러 - 유효하지 않은 보호형 OpenPGP 데이터 블록이 발견되었습니다 unverifiedReply=들여쓰기 된 부분 (답장)이 변형된 것 같습니다 -keyInMessageBody=메시지의 본문에서 열쇠를 발견하였습니다. "열쇠 반입" 버튼을 누르시기 바랍니다. +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=에러 - 서명이 일치하지 않습니다 -cantImport=공개키 가져오기 실패\n\n +# cantImport=Error importing public key\n\n doImportOne=%1$S (%2$S)을 반입할까요? doImportMultiple=다음 열쇠를 반입할까요?\n\n%S previewFailed=공개키 파일을 읽을 수 없습니다. @@ -366,14 +374,15 @@ sc.removeCard=해당 작업은 리더에 스마트카드가 들어있을 필요가 없습니다.\n스마트카드를 제거한 후 다시 시도해보십시오. sc.noCardAvailable=리더에서 스마트 카드를 찾을 수 없습니다\n스마트 카드를 삽입하고 작업을 다시 해보세요 sc.noReaderAvailable=스마트 카드 리더에 접근이 허용되지 않습니다\n카드 리더를 연결하고, 스마트 카드를 삽입 후, 작업을 다시 해보세요 -keyError.keySpecNotFound=이메일 주소 "%S"가 열쇠고리에 있는 열쇠와 일치하지 않습니다. -keyError.keyIdNotFound=열쇠고리에서 열쇠 "%S" 를 찾을 수 없습니다. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. keyError.resolutionAction=계정설정의 OpenPGP섹션에서 정상적인 열쇠를 선택하십시오. missingPassphrase=암호문구 분실 errorHandling.gpgAgentInvalid=이 시스템이 사용하는 gpg에이전트가 GnuPG시스템과 버전이 맞지 않습니다. errorHandling.gpgAgentError=GPG에이전트와 GnuPG가 통신과정에서 에러가 발생하였습니다. errorHandling.dirmngrError=GnuPG와 dirmngr가 통신과정에서 에러가 발생하였습니다. errorHandling.pinentryError=GnuPG가 pinentry를 이용하여 암호문구를 찾을 수 없습니다. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. errorHandling.readFaq=시스템 셋업과 설정과정에서 에러가 발생하여 에니그메일이 정상가동하지 않고 있으며 자동적으로 회복될 수 없습니다. \n\n다음 사이트 https://enigmail.net/faq.를 참고하시기 바랍니다. gpgNotFound=GnuPG 프로그램 '%S'을 찾을 수 없습니다.\n에니그메일 설정에서 GnuPG 실행 경로를 올바르게 설정 해 주세요. @@ -384,9 +393,8 @@ prefBad=%S 의 잘못된 서명 failCancel=에러 - 사용자에 의해 키 받기가 취소 되었습니다 -failNoServer=에러 - 키를 받아올 키 서버가 지정되지 않았습니다 -failNoID=에러 - 받을 키의 ID가 지정되지 않았습니다 failKeyExtract=에러 - 키 추출 명령 실패 +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=에러 - 첫 OpenPGP 블록이 공개키가 아닙니다 importKeyConfirm=메시지에 들어있는 키를 가져오겠습니까? failKeyImport=에러 - 키 가져오기 실패 @@ -425,6 +433,8 @@ identityName=디지털 신분증: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=암호화를 활성화 했으나, 키를 선택하지 않으셨습니다. %S 에게 보낼 메일을 암호화하기 위해서는 키 목록에서 키를 선택해주셔야합니다. %S 에 대하여 암호화를 비활성 상태로 하시겠습니까? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=선택한 기능은 오프라인 모드에서는 사용할 수 없습니다. 온라인에서 다시 시도해 주십시오. -protocolNotSupported=선택한 프로토콜 '%S://'는 OpenPGP 키 다운로드를 지원하지 않습니다. -gpgkeysDisabled='extensions.enigmail.useGpgKeysTool' 옵션을 활성화 하면 도움이 될 것 같습니다. noKeyserverConn=키 서버 %S 에 접속 할 수 없습니다. -keyDownloadFailed=키 서버에서 키 다운로드를 실패했습니다. 상태 메시지:\n%S internalError=내부 오류가 발생했습니다. 키가 다운로드되거나 가져오기할 수 없었습니다. -noKeyFound=죄송합니다. 지정된 검색 기준에 일치하는 키를 찾을 수 없었습니다.\n키 ID는 앞쪽에 \\"0x\\"가 붙어야만 함 (예:0xABCDEF12)을 주의해주세요. -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=키 서버에서 검색 혹은 다운로드에 실패: gpgkeys_%S 는 실행될 수 없었습니다. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=소유자 신뢰 설정 실패 @@ -490,7 +493,6 @@ asciiArmorFile=보호형 ASCII 파일 (*.asc) importKeyFile=OpenPGP 키 파일 반입 gnupgFile=GnuPG 파일 -# createKeyOK=Your Key has been generated saveRevokeCertAs=폐기 증명서 생성 & 저장 # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=폐기 증명서가 생성되지 않았습니다. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%S (0x%S) pub-sec defaultPubKeyFilename=반출된 공개키 defaultPubSecKeyFilename=반출된 공개키와 비밀키 -noSecretKeys=비밀키가 발견되지 않습니다.\n\n지금 본인 소유가 될 키를 생성하시겠습니까? sendKeysOk=키 보내기 성공 sendKeysFailed=키 보내기 실패 receiveKeysOk=키 업데이트 성공 receiveKeysFailed=키 다운로드 실패 +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=클립보드에서 키를 가져오시겠습니까? importFromUrl=이 URL에서 공개키를 다운로드: copyToClipbrdFailed=선택한 키를 클립보드에 복사할 수 없습니다. copyToClipbrdOK=클립보드에 키 복사됨 -deleteSecretKey=경고:당신은 비밀키를 삭제하려고 하고 있습니다!\n당신의 비밀키를 삭제했을 경우, 해당 키로 암호화된 모든 메시지를 복호화 할 수 없으며, 당신 키를 폐지하는데 필요한 폐지 인증서도 더는 만들 수 없습니다.\n\n정말로 비밀키와 공개키 양쪽 모두를 삭제합니까?\n'%S' +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=경고:당신은 비밀키를 삭제하려고 하고 있습니다!\n당신의 비밀키를 삭제했을 경우, 해당 키로 암호화된 모든 메시지를 복호화 할 수 없습니다.\n\n정말로 비밀키와 공개키 양쪽 모두를 삭제합니까? deletePubKey=공개키를 삭제합니까?\n'%S' deleteSelectedPubKey=공개키를 삭제합니까? @@ -529,7 +531,7 @@ revokeKeyQuestion='%S'키를 취소하려고 합니다.\n\n이 키로 더 이상 서명 작업을 수행할 수 없습니다. 일단 반포하면 상대방이 이 키로 암호화할 수 없습니다. 예전 메시지를 복호화할 수는 있습니다. \n\n계속 진행하시겠습니까?\n revokeKeyOk=키가 폐지되었습니다. 만약 키 서버에 당신의 공개키가 있다면, 다시 업로드하시기를 권장합니다. 그렇게 해주면 다른 사람들이 해당 키가 폐지된 것을 알 수 있습니다. revokeKeyFailed=키가 폐지될 수 없습니다. -# revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=키를 하나도 선택하지 않았습니다. 모든 키를 새로고칠까요? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? @@ -541,21 +543,21 @@ keyMan.button.import=가져오기(&I) keyMan.button.refreshAll=모든 키 새로고침(&R) keyMan.button.revokeKey=키 폐기(&R) -keyMan.button.skip=키 건너뜀 &S keylist.noOtherUids=다른 신원이 없음 keylist.hasOtherUids=별명: -keylist.noPhotos=사진 없음 -keylist.hasPhotos=사진 +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos keyMan.addphoto.filepicker.title=추가하려는 사진을 선택하세요. -keyMan.addphoto.warnLargeFile=선택한 파일이 25 kB이상입니다.\n첨부한 파일이 너무 크면 키의 크기가 커지는 문제가 발생하므로 권장하지 않습니다. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. keyMan.addphoto.noJpegFile=선택한 파일형식이 JPEG 가 아닌 것 같습니다. 다른 파일을 선택하세요. keyMan.addphoto.failed=사진이 추가되지 않았습니다. # noWksIdentity=The key %S does not have a WKS identity. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? -# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=PIN 변경 실패 -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=키 새로고침 중, 잠시 기다려 주십시오 ... keyserverProgress.uploading=키 업로드 중, 잠시 기다려 주십시오 ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=키 새로고침 keyserverTitle.uploading=키 업로드 +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=패스프레이즈가 최소 8 자는 되어야합니다! -setupWizard.reallyCancel=정말로 Enigmail 설정 마법사를 닫으시겠습니까? setupWizard.invalidGpg=GnuPG 실행파일이 아닙니다. 다른 파일을 선택하세요. -setupWizard.specifyFile=계속하려면 공개키 파일을 지정해야합니다. setupWizard.installFailed=설치가 실패한 것 같습니다. 다시 설치하거나 GnuPG를 수작업으로 설치한 다음 브라우즈 버튼으로 해당 프로그램을 지정하세요. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. -setupWizard.hashSumError=마법사가 다운로드한 파일이 정상인지 검증할 수 없습니다. 파일이 파손되었거나 오손된 것 같습니다. 그래도 설치작업을 계속하시겠습니까? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? setupWizard.importSettingsFile=적재할 백업파일을 지정하시오 -setupWizard.invalidSettingsFile=지정한 파일이 정상적인 에니그메일 셋업백업파일이 아님 +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. setupWizard.gpgConfExists=GnuPG 구성파일이 이미 있습니다. 과거 설치과정에서 만든 구성파일로 덧쓰기 할까요? -# setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=GnuPG다운로드 과정에서 에러가 발생했습니다. 콘솔로그를 이용하여 자세한 내용을 점검하세요. @@ -654,12 +662,12 @@ # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. -# filter.keyNotFound=Could not find an encryption key for "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -converter.decryptBody.failed=제목: "%S" 메시지를 복호화할 수 없습니다.\n다른 암호문구를 사용하시겠습니까? 아니면 이 메시지는 건너 뛸까요? -converter.decryptAtt.failed=제목이 "%2$S"인 메시지의 첨부파일 "%1$S"을 복호화할 수 없습니다. \n.\n다른 암호문구를 사용하시겠습니까 아니면 이 메시지를 건너뛸까요? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? saveLogFile.title=로그파일 저장 @@ -691,13 +699,13 @@ enigmailSettings=에니그메일 셋팅 defaultBackupFileName=에니그메일 반출 specifyExportFile=반출할 파일 이름 지정 -homedirParamNotSUpported=--homedir 이나 --keyring 와 같이 패쓰를 구성하는 추가 매개변수는 시스템셋팅 정보 반출이나 반입작업에서 지원되지 않습니다. 환경변수GNUPGHOME 를 사용하는 것과 같은 다른 방법을 사용하세요. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm -expiry.keyExpiresSoon=사용하는 열쇠 %1$S 의 유효기간이 %2$S 일 이내에 만료됩니다..\n\n열쇠 한쌍을 새로 생성한 다음 관련 계정에 새 열쇠를 이용하기를 권합니다. -# expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties @@ -709,6 +717,7 @@ # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. @@ -728,12 +737,12 @@ # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! -# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. -# pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. @@ -763,16 +772,16 @@ # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. -# handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device -# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? @@ -785,10 +794,12 @@ # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. +#strings in pEpAdapter.jsm # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=Enigmail에 대하여 @@ -799,6 +810,7 @@ # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: +# aboutEnigmail.userSupport.team=the team and the list/forum members # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension @@ -808,3 +820,38 @@ # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/lt/enigmail.dtd enigmail-2.1.3+ds1/lang/lt/enigmail.dtd --- enigmail-2.0.12+ds1/lang/lt/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/lt/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ -"Mozilla" viešąją licenciją 2.0."> - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,10 +63,7 @@ - - - - + @@ -84,17 +72,18 @@ - + + - + ""> @@ -117,6 +106,9 @@ + + + @@ -209,6 +201,7 @@ + @@ -217,8 +210,8 @@ - - + + @@ -345,7 +338,7 @@ - + @@ -368,7 +361,6 @@ -Autocrypt yra standartas, kuris apibrėžia kaip pasiekti patogų ištisinį el. laiškų šifravimą. Jis nurodo, kaip el. pašto programos užmezga šifravimo galimybes, naudodamos įprastus el. laiškus."> @@ -391,8 +383,8 @@ - - + + @@ -413,7 +405,7 @@ “ yra netinkamas"> - + @@ -452,11 +444,11 @@ - + - + @@ -464,15 +456,15 @@ - + - + - - - + + + @@ -542,7 +534,7 @@ - + @@ -593,9 +585,9 @@ - + - + @@ -610,7 +602,7 @@ - + @@ -665,39 +657,11 @@ - - + - - - - - - - - - - - - - - - - - -Pastaba: Enigmail visada patikrins visų paskyrų ir tapatybių parašus - - - - - - -nepaisant ar įjungta ar išjungta"> - + Šis pagelbiklis palydės jus per sąrankos procesą."> - - + - - - - - - - - - - - - - - - - - -viešasis raktas yra skirtas kitiems, kad jie siųstų jums šifruotus laiškus. Jūs galite juo dalintis su visais."> -privatusis raktas yra skirtas jums, kad iššifruotumėte šiuos el. laiškus ir siųstumėte pasirašytus el. laiškus. - Jūs neturėtumėte jo niekam perduoti."> -privatusis raktas yra skirtas jums, kad iššifruotumėte šiuos el. laiškus ir siųstumėte pasirašytus el. laiškus. - Jūs neturėtumėte jo niekam perduoti. - Norint apsaugoti jūsų privatųjį raktą, kituose dviejuose dialogo languose jūsų bus paklausta slaptafrazės."> -slaptafrazė yra slaptažodis, skirtas apsaugoti jūsų privatųjį raktą. Jis neleidžia netinkamai naudoti jūsų privatųjį raktą."> -nerekomenduojami."> - - - - - - - - - - - - - - - - - - - - - - - - -Šiam reikalui jūsų bus paprašyta įvesti slaptažodį. Perkelkite liudijimą į laikmeną, kaip pavyzdžiui, CD ar USB atmintukas, kurį gali būti saugiai atskirai laikoma. Jei koks nors asmuo gaus prieigą prie šio liudijimo, jis galės padaryti jūsų raktą netinkamą naudoti."> - - - - - - - - - - - - eksportuokite savo duomenis iš seno kompiuterio, naudodami atsarginės kopijos vediklį, esantį Enigmail nuostatose - importuokite duomenis į savo naująjį kompiuterį, naudodami šį vediklį. - "> - - - - - - -Dėkui jog naudojate Enigmail."> -Norėdami tai atlikti, patvirtinkite užklausą, kurią rasite savo gautų laiškų aplanke."> - - - - - - - - + + + + + + + + + + + - + @@ -826,12 +712,10 @@ - - eksportuokite savo duomenis iš seno kompiuterio, naudodami šį vediklį - importuokite duomenis į savo naująjį kompiuterį, naudodami sąrankos vediklį. - "> + + + @@ -843,27 +727,27 @@ - + - + - + - - - + + + - - + + - - + + - + @@ -873,28 +757,40 @@ - - + + - + - + - - - + + + + - + -Dabar persijunkite į kitą įrenginį ir atverkite laišką. Jūsų turėtų būti paprašyta sąrankos kodo. Užklausoje įveskite šiuos skaitmenis:"> + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/lt/enigmail.properties enigmail-2.1.3+ds1/lang/lt/enigmail.properties --- enigmail-2.0.12+ds1/lang/lt/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/lt/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -36,7 +36,7 @@ initErr.howToFixIt=Norint naudoti Enigmail, reikalinga GnuPG. Jeigu jūs dar neįdiegėte GnuPG, lengviausias būdas tai padaryti yra pasinaudoti žemiau esančiu mygtuku "Sąrankos vediklis". initErr.setupWizard.button=&Sąrankos vediklis passphraseCleared=Slaptafrazė išvalyta. -# cannotClearPassphrase=You are using a non-standard tool (such as gnome-keyring) for passphrase handling. Clearing the passphrase is therefore not possible from within Enigmail. +cannotClearPassphrase=Slaptafrazės apdorojimui naudojate nestandartinį įrankį (tokį kaip gnome-keyring). Slaptafrazės išvalymas, naudojant Enigmail yra neįmanomas. noPhotoAvailable=Nėra nuotraukos debugLog.title=Enigmail derinimo žurnalas error.photoPathNotReadable=Kelias iki nuotraukos „%S“ neperskaitomas @@ -65,7 +65,7 @@ onlyGPG=Rakto generavimas veikia tik su GnuPG (ne su PGP)! keygenComplete=Raktas sugeneruotas! Pasirašymui bus naudojama <%S> tapatybė. -revokeCertRecommended=Mes primygtinai rekomenduojame savo raktui sukurti panaikinimo liudijimą. Šis liudijimas galės būti naudojamas paversti jūsų raktą negaliojančiu, pvz., jei prarasite savo slaptą raktą ar jis bus sukompromituotas. Ar norite dabar sukurti tokį liudijimą? +revokeCertRecommended=Mes primygtinai rekomenduojame savo raktui sukurti panaikinimo liudijimą. Šis liudijimas galės būti naudojamas paversti jūsų raktą negaliojančiu, pvz., jei prarasite savo slaptąjį raktą ar jis bus sukompromituotas. Ar norite dabar sukurti tokį liudijimą? keyMan.button.generateCert=&Generuoti liudijimą genCompleteNoSign=Raktas sėkmingai sugeneruotas! genGoing=Raktas generuojamas! @@ -73,12 +73,12 @@ passNoMatch=Slaptafrazės nesutampa; įveskite dar kartą passCheckBox=Pažymėkite žymimąjį langelį jei raktui nenurodote slaptafrazės passUserName=Nurodykite naudotojo vardą, šiai tapatybei -# keygen.missingUserName=There is no name specified for the selected account/identity. Please enter a value in the field "Your name" in the account settings. +keygen.missingUserName=Pasirinktai paskyrai/tapatybei nėra nurodytas joks vardas. Paskyrų nuostatose, laukelyje "Asmenvardis", įveskite reikšmę. keygen.passCharProblem=Jūs savo slaptafrazėje naudojate specialius simbolius. Deja, tai gali sukelti problemų kitoms programoms. Rekomenduojame jums pasirinkti slaptafrazę, kurioje būtų tik kurie nors iš šių simbolių:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=Dėl techninių priežasčių, jūsų slaptafrazė negali prasidėti ar baigtis tarpu. changePassFailed=Nepavyko pakeisti slaptafrazės. -keyConfirm=Sugeneruoti viešąjį ir privatųjį raktus, skirtus „%S“? +keyConfirm=Sugeneruoti viešąjį ir slaptąjį raktą, skirtą „%S“? keyMan.button.generateKey=&Generuoti raktą keyAbort=Nutraukti raktų generavimą? keyMan.button.generateKeyAbort=&Nutraukti raktų generavimą? @@ -86,14 +86,14 @@ expiryTooLong=Negalite sukurti rakto, kurio galiojimas baigsis daugiau nei po 100 metų. expiryTooLongShorter=Negalite sukurti rakto, kurio galiojimas baigsis daugiau nei po 90 metų. expiryTooShort=Jūsų raktas turi galioti bent vieną dieną. -keyGenFailed=Sugeneruoti rakto nepavyko. Patikrinkite Enigmail pultą (Meniu Enigmail > Enigmail derinimas) jei norite gauti daugiau informacijos. +keyGenFailed=Nepavyko sugeneruoti rakto. Išsamesnei informacijai, patikrinkite Enigmail pultą (Meniu Enigmail > Derinimo parinktys). setKeyExpirationDateFailed=Nepavyko pakeisti galiojimo pabaigos datos # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail saugumo informacija\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Šiam laiškui skirti priedai nebuvo pasirašyti ar šifruoti*\r\n\r\n +enigContentNote=Enigmail: *Šiame laiške esantys priedai nebuvo nei pasirašyti, nei šifruoti*\r\n\r\n possiblyPgpMime=Galimai PGP/MIME šifruotas ar pasirašytas laiškas; norėdami patikrinti, naudokite „Iššifruoti/Patikrinti“ funkciją saveAttachmentHeader=Enigmail: Įrašyti iššifruotą priedą @@ -102,7 +102,7 @@ beginPgpPart=**********ŠIFRUOTOS ar PASIRAŠYTOS DALIES PRADŽIA********** endPgpPart=**********ŠIFRUOTOS ar PASIRAŠYTOS DALIES PABAIGA********** -notePartEncrypted=Enigmail: *Laiško dalys NEBUVO pasirašytos ar užšifruotos* +notePartEncrypted=Enigmail: *Laiško dalys NEBUVO nei pasirašytos, nei šifruotos* noteCutMessage=Enigmail: *Rastos kelios laiško dalys -- iššifravimas/tikrinimas nutrauktas* decryptOkNoSig=Įspėjimas\n\nIššifravimas buvo sėkmingas, bet nepavyko patikrinti parašo @@ -114,7 +114,8 @@ fixBrokenExchangeMsg.failed=Nepavyko pataisyti laiško. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p -# wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S +detailsDlg.importKey=Importuoti raktą +wksNoIdentity=Šis raktas nėra susietas su jokia iš jūsų el. pašto paskyrų. Pridėkite paskyrą bent vienam iš šių el. pašto adresų:\n\n%S wksConfirmSuccess=Patvirtinimo el. laiškas išsiųstas. wksConfirmFailure=Patvirtinimo el. laiško siuntimas nepavyko. autocrypt.importSetupKey.accountPreconfigured=Jūsų paskyra jau yra teisingai sukonfigūruota naudoti Autocrypt.\n\nAr tikrai norite perrašyti savo nustatymus šiuo sąrankos laišku? @@ -148,11 +149,10 @@ minimalLineWrapping=Jūs nustatėte eilučių laužymą %S simboliais. Norint teisingai užšifruoti ar/ir pasirašyti, ši vertė turi būti bent 68.\nAr norite dabar nustatyti eilučių laužymą ties 68 simboliais? warning=Įspėjimas signIconClicked=Jūs pakeitėte pasirašymą. Nepaisant to, kol jūs rašote šį laišką, pasirašymo (de)aktyvavimas daugiau nepriklauso nuo šifravimo (de)aktyvacijos. -# 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. +errorOwnKeyUnusable=Dabartinei tapatybei sukonfigūruotas rakto ID "%S" nesuteikia jokio galimo naudoti OpenPGP rakto.\n\nĮsitikinkite, kad turite galiojantį, nepasibaigusio galiojimo OpenPGP raktą ir, kad jūsų paskyros nustatymai nurodo į tą raktą.\nJeigu jūsų rakto galiojimas yra nepasibaigęs, tuomet patikrinkite ar nustatėte pasitikėjimą savininku į "pilnas" arba "visiškas". msgCompose.cannotSaveDraft=Klaida, įrašant juodraštį msgCompose.partiallyEncrypted.short=Saugokitės slaptos informacijos nutekėjimo - dalinai šifruotas el. paštas. -# msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. -# msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. +msgCompose.partiallyEncrypted.inlinePGP=Laiške į kurį atsakote, buvo šifruotų ir nešifruotų dalių. Jeigu siuntėjui pradžioje nepavyko iššifruoti kai kurių laiško dalių, tuomet gali būti, kad atskleidžiate slaptą informaciją, kurią siuntėjas pradžioje negalėjo pats iššifruoti.\n\nApsvarstykite galimybę iš savo atsakymo šiam siuntėjui, pašalinti visą cituojamą tekstą. msgCompose.internalEncryptionError=Vidinė klaida: žadėtas šifravimas išjungtas msgCompose.internalError=Įvyko vidinė klaida. @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=Enigmail pasirinktai tapatybei yra išjungta msgCompose.protectSubject.tooltip=Apsaugoti laiško temą msgCompose.noSubjectProtection.tooltip=Neapsaugoti laiško temos -msgCompose.encryptedSubjectStub=Šifruotas laiškas msgCompose.protectSubject.dialogTitle=Įjungti temos apsaugą? msgCompose.protectSubject.question=Įprastuose šifruotuose el. laiškuose yra neredaguotą temą.\n\nMes nustatėme standartą, skirtą nuslėpti šifruotame laiške pradinę temą\nir pakeisti ją fiktyviu tekstu, tokiu būdu tema bus matoma tik iššifravus el. laišką.\n\nAr norite šifruotuose laiškuose apsaugoti temą? msgCompose.protectSubject.yesButton=A&psaugoti temą @@ -176,10 +175,10 @@ msgCompose.pepSendUnknown=Nežinoma msgCompose.pepSendUnsecure=Nesaugus msgCompose.pepSendSecure=Saugus -# msgCompose.pepSendTrusted=Secure & Trusted +msgCompose.pepSendTrusted=Saugus ir patikimas -# pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -pep.alert.weakReply=Jūs ketinate persiųsti ar atsakyti į saugų laišką, kaip į nesaugų. Jei pasirinksite tęsti, gali būti atskleista konfidenciali informacija, kuri sukels pavojų jums ir jūsų bendravimo partneriui. Ar tikrai norite tęsti? +pep.alert.disabledForIdentity=p≡p dabartinei tapatybei yra išjungta. Įjunkite p≡p per Enigmail/p≡p nuostatas. +pep.alert.weakReply=Jūs ketinate persiųsti ar atsakyti į saugų laišką, tačiau laiškas, kurį siunčiate yra nesaugus. Jei pasirinksite tęsti, gali būti atskleista konfidenciali informacija, kuri sukels pavojų jums ir jūsų bendravimo partneriui. Ar tikrai norite tęsti? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=Įrašyti %S laišką į %S neišsiųstų laiškų aplanke? onlineSend=Išsiųsti %S laišką į %S? -encryptKeysNote=Pastaba: laiškas užšifruotas su šio naudotojo ID/Raktu: %S +encryptKeysNote=Pastaba: laiškas užšifruotas naudojant šiuos naudotojo ID/Raktus: %S hiddenKey= -signFailed=Klaida Enigmail; Nepavyko užšifruoti/pasirašyti; siųsti nešifruotą laišką? +signFailed=Klaida Enigmail: šifravimas/pasirašymas nepavyko. Siųsti laišką nešifruotu pavidalu? msgCompose.button.sendUnencrypted=&Siųsti nešifruotą laišką recipientsSelectionHdr=Pasirinkite gavėjus šifravimui @@ -224,10 +223,10 @@ signOnWithReason=Pasirašymas: ĮJUNGTAS (%S) signOffWithReason=Pasirašymas: IŠJUNGTAS (%S) reasonEnabledByDefault=įjungta pagal numatymą -# reasonManuallyForced=manually forced -# reasonByRecipientRules=forced by recipient rules -# reasonByAutoEncryption=forced by auto encryption -reasonByConflict=dėl konflikto gavėjų taisyklėse +reasonManuallyForced=priverstinai rankiniu būdu +reasonByRecipientRules=priverstinai pagal kiekvieno atskiro gavėjo taisykles +reasonByAutoEncryption=priverstinai pagal automatinį šifravimą +reasonByConflict=dėl konflikto kiekvieno atskiro gavėjo taisyklėse reasonByEncryptionMode=dėl šifravimo veiksenos # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=Bus naudojamas įterptasis PGP # Attach own key status (tooltip strings): -attachOwnKeyNo=Jūsų pačių raktas nebus pridėtas -attachOwnKeyYes=Bus pridėtas jūsų pačių raktas -attachOwnKeyDisabled=Nepavyko pridėti jūsų pačių rakto. Norėdami įjungti šią ypatybę,\nturite Paskyros nustatymuose, OpenPGP sekcijoje pasirinkti tam tikrą raktą. +attachOwnKeyNo=Jūsų pačių viešasis raktas nebus pridėtas +attachOwnKeyYes=Bus pridėtas jūsų pačių viešasis raktas +attachOwnKeyDisabled=Nepavyko pridėti jūsų pačių viešojo rakto. Norėdami įjungti šią ypatybę,\nturite Paskyros nustatymuose, OpenPGP sekcijoje pasirinkti tam tikrą raktą. rulesConflict=Aptiktos nesuderinamos kiekvienam-gavėjui taisyklės\n%S\n\nSiųsti laišką su šiais nustatymais? msgCompose.button.configure=&Konfigūruoti @@ -263,12 +262,16 @@ # Strings in enigmailMsgHdrViewOverlay.js keyNeeded=Viešas rakto %S parašas turi būti patikrintas -# keyUsed=Public key %S used to verify signature +keyUsed=Parašo patvirtinimui panaudotas viešasis raktas %S clickDecrypt=; naudokite „Iššifruoti/Patikrinti“ funkciją clickDecryptRetry=; norėdami bandyti dar kartą, naudokite „Iššifruoti/Patikrinti“ funkciją clickDetailsButton=; išsamesnei informacijai, spustelėkite ant mygtuko "Išsamiau" clickImportButton=; norėdami importuoti raktą, spustelėkite ant mygtuko "Importuoti raktą" keyTypeUnsupported=; jūsų GnuPG versija nepalaiko rakto tipo +decryptManually=; norėdami iššifruoti laišką, spustelėkite ant mygtuko "Iššifruoti" +verifyManually=; norėdami patikrinti parašą, spustelėkite ant mygtuko "Patikrinti" +headerView.button.verify=Patikrinti +headerView.button.decrypt=Iššifruoti msgPart=%S laiško dalis msgSigned=pasirašytas msgSignedUnkownKey=pasirašytas, naudojant nežinomą raktą @@ -277,20 +280,22 @@ unverifiedSig=Nepatvirtintas parašas incompleteDecrypt=Iššifravimas nepilnas -needKey=Klaida - laiško iššifravimui nerasta jokio privačiojo/slapto rakto +needKey=Klaida - laiško iššifravimui nerasta jokio slaptojo rakto failedDecrypt=Klaida - nepavyko iššifruoti badPhrase=Klaida - bloga slaptafrazė +missingMdcError=Klaida - trūksta arba sugadinta vientisumo apsauga (MDC) failedDecryptVerify=Klaida - iššifravimas/patikrinimas nepavyko viewInfo=; Rodymas > Laiško saugumo informacija, išsamesnei informacijai +brokenExchangeMessage=Sugadintas PGP/MIME laiškas iš MS-Exchange. decryptedMsg=Iššifruotas laiškas decryptedMsgWithFormatError=Iššifruotas laiškas (atkurtas sugadintas PGP laiško formatas, jį greičiausiai sugadino senas Exchange serveris, gali būti neįmanoma perskaityti laiško) usedAlgorithms=Naudoti algoritmai: %1$S ir %2$S pepStatusInfo.text=p≡p laiško būsena. -# pepStatusInfo.title.m3=Under Attack +pepStatusInfo.title.m3=Puolamas pepStatusInfo.info.m3=Šis laiškas nėra saugus ir buvo klastojamas. -# pepStatusInfo.title.m1=Mistrusted +pepStatusInfo.title.m1=Nebepatikimas pepStatusInfo.info.m1=Šiame laiške yra bendravimo partneris, kuris anksčiau buvo pažymėtas kaip nepatikimas pepStatusInfo.title.r0=Nežinoma pepStatusInfo.info.r0=Šiame laiške nėra pakankamai informacijos, kad būtų nuspręsta ar jis yra saugus ar ne. @@ -300,32 +305,33 @@ pepStatusInfo.info.r2=Šis laiškas negali būti iššifruotas, nes raktas nėra prieinamas. pepStatusInfo.title.r3=Nesaugus pepStatusInfo.info.r3=Šis laiškas yra nesaugus. -# pepStatusInfo.title.r4=Unsecure for Some +pepStatusInfo.title.r4=Kai kuriems nesaugus pepStatusInfo.info.r4=Kai kuriems bendravimo partneriams šis laiškas yra nesaugus. pepStatusInfo.title.r5=Nepatikimas saugumas pepStatusInfo.info.r5=Šiame laiške yra nepatikima apsauga. -# pepStatusInfo.title.r6=Secure... +pepStatusInfo.title.r6=Saugus... pepStatusInfo.info.r6=Šis laiškas yra saugus, tačiau vis tiek turite patvirtinti savo bendravimo partnerio tapatybę. -# pepStatusInfo.title.r7=Secure & Trusted +pepStatusInfo.title.r7=Saugus ir patikimas pepStatusInfo.info.r7=Šis laiškas yra saugus ir patikimas. pepStatusInfo.color.green=Žalia pepStatusInfo.color.yellow=Geltona pepStatusInfo.color.red=Raudona -# pepRevokeTrust.question=Do you really want to cancel the trust for %S? -# pepRevokeMistrust.question=Do you really want to re-trust the key for %S? -# pepRevokeTrust.doRevoke=Cancel &trust +pepRevokeTrust.question=Ar tikrai norite atsisakyti pasitikėjimo, skirto %S? +pepRevokeMistrust.question=Ar tikrai norite iš naujo pasitikėti raktu, skirtu %S? +pepRevokeTrust.doRevoke=Atsisakyti &pasitikėjimo -# wksConfirmationReq=Web Key Directory Confirmation Request -# wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. +wksConfirmationReq=Saityno raktų katalogo patvirtinimo užklausa +wksConfirmationReq.message=Šį laišką išsiuntė jūsų el. pašto tiekėjas, kad patvirtintų jūsų OpenPGP viešojo rakto išskleidimą\nsavo saityno raktų kataloge.\nJūsų viešojo rakto pateikimas padeda kitiems atrasti jūsų raktą ir todėl, turėti galimybę šifruoti jums laiškus.\n\nJeigu norite išskleisti savo raktą saityno raktų kataloge dabar, tuomet būsenos juostoje spustelėkite mygtuką "Patvirtinti užklausą".\nPriešingu atveju, tiesiog, nepaisykite šio laiško. wksConfirmationReq.button.label=Patvirtinti užklausą autocryptSetupReq=Atlikti Autocrypt sąranką autocryptSetupReq.button.label=Pradėti sąranką -autocryptSetupReq.setupMsg.desc=Šiame laiške yra visa informacija, kurios reikia, norint saugiai perkelti iš jūsų pradinio įrenginio jūsų Autocrypt nustatymus kartu su slaptu raktu. -# autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. +autocryptSetupReq.setupMsg.desc=Šiame laiške yra visa informacija, kurios reikia, norint saugiai perkelti jūsų Autocrypt nustatymus kartu su slaptuoju raktu iš jūsų pradinio įrenginio. +autocryptSetupReq.setupMsg.backup=Galite pasilikti šį laišką ir jį naudoti kaip savo slaptojo rakto atsarginę kopiją. Jeigu norite taip daryti, turėtumėte užsirašyti slaptažodį ir laikyti jį saugioje vietoje. autocryptSetupReq.message.import=Norėdami importuoti nustatymus ir raktą(-us) į Enigmail, spustelėkite būsenos juostoje ant mygtuko "Pradėti sąranką". autocryptSetupReq.message.sent=Spustelėkite ant pranešimo savo naujame įrenginyje ir sekite instrukcijas, norėdami importuoti nustatymus. +postbox.cannotUseQuickReply.message=Atsakote į šifruotą laišką. Norėdami atverti savo atsakymą lange, naudokite teksto langelio viršutiniame dešiniajame kampe esančią "išskleidimo" piktogramą, ir išsiųskite atsakymą iš ten. # strings in pref-enigmail.js oldGpgVersion20=Enigmail inicijavimas patyrė nesėkmę.\n\nJūs naudojate GnuPG versiją %1$S, kuri yra daugiau nebepalaikoma. Enigmail reikalauja GnuPG versijos %2$S arba naujesnės. Prašome atnaujinti savo GnuPG įdiegimą arba kitu atveju Enigmail neveiks. @@ -337,6 +343,8 @@ prefs.warnAskNever=Įspėjimas: įjungus šią parinktį nebus pranešama jei vienam iš gavėjų nėra rakto ir laiškas nešifruotas! prefs.warnIdleTimeForUnknownAgent=Nepavyko prisijungti prie gpg-agent. Gal jūsų sistema slaptafrazės įvedimui naudoja specialų įrankį, tokį kaip gnome-keyring ar seahorse-agent. Dėja Enigmail negali valdyti įvedimo laiko jūsų įrankyje. Laiko nustatymai Enigmail programoje yra ignoruojami. prefEnigmail.oneKeyserverOnly=Klaida - automatiniam trūkstamų OpenPGP raktų atsiuntimui galite nurodyti tik vieną raktų serverį. +acSetupMessage.desc=Perkelkite savo raktą į kitą Autocrypt įgalintą įrenginį. (Kas yra Autocrypt) +aboutLicense.desc=Enigmail yra atvirojo kodo ir yra licencijuota pagal "Mozilla" viešąją licenciją 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,7 +361,7 @@ noPassphrase=Klaida - nepateikta slaptafrazė noPGPblock=Klaida - nerastas tinkamas „armored OpenPGP“ duomenų blokas unverifiedReply=Cituojama laiško dalis (atsakyme) turbūt buvo pakeista -keyInMessageBody=Pagrindinėje laiško dalyje rastas raktas. Norėdami importuoti raktą, spustelėkite "Importuoti raktą" +keyInMessageBody=Pagrindinėje laiško dalyje buvo rastas raktas. Norėdami importuoti raktą, spustelėkite "Importuoti raktą" sigMismatch=Klaida - parašas nesutampa cantImport=Klaida importuojant viešąjį raktą\n\n doImportOne=Importuoti %1$S (%2$S)? @@ -366,27 +374,27 @@ sc.removeCard=Operacijai atlikti reikia jog SmartCard nebūtų įrenginyje.\nIšimkite SmartCard ir pakartokite operaciją. sc.noCardAvailable=Jūsų įrenginyje SmartCard nerasta\nĮdėkite jūsų SmartCard ir pakartokite operaciją. sc.noReaderAvailable=Jūsų SmartCard skaitytuvas nepasiekiamas\nPrijunkite SmartCard skaitytuvą, įdėkite kortelę ir pakartokite operaciją. -# keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. +keyError.keySpecNotFound=El. pašto adresui "%S" nepavyksta rasti rakto atitikmens jūsų raktinėje. keyError.keyIdNotFound=Jūsų raktinėje nepavyko rasti rakto ID "%S". keyError.resolutionAction=Pasirinkite savo Paskyros nustatymuose, OpenPGP sekcijoje, galiojantį raktą. missingPassphrase=Trūksta slaptafrazės errorHandling.gpgAgentInvalid=Jūsų sistemoje yra paleista gpg-agent versija, kuri nėra tinkama jūsų GnuPG versijai. errorHandling.gpgAgentError=GnuPG pranešė apie klaidą susisiekime su gpg-agent (GnuPG komponentu). errorHandling.dirmngrError=GnuPG pranešė apie klaida susisiekime su dirmngr (GnuPG komponentu). -# errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. +errorHandling.pinentryError=GnuPG negali užklausti jūsų slaptafrazės per pin įvedimą. +errorHandling.pinentryCursesError=Jūsų GnuPG diegimas yra sukonfigūruotas taip, kad PIN įvedimui naudotų pultą. Vis dėlto, naudojant Enigmail, jums reikia grafinės PIN įvedimo versijos. errorHandling.readFaq=Tai yra sistemos sąrankos ar konigūracijos klaida, kuri neleidžia Enigmail tinkamai veikti ir kuri negali būti automatiškai pataisyta.\n\nMes primygtinai rekomenduojame, kad jūs paieškotumėte informacijos mūsų palaikymo svetainėje, adresu https://enigmail.net/faq. gpgNotFound=Nepavyko rasti GnuPG programos „%S“.\nĮsitikinkite jog Enigmail nustatymuose nurodėte teisingą GnuPG kelią. gpgNotInPath=Nepavyko rasti GnuPG vykdomojo failo PATH.\nĮsitikinkite jog Enigmail nustatymuose nurodėte teisingą GnuPG kelią. -# enigmailNotAvailable=Enigmail core Service not available +enigmailNotAvailable=Pagrindinė Enigmail tarnyba neprieinama prefGood=GERAS parašas iš %S prefBad=BLOGAS parašas iš %S failCancel=Klaida - rakto gavimą atšaukė naudotojas -failNoServer=Klaida - nenurodytas raktų serveris iš kurio reikia gauti raktą -failNoID=Klaida - nenurodyta rakto ID kurį reikia gauti failKeyExtract=Klaida - rakto išgavimo komanda nepavyko +failKeyNoSubkey=Nėra galiojančio porakčio/rakto notFirstBlock=Klaida - pirmas OpenPGP blokas nėra viešasis raktas importKeyConfirm=Importuoti viešąjį(-uosius) raktą(-us) įterptus laiške? failKeyImport=Klaida - nepavyko importuoti rakto @@ -409,8 +417,8 @@ atLeastOneKey=Nepasirinktas raktas! Turite pasirinkti bent vieną raktą patvirtinant šį dialogą fewerKeysThanRecipients=Jūs pasirinkote mažiau raktų nei yra gavėjų. Ar jūs įsitikinę jog raktų, kuriuos reikia užšifruoti, sąrašas pilnas? userSel.button.goBack=Pasirinkti daugiau raktų -userSel.secretKeySel.title=Pasirinkite slaptą OpenPGP raktą laiškų pasirašymui -# userSel.problemNoKey=No valid key +userSel.secretKeySel.title=Pasirinkite slaptąjį OpenPGP raktą laiškų pasirašymui +userSel.problemNoKey=Nėra galiojančio rakto userSel.problemMultipleKeys=Keli raktai # should be same as thunderbird ENTITY sendLaterCmd.label: sendLaterCmd.label=Siųsti vėliau @@ -423,15 +431,17 @@ # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=Pasirinkite OpenPGP raktą šifravimui identityName=Tapatybė: %S -# switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. +switchPepMode=Šiuo metu naudojate Enigmail "p≡p jaunių" veikseną.\n\nĮjungdami paskyrai OpenPGP ar S/MIME, išjungiate p≡p ir naudojate "įprastą" Enigmail veikseną be p≡p. enableEnigmail=&Išjungti p≡p +amPrefAutocrypt.desc=Autocrypt yra standartas, kuris apibrėžia kaip pasiekti patogų ištisinį el. laiškų šifravimą. Jis nurodo, kaip el. pašto programos užmezga šifravimo galimybes, naudodamos įprastus el. laiškus. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Jūs įjungėte šifravimą, bet nepasirinkote rakto. Norint užšifruoti laiškus siunčiamus %S, jūs turite nurodyti vieną ar kelis tinkamus raktus iš jūsų raktų sąrašo. Ar norite išjungti šifravimą skirtą %S? noKeyToUse=(nėra - be šifravimo) noEmptyRule=Taisyklė negali būti tuščia! Nurodykite el. pašto adresą taisyklės laukelyje. invalidAddress=El. pašto adresas(-ai) kuriuos įvedėte yra neteisingi. Jūs neturėtumėte nurodyti gavėjų vardų, o tik el. pašto adresus. Pvz.:\nNeteisingas: Vardenis Pavardenis \nTeisingas: vardenis.pavardenis@adresas.lt -# noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. +noCurlyBrackets=Laužtiniai skliaustai {} turi specialią reikšmę ir neturėtų būti naudojami el. pašto adrese. Jei norite pakeisti atitinkamą elgesį šiai taisyklei, naudokite „Pritaikyti taisyklę, jei gavėjas ...“ parinktį.\nDaugiau informacijos yra prieinama žinyne. # Strings used in enigmailRulesEditor.js never=Niekada @@ -444,28 +454,21 @@ # Strings used in enigmailSearchKey.js needOnline=Pasirinkta funkcija neprieinama dirbant atsijungus. Prisijunkite ir bandykite dar kartą. -protocolNotSupported=Jūsų pasirinktas protokolas „%S://“ nėra palaikomas OpenPGP raktų atsiuntimui. -gpgkeysDisabled=Turėtų pagelbėti „extensions.enigmail.useGpgKeysTool“ parinkties įjungimas. -noKeyserverConn=Nepavyko prisijungti prie raktų serverio %S. -keyDownloadFailed=Nepavyko atsisiųsti rakto iš raktų serverio. Būsenos pranešimas:\n%S +noKeyserverConn=Nepavyko prisijungti prie raktų serverio ties %S. internalError=Kilo vidinė klaida. Raktų importuoti ar atsisiųsti nepavyko. -noKeyFound=Apgailestaujame, nepavyko rasti rakto kuris atitiktų jūsų nurodytus kriterijus.\nTurėkite omeny jog rakto ID turi prasidėti „0x“ (pvz. 0xABCDEF12). -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Nepavyko surasti ar atsisiųsti rakto iš raktų serverio: nepavyko įvykdyti gpgkeys_%S. - +noKeyFound=Mums nepavyko rasti rakto, kuris atitiktų nurodytus paieškos kriterijus. +keyDownload.keyUnavailable=Raktas, kurio ID %S nėra prieinamas raktų serveryje. Tikriausiai, rakto savininkas neįkėlė savo rakto į raktų serverį.\n\nPaprašykite laiško siuntėjo, kad išsiųstų jums savo viešąjį raktą el. paštu. # Strings in enigmailEditKeyTrustDlg.xul -setKeyTrustFailed=Nepavyko nustatyti savininko patikimumo +setKeyTrustFailed=Nepavyko nustatyti pasitikėjimą savininku # Strings in enigmailSignKeyDlg.js signKeyFailed=Rakto pasirašyti nepavyko -alreadySigned.label=Pastaba: raktas %S jau pasirašytas pasirinktu privačiuoju raktu. -# alreadySignedexportable.label=Note: the key %S is already signed exportable with the selected secret key. A local signature does not make sense. -partlySigned.label=Pastaba: kai kurie rakto %S naudotojų ID jau pasirašyti pasirinktu privačiuoju raktu. -# noTrustedOwnKeys=No eligible key found for signing! You need at least one fully trusted secret key in order to sign keys. +alreadySigned.label=Pastaba: raktas %S jau pasirašytas pasirinktu slaptuoju raktu. +alreadySignedexportable.label=Pastaba: raktas %S jau yra tinkamas eksportavimui ir pasirašytas, naudojant pasirinktą slaptąjį raktą. Vietinis parašas neturi prasmės. +partlySigned.label=Pastaba: kai kurie rakto %S naudotojų ID jau pasirašyti pasirinktu slaptuoju raktu. +noTrustedOwnKeys=Pasirašymui nerasta nei vieno tinkamo rakto! Norint pasirašinėti raktus, jums reikia bent vieno pilnai patikimo slaptojo rakto. # Strings in enigmailKeyManager.js keyMan.loadingKeys=Įkraunami raktai, prašome palaukti ... @@ -490,7 +493,6 @@ asciiArmorFile=ASCII Armored failai (*.asc) importKeyFile=Importuoti OpenPGP rakto failą gnupgFile=GnuPG failai -createKeyOK=Jūsų raktas buvo sugeneruotas saveRevokeCertAs=Sukurti ir įrašyti panaikinimo liudijimą revokeCertOK=Panaikinimo liudijimas buvo sėkmingai sukurtas. Galite jį naudoti, norėdami paversti savo viešąjį raktą negaliojančiu, pvz., tuo atveju, jei prarasite savo slaptąjį raktą. revokeCertFailed=Nepavyko sukurti panaikinimo liudijimo. @@ -500,7 +502,7 @@ noKeySelected=Pasirinktai operacijai atlikti jūs turite pasirinkti bent vieną raktą exportToFile=Eksportuoti viešąjį raktą į failą exportKeypairToFile=Eksportuoti slaptąjį ir viešąjį raktą į failą -exportSecretKey=Ar norite įtraukti slaptą raktą į įrašytą OpenPGP rakto failą? +exportSecretKey=Ar norite įtraukti slaptąjį raktą į įrašytą OpenPGP rakto failą? saveKeysOK=Raktai sėkmingai įrašyti saveKeysFailed=Raktų įrašyti nepavyko importKeysFailed=Raktų importuoti nepavyko @@ -508,51 +510,51 @@ specificPubKeyFilename=%S (0x%S) viešas specificPubSecKeyFilename=%S (0x%S) viešas-saugus defaultPubKeyFilename=Eksportuoti-viešieji-raktai -defaultPubSecKeyFilename=Eksportuoti-viešieji-ir-slapti-raktai -noSecretKeys=Slaptų raktų nerasta.\n\nAr norite sugeneruoti savo raktą dabar? +defaultPubSecKeyFilename=Eksportuoti-viešieji-ir-slaptieji-raktai sendKeysOk=Raktas(-ai) sėkmingai išsiųsti sendKeysFailed=Raktų išsiųsti nepavyko receiveKeysOk=Raktas(-ai) sėkmingai atnaujinti receiveKeysFailed=Raktų atsiuntimas nepavyko +keyUpload.verifyEmails=Raktų serveris kiekvieno jūsų įkelto rakto el. paštui atsiųs po el. laišką. Norėdami patvirtinti savo rakto paskelbimą, kiekviename gautame el. laiške spustelėkite ant nuorodos. importFromClip=Ar norite importuoti raktą(-us) iš iškarpinės? importFromUrl=Atsisiųsti viešąjį raktą iš šio URL: copyToClipbrdFailed=Nepavyko nukopijuoti pasirinkto rakto(-ų) į iškarpinę. copyToClipbrdOK=Raktas(-ai) nukopijuoti į iškarpinę -deleteSecretKey=ĮSPĖJIMAS: Jūs ketinate ištrinti slaptą raktą!\nJei ištrinsite savo slaptą raktą, nebegalėsite iššifruoti laiškų užšifruotų tuo raktu ir nebegalėsite to rakto panaikinti.\n\nAr tikrai norite ištrinti ABU (slaptą ir viešąjį) raktus\n„%S“? -deleteMix=ĮSPĖJIMAS: Jūs ketinate ištrinti slaptus raktus!\nJeigu ištrinsite savo slaptą raktą, nebegalėsite iššifruoti laiškų užšifruotų tuo raktu.\nAr tikrai norite ištrinti ABU (pasirinktą slaptą ir viešąjį) raktus? +deleteSecretKey=ĮSPĖJIMAS: Jūs ketinate ištrinti slaptąjį raktą!\nJei ištrinsite savo slaptąjį raktą, daugiau nebegalėsite iššifruoti jokių tam raktui užšifruotų laiškų ir nebegalėsite to rakto panaikinti.\n\nAr tikrai norite ištrinti ABU (slaptąjį ir viešąjį) raktus\n„%S“? +deleteMix=ĮSPĖJIMAS: Jūs ketinate ištrinti slaptuosius raktus!\nJeigu ištrinsite savo slaptąjį raktą, nebegalėsite iššifruoti laiškų užšifruotų tuo raktu.\nAr tikrai norite ištrinti ABU (pasirinktą slaptąjį ir viešąjį) raktus? deletePubKey=Ar tikrai norite ištrinti viešąjį raktą\n„%S“? deleteSelectedPubKey=Ar norite ištrinti viešuosius raktus? deleteKeyFailed=Nepavyko ištrinti rakto. revokeKeyQuestion=Ketinate panaikinti raktą "%S".\n\nDaugiau nebegalėsite pasirašyti šiuo raktu, o jį išplatinus, kiti daugiau nebegalės šifruoti naudojant tą raktą. Jūs vis dar galite naudoti raktą senų laiškų iššifravimui.\n\nAr norite tęsti? revokeKeyOk=Raktas panaikintas. Jeigu jūsų raktas yra prieinamas raktų serveryje, rekomenduojama jį įkelti iš naujo, kad kiti matytų, jog jis buvo panaikintas. revokeKeyFailed=Nepavyko panaikinti rakto. -revokeKeyNotPresent=Jūs neturite jokio rakto (0x%S), kuris tiktų į šį panaikinimo liudijimą!\n\nJeigu praradote savo raktą, tuomet privalote jį importuoti (pvz., iš raktų serverio) prieš panaikinimo liudijimą! +revokeKeyNotPresent=Jūs neturite jokio rakto (0x%S), kuris atitiktų šį panaikinimo liudijimą!\n\nJei praradote savo raktą, tuomet prieš importuodami panaikinimo liudijimą, privalote importuoti raktą (pvz., iš raktų serverio)! revokeKeyAlreadyRevoked=Raktas 0x%S jau buvo panaikintas. refreshAllQuestion=Nepasirinkote jokio rakto. Ar norite atnaujinti VISUS raktus? refreshKeyServiceOn.warn=Įspėjimai: Šiuo metu jūsų raktai kaip įmanoma saugiau yra fone įkeliami iš naujo.\nVisų raktų įkėlimas iš naujo vienu metu gali bereikalingai atskleisti informaciją apie jus.\nAr tikrai norite tai padaryti? refreshKey.warn=Įspėjimas: priklausomai nuo raktų skaičiaus ir interneto greičio, raktų atnaujinimas gali užtrukti! downloadContactsKeys.warn=Įspėjimas: priklausomai nuo raktų skaičiaus ir interneto greičio, raktų atnaujinimas gali užtrukti! downloadContactsKeys.importFrom=Importuoti kontaktus iš „%S“ adresų knygutės? -keyMan.button.exportSecKey=Eksportuoti &slaptus raktus +keyMan.button.exportSecKey=Eksportuoti &slaptuosius raktus keyMan.button.exportPubKey=Eksportuoti tik &viešuosius raktus keyMan.button.import=&Importuoti keyMan.button.refreshAll=&Iš naujo įkelti visus raktus keyMan.button.revokeKey=&Panaikinti raktą -keyMan.button.skip=&Praleisti raktą keylist.noOtherUids=Neturi kitų tapatybių keylist.hasOtherUids=Taip pat žinomas kaip -keylist.noPhotos=Nėra nuotraukos +keylist.noPhotos=Nėra prieinamos nuotraukos keylist.hasPhotos=Nuotraukos keyMan.addphoto.filepicker.title=Pasirinkite nuotrauką kuri bus pridėta -keyMan.addphoto.warnLargeFile=Jūsų pasirinktas failas yra didesnis nei 25 kB.\nNerekomenduotina pridėti didelių failų, nes raktai tampa labai dideli. +keyMan.addphoto.warnLargeFile=Jūsų pasirinktas failas yra didesnis nei 25 kB.\nNerekomenduotina pridėti didelių failų, nes tai sąlygoja labai didelius raktus. keyMan.addphoto.noJpegFile=Pasirinktas failas nėra JPEG failas. Pasirinkite kitą failą. keyMan.addphoto.failed=Nepavyko pridėti nuotraukos. noWksIdentity=Raktas %S neturi WKS tapatybės. +wksUpload.noKeySupported=Įkėlimas nebuvo sėkmingas - atrodo, kad jūsų tiekėjas nepalaiko WPS. keyman.addBlacklistKey.msg=Ar tikrai norite, kad p≡p laiškų šifravimui nustotų naudoti "%1$S (%2$S)" raktą? keyman.removeBlacklistKey.msg=Ar norite leisti p≡p būsimiems laiškams naudoti raktą "%1$S (%2$S)"? @@ -568,7 +570,7 @@ # Strings in enigmailKeyImportInfo.xul importInfoTitle=PAVYKO! Raktai importuoti -# importInfoBits=Bits +importInfoBits=bitų importInfoCreated=Sukurtas importInfoFpr=Kontrolinis kodas importInfoDetails=(Išsamiau) @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Nepavyko pakeisti PIN -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Raktai įkeliami iš naujo, prašome palaukti... keyserverProgress.uploading=Raktai įkeliami, palaukite... keyserverProgress.wksUploadFailed=Nepavyko įkelti jūsų raktą į saityno raktų paslaugą. keyserverProgress.wksUploadCompleted=Jūsų viešasis raktas buvo sėkmingai pateiktas jūsų tiekėjui. Jūs gausite el. laišką, patvirtinantį, jog inicijavote įkėlimą. keyserverTitle.refreshing=Atnaujinti raktus -keyserverTitle.uploading=Įkelti raktą +keyserverTitle.uploading=Rakto įkėlimas +keyserver.result.download.none=Neatsisiųsta jokio rakto. +keyserver.result.download.1of1=Raktas sėkmingai atsisiųstas. +keyserver.result.download.1ofN=Sėkmingai atsisiųstas 1 iš %S raktų. +keyserver.result.download.NofN=Sėkmingai atsisiųsta %1$S iš %2$S raktų. +keyserver.result.uploadOne=Sėkmingai įkeltas 1 raktas. +keyserver.result.uploadMany=Sėkmingai įkelta raktų: %S. # Strings in enigmailSetupWizard -passphrase.min8keys=Jūsų slaptafrazė turi būti sudaryta bent iš 8 simbolių! -setupWizard.reallyCancel=Ar tikrai norite užverti Enigmail sąrankos vediklį? setupWizard.invalidGpg=Jūsų pasirinktas failas nėra GnuPG vykdomasis failas. Pasirinkite kitą failą. -setupWizard.specifyFile=Norėdami tęsti, turite nurodyti bent jau viešąjį raktą. setupWizard.installFailed=Atrodo diegimas nepavyko. Pabandykite iš naujo arba įdiekite GnuPG rankiniu būdu ir pasirinkite jį su naršymo mygtuku. setupWizard.downloadForbidden=Jūsų pačių saugumui, mes nesiųsime GnuPG. Norėdami atsisiųsti GnuPG, apsilankykite https://gnupg.org/ . setupWizard.downloadImpossible=Šiuo metu mums nepavyko atsisiųsti GnuPG. Bandykite vėliau arba, norėdami atsisiųsti GnuPG, apsilankykite https://gnupg.org/ . -setupWizard.hashSumError=Vedikliui nepavyko patikrinti atsiųsto failo vietisumo. Failas gali būti netinkamai atsiųstas arba pakeistas. Ar vis tiek norite tęsti diegimą? +setupWizard.hashSumError=Vedikliui nepavyko patikrinti atsiųsto failo vietisumo. Gali būti, kad failas buvo netinkamai atsisiųstas arba suklastotas. Ar vis tiek norite tęsti diegimą? setupWizard.importSettingsFile=Nurodykite atsarginės kopijos failą, iš kurio įkelti -setupWizard.invalidSettingsFile=Nurodytas failas nėra teisingas Enigmail nustatymų atsarginės kopijos failas. +setupWizard.invalidSettingsFile=Nurodytas failas nėra tinkamas Enigmail Nustatymų atsarginės kopijos failas. setupWizard.gpgConfExists=GnuPG konfigūracijos failas jau yra. Ar norite jį perrašyti konfigūracijos failu iš savo senojo diegimo? -setupWizard.noGpgHomeDir=Atrodo, kad esate sukonfigūravę %S, kad naudotų GnuPG. Tačiau tai nėra katalogas - jūs negalite jo naudoti. +setupWizard.noGpgHomeDir=Atrodo, kad esate sukonfigūravę %S, kad ji būtų naudojama su GnuPG. Vis dėlto, tai nėra katalogas - jūs negalite jo naudoti. setupWizard.unmachtedIds=Šioms jūsų senos sąrankos tapatybėms nepavyko rasti atitikmenų:\n%S\nNustatymai šioms tapatybėms buvo praleisti. +setupWizard.foundAcSetupMessage=Rastas Autocrypt sąrankos laiškas. Norėdami inicijuoti Autocrypt sąrankos procedūrą, sputelėkite žemiau ant mygtuko Pradėti sąranką. +setupWizard.foundAcNoSetupMsg=Mes nustatėme, kad jūs naudojate su Autocrypt suderinamą el. pašto kliento programą, tačiau mums nepavyko rasti jokio Autocrypt sąrankos laiško. Rekomenduojame esamame įrenginyje susikurti Autocrypt sąrankos laišką, o tuomet spustelėti Peržiūrėti gautųjų aplanką. Priešingu atveju, galite eksportuoti savo nustatymus ir raktus iš esamo Enigmail diegimo ir čia atkurti šiuos nustatymus. +setupWizard.setupComplete=Dabar, Enigmail yra tinkamai sukonfigūruota ir paruošta naudoti. Tolimesnei informacijai apie naudojimąsi Enigmail, apsilankykite mūsų internetinėje svetainėje. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Atsiunčiant GnuPG įvyko klaida. Tolimesnei informacijai, žiūrėkite pulto žurnalą. @@ -650,15 +658,15 @@ filter.decryptMove.label=Iššifruoti visam laikui (Enigmail) filter.decryptCopy.label=Sukurti iššifruotą kopiją (Enigmail) filter.decryptMove.warnExperimental=Įspėjimas - filtro veiksmas "Iššifruoti visam laikui" gali privesti prie sunaikintų laiškų.\n\nPrimygtinai jums rekomenduojame, iš pradžių, išbandyti filtrą "Sukurti iššifruotą kopiją", atsargiai išbandyti rezultatą ir pradėti naudoti šį filtrą tik tuomet, kai būsite patenkinti rezultatu. -# filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted -# filter.term.pgpencrypted.label=OpenPGP Encrypted -# filter.encrypt.label=Encrypt to key (Enigmail) +filter.tempPepFilterDesc=Laikinas filtras, skirtas laikyti išsiųstus laiškus nešifruotai +filter.term.pgpencrypted.label=OpenPGP šifruotas +filter.encrypt.label=Šifruoti į raktą (Enigmail) filter.keyRequired=Privalote pasirinkti gavėjo raktą. filter.keyNotFound=Nepavyko rasti šifravimo rakto, skirto "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +filter.warn.keyNotSecret=Įspėjimas - filtro veiksmas "Šifruoti į raktą" pakeičia visus gavėjus.\n\nJeigu neturite "%S" slaptojo rakto, daugiau nebegalėsite skaityti el. laiškų. # strings in enigmailConvert.jsm -converter.decryptBody.failed=Nepavyko iššifruoti laiško, kurio tema\n"%S".\nAr norėtumėte bandyti dar kartą, naudojant kitą slaptafrazę, ar norite praleisti laišką? +converter.decryptBody.failed=Nepavyko iššifruoti laiško, kurio tema\n"%S".\nAr norite bandyti dar kartą, naudojant kitą slaptafrazę, ar verčiau praleisti laišką? converter.decryptAtt.failed=Nepavyko iššifruoti priedo "%1$S"\nlaiške, kurio tema\n"%2$S".\nAr norite bandyti dar kartą, naudojant kitą slaptafrazę, ar verčiau praleisti laišką? saveLogFile.title=Įrašyti žurnalo failą @@ -674,14 +682,14 @@ keyRing.pubKeyNotForSigning=Raktas %1$S (rakto ID %2$S) negali būti naudojamas pasirašymui. keyRing.pubKeyNotForEncryption=Raktas %1$S (rakto ID %2$S) negali būti naudojamas šifravimui. keyRing.keyDisabled=Raktas %1$S (rakto ID %2$S) yra išjungtas; jis negali būti naudojamas. -# keyRing.keyNotTrusted=The key %1$S (key ID %2$S) is not trusted enough. Please set the trust level of your key to "ultimate" to use it for signing. -# keyRing.keyInvalid=The key %1$S (key ID %2$S) is not valid. Please consider verifying it correctly. Alternatively use the Default encryption settings in the Enigmail preferences dialog. +keyRing.keyNotTrusted=Raktas %1$S (rakto ID %2$S) nėra pakankamai patikimas. Norėdami jį naudoti pasirašymui, nustatykite pasitikėjimo savo raktu lygį į "visiškas". +keyRing.keyInvalid=Raktas %1$S (rakto ID %2$S) negalioja. Apsvarstykite galimybę teisingai jį patikrinti. Kitu atveju, Enigmail nuostatų dialoge naudokite numatytuosius šifravimo nustatymus. keyRing.signSubKeysRevoked=Visi rakto %1$S (rakto ID %2$S) pasirašymo porakčiai yra panaikinti. keyRing.signSubKeysExpired=Visų rakto %1$S (rakto ID %2$S) pasirašymo porakčių galiojimas yra pasibaigęs. keyRing.signSubKeysUnusable=Visi rakto %1$S (rakto ID %2$S) pasirašymo porakčiai yra panaikinti, yra pasibaigęs jų galiojimas ar jie yra kitaip netinkami naudoti. keyRing.encSubKeysRevoked=Visi rakto %1$S (rakto ID %2$S) šifravimo porakčiai yra panaikinti. keyRing.encSubKeysExpired=Pasibaigė visų rakto %1$S (rakto ID %2$S) porakčių galiojimas. -# keyRing.noSecretKey=You do not seem to have the secret key for %1$S (key ID %2$S) on your keyring; you cannot use the key for signing. +keyRing.noSecretKey=Atrodo, kad savo raktinėje neturite slaptojo rakto, skirto %1$S (rakto ID %2$S); negalite naudoti rakto pasirašymui. keyRing.encSubKeysUnusable=Visi rakto %1$S (rakto ID %2$S) šifravimo porakčiai yra panaikinti, yra pasibaigęs jų galiojimas ar jie yra kitaip netinkami naudoti. @@ -691,49 +699,50 @@ enigmailSettings=EnigmailNustatymai defaultBackupFileName=Enigmail-eksportavimas specifyExportFile=Nurodykite failo pavadinimą eksportavimui -# homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. +homedirParamNotSUpported=Papildomi parametrai, tokie kaip --homedir ir --keyring, kurie konfigūruoja kelius, nėra palaikomi jūsų eksportavimo/atkūrimo nustatymų. Naudokite alternatyvius būdu, tokius kaip aplinkos kintamojo GNUPGHOME, nustatymas. #strings in expiry.jsm expiry.keyExpiresSoon=Jūsų raktas %1$S nustos galioti mažiau nei po %2$S dienų.\n\nRekomenduojame sukurti naują raktų porą ir sukonfigūruoti atitinkamas paskyras naujo rakto naudojimui. -expiry.keysExpireSoon=Šie jūsų raktai nustos galioti mažiau nei po %1$S dienų:\n%2$S Rekomenduojame sukurti naujus raktus ir sukonfigūruoti savo paskyras naudoti naujus raktus. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. +expiry.keysExpireSoon=Šie raktai nustos galioti po mažiau nei %1$S dienų:\n%2$S. Rekomenduojame susikurti naujus raktus ir sukonfigūruoti atitinkamas paskyras naudoti naujus raktus. +expiry.keyMissingOwnerTrust=Jūsų slaptajam raktui %S trūksta pasitikėjimo.\n\nRekomenduojame, kad rakto savybėse nustatytumėte "Jūs pasikliaujate sertifikavimais" į "visiškas". +expiry.keysMissingOwnerTrust=Šiems jūsų slaptiesiems raktams trūksta pasitikėjimo.\n%S.\n\nRekomenduojame, kad rakto savybėse nustatytumėte "Jūs pasikliaujate sertifikavimais" į "visiškas". expiry.OpenKeyManager=Atverti Enigmail raktų tvarkymą expiry.OpenKeyProperties=Atverti rakto savybes #strings in pEpDecrypt.jsm -pEpDecrypt.cannotDecrypt=Tai yra šifruotas laiškas. Deja, jūs neturite šio laiško iššifravimui skirto privačiojo rakto. +pEpDecrypt.cannotDecrypt=Tai yra šifruotas laiškas. Deja, jūs neturite šio laiško iššifravimui skirto slaptojo rakto. #strings in gpgAgent.jsm gpghomedir.notexists=Katalogo "%S" su jūsų OpenPGP raktais nėra ir jis negali būti sukurtas. gpghomedir.notwritable=Katalogas "%S", kuriame yra jūsų OpenPGP raktai, nėra skirtas rašymui. gpghomedir.notdirectory=Katalogas "%S", kuriame yra jūsų your OpenPGP raktai, iš tiesų, yra failas, o ne katalogas. -# gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +gpghomedir.notusable=Pataisykite katalogo leidimus arba pakeiskite savo GnuPG "namų" katalogo vietą. Priešingu atveju GnuPG negalės tinkamai veikti. +gpgAgent.noAutostart=Jūs naudojate GnuPG versiją %S. Ši versija reikalauja, kad paleistumėte gpg-agent dar prieš paleisdami Thunderdbird ir, kad kintamasis "GPG_AGENT_INFO" būtų iš anksto įkeltas.\n\nŠios išankstinės sąlygos nėra patenkintos - jūs negalite naudoti Enigmail, kol neišspręsite šios problemos. #strings in pepTrustWords.js -# pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. +pepTrustWords.cannotVerifyOwnId=Nepavyksta patikrinti p≡p pasitikėjimo žodžių jūsų paskyrai. pepTrustWords.cannotFindKey=Nepavyksta rasti rakto, skirto %S. pepTrustWords.cannotStoreChange=Nepavyko pakeisti pasitikėjimo %S raktu. -# pepTrustWords.generalFailure=Cannot obtain trustwords for %S. +pepTrustWords.generalFailure=Nepavyksta gauti pasitikėjimo žodžių, skirtų %S. pepTrustWords.partnerFingerprint=%S kontrolinis kodas: #strings in mimeWkdHandler.jsm wkdMessage.body.req=Jūsų el. pašto tiekėjas apdorojo jūsų užklausą įkelti jūsų viešąjį raktą į OpenPGP saityno raktų katalogą.\n\nNorėdami užbaigti savo viešojo rakto paskelbimą, spustelėkite Enigmail antraštėje patvirtinimo mygtuką. -# wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. +wkdMessage.body.process=Tai yra automatinis el. laiškas, susijęs su automatiniu apdorojimu, skirtu įkelti jūsų viešąjį raktą į OpenPGP saityno raktų katalogą.\n\nŠiuo metu jums nereikia atlikti jokių papildomų veiksmų. #strings in pepHandshake.js pepPrivacyStatus.RatingBrokenSuggestion=Arba jūs, arba siuntėjas turėtų išsiųsti laišką iš naujo. pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=Jeigu jūs parašėte šį laišką, tuomet jūsų raktas yra neprieinamas. -# pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. -# pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. +pepPrivacyStatus.RatingMistrustSuggestion=Iš naujo užmegzkite ryšį su savo bendravimo partneriu ir pabandykite užbaigti dar vieną išankstinį suderinimą. +pepPrivacyStatus.RatingReliableSuggestion=Užbaikite išankstinį suderinimą su savo bendravimo partneriu, pasakydami vienas kitam savo pasitikėjimo žodžius asmeniškai ar telefonu. Išankstinis suderinimas su kiekvienu partneriu yra reikalingas tik vieną kartą ir užtikrina saugų bei patikimą bendravimą. pepPrivacyStatus.RatingTrustedSuggestion=Nereikalingas joks veiksmas! pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Turėkite omenyje, kad šis laiškas gali būti nesaugus. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Pridėkite reikiamą informaciją. -pepPrivacyStatus.RatingUnderAttackSuggestion=Atskirai patvirtinkite šio laiško turinį su savo bendravimo partneriu. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. +pepPrivacyStatus.RatingUnderAttackSuggestion=Patvirtinkite šio laiško turinį su savo bendravimo partneriu, naudodami kitą kanalą. +pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Įsitikinkite, kad privatumo būsena kiekvienam išvardytam susirašinėjimo partneriui yra bent "saugi". pepPrivacyStatus.RatingUnencryptedSuggestion=Paprašykite savo bendravimo partnerio naudoti šifravimo sprendimą arba įsidiegti p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. +pepPrivacyStatus.RatingUnreliableSuggestion=Šiame laiške nėra patikimo šifravimo arba trūksta parašo. Paprašykite savo bendravimo partnerio, kad atnaujintų savo šifravimo sprendimą ar įsidiegtų p≡p. pepPrivacyStatus.RatingBrokenExplanation=Šiame laiške yra sugadintas šifravimas ar formatavimas. pepPrivacyStatus.RatingHaveNoKeyExplanation=Šis laiškas negali būti iššifruotas, nes raktas nėra prieinamas. @@ -746,33 +755,33 @@ pepPrivacyStatus.RatingUnencryptedForSomeExplanation=Kai kuriems bendravimo partneriams šis laiškas yra nesaugus. pepPrivacyStatus.RatingUnreliableExplanation=Šiame laiške yra nepatikima apsauga. -# pepPrivacyStatus.RatingBrokenText=Broken +pepPrivacyStatus.RatingBrokenText=Sugadintas pepPrivacyStatus.RatingHaveNoKeyText=Nepavyksta iššifruoti -# pepPrivacyStatus.RatingMistrustText=Mistrusted +pepPrivacyStatus.RatingMistrustText=Nebepatikimas pepPrivacyStatus.RatingReliableText=Saugus -# pepPrivacyStatus.RatingTrustedText=Secure & Trusted +pepPrivacyStatus.RatingTrustedText=Saugus ir patikimas pepPrivacyStatus.RatingUndefinedText=Nežinoma -# pepPrivacyStatus.RatingUnderAttackText=Under Attack -# pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some +pepPrivacyStatus.RatingUnderAttackText=Puolamas +pepPrivacyStatus.RatingUnencryptedForSomeText=Kai kuriems nesaugus pepPrivacyStatus.RatingUnencryptedText=Nesaugus pepPrivacyStatus.RatingUnreliableText=Nepatikimas saugumas handshakeDlg.button.initHandshake=Išankstinis suderinimas... -# handshakeDlg.button.stopTrust=Stop Trusting -# handshakeDlg.button.reTrust=Stop Mistrusting +handshakeDlg.button.stopTrust=Nustoti pasitikėti +handshakeDlg.button.reTrust=Nustoti nebepasitikėti handshakeDlg.label.outgoingMessage=Išsiunčiamas laiškas handshakeDlg.label.incomingMessage=Gaunamas laiškas -# handshakeDlg.error.noPeers=Cannot handshake without any correspondents. -# handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. +handshakeDlg.error.noPeers=Nepavyksta atlikti išankstinio suderinimo be jokių susirašinėtojų. +handshakeDlg.error.noProtection=Norėdami naudoti "išankstinio suderinimo" funkciją, įjunkite apsaugą. -enigmail.acSetupPasswd.descEnterPasswd=Įveskite kitame įrenginyje rodomą sąrankos kodą -enigmail.acSetupPasswd.descCopyPasswd=Norėdami tęsti sąranką, įveskite žemiau esantį sąrankos kodą savo kitame įrenginyje +enigmail.acSetupPasswd.descEnterPasswd=Įveskite kitame įrenginyje rodomą sąrankos kodą. +enigmail.acSetupPasswd.descCopyPasswd=Norėdami tęsti sąranką, įveskite žemiau esantį sąrankos kodą savo kitame įrenginyje. #strings in autocrypt.jsm autocrypt.setupMsg.subject=Autocrypt sąrankos laiškas autocrypt.setupMsg.msgBody=Norėdami nusistatyti savo naujajame įrenginyje Autocrypt, sekite instrukciją, kurią turėtų pateikti jūsų naujasis įrenginys. -autocrypt.setupMsg.fileTxt=Tai yra Autocrypt sąrankos failas, kuris naudojamas nustatymų ir raktų perkėlimui tarp kliento programų. Jūs galite jį iššifruoti, naudodami jūsų senajame įrenginyje pateiktą sąrankos kodą, o tuomet importuodami jame laikomą raktą į savo raktinę. +autocrypt.setupMsg.fileTxt=Tai yra Autocrypt sąrankos failas, kuris naudojamas nustatymų ir raktų perkėlimui tarp kliento programų. Jūs galite jį iššifruoti, naudodami jūsų senajame įrenginyje rodomą sąrankos kodą ir tuomet iš įrenginio importuoti raktą į savo raktinę. #strings in upgradeInfo.html upgradeInfo.doctitle=Kas naujo Enigmail v2.0? @@ -781,14 +790,16 @@ upgradeInfo.encSubject.title=Laiško temos šifravimas upgradeInfo.encSubject.desc=Mes sukūrėme naują būda, kuris perkelia el. laiško tema į šifruotą laišką ir pakeičia matomą temą į "Šifruotas laiškas". Iššifravus tokį laišką, pradinė tema yra pakeičiama automatiškai. Temos slėpimas yra įjungtas pagal numatymą; jeigu jums tai nepatinka, yra nuostata, skirta tai išjungti. (Pastaba: ši ypatybė reikalauja, kad laiškas būtų išsiųstas naudojant PGP/MIME.) upgradeInfo.buttons.title=Pakeista šifravimo ir pasirašymo mygtukų elgsena -# upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. +upgradeInfo.buttons.desc=Laiško rašymo lange esantys mygtukai Šifruoti ir Pasirašyti dabar veikia tiek OpenPGP, tiek S/MIME protokolams. Jeigu yra galimi abu algoritmai, tuomet Enigmail bandys teikti pirmenybę tam, kuriam yra prieinami visi raktai. upgradeInfo.autocrypt.title=Autocrypt palaikymas upgradeInfo.autocrypt.desc=Dabar, Enigmail palaiko Autocrypt, naują standartą, skirtą platinti raktus kaip išsiųstų laiškų dalį. Enigmail automatiškai importuoja raktus iš su Autocrypt suderinamų laiškų ir tokiu būdu, bėgant laikui, gali būti šifruota vis daugiau ir daugiau laiškų. upgradeInfo.pEp.title=Naujoji p≡p jaunių veiksena (Ganėtinai lengvas privatumas) -upgradeInfo.pEp.desc=Dabar, programoje Enigmail yra p≡p jaunių veiksena. Šiam reikalui, šiuo metu turite rankiniu būdu įdiegti p≡p; ateities laidose tai pasikeis. p≡p jaunių veiksena leidžia jums naudoti OpenPGP šifravimą kaip įmanoma skaidriau; jums daugiau nebereikia rūpintis raktų tvarkymu ir raktų sinchronizavimu tarp įrenginių. +upgradeInfo.pEp.desc=Dabar, programoje Enigmail yra p≡p jaunių veiksena. p≡p jaunių veiksena leidžia jums naudoti OpenPGP šifravimą kaip įmanoma skaidriau; jums daugiau nebereikia rūpintis raktų tvarkymu ir raktų sinchronizavimu tarp įrenginių. upgradeInfo.bottom.desc=Norėdami gauti pagalbos, naudojantis Enigmail, apsilankykite mūsų dokumentacijos puslapyje. -# pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +#strings in pEpAdapter.jsm +pep.missingGnuPG=Norint naudoti Enigmail/p≡p, yra reikalinga GnuPG. Kadangi mums nepavyko jos rasti, siūlome atsiųsti ir ją jums įdiegti. +pep.updateAvailable=Yra prieinama nauja Enigmail/p≡p kriptografijos modulio versija. Ar norėtumėte atsisiųsti ir įsidiegti atnaujinimą? #strings in enigmailAbout.html aboutEnigmail.tabName=Apie Enigmail @@ -799,12 +810,48 @@ aboutEnigmail.documentation=Dokumentacija: aboutEnigmail.testing=Testavimas: aboutEnigmail.userSupport=Naudotojų palaikymas: +aboutEnigmail.userSupport.team=komanda ir sąrašo/forumo dalyviai aboutEnigmail.localization=Lokalizavimas: Žiūrėkite Enigmail kalbų paketų puslapį aboutEnigmail.Credits=Padėkos: aboutEnigmail.origAuthor=Pradinis Enigmail plėtinio autorius aboutEnigmail.icons=Piktogramos: aboutEnigmail.formerMembers=Buvę komandos nariai: -# aboutEnigmail.projectHosting=Project hosting: +aboutEnigmail.projectHosting=Projekto priegloba: aboutEnigmail.licenseSupportTitle=Licencija ir palaikymas aboutEnigmail.license=Enigmail OpenPGP atvirojo kodo ir yra licencijuota pagal %S aboutEnigmail.support=Palaikymas ir atsiuntimai yra prieinami iš www.enigmail.net. + +#strings in updateGnuPG.html +updateGnuPG.tabName=GnuPG atnaujinimas +updateGnuPG.title=GnuPG atnaujinimai +updateGnuPG.introduction.desc=Enigmail savo kriptografijos funkcijų atlikimui reikalauja GnuPG. Rekomenduojame išlaikyti savo GnuPG diegimą atnaujintą. +updateGnuPG.updateRequired=Yra prieinama naujesnė GnuPG versija. Mes primygtinai rekomenduojame, kad išlaikytumėte savo GnuPG diegimą atnaujintą. Norėdami atsisiųsti ir įdiegti atnaujinimą, spustelėkite ant mygtuko Įdiegti atnaujinimą. +updateGnuPG.noUpdateRequired=GnuPG yra naujausios versijos. +updateGnuPG.cannotUpdate.header=Enigmail palaiko tik šių paketų atnaujinimą: +updateGnuPG.cannotUpdate.footer=Atrodo, kad jūs naudojate kitokį GnuGP variantą; deja, tačiau todėl programai Enigmail nėra įmanoma atnaujinti jūsų GnuGP diegimo. +updateGnuPG.installUpdate=Įdiegti atnaujinimą +updateGnuPG.noMoreUpdates=Ateityje nebetikrinti ar yra atnaujinimų +updateGnuPG.checkUpdate=Tikrinti ar yra GnuPG atnaujinimų + + +#strings in keyserver.jsm +keyserver.error.aborted=Nutraukta +keyserver.error.unknown=Įvyko nežinoma klaida +keyserver.error.serverError=Raktų serveris pranešė apie klaidą. +keyserver.error.importError=Nepavyko importuoti atsisiųsto rakto. +keyserver.error.unavailable=Raktų serveris yra neprieinamas. +keyserver.error.securityError=Raktų serveris nepalaiko šifruotos prieigos. +keyserver.error.certificateError=Raktų serverio liudijimas negalioja. +keyserver.error.unsupported=Enigmail nepalaiko raktų serverio. + +#strings in mimeDecrypt.jsm +mimeDecrypt.encryptedPart.attachmentLabel=Šifruota laiško dalis +mimeDecrypt.encryptedPart.concealedData=Tai yra šifruota laiško dalis. Jūs turite atverti ją atskirame lange, spusteldami ant priedo. + +#strings in gnupg-key.jsm +import.secretKeyImportError=Importuojant slaptuosius raktus, GnuPG įvyko klaida. Importavimas nebuvo sėkmingas. + +#strings in importSettings.js +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ą diff -Nru enigmail-2.0.12+ds1/lang/make-lang.sh enigmail-2.1.3+ds1/lang/make-lang.sh --- enigmail-2.0.12+ds1/lang/make-lang.sh 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/make-lang.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,102 +0,0 @@ -#!/bin/sh - -# make-lang.sh v1.0.10 -# this script is used to create a language-specifi XPI for Enigmail - -# if you want to debug this script, set DEBUG to something >0 -DEBUG=0 - -if [ $# -ne 2 ]; then - echo "Usage: $0 xx-YY version" - echo " where: xx-YY is the language and country code representing the" - echo " translated language" - echo " version is the Enigmail version, e.g. 0.84.1" - exit 1 -fi - -ENIGLANG=$1 -export ENIGLANG - -ENIGVERSION=$2 -export ENIGVERSION - -LANGDIR=${ENIGLANG}/chrome/locale/${ENIGLANG}/enigmail -HELPDIR=${LANGDIR}/help -cwd=`pwd` -rm -rf ${LANGDIR} >/dev/null 2>&1 -mkdir -p ${LANGDIR} -mkdir -p ${HELPDIR} - -LANGHASH=`echo "${ENIGLANG}" | md5sum | awk '{ print substr($0,1,2)}'` -export LANGHASH - -# create chrome.manifest for Thunderbird 3.1 and newer -cat > ${ENIGLANG}/chrome.manifest < ${ENIGLANG}/install.rdf < - - - - - enigmail-${ENIGLANG}@www.enigmail.net - ${ENIGVERSION} - - - - - {3550f703-e582-4d05-9a08-453d09bdfdc6} - 3.1 - 3.1.* - - - - {92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} - 2.0 - 2.1.* - - - - - Enigmail ${ENIGLANG} - Enigmail ${ENIGLANG} language package - - - Enigmail Team - - https://www.enigmail.net/langpack.html - - - chrome://enigmail/content/pref-enigmail.xul - chrome://enigmail/content/enigmailAbout.xul - chrome://enigmail/skin/enigmail-about.png - - - -EOT - -for f in enigmail.dtd enigmail.properties am-enigprefs.properties upgrade_080.html ; do - cp ${f} ${LANGDIR} -done - -if [ -d help ]; then - cd help -fi -pwd - -for f in compose.html editRcptRule.html initError.html messenger.html rulesEditor.html sendingPrefs ; do - cp ${f} ${cwd}/${HELPDIR} -done - -cd ${cwd}/${ENIGLANG}/chrome -zip -r -D enigmail-${ENIGLANG}.jar locale -cd .. -zip ../enigmail-${ENIGLANG}-${ENIGVERSION}.xpi install.rdf chrome.manifest chrome/enigmail-${ENIGLANG}.jar -cd .. - -test $DEBUG -eq 0 && rm -rf ${ENIGLANG} diff -Nru enigmail-2.0.12+ds1/lang/nb/enigmail.dtd enigmail-2.1.3+ds1/lang/nb/enigmail.dtd --- enigmail-2.0.12+ds1/lang/nb/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/nb/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ -Mozilla Public License 2.0."> - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,15 +63,7 @@ - - - - - 'Autocrypt-nøkkeloverføring' krever at e-postklienten på den andre enheten har Autocrypt-støtte. - Selv om dette er den enkleste løsningen, er det foreløpig kun et par programmer som har støtte for standarden. - Den andre måten er 'Sikkerhetskopi og gjenoppretting' av innstillingene dine. - Dette vil opprette en ZIP-fil og all påkrevd informasjon og nøkler, som du så kan kopiere til din nye enhet. - Enigmail kan importere disse innstillingene direkte; for andre e-postklienter, kan ZIP-filen pakkes ut og håndteres manuelt."> + @@ -94,12 +77,13 @@ + - + '"> @@ -122,6 +106,9 @@ + + + @@ -214,6 +201,7 @@ + @@ -222,8 +210,8 @@ - - + + @@ -350,7 +338,7 @@ - + @@ -373,7 +361,6 @@ -Autocrypt er en standard som definerer hvordan man oppnår beleilig ende-til-ende -kryptering av e-post. Den definerer hvordan e-postprogrammer forhandler krypteringsmuligheter ved bruk av vanlige e-poster."> @@ -461,8 +448,8 @@ - - + + @@ -547,7 +534,7 @@ - + @@ -628,7 +615,7 @@ - + @@ -670,140 +657,37 @@ - - - - - - - - - - - - - - - - - - - - -MER: Enigmail vil alltid prøve å bekrefte signaturer i eposter, om det er aktivert for en konto eller ikke"> - + + - - + - - - - - - - - - - - - - - - - - -offentlige nøkkel brukes av andre for å sende deg krypterte eposter. Du kan dele denne med alle. "> -private nøkkel er kun for deg for å dekryptere motatte meldinger og for å sende signerte meldinger. Du bør ikke dele den med noen."> -private nøkkel er kun for deg for å dekryptere motatte meldinger og for å sende signerte meldinger. Du bør ikke dele den med noen. -For å beskytte den private nøkkelen din vil du bli bedt om angi en passfrase i de to følgende dialogboksene."> -Passfrasen er for å beskytte den private nøkkelen din. Den forhindrer misbruk av din private nøkkel."> -ikke"> - - - - - - - - - - - - - - - - - - - - - - - - -Du vil bli forespurt inntasting av ditt passord for dette. Overfør sertifikatet på et medium som kan lagres trygt, som en CD-plate eller et USB-minne. Hvis noen får tilgang til sertifikatet, kan de bruke det til å gjøre nøkkelen din ubrukelig."> - - - - - - - - - - - - -eksporter dataene dine fra din gamle datamaskin ved hjelp av veiviseren for sikkerhetskopiering i Engimail-innstillinger - -importer dataene til en annen maskin ved hjelp av denne veiviseren. - -"> - - - - - - -Takk for at du bruker Enigmail."> -Bekreft forespørselen du finner i innboksen din hvis du ønsker å gjøre det."> - - - - - - - - + + + + + + + + + + + - + @@ -819,16 +703,9 @@ - - -eksporter dataene dine fra din gamle datamaskin ved hjelp av denne veiviseren - -importer dataene til en annen maskin ved hjelp av oppsettsveiviseren. - -"> + + + @@ -850,7 +727,7 @@ - + @@ -877,7 +754,7 @@ - + @@ -891,12 +768,19 @@ - - Velg kontoen du ønsker å overføre nøkkelen din fra. - En oppsettskode (passord) på påfølgende skjerm vil vises, som du må skrive inn på den andre enheten for å importere din nøkkel og relaterte innstillinger."> + + -Bytt til den andre enheten nå og åpne meldingen. Du vil bli forespurt en oppsettskode. Skriv inn følgende tall inn i ledeteksten:"> + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/nb/enigmail.properties enigmail-2.1.3+ds1/lang/nb/enigmail.properties --- enigmail-2.0.12+ds1/lang/nb/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/nb/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=Enigmail varsel -enigConfirm=Enigmail bekreftelse +# enigConfirm=Enigmail Confirmation enigInfo=Enigmail-informasjon enigError=Enigmail feil enigPrompt=Enigmail forespørsel @@ -78,7 +78,7 @@ passSpaceProblem=Av tekniske årsaker kan ikke passfrasen din starte eller slutte med mellomromstegnet. changePassFailed=Endring av passfrase mislyktes. -keyConfirm=Generer offentlige og private nøkler for '%S'? +# keyConfirm=Generate public and secret key for '%S'? keyMan.button.generateKey=&Genererer nøkkel keyAbort=Avbryt nøkkelgenerering? keyMan.button.generateKeyAbort=&Avbryt nøkkelgenerering @@ -86,14 +86,14 @@ expiryTooLong=Du kan ikke lage en nøkkel som utløper om mer enn 100 år. expiryTooLongShorter=Du kan ikke lage en nøkkel som utløper om mer enn 90 år. expiryTooShort=Nøkkelen må være gyldig i minst én dag. -keyGenFailed=Nøkkelgenereringen feilet. Vennligst sjekk Enigmail konsollen(Meny Enigmail > feilsøk Enigmail) for mer detaljer. +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. setKeyExpirationDateFailed=Utløpsdatoen kunne ikke endres. # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail sikkerhetsinformasjon\n\n enigHeader=Enigmail: -# enigContentNote=Enigmail: *Attachments to this message have not been signed or encrypted*\r\n\r\n +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=Mulig PGP/MIME kryptert eller signert melding; klikk knapp for dekryptering for å bekrefte saveAttachmentHeader=Enigmail: Lagre dekryptert vedlegg @@ -102,7 +102,7 @@ beginPgpPart=********* *BEGYNN KRYPTERT ELLER SIGNERT DEL* ********* endPgpPart=********** *AVSLUTT KRYPTERT ELLER SIGNERT DEL* ********** -notePartEncrypted=Enigmail: *Deler av meldignen har IKKE blitt krypert eller signert* +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *Flere meldingsblokker funnet -- dekryptering/bekreftelse avsluttet* decryptOkNoSig=Advarsel\n\nDekryptering var vellykket, men signaturen kunne ikke bekreftes. @@ -114,6 +114,7 @@ fixBrokenExchangeMsg.failed=Klarte ikke å reparere meldingen enigmail.msgViewColumn.label=Enigmal enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key wksNoIdentity=Dene nøkkelen er ikke lenket til noen av dine e-postkontoer. Legg til en konto for minst én av følgende e-postadresse(r):\n\n%S wksConfirmSuccess=Bekreftelses-e-post sendt. wksConfirmFailure=Sending av bekreftelses-e-posten mislyktes. @@ -148,10 +149,9 @@ minimalLineWrapping=Du har angitt at tekstlinjer skal brytes ved %S tegn. For korrept kryptering og/eller signering må denne verdien være minst 68. \nVil du endre tekstbryting til 68 tegn? warning=Advarsel signIconClicked=Du har manuelt modifisert signering. Derfor vil ikke (de)aktivering av signering avhenge av (de)aktivering av kryptering. -errorOwnKeyUnusable=Nøkkel-IDen '%S' som er satt opp for den gjeldende identiteten gir ikke en anvendbar OpenPGP-nøkkel. \n \nForsikre deg om at du har en gyldig, ikke utløpt OpenPGP-nøkkel og at kontoinnstillingene dine peker til denne nøkkelen. \nHvis nøkkelen din ikke er utløpt sjekk om du har satt eiertillit til "full" eller "ultimat". +# 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=Feil under lagring av utkast msgCompose.partiallyEncrypted.short=Pass deg for å lekke sensitiv informasjon - i særdeleshet kryptert e-post. -msgCompose.partiallyEncrypted.mimeMsg=Meldingen du svarer på inneholder både ukrypterte og krypterte deler. Noen ukrypterte deler er ikke synlige for deg.\n\nHvis senderen ikke kan dekryptere de skjulte meldingsdelene opprinnelig, kan det hende du lekker konfidensiell informasjon om at senderen ikke opprinnelig kunne dekryptere selv.\n\nDet anbefales at du ikke svarer på meldingen, men oppretter en ny melding som inneholder svaret ditt. msgCompose.partiallyEncrypted.inlinePGP=Meldingen du svarer på inneholdt både ukrypterte og krypterte deler. Hvis senderen ikke kunne dekryptere noen deler av meldingen opprinnelig, kan det hende du lekker konfidensiell informasjon om at senderen ikke opprinnelig kunne dekryptere selv.\n\nOvervei å fjerne all sitert tekst fra ditt svar til denne avsenderen. msgCompose.internalEncryptionError=Intern feil: avtalt kryptering deaktivert @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=Enigmail er deaktivert for den valgte identiteten msgCompose.protectSubject.tooltip=Beskytt meldingsemnet msgCompose.noSubjectProtection.tooltip=Ikke beskytt meldingsemnet -msgCompose.encryptedSubjectStub=Kryptert melding msgCompose.protectSubject.dialogTitle=Skru på beskyttelse av emnet? msgCompose.protectSubject.question=Vanlige krypterte e-poster inneholder det uredigerte emnet.\n\nVi har etablert en standard for skjuling av det opprinnelige emnet i den krypterte meldingen\nog erstatte det med en lure-tekst, slik at det egentlige emnet kun er synlig etter at e-posten er dekryptert.\n\nØnsker du å beskytte emnet i krypterte meldinger? msgCompose.protectSubject.yesButton=&Beskytt emne @@ -179,7 +178,7 @@ msgCompose.pepSendTrusted=Sikker og betrodd pep.alert.disabledForIdentity=p≡p er avskrudd for nåværende identitet. Skru på p≡p via Enigmail/p≡p-innstillingene. -pep.alert.weakReply=Du er i ferd med å videresende eller svare på en sikker melding på usikkert vis. Hvis du velger å fortsette, vil konfidensiell informasjon om deg kanskje lekke, og også gjøre din samtalepartner skadelidende. Er du sikker på at du ønsker å fortsette? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=Lagre %S melding til %S mappe for usendte elementer? onlineSend=Send %S melding til %S? -encryptKeysNote=Merk: meldingen er kryptert med de følgende brukerid-er / nøkler: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S hiddenKey= -signFailed=Feil i Enigmail; Kryptering/signering feilet. Send ukryptert epost? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=&Send melding ukryptert recipientsSelectionHdr=Velg mottakere for kryptering @@ -225,9 +224,9 @@ signOffWithReason=Signering: AV (%S) reasonEnabledByDefault=påslått som standard reasonManuallyForced=manuelt tvunget -reasonByRecipientRules=tvunget av mottaker-regler +# reasonByRecipientRules=forced by per-recipient rules reasonByAutoEncryption=tvunget av automatisk kryptering -reasonByConflict=grunnet konflikt mellom mottakerregler +# reasonByConflict=due to conflict in per-recipient rules reasonByEncryptionMode=på grunn av krypteringsmodus # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=Inline PGP vil bli benyttet # Attach own key status (tooltip strings): -attachOwnKeyNo=Din egen nøkkel vil ikke bli lagt ved -attachOwnKeyYes=Din egen nøkkel vil bli lagt ved -attachOwnKeyDisabled=Din egen nøkkel kan ikke legges ved. Du må angi en spesifikk nøkkel i OpenPGP-delen av Kontoinnstillinger for å aktivere denne funksjonen. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Konflikt i mottakerrelaterte regler:\n%S\n\nSend melding med desse instillingene? msgCompose.button.configure=&Sett opp @@ -269,6 +268,10 @@ clickDetailsButton=; klikk på detaljer-knappen for mer informasjon clickImportButton=; klikk på importer nøkkel-knappen for å lasted ned nøkkelen keyTypeUnsupported=; nøkkeltypen er ikke støttet av din versjon av GnuPG +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Dekrypter msgPart=Del av meldingen %S msgSigned=signert msgSignedUnkownKey=signert med ukjent nøkkel @@ -280,8 +283,10 @@ needKey=Feil - privat nøkkel trengs til å dekryptere failedDecrypt=Feil - Dekryptering feilet badPhrase=Feil - Feil passfrase +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=Feil - Dekryptering / Verifisering feilet viewInfo=; Vis -> Meldings sikkerhetsinfo for detaljer +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=Dekryptert melding decryptedMsgWithFormatError=Dekryptert melding (reparert misformet PGP epostformat sannsynligvis pga en gammel MS Exchange-tjener. Resultatet kan være vanskelig å lese) @@ -326,6 +331,7 @@ autocryptSetupReq.setupMsg.backup=Du kan beholde denne meldingen og bruke den som sikkerhetskopi for din hemmelige nøkkel. Hvis du ønsker å gjøre det, burde du skrive ned passordet og lagre det sikkert. autocryptSetupReq.message.import=For å importere innstillingene og nøkkel/nøkler i Enigmail, klikk på "Start oppsett" i statusfeltet. autocryptSetupReq.message.sent=Klikk på meldingen på din nye enhet og følg instruksjonene for å importere innstillingene. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js oldGpgVersion20=Igangsetting av Enigmail mislyktes.\n\nDu bruker GnuPG-versjon %1$S, som ikke støttes lenger. Enigmail krever GnuPG-versjon %2$S eller nyere. Oppgrader din GnuPG-installasjon for at Enigmail skal virke. @@ -337,6 +343,8 @@ prefs.warnAskNever=Advarsel: ved å aktivere dette valget resulterer det i en ukryptert melding uten noe videre informasjon om nøkkel ikke finnes for en av mottagerene -- Enigmail vil ikke informere deg om dette skjer! prefs.warnIdleTimeForUnknownAgent=Kan ikke kople til gpg-agent. Dette kan skje om systemet ditt bruker et eget verktøy for passfrasehåndtering (f.eks. gnome-keyring, seahore-agent, KDE wallet manager,...) Dessverre kan ikke Enigmail kontrollere passfrasetimeout for verktøyet du bruker. Innstillinger for dette i Enigmail vil derfor ignoreres. prefEnigmail.oneKeyserverOnly=Feil - du kan kun angi én nøkkeltjener for automatisk nedlasting av manglende OpenPGP-nøkler. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +aboutLicense.desc=Enigmail er fri programvare, under Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=Feil - ingen passfrase er oppgitt noPGPblock=Feil - Ingen beskyttet OpenPGP data blokk er funnet unverifiedReply=Innrykket meldingsdel (svar) er antageligvis endret -keyInMessageBody=Nøkkel funnet i meldingen. Klikk "Importer nøkkel" for å importere den. +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=Feil - Signaturen stemmer ikke overens -cantImport=Feil i importering av offentlig nøkkel\n\n +# cantImport=Error importing public key\n\n doImportOne=Importer %1$S (%2$S)? doImportMultiple=Importer følgende nøkeler? %S previewFailed=Kan ikke lese offentlig nøkkel-fil. @@ -366,14 +374,15 @@ sc.removeCard=Denne operasjonen krever at det ikke er noe smartkort i leseren. Vennligst fjern smartkortet fra leseren og gjenta operasjonen. sc.noCardAvailable=Inget SmartCard ble funnet i leseren.\nVennligst sett inn et kort og gjenta operasjonen. sc.noReaderAvailable=SmartCard-leseren ble ikke funnet.\n Vennligst kobl til leseren. -keyError.keySpecNotFound=E-postadressen "%S" kan ikke koples mot en nøkkel i nøkkelringen din. -keyError.keyIdNotFound=Den angitte nøkkel-IDen "%S" ble ikke funnet i nøkkelringen din. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. keyError.resolutionAction=Velg en gyldig nøkkel i OpenPGP-delen av kontoinnstillingene dine. missingPassphrase=Manglende passfrase errorHandling.gpgAgentInvalid=Systemet ditt bruker en versjon av gpg-agent som ikke passer sammen med GnuPG-versjonen din. errorHandling.gpgAgentError=GnuPG rapporterte en feil i kommunikasjonen med gpg-agent (en komponent i GnuPG). errorHandling.dirmngrError=GnuPG rapporterte en feil i kommunikasjonen med dirmngr (en komponent i GnuPG). errorHandling.pinentryError=GnuPG kan ikke be om passfrasen din via pinentry. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. errorHandling.readFaq=Dette er en førstegangsveiviser- eller oppsettsfeil som hindrer Enigmail i å fungere normalt, og som ikke kan rettes automatisk. \n \nVi anbefaler sterkt at du konsulterer supportnettsiden vår på https://enigmail.net/faq. gpgNotFound=Klarte ikke å finne GnuPG-programmet '%S'\nKontroller banen. @@ -384,9 +393,8 @@ prefBad=Dårlig signatur fra %S failCancel=Feil - Nøkkelhenting avbrutt av bruker -failNoServer=Feil - Ingen nøkkeltjener har blitt spesifisert -failNoID=Feil - Ingen NøkkelID å hente nøkkel for failKeyExtract=Feil - Nøkkelutentings-kommando feilet +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=Feil - Første OpenPGP blokk tilhører ikke en offentlig nøkkel importKeyConfirm=Importer offentlige nøkler fra meldignen? failKeyImport=Feil - nøkkelimportering feilet @@ -425,6 +433,8 @@ identityName=Identitet: %S switchPepMode=Du bruker nå 'p≡p-juniormoduset' i Enigmail.\n\nVed å skru på OpenPGP eller S/MIME for en konto, skrur du av p≡p og bruker 'vanlig'-modus i Enigmail, uten p≡p. enableEnigmail=&Skru av p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Du har aktivert kryptering, men ikke valgt en nøkkel. For å kunne kryptere eposter sendt til %S må du velge en eller flere nøkler å kryptere til. Ønsker du å deaktivere kryptering til: %S? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=Funksjonen du har valg er ikke tilgjengelig i frakoblet modus. Venngligst kobl til og prøv igjen. -protocolNotSupported=Protokollen '%S://' som du har valgt er ikke tilgjengelig for å laste ned OpenPGP nøkler -gpgkeysDisabled=Det vil kanskje hjelpe å aktivere valget: 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=Kunne ikke koble til nøkkeltjener på %S. -keyDownloadFailed=Feilet i å laste ned nøkkel fra tjener. Status-meldingen er:\n%S internalError=En intern feil oppstod. Nøklene kunne ikke bli lastet ned eller importert. -noKeyFound=Beklager, men kunne ikke finne en nøkkel som passet til søket. Vennligst merk at nøkkel-ider skal være prefikset med \\"0x\\" (f.eks. 0xABCDEF12). -keyDownload.keyUnavailable=Nøkkelen med ID %S er ikke tilgjengelig på den nøkkeltjeneren. Mest sannsynlig har ikke eieren av nøkkelen lastet den opp til nøkkeltjeneren.\n\nSpør avsenderen av meldingen om å sende deg deres offentlige nøkkel per e-post. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Klarte ikke å søke eller laste ned nøkkel fra nøkkeltjener: gpgkeys_%S kunne ikke bli utført - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Nøkkelpålitelighet kunne ikke bli satt @@ -490,7 +493,6 @@ asciiArmorFile=ASCII armored-filer (*.asc) importKeyFile=Importer OpenPGP nøkkelfil gnupgFile=GnuPG Filer -createKeyOK=Nøkkelen din har blitt laget saveRevokeCertAs=Lag og lagre tilbaketrekkingssertifikat revokeCertOK=Tilbaketrekkingssertifikatetet har blitt laget. Du kan bruke det til å gjøre din offentlige nøkkel ubrukelig, f.eks. hvis du skulle miste din hemmelige nøkkel. revokeCertFailed=Tilbaketrekkingssertifikatet kunne ikke lages. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%S (0x%S) pub-sec defaultPubKeyFilename=Eksporter offentlige nøkler defaultPubSecKeyFilename=Eksporter offentlige og private nøkler -noSecretKeys=Ingen private nøkler funnet. Ønsker du å generere din egen nøkkel nå? sendKeysOk=Nøkler sendt vellykket sendKeysFailed=Sending av nøkler feilet receiveKeysOk=Nøkler oppdatert vellykket receiveKeysFailed=Nedlasting av nøkler feilet +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=Ønsker du å importere noen nøkler fra utklippstavlen? importFromUrl=Last ned offentlig nøkkel fra denne URLen: copyToClipbrdFailed=Kunne ikke kopiere de valgte nøkler til utklippstavlen copyToClipbrdOK=Valgte nøkler kopiert til utklippstavle -deleteSecretKey=Advarsel: Du er i gang med å slette en privat nøkkel!\nOm du sletter en privat nøkkel, vil du ikke klare å dekryptere meldinger som er kryptert med den offentlige nøkkelen\n\nØnsker du virkelig å både slette den private og den offentlige nøkkelen?\n'%S'? +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=Advarsel: Du er i gang med å slette en privat nøkkel!\nOm du sletter en privat nøkkel, vil du ikke klare å dekryptere meldinger som er kryptert med den offentlige nøkkelen\n\nØnsker du virkelig å både slette den private og den offentlige nøkkelen?\n'%S'? deletePubKey=Ønsker du å slette den offentlige nøkkelen\n'%S'? deleteSelectedPubKey=Ønsker du å slette de offentlige nøklene? @@ -529,7 +531,7 @@ revokeKeyQuestion=Du er i ferd med å trekke tilbake nøkkel '%S'. \n \nDu vil ikke lenger kunne signere med denne nøkkelen, og når tilbaketrekkingen er distribuert vil andre ikke lenger kunne kryptere til denne nøkkelen. Du kan fortsatt bruke nøkkelen for å dekryptere gamle meldinger. \n \nVil du fortsette? revokeKeyOk=Nøkkelen har blitt trukket tilbake. Om nøkkelen er tilgjengelig på en nøkkeltjener er det annbefalt å laste den opp igjen så andre kan se at den er trukket tilbake. revokeKeyFailed=Nøkkelen kunne ikke bli trukket tilbake -revokeKeyNotPresent=Du har ingen nøkkel (0x%S) som stemmer overens med dette tilbakekallingssertifikatet!\n\nHvis du har mistet nøkkelen din, må du importere den (f.eks. fra en nøkkeltjener) før tilbakekallingssertifikatet! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! revokeKeyAlreadyRevoked=Nøkkelen 0x%S har allerede blitt tilbakekalt. refreshAllQuestion=Du valgte ikke noen nøkkel, nøsker du å oppdatere alle? refreshKeyServiceOn.warn=Advarsel: Nøklene dine blir gjenoppfrisket i bakgrunnen så sikkert som mulig.\nÅ gjenoppfriske alle nøklene samtidig vil avsløre informasjon om deg i unøde.\nØnsker du virkelig å gjøre dette? @@ -541,21 +543,21 @@ keyMan.button.import=&Importer keyMan.button.refreshAll=&&Oppdater alle nøkler keyMan.button.revokeKey=&&Trekk tilbake nøkkel -keyMan.button.skip=&&Hopp over nøkkel keylist.noOtherUids=Har ingen andre identiteter keylist.hasOtherUids=Også kjent som -keylist.noPhotos=Ingen bilder tilgjengelig -keylist.hasPhotos=Bilder +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos keyMan.addphoto.filepicker.title=Velg bilde å legge til -keyMan.addphoto.warnLargeFile=Filen du har valgt er større en 25kB. \nNøklene blir veldig store om det legges til store filer, dette anbefales derfor ikke. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. keyMan.addphoto.noJpegFile=Den valgte filen virker ikke å være en JPEG-fil. Vennligst velg en annen fil. keyMan.addphoto.failed=Kunne ikke legge til bildet noWksIdentity=Nøkkelen %S har ikke en WKS-identitet. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -keyman.addBlacklistKey.msg=Ønsker du virkelig av p≡p skal slutte å bruke nøkkelen "%1$S (%2$S)" til kryptering av meldinger? -keyman.removeBlacklistKey.msg=Ønsker du å tillate p≡p å bruke nøkkelen "%1$S (%2$S)" for framtidige meldinger? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? keyman.addBlacklistKey.button=&Svartelist nøkkelen keyman.removeBlacklistKey.button=&Fjern nøkkel fra svarteliste @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Klarte ikke å endre PIN -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Oppdaterer nøkler, vennligst vent ... keyserverProgress.uploading=Laster opp nøkler, vennligst vent... keyserverProgress.wksUploadFailed=Kunne ikke late opp nøkkelen din til nettnøkkeltjenesten keyserverProgress.wksUploadCompleted=Din offentlige nøkkel ble sendt til din tilbyder. Du vil motta en e-post for å bekrefte at du igangsatte opplastingen. keyserverTitle.refreshing=Oppdater nøkler keyserverTitle.uploading=Nøkkelopplasting +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=Passfrasen må inneholde minst åtte tegn. -setupWizard.reallyCancel=Ønsker du virkelig å avbryte Enigmail hjelperen? setupWizard.invalidGpg=Filen du anga er ikke GnuPG-programmet. Vennligst oppig en annen fil. -setupWizard.specifyFile=Du må angi en offentlig nøkkel-fil for å kunne fortsette setupWizard.installFailed=Det virker som om installasjonen ikke gikk bra. Prøv igjen eller installer GnuPG manuelt og angi plassering med Bla igjennom-knappen. setupWizard.downloadForbidden=For din egen sikkerhet laster vi ikke ned GnuPG automatisk. Besøk https://gnupg.org/ for å laste det ned. setupWizard.downloadImpossible=Kan ikke laste ned GnuPG akkurat nå. Prøv igjen senere, eller besøk https://gnupg.org/ for å laste det ned. -setupWizard.hashSumError=Installasjonsveilederen kunne ikke verifisere integriteten til den nedlastede filen. Filen kan være ødelagt eller manipulert. Vil du fortsette installasjonen uansett? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? setupWizard.importSettingsFile=Angi fil å hente sikkerhetskopi fra -setupWizard.invalidSettingsFile=Den angitte filen er ikke en gyldig sikkerhetskopi av Enigmail-innstillinger. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. setupWizard.gpgConfExists=Oppsettsfil for GnuPG finnes allerede. Vil du overskrive den med versjonen fra din gamle installasjon? -setupWizard.noGpgHomeDir=Det virker som du har satt opp %S til bruk for GnuPG. Dog, er ikke dette en mappe - du kan ikke bruke den. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. setupWizard.unmachtedIds=Følgende identiteter for ditt gamle oppsett kunne ikke jamføres:\n%S\nInnstillingene for disse identitetene ble hoppet over. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Det oppsto en feil under nedlasting av GnuPG. Sjekk konsolloggen for flere detaljer. @@ -654,12 +662,12 @@ filter.term.pgpencrypted.label=OpenPGP-kryptert filter.encrypt.label=Krypter til nøkkel (Enigmail) filter.keyRequired=Du må velge en mottagernøkkel. -filter.keyNotFound=Kunne ikke finne krypteringsnøkkel for "%S". -filter.warn.keyNotSecret=Advarsel - filterhandlingen "Krypter til nøkkel" erstatter mottakerne.\n\nHvis du ikke har hemmelig nøkkel for "%S" vil ikke lenger kunne lese e-postene. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -converter.decryptBody.failed=Kunne ikke dekryptere melding med emne \n"%S". \nVil du prøve igjen med en annen passfrase eller vil du hoppe over meldingen? -converter.decryptAtt.failed=Kunne ikke dekryptere vedlegget "%1$S" \ntil meldingen med emne \n"%2$S" \nVil du prøve igjen med en annen passfrase eller vil du hoppe over meldingen? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? saveLogFile.title=Lagre loggfil @@ -691,13 +699,13 @@ enigmailSettings=Enigmail-innstillinger defaultBackupFileName=Enigmail-eksport specifyExportFile=Angi filnavn for eksport -homedirParamNotSUpported=Parametre som angir stier, som --homedir og --keyring, er ikke støttet ved eksport og import av innstillinger. Bruk andre metoder slik som å sette miljøvariabelen GNUPGHOME. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #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 setter opp 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:\n%2$S. Det anbefales at du lager nye nøkler og setter opp kontoene dine til å bruke de nye nøklene. -expiry.keyMissingOwnerTrust=Din hemmelige nøkkel %S har manglende tillit..\n\nDet anbefales at du setter "Du stoler på sertifiseringer" til "ultimat" i nøkkelegenskapene. -expiry.keysMissingOwnerTrust=Følgende av dine hemmelige nøkler har manglende tillit.\n%S.\nDet anbefales at du setter "Du stoler på sertifiseringer" til "ultimat" i nøkkelegenskapene. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. expiry.OpenKeyManager=Åpne Enigmail-nøkkelbehandling expiry.OpenKeyProperties=Åpne nøkkelegenskaper @@ -709,6 +717,7 @@ gpghomedir.notwritable=Mappen "%S" som inneholder dine OpenPGP-nøkler er ikke skrivbar. gpghomedir.notdirectory=Mappen "%S" som inneholder dine OpenPGP-nøkler er en fil istedenfor en mappe. gpghomedir.notusable=Ordne mappetilganger eller endre plasseringen for "hjem"-mappen for din GnuPG-mappe. GnuPG trenger dette for å fungere. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=Kan ikke bekrefte p≡p-tillitsord for egen konto. @@ -728,12 +737,12 @@ pepPrivacyStatus.RatingMistrustSuggestion=Gjenopprett tilkoblingen med din samtalepartner og prøv å fullføre et nytt handtrykk. pepPrivacyStatus.RatingReliableSuggestion=Sluttfør et håndtrykk med din samtalepartner ved å utveksle tillitsord på tomannshånd eller over telefon. Et håndtrykk trengs én gang per partner, og vil sikre at kommunikasjonen er sikker og betrodd. pepPrivacyStatus.RatingTrustedSuggestion=Ingen handling nødvendig! -pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Ha i minnet at det kan hende meldingen ikke er sikker. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Legg til nødvendig informasjon. -pepPrivacyStatus.RatingUnderAttackSuggestion=Bekreft innholdet i denne meldingen med din samtalepartner i en annen kanal. -pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Forsikre deg om at personvernsstatusen for hver samtalepartner som er opplistet minst er "sikker". +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". pepPrivacyStatus.RatingUnencryptedSuggestion=Spør din kommunikasjonspartner om å bruke en krypteringsløsning eller installere p≡p. -pepPrivacyStatus.RatingUnreliableSuggestion=Denne meldingen har ingen pålitelig kryptering eller mangler signatur. Spør din samtalepartner om å oppgradere deres krypteringsløsning, eller installere p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. pepPrivacyStatus.RatingBrokenExplanation=Meldingen har knekt kryptering eller formatering. pepPrivacyStatus.RatingHaveNoKeyExplanation=Meldingen kan ikke dekrypteres fordi nøkkelen ikke er tilgjengelig. @@ -763,16 +772,16 @@ handshakeDlg.label.outgoingMessage=Utgående melding handshakeDlg.label.incomingMessage=Innkommende melding handshakeDlg.error.noPeers=Kan ikke utføre håndtrykk uten korrespondenter. -handshakeDlg.error.noProtection=Skru på beskyttelse for å bruke "Håndtrykk"-funksjonen. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -enigmail.acSetupPasswd.descEnterPasswd=Skriv inn oppsettskoden som vises på den andre enheten. -enigmail.acSetupPasswd.descCopyPasswd=Angi oppsettskoden nedenfor på din andre enhet for å fortsette oppsettet +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm autocrypt.setupMsg.subject=Autocrypt-oppsettsmelding autocrypt.setupMsg.msgBody=For å sette opp din nye enhet til bruk med Autocrypt, følg instruksjonene som forhåpentligvis presenteres for deg av din nye enhet. -autocrypt.setupMsg.fileTxt=Dette er Autocrypt-oppsettsfilen som brukes til å overføre innstillinger og nøkler mellom klienter. Du kan dekryptere den ved bruk av oppsettskoden som vises på din gamle enhet, og så importere nøkkelen den inneholder til din nøkkelring. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html upgradeInfo.doctitle=Hva er nytt i Enigmail v2.0? @@ -785,10 +794,12 @@ upgradeInfo.autocrypt.title=Støtte for Autocrypt upgradeInfo.autocrypt.desc=Enigmail støtter nå Autocrypt, en ny standard for å distribuere nøkler som del av sendte meldinger. Enigmail importerer automatisk nøkler meldinger av Autocrypt-standard, slik at at flere og flere e-poster kan krypteres ettersom tiden går. upgradeInfo.pEp.title=Nytt p≡p-juniormodus (praktisk enkelt personvern) -upgradeInfo.pEp.desc=Enigmail inneholder et p≡p juniormodus. Du må installere p≡p manuelt for å få dette; dette vil endre seg i en senere versjon. p≡p-juniormodus lar deg bruke OpenPGP-kryptering så transparent som mulig; du trenger ikke å tenke på nøkkelbehandling og synkronisering av nøkler mellom enheter lenger. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. upgradeInfo.bottom.desc=Besøk dokumentasjonen for hjelp med bruk av Enigmail. +#strings in pEpAdapter.jsm pep.missingGnuPG=For å kunne bruke Enigmail/p≡p, kreves GnuPG. Siden det ikke ble fannet, kan det lastes ned og installeres for deg. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=Om Enigmail @@ -799,6 +810,7 @@ aboutEnigmail.documentation=Dokumentasjon: aboutEnigmail.testing=Testing: aboutEnigmail.userSupport=Brukerstøtte: +# aboutEnigmail.userSupport.team=the team and the list/forum members aboutEnigmail.localization=Lokalisering: Sjekk Enigmail-språkpakkesiden aboutEnigmail.Credits=Bidragsytere: aboutEnigmail.origAuthor=Opprinnelig utvikler av Enigmail-tillegget @@ -808,3 +820,38 @@ aboutEnigmail.licenseSupportTitle=Lisens og støtte aboutEnigmail.license=Enigmail OpenPGP er fri programvare, under %S aboutEnigmail.support=Støtte og nedlastinger tilgjengelig fra www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/nl/enigmail.dtd enigmail-2.1.3+ds1/lang/nl/enigmail.dtd --- enigmail-2.0.12+ds1/lang/nl/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/nl/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ -Mozilla Public License 2.0."> - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,14 +63,7 @@ - - - - -‘Autocrypt-sleuteloverbrenging’ vereist dat het e-mailprogramma op het andere apparaat compatibel is met Autocrypt. -Hoewel dit de eenvoudigere oplossing is, ondersteunen slechts een paar applicaties op dit moment deze standaard.De andere manier is via ‘het maken en terugzetten van een reservekopie’ van uw instellingen. -Dit creëert een zipbestand met alle benodigde informatie en sleutels, dat u naar uw nieuwe apparaat kunt kopiëren. -Enigmail kan deze instellingen direct importeren; voor andere e-mailprogramma’s kan het zipbestand uitgepakt worden en handmatig worden verwerkt."> + @@ -93,12 +77,13 @@ + - + ’"> @@ -121,6 +106,9 @@ + + + @@ -213,6 +201,7 @@ + @@ -221,8 +210,8 @@ - - + + @@ -349,7 +338,7 @@ - + @@ -372,7 +361,6 @@ -Autocrypt is een standaard die definieert hoe u eenvoudig end-to-end-versleuteling van e-mailberichten kunt bereiken. Het specificeert hoe e-mailprogramma’s onderhandelen over versleutelingsmogelijkheden via reguliere e-mailberichten."> @@ -460,8 +448,8 @@ - - + + @@ -546,7 +534,7 @@ - + @@ -669,139 +657,40 @@ - - + - - - - - - - - - - - - - - - - - -Let op: Enigmail zal altijd de ondertekeningen van e-mails controleren, of Enigmail nu voor die account is ingeschakeld of niet."> - - - + - - - - - - - - - - - - - - - - - -publieke sleutel kunnen andere personen u versleutelde berichten sturen. U kunt deze aan iedereen geven."> -privésleutel is alleen voor uzelf en is nodig om e-mails te ontcijferen en ondertekende e-mails te verzenden. - U moet deze sleutel geheim houden en aan niemand geven."> -privésleutel is alleen voor uzelf en is nodig om e-mails te ontcijferen en ondertekende e-mails te verzenden. - U moet deze sleutel geheim houden en aan niemand geven. - Om uw privésleutel te beschermen, wordt in de volgende twee dialoogvensters om een wachtwoordzin gevraagd."> -wachtwoordzin is een wachtwoord om uw privésleutel mee te beschermen. Deze voorkomt misbruik van uw privésleutel."> -niet aanbevolen."> - - - - - - - - - - - - - - - - - - - - - - - - -U wordt gevraagd om hiervoor uw wachtwoord in te voeren. Plaats dit certificaat op een medium waar het veilig opgeborgen kan worden, zoals een CD of een USB-stick. Als iemand dit certificaat bemachtigd, kan hij dit gebruiken om uw sleutel onbruikbaar te maken,"> - - - - - - - - - - - - exporteer uw gegevens van uw oude computer door middel van de back-upwizard in de Enigmail-instellingen - importeer de gegevens op uw nieuwe computer door middel van deze wizard. - "> - - - - - - -Bedankt voor het gebruiken van Enigmail."> -Bevestig het verzoek in uw Postvak IN als u dit wilt doen."> - - - - - - - - + + + + + + + + + + + - + @@ -817,12 +706,9 @@ - - exporteer uw gegevens van uw oude computer door middel van deze wizard - importeer de gegevens op uw nieuwe computer door middel van de Installatiewizard. - "> + + + @@ -842,7 +728,7 @@ - + @@ -869,7 +755,7 @@ - + @@ -883,12 +769,21 @@ - -Selecteer hieronder de account waarvoor je je sleutel wilt overzetten. -Er wordt een instellingscode (wachtwoord) getoond op het volgende scherm, die je op het andere apparaat moet invoeren om je sleutel en overige instellingen te importeren."> + + -Schakel over naar het nieuwe apparaat en open het bericht. Als het goed is, word je gevraagd om de instellingscode. Type de volgende cijfers in op de prompt:"> + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/nl/enigmail.properties enigmail-2.1.3+ds1/lang/nl/enigmail.properties --- enigmail-2.0.12+ds1/lang/nl/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/nl/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -86,14 +86,14 @@ expiryTooLong=Het is niet mogelijk om een sleutel te maken die over meer dan 100 jaar vervalt. expiryTooLongShorter=Het is niet mogelijk om een sleutel te maken die over meer dan 90 jaar vervalt. expiryTooShort=Uw sleutel moet minstens één dag geldig zijn. -keyGenFailed=Aanmaken sleutel mislukt. Bekijk de console van Enigmail voor details (Menu Enigmail > Enigmail debuggen). +keyGenFailed=Het aanmaken van de sleutel is mislukt. Bekijk de console van Enigmail voor details (Menu Enigmail > Enigmail debuggen). setKeyExpirationDateFailed=De vervaldatum kon niet worden gewijzigd # Strings in enigmailMessengerOverlay.js securityInfo=Beveiligingsinformatie van Enigmail\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Bijlagen bij dit bericht zijn niet ondertekend of versleuteld*\n\n +enigContentNote=Enigmail: *bijlagen bij dit bericht zijn niet ondertekend of versleuteld*\n\n possiblyPgpMime=Mogelijk met PGP/MIME versleuteld of ondertekend bericht; klik op de knop Ontcijferen om te verifiëren saveAttachmentHeader=Enigmail: ontcijferde bijlage opslaan @@ -102,7 +102,7 @@ beginPgpPart=********* *BEGIN VAN VERSLEUTELD of ONDERTEKEND DEEL* ********* endPgpPart=********** *EINDE VAN VERSLEUTELD of ONDERTEKEND DEEL* ********** -notePartEncrypted=Enigmail: *Delen van het bericht zijn NIET ondertekend of versleuteld* +notePartEncrypted=Enigmail: *delen van het bericht zijn NIET ondertekend of versleuteld* noteCutMessage=Enigmail: *Meerdere berichtblokken gevonden - ontcijferen/verifiëren afgebroken* decryptOkNoSig=Waarschuwing\n\nOntcijfering is gelukt, maar de ondertekening kon niet juist worden geverifieerd @@ -114,6 +114,7 @@ fixBrokenExchangeMsg.failed=Berichtreparatie mislukt. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key wksNoIdentity=Deze sleutel is niet aan een van uw e-mailaccounts verbonden. Voeg een account voor tenminste een van de volgende e-mailadressen toe:\n\n%S wksConfirmSuccess=Bevestigings-e-mail verzonden. wksConfirmFailure=Het versturen van de bevestigings-e-mail is mislukt. @@ -139,7 +140,7 @@ sendWithHiddenBcc=BCC-ontvangers verbergen sendWithShownBcc=Normaal versleutelen sendingNews=Versleutelde verzending afgebroken.\n\nDit bericht kan niet worden versleuteld, omdat er nieuwsgroepontvangers zijn. Verzend het bericht opnieuw zonder versleuteling. -sendToNewsWarning=U staat op het punt een versleutelde e-mail naar een nieuwsgroep te verzenden.\n\nDit wordt afgeraden, omdat dit alleen zin heeft als alle leden van de groep dit bericht kunnen ontcijferen, dus het bericht moet worden versleuteld met de sleutels van alle leden van de groep. Verzend dit bericht alleen als u precies weet wat u doet.\n\nDoorgaan? +sendToNewsWarning=Waarschuwing: je staat op het punt een versleutelde e-mail naar een nieuwsgroep te verzenden.\n\nDit wordt afgeraden, omdat dit alleen zin heeft als alle leden van de groep dit bericht kunnen ontcijferen, dus het bericht moet worden versleuteld met de sleutels van alle leden van de groep. Verzend dit bericht alleen als je precies weet wat je doet.\n\nDoorgaan? hasHTML=HTML-berichtwaarschuwing:\nDit bericht bevat vermoedelijk HTML, wat ervoor kan zorgen dat ondertekening of versleuteling mislukt. Houd de SHIFT-toets ingedrukt wanneer u op de knop Opstellen/Antwoorden klikt om een ondertekend bericht te verzenden en dit probleem in de toekomst te vermijden. Als u dit berichten standaard ondertekent, vink dan de optie ‘Berichten opstellen in HTML-indeling’ uit om het gebruik van HTML voor deze account definitief uit te schakelen. strippingHTML=Het bericht bevat HTML-opmaakgegevens. Deze gaat verloren bij het converteren naar platte tekst voor ondertekening of versleuteling. Wilt u doorgaan? msgCompose.button.sendAnyway=Bericht toch &verzenden @@ -148,11 +149,10 @@ minimalLineWrapping=U hebt regelterugloop ingesteld op %S tekens. Voor juiste versleuteling en/of ondertekening moet dit getal minstens 68 zijn.\nWilt u de regelterugloop nu naar 68 tekens wijzigen? warning=Waarschuwing signIconClicked=U hebt handmatig ondertekenen aangepast. Daarom zal het (de)activeren van de ondertekening tijdens het opstellen van dit bericht niet meer afhankelijk zijn van het (de)activeren van de versleuteling. -errorOwnKeyUnusable=De sleutel-ID ‘%S’ die voor de huidige identiteit is geconfigureerd, levert geen bruikbare OpenPGP-sleutel op.\n\nZorg ervoor dat u een geldige, niet-vervallen OpenPGP-sleutel hebt en dat deze in uw accountinstellingen is ingesteld.\nAls uw sleutel niet is vervallen, controleer dan of u het Eigenaarsvertrouwen op volledig of maximaal hebt ingesteld. +errorOwnKeyUnusable=De sleutel-ID ‘%S’ die voor de huidige identiteit is geconfigureerd, levert geen bruikbare OpenPGP-sleutel op.\n\nZorg ervoor dat u een geldige, niet-vervallen OpenPGP-sleutel hebt en dat deze in uw accountinstellingen is ingesteld.\nAls uw sleutel niet is vervallen, controleer dan of u het Eigenaarsvertrouwen op ‘volledig’ of ‘maximaal’ hebt ingesteld. msgCompose.cannotSaveDraft=Fout bij opslaan van concept msgCompose.partiallyEncrypted.short=Pas op dat u geen gevoelige informatie lekt - gedeeltelijk versleuteld e-mailbericht. -msgCompose.partiallyEncrypted.mimeMsg=Het bericht waarop u antwoordt, bevat zowel onversleutelde als versleutelde delen. Sommige versleutelde delen zijn niet zichtbaar voor u.\n\nAls de afzender niet in staat was om de verborgen delen te ontsleutelen, is het mogelijk dat u vertrouwelijke informatie lekt die de afzender zelf niet kon ontsleutelen.\n\nWij adviseren u niet op het bericht te antwoorden, maar om een nieuw bericht te maken met uw antwoord. -msgCompose.partiallyEncrypted.inlinePGP=Het bericht waarop u antwoordt, bevat zowel onversleutelde als versleutelde delen. Als de afzender niet in staat was om sommige delen te ontsleutelen, is het mogelijk dat u vertrouwelijke informatie lekt die de afzender zelf niet kon ontsleutelen.\n\nWij adviseren u alle geciteerde tekst uit uw antwoord aan deze afzender te verwijderen. +msgCompose.partiallyEncrypted.inlinePGP=Het bericht waarop u antwoordt, bevat zowel onversleutelde als versleutelde delen. Als de afzender niet in staat was om sommige delen te ontcijferen, is het mogelijk dat u vertrouwelijke informatie lekt die de afzender zelf niet kon ontcijferen.\n\nWij adviseren u alle geciteerde tekst uit uw antwoord aan deze afzender te verwijderen. msgCompose.internalEncryptionError=Interne fout: beloofde versleuteling uitgeschakeld msgCompose.internalError=Er is een interne fout opgetreden. @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=Enigmail is voor het gekozen profiel uitgeschakeld msgCompose.protectSubject.tooltip=Het berichtonderwerp beschermen msgCompose.noSubjectProtection.tooltip=Het berichtonderwerp niet beschermen -msgCompose.encryptedSubjectStub=Versleuteld bericht msgCompose.protectSubject.dialogTitle=Bescherming van Onderwerp inschakelen? msgCompose.protectSubject.question=Normale versleutelde berichten bevatten het ongeredigeerde onderwerp. Wij hebben een standaard bewerkstelligd om het oorspronkelijke onderwerp te verbergen in het versleutelde bericht en het te vervangen door een dummytekst, zodat het onderwerp alleen zichtbaar is nadat het e-mailbericht is ontsleuteld.\n\nWilt u het onderwerp van versleutelde berichten beschermen? msgCompose.protectSubject.yesButton=Onderwerp &beschermen @@ -179,7 +178,7 @@ msgCompose.pepSendTrusted=veilig & vertrouwd pep.alert.disabledForIdentity=p≡p is voor de huidige identiteit uitgeschakeld. Schakel p≡p in via Enigmail/p≡p-voorkeuren. -pep.alert.weakReply=U staat op het punt om een veilig bericht onveilig te beantwoorden. Als u doorgaat, kan er vertrouwelijke informatie lekken, waardoor u en uw correspondent in gevaar gebracht kunnen worden. Weet u zeker dat u door wilt gaan? +pep.alert.weakReply=U staat op het punt om een veilig bericht onveilig door te sturen of te beantwoorden. Als u doorgaat, kan er vertrouwelijke informatie lekken, waardoor u en uw correspondent in gevaar gebracht kunnen worden. Weet u zeker dat u door wilt gaan? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=%S bericht opslaan naar %S in map Niet-verzonden berichten? onlineSend=%S bericht naar %S verzenden? -encryptKeysNote=Let op: het bericht is met de volgende gebruikers-ID/-sleutel versleuteld: %S +encryptKeysNote=Noot: het bericht is met de volgende gebruikers-ID/-sleutel versleuteld: %S hiddenKey= -signFailed=Fout in Enigmail; Versleuteling/ondertekening mislukt; niet-versleuteld bericht verzenden? +signFailed=Fout in Enigmail: versleuteling/ondertekening is mislukt. Wilt u het bericht niet-versleuteld verzenden? msgCompose.button.sendUnencrypted=Onversleuteld bericht &verzenden recipientsSelectionHdr=Ontvangers voor versleuteling selecteren @@ -227,7 +226,7 @@ reasonManuallyForced=handmatig afgedwongen reasonByRecipientRules=afgedwongen door ontvangerregels reasonByAutoEncryption=afgedwongen door automatische versleuteling -reasonByConflict=vanwege conflict in de ontvangerregels +reasonByConflict=door conflicterende ontvangerregels reasonByEncryptionMode=vanwege versleutelingsmodus # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=Inline PGP zal worden gebruikt # Attach own key status (tooltip strings): -attachOwnKeyNo=Uw eigen sleutel zal niet worden gekoppeld -attachOwnKeyYes=Uw eigen sleutel zal worden gekoppeld -attachOwnKeyDisabled=Uw eigen sleutel kan niet worden gekoppeld. U moet een specifieke sleutel selecteren\nin de sectie OpenPGP van de Accountinstellingen om deze functie in te schakelen. +attachOwnKeyNo=Uw eigen publieke sleutel zal niet worden gekoppeld +attachOwnKeyYes=Uw eigen publieke sleutel zal worden gekoppeld +attachOwnKeyDisabled=Uw eigen publieke sleutel kan niet worden gekoppeld. U moet een specifieke sleutel selecteren\nin de sectie OpenPGP van de accountinstellingen om deze functie in te schakelen. rulesConflict=Conflicterende per-ontvanger-regels gevonden\n%S\n\nBericht met deze instellingen verzenden? msgCompose.button.configure=&Instellen @@ -269,6 +268,10 @@ clickDetailsButton=; klik op ‘Details’ voor meer informatie clickImportButton=; klik op ‘Sleutel importeren’ om de sleutel te importeren keyTypeUnsupported=; het sleuteltype wordt niet door uw versie van GnuPG ondersteund +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Ontcijferen msgPart=Deel van het bericht %S msgSigned=ondertekend msgSignedUnkownKey=ondertekend met onbekende sleutel @@ -280,8 +283,10 @@ needKey=Fout - geheime sleutel nodig om het bericht te ontcijferen failedDecrypt=Fout - ontcijfering mislukt badPhrase=Fout - onjuiste wachtwoordzin +missingMdcError=Fout - ontbrekende of ongeldige integriteitsbescherming (MDC) failedDecryptVerify=Fout - ontcijfering/verificatie mislukt viewInfo=; Beeld > Berichtbeveiliginginfo voor details +brokenExchangeMessage=Ongeldig PGP/MIME-bericht van MS Exchange decryptedMsg=Ontcijferd bericht decryptedMsgWithFormatError=Ontcijferd bericht (beschadigde PGP-e-mailindeling hersteld, waarschijnlijk veroorzaakt door een oude Exchange-server, waardoor het resultaat misschien niet perfect leesbaar is) @@ -326,6 +331,7 @@ autocryptSetupReq.setupMsg.backup=U kunt dit bericht bewaren en het gebruiken als een veiligheidskopie van uw privésleutel. Als u dit wilt doen, schrijf dan het wachtwoord op en bewaar dit op een veilige plaats. autocryptSetupReq.message.import=Klik op de knop ‘Set-up starten’ in de statusbalk om de instellingen en sleutel(s) in Enigmail te importeren autocryptSetupReq.message.sent=Klik op het bericht op uw nieuwe apparaat en volg de instructies om uw instellingen te importeren. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js oldGpgVersion20=Initialisatie van Enigmail is mislukt.\n\nU gebruikt GnuPG versie %1$S, die niet meer wordt ondersteund. Enigmail vereist GnuPG versie %2$S of nieuwer. Upgrade uw installatie van GnuPG, anders zal Enigmail niet werken. @@ -337,6 +343,8 @@ prefs.warnAskNever=Waarschuwing: het aanzetten van deze optie zal leiden tot onversleutelde e-mails zonder enig bericht als er voor een van de ontvangers geen sleutel bestaat - Enigmail zal u niet informeren als dit gebeurt! prefs.warnIdleTimeForUnknownAgent=Kon geen verbinding met gpg-agent maken. Misschien gebruikt uw systeem een aangepast programma voor het afhandelen van uw wachtwoordzin (bv. gnome-keyring of seahorse-agent). Enigmail heeft helaas geen invloed op de geldigheidsduur van de wachtwoordzin van het programma dat u gebruikt. De instellingen in Enigmail worden daarom genegeerd. prefEnigmail.oneKeyserverOnly=Fout - u kunt slechts één sleutelserver instellen voor het automatisch downloaden van ontbrekende OpenPGP-sleutels. +acSetupMessage.desc=Uw sleutel overbrengen naar een ander Autocrypt-enabled apparaat. (Wat is Autocrypt) +aboutLicense.desc=Enigmail is open source en gelicentieerd onder de Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -355,7 +363,7 @@ unverifiedReply=Ingesprongen berichtdeel (antwoord) is waarschijnlijk aangepast keyInMessageBody=Sleutel in berichttekst gevonden. Klik op ‘Sleutel importeren’ om de sleutel te importeren sigMismatch=Fout - Ondertekeningen komen niet overeen -cantImport=Fout bij het importeren van publieke sleutel\n\n +cantImport=Fout bij het importeren van de publieke sleutel\n\n doImportOne=%1$S (%2$S) importeren? doImportMultiple=De volgende sleutels importeren?\n\n%S previewFailed=Kan het bestand met de publieke sleutel niet importeren. @@ -374,6 +382,7 @@ errorHandling.gpgAgentError=GnuPG heeft een fout gemeld in de communicatie met gpg-agent (een component van GnuPG). errorHandling.dirmngrError=GnuPG heeft een fout gemeld in de communicatie met dirmngr (een component van GnuPG). errorHandling.pinentryError=GnuPG kan niet om uw wachtwoordzin vragen via pincode-invoer. +errorHandling.pinentryCursesError=Uw GnuPG-installatie is geconfigureerd om de console te gebruiken voor pincode-invoer. Als u Enigmail gebruikt, moet u echter een grafische versie gebruiken. errorHandling.readFaq=Dit is een systeeminstallatie- of configuratiefout die voorkomt dat Enigmail goed kan werken en niet automatisch kan worden hersteld.\n\nHet wordt ten zeerste aanbevolen onze ondersteuningswebsite https://enigmail.net/faq te raadplegen. gpgNotFound=Kan het GnuPG-programma ‘%S’ niet vinden.\nZorg ervoor dat u het uitvoerbare pad van GPG goed hebt ingesteld in de Enigmail-voorkeuren. @@ -384,9 +393,8 @@ prefBad=ONJUISTE ondertekening van %S failCancel=Fout - Sleutelontvangst geannuleerd door gebruiker -failNoServer=Fout - Geen sleutelserver opgegeven om sleutels van te ontvangen -failNoID=Fout - Geen sleutel-ID opgegeven om een sleutel voor te ontvangen failKeyExtract=Fout - sleutelextractieopdracht mislukt +failKeyNoSubkey=Geen geldige (sub-)sleutel notFirstBlock=Fout - Eerste OpenPGP-blok is geen publiek sleutelblok importKeyConfirm=Publieke sleutel(s) die in het bericht zijn ingesloten importeren? failKeyImport=Fout - sleutel importeren mislukt @@ -425,6 +433,8 @@ identityName=Identiteit: %S switchPepMode=U gebruikt momenteel de ‘p≡p-juniormodus’ van Enigmail.\n\nDoor OpenPGP of S/MIME voor een account in te schakelen, schakelt u p≡p en de ‘normale’ modus van Enigmail zonder p≡p uit. enableEnigmail=p≡p &uitschakelen +amPrefAutocrypt.desc=Autocrypt is een standaard die definieert hoe u eenvoudig end-to-end-versleuteling van e-mailberichten kunt bereiken. Het specificeert hoe e-mailprogramma’s onderhandelen over versleutelingsmogelijkheden via reguliere e-mailberichten. + # Strings used in enigmailSingleRcptSettings.js noEncryption=U hebt versleuteling geactiveerd, maar geen sleutel geselecteerd. Om versleutelde mails naar %S te verzenden, dient u een geldige sleutel uit uw sleutellijst op te geven. Wilt u versleuteling voor %S uitschakelen? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=De functie die u hebt geselecteerd, is niet in de offlinemodus beschikbaar. Ga online en probeer het opnieuw. -protocolNotSupported=Het protocol ‘%S://’ dat u hebt geselecteerd, wordt niet ondersteund bij het downloaden van OpenPGP-sleutels. -gpgkeysDisabled=Het zou helpen als u de optie ‘extensions.enigmail.useGpgKeysTool’ inschakelt. noKeyserverConn=Kon geen verbinding maken met sleutelserver op %S. -keyDownloadFailed=Downloaden van sleutel van sleutelserver mislukt. Statusbericht is:\n%S internalError=Er is een interne fout opgetreden. De sleutels konden niet worden gedownload of geïmporteerd. -noKeyFound=Sorry, ik kon geen sleutel vinden die aan de zoekcriteria voldoet.\nOnthoud dat de sleutel-ID’s moeten worden voorafgegaan door ‘0x’ (bv. 0xABCDEF12). -keyDownload.keyUnavailable=De sleutel met ID %S is helaas niet beschikbaar op de keyserver. Waarschijnlijk heeft de eigenaar van de sleutel zijn sleutel niet naar de keyserver geüpload.\n\nVraag de afzender van het bericht om u zijn sleutel via e-mail toe te sturen. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Zoeken naar of downloaden van sleutel van sleutelserver mislukt: gpgkeys_%S kon niet worden uitgevoerd. - +noKeyFound=Wij konden geen sleutel vinden die aan de opgegeven zoekcriteria voldoet. +keyDownload.keyUnavailable=De sleutel met ID %S is niet beschikbaar op de sleutelserver. Waarschijnlijk heeft de eigenaar van de sleutel zijn sleutel niet naar de sleutelserver geüpload.\n\nVraag de afzender van het bericht om u zijn sleutel via e-mail toe te sturen. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Instellen van sleutelvertrouwen mislukt @@ -488,9 +491,8 @@ userAtt.photo=Gebruikerskenmerk (JPEG-afbeelding) asciiArmorFile=ASCII-armored bestanden (*.asc) -importKeyFile=OpenPGP-bestand importeren +importKeyFile=OpenPGP-sleutelbestand importeren gnupgFile=GnuPG-bestanden -createKeyOK=Uw sleutel is gegenereerd saveRevokeCertAs=Intrekkingscertificaat aanmaken en opslaan revokeCertOK=Het intrekkingscertificaat is met succes aangemaakt. U kunt dit certificaat gebruiken om uw publieke sleutel ongeldig te maken, bijvoorbeeld als u uw geheime sleutel hebt verloren. revokeCertFailed=Het intrekkingscertificaat kon worden niet aangemaakt. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%1$S (0x%2$S) pub-sec defaultPubKeyFilename=Geëxporteerde-publieke-sleutels defaultPubSecKeyFilename=Geëxporteerde-publieke-en-geheime-sleutels -noSecretKeys=Geen geheime sleutels gevonden.\n\nWilt u uw eigen sleutel nu aanmaken? sendKeysOk=Sleutel(s) met succes verzonden sendKeysFailed=Verzenden van sleutels is mislukt receiveKeysOk=Sleutel(s) met succes bijgewerkt receiveKeysFailed=Downloaden van sleutels mislukt +keyUpload.verifyEmails=De sleutelserver zal u een e-mail sturen voor elk e-mailadres van de sleutel die u heeft geüpload. Om de publicatie van uw sleutel te bevestigen, moet u op de koppeling in elke e-mail die u ontvangt klikken. importFromClip=Wilt u de sleutel(s) van het klembord importeren? importFromUrl=Publieke sleutel van deze URL downloaden: copyToClipbrdFailed=Kopiëren van sleutels naar het klembord mislukt. copyToClipbrdOK=Sleutel(s) naar het klembord gekopieerd -deleteSecretKey=WAARSCHUWING: u gaat een geheime sleutel verwijderen!\nAls u uw geheime sleutel verwijdert, kunt u geen versleutelde berichten voor die sleutel meer ontcijferen en u kunt u uw sleutel niet meer intrekken.\n\nWeet u zeker dat u zowel uw geheime als uw publieke sleutel ‘%S’ wilt verwijderen? +deleteSecretKey=WAARSCHUWING: u gaat een geheime sleutel verwijderen!\nAls u uw geheime sleutel verwijdert, kunt u geen versleutelde berichten voor die sleutel meer ontcijferen en kunt u uw sleutel niet meer intrekken.\n\nWeet u zeker dat u zowel uw geheime als uw publieke sleutel ‘%S’ wilt verwijderen? deleteMix=WAARSCHUWING: je gaat geheime sleutels verwijderen!\nAls je je geheime sleutel verwijdert, kun je je berichten niet meer met die sleutel ontcijferen.\n\nWeet je zeker dat je BEIDE sleutels wilt verwijderen, zowel de geheime als de publieke sleutel? deletePubKey=Wilt u de publieke sleutel verwijderen?\n‘%S’ deleteSelectedPubKey=Wilt u de publieke sleutels verwijderen? @@ -529,7 +531,7 @@ revokeKeyQuestion=U gaat de sleutel ‘%S’ intrekken.\n\nU zal niet meer kunnen ondertekenen met deze sleutel, en zodra verspreid, kunnen anderen deze niet meer voor het versleutelen gebruiken. U kunt deze sleutel nog wel gebruiken voor het ontcijferen van oude berichten.\n\nWilt u doorgaan? revokeKeyOk=De sleutel is ingetrokken. Als uw sleutel op een sleutelserver beschikbaar is, wordt aanbevolen de sleutel opnieuw te uploaden, zodat anderen de intrekking kunnen zien. revokeKeyFailed=De sleutel kon niet worden ingetrokken. -revokeKeyNotPresent=U heeft geen sleutel (0x%S) die overeenkomt met dit intrekkingscertificaat!\n\nAls u uw sleutel bent kwijtgeraakt, moet u hem voor het intrekkingscertificaat importeren (bv. van een sleutelserver)! +revokeKeyNotPresent=U hebt geen sleutel (0x%S) die overeenkomt met dit intrekkingscertificaat!\n\nAls u uw sleutel bent kwijtgeraakt, moet u hem importeren vóór u het intrekkingscertificaat importeert (bv. van een sleutelserver)! revokeKeyAlreadyRevoked=De sleutel 0x%S is al ingetrokken. refreshAllQuestion=U hebt geen sleutel geselecteerd. Wilt u ALLE sleutels verversen? refreshKeyServiceOn.warn=Waarschuwing: uw sleutels worden momenteel zo veilig mogelijk in de achtergrond ververst.\nAls u al uw sleutels tegelijk ververst, zal dit onnodig informatie over u onthullen.\nWilt u dit echt doen? @@ -541,7 +543,6 @@ keyMan.button.import=&Importeren keyMan.button.refreshAll=Alle sleutels &verversen keyMan.button.revokeKey=&Sleutel intrekken -keyMan.button.skip=Sleutel &overslaan keylist.noOtherUids=Heeft geen andere identiteiten keylist.hasOtherUids=Ook bekend als @@ -549,10 +550,11 @@ keylist.hasPhotos=Foto’s keyMan.addphoto.filepicker.title=Selecteer foto om toe te voegen -keyMan.addphoto.warnLargeFile=Het bestand dat u hebt gekozen, is groter dan 25 kB.\nHet toevoegen van grote bestanden wordt niet aanbevolen, omdat de sleutels anders erg groot kunnen worden. +keyMan.addphoto.warnLargeFile=Het bestand dat u hebt gekozen, is groter dan 25 Kb.\nHet toevoegen van grote bestanden wordt niet aanbevolen, omdat de sleutels anders erg groot kunnen worden. keyMan.addphoto.noJpegFile=Het geselecteerde bestand lijkt geen JPEG-bestand te zijn. Kies een ander bestand. keyMan.addphoto.failed=De foto kon niet worden toegevoegd. noWksIdentity=De sleutel %S heeft geen WKS-identiteit. +wksUpload.noKeySupported=De upload is mislukt - het lijkt erop dat uw provider WKS niet ondersteunt. keyman.addBlacklistKey.msg=Wilt u echt dat p≡p de sleutel ‘%1$S (%2$S)’ niet meer gebruikt voor het versleutelen van berichten? keyman.removeBlacklistKey.msg=Wilt u p≡p toestemming geven om sleutel ‘%1$S (%2$S)’ voor toekomstige berichten te gebruiken? @@ -604,19 +606,22 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Wijzigen van pincode mislukt -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Sleutels worden ververst, even geduld… keyserverProgress.uploading=Sleutels worden geüpload, even geduld… keyserverProgress.wksUploadFailed=Kon uw sleutel niet uploaden naar de Web Key Service keyserverProgress.wksUploadCompleted=Uw publieke sleutel werd met succes naar uw provider gestuurd. U zult een e-mail krijgen om te bevestigen dat u de upload hebt aangevraagd. keyserverTitle.refreshing=Sleutels verversen keyserverTitle.uploading=Sleutel uploaden +keyserver.result.download.none=Geen sleutel gedownload. +keyserver.result.download.1of1=Sleutel met succes gedownload. +keyserver.result.download.1ofN=1 van %S sleutels met succes gedownload. +keyserver.result.download.NofN=%1$S van %2$S sleutels met succes gedownload. +keyserver.result.uploadOne=1 sleutel met succes geüpload. +keyserver.result.uploadMany=%S sleutels met succes geüpload. # Strings in enigmailSetupWizard -passphrase.min8keys=Uw wachtwoordzin moet minstens 8 tekens bevatten! -setupWizard.reallyCancel=Weet u zeker dat u de installatiewizard van Enigmail wilt afsluiten? setupWizard.invalidGpg=Het bestand dat u hebt opgegeven, is geen GnuPG-programma. Kies een ander bestand. -setupWizard.specifyFile=U moet minstens één publieke sleutel selecteren om te kunnen doorgaan. setupWizard.installFailed=Het lijkt erop dat de installatie is mislukt. Probeer de installatie opnieuw, of installeer GnuPG zelf en geef de plaats aan met de knop Bladeren. setupWizard.downloadForbidden=Voor uw eigen veiligheid downloaden we GnuPG niet. Bezoek https://gnupg.org/ om GnuPG te downloaden. setupWizard.downloadImpossible=We kunnen GnuPG op dit moment niet downloaden. Probeer het later opnieuw, of ga naar https://gnupg.org/ om GnuPG te downloaden. @@ -626,6 +631,9 @@ setupWizard.gpgConfExists=Het GnuPG-configuratiebestand bestaat al. Wilt u dit overschrijven met dat uit uw oude installatie? setupWizard.noGpgHomeDir=U heeft %S gespecificeerd om voor GnuPG te gebruiken. Dit is echter geen map – u kunt deze niet gebruiken. setupWizard.unmachtedIds=De volgende identiteiten van uw oude set-up konden niet worden gevonden.\n%S\nDe instellingen voor deze identiteiten zijn overgeslagen. +setupWizard.foundAcSetupMessage=Autocrypt-instellingsbericht gevonden. Klik op de knop Set-up starten hieronder om de Autocrypt-configuratie te starten. +setupWizard.foundAcNoSetupMsg=Wij hebben gedetecteerd dat u een e-mailclient gebruikt die aan Autocrypt voldoet, maar we konden geen Autocrypt-instellingsbericht vinden. Wij raden u aan om een Autocrypt-instellingsbericht op uw bestaande apparaat aan te maken en vervolgens op Postvak IN opnieuw scannen te klikken. U kunt ook uw instellingen en sleutels in een bestaande Enigmail-installatie exporteren en die instellingen hier importeren. +setupWizard.setupComplete=Enigmail is nu goed geconfigureerd en klaar voor gebruik. Kijk voor meer info over het gebruik van Enigmail op onze startpagina. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Er is een fout opgetreden bij het downloaden van GnuPG. Controleer de console-uitvoer voor nadere details. @@ -647,19 +655,19 @@ # filter stuff filter.folderRequired=U moet een doelmap kiezen. -filter.decryptMove.label=Permanent ontcijferen +filter.decryptMove.label=Permanent ontcijferen (Enigmail) filter.decryptCopy.label=Ontcijferde kopie aanmaken (Enigmail) filter.decryptMove.warnExperimental=Waarschuwing. ‘Permanent ontcijferen’ kan leiden tot beschadigde of kapotte berichten.\n\nHet wordt aanbevolen eerst ‘Ontcijferde kopie genereren’ te proberen, het resultaat zorgvuldig te testen, en alleen dan de permanente actie uit te voeren. filter.tempPepFilterDesc=Tijdelijk filter om verzonden bericht onversleuteld op te slaan filter.term.pgpencrypted.label=Versleuteld met OpenPGP filter.encrypt.label=Naar sleutel versleutelen (Enigmail) filter.keyRequired=U moet een sleutel van een ontvanger selecteren. -filter.keyNotFound=Kon geen sleutel voor ‘%S’ vinden. -filter.warn.keyNotSecret=Waarschuwing - de filteractie ‘Naar sleutel versleutelen’ vervangt de ontvangers.\n\nAls u geen geheime sleutel voor ‘%S’ heeft, kunt u de e-mailberichten niet meer lezen. +filter.keyNotFound=Kon geen coderingssleutel vinden voor ‘%S’. +filter.warn.keyNotSecret=Waarschuwing - de filteractie ‘Naar sleutel versleutelen’ vervangt de ontvangers.\n\nAls u de geheime sleutel voor ‘%S’ niet hebt, kunt u de e-mails niet meer lezen. # strings in enigmailConvert.jsm converter.decryptBody.failed=Kon bericht met het volgende onderwerp niet ontcijferen:\n‘%S’.\nWilt u het nogmaals proberen met een andere wachtwoordzin, of wilt u dit bericht overslaan? -converter.decryptAtt.failed=Kon bijlage niet ontcijferen: ‘%1$S’\nvan bericht met onderwerp:\n‘%2$S’.\nWilt u het nogmaals proberen met een andere wachtwoordzin, of wilt u het bericht overslaan? +converter.decryptAtt.failed=Kon bijlage ‘%1$S’\nvan bericht met het volgende onderwerp niet ontcijferen: \n‘%2$S’.\nWilt u het nogmaals proberen met een andere wachtwoordzin, of wilt u het bericht overslaan? saveLogFile.title=Logbestand opslaan @@ -694,10 +702,10 @@ homedirParamNotSUpported=Extra parameters waarmee paden worden geconfigureerd, zoals --homedir en --keyring, worden niet ondersteund bij het exporteren/herstellen van uw instellingen. Gebruik andere manieren, zoals het instellen van de variabele GNUPGHOME. #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 overeenkomstige accounts in te stellen om deze nieuwe sleutels te gebruiken. -expiry.keyMissingOwnerTrust=Voor uw geheime sleutel %S is geen vertrouwen ingesteld.\n\nHet wordt aanbevolen om ‘U vertrouwt op certificeringen’ op maximaal in te stellen bij de eigenschappen van de sleutel. -expiry.keysMissingOwnerTrust=Voor uw onderstaande geheime sleutels is geen vertrouwen ingesteld:\n%S.\nHet wordt aanbevolen om ‘U vertrouwt op certificeringen’ op maximaal in te stellen bij de eigenschappen van de sleutel. +expiry.keyExpiresSoon=Uw sleutel %1$S zal binnen %2$S dagen vervallen.\n\nWij raden aan om 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. Wij raden u aan om nieuwe sleutels aan te maken en de overeenkomende accounts in te stellen om deze nieuwe sleutels te gebruiken. +expiry.keyMissingOwnerTrust=Voor uw geheime sleutel %S is geen vertrouwen ingesteld.\n\nWij bevelen u aan om ‘U vertrouwt op certificeringen’ op maximaal in te stellen bij de eigenschappen van de sleutel. +expiry.keysMissingOwnerTrust=Voor uw onderstaande geheime sleutels is geen vertrouwen ingesteld:\n%S.\nWij raden u aan om ‘U vertrouwt op certificeringen’ op maximaal in te stellen bij de eigenschappen van de sleutel. expiry.OpenKeyManager=Enigmail-sleutelbeheer openen expiry.OpenKeyProperties=Sleuteleigenschappen openen @@ -709,6 +717,7 @@ gpghomedir.notwritable=De map ‘%S’ die uw OpenPGP-sleutels bevat, is niet schrijfbaar. gpghomedir.notdirectory=De map ‘%S’ die uw OpenPGP-sleutels bevat, is een bestand in plaats van een map. gpghomedir.notusable=Herstel de rechten van de map of wijzig de locatie van uw GnuPG-hoofdmap. GnuPG kan anders niet correct werken. +gpgAgent.noAutostart=U gebruikt GnuPG versie %S. Voor deze versie moet u gpg-agent opstarten voordat u Thunderbird start en moet de omgevingsvariabele GPG_AGENT_INFO vooraf ingesteld zijn.\n\nEr is niet aan deze voorwaarden voldaan - u kunt Enigmail pas gebruiken als u dit probleem heeft opgelost. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=p≡p-vertrouwwoorden voor eigen account kunnen niet worden geverifieerd. @@ -728,10 +737,10 @@ pepPrivacyStatus.RatingMistrustSuggestion=Herstel de verbinding met uw correspondent en probeer een andere handdruk te voltooien. pepPrivacyStatus.RatingReliableSuggestion=Voltooi een handdruk met uw correspondent door persoonlijk of via de telefoon vertrouwenswoorden uit te wisselen. Aan handdruk is slechts een keer per correspondent nodig en verzekert u van veilige en vertrouwde communicatie. pepPrivacyStatus.RatingTrustedSuggestion=Geen actie nodig! -pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Let erop dat dit bericht misschien niet veilig is. +pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Houd er rekening mee dat dit bericht misschien niet veilig is. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Voeg de benodigde informatie toe. -pepPrivacyStatus.RatingUnderAttackSuggestion=Controleer de inhoud van dit bericht afzonderlijk met uw correspondent. -pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Zorg ervoor dat de privacystatus voor alle getoonde correspondenten tenminste veilig is. +pepPrivacyStatus.RatingUnderAttackSuggestion=Controleer de inhoud van dit bericht met uw correspondent via een ander kanaal. +pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Zorg ervoor dat de privacystatus voor alle getoonde correspondenten tenminste ‘veilig’ is. pepPrivacyStatus.RatingUnencryptedSuggestion=Vraag uw correspondent om een versleutelingsoplossing te gebruiken of om p≡p te installeren. pepPrivacyStatus.RatingUnreliableSuggestion=Dit bericht heeft geen betrouwbare versleuteling of handtekening. Vraag uw correspondent om zijn encryptiesoftware te upgraden of om p≡p te installeren. @@ -759,7 +768,7 @@ handshakeDlg.button.initHandshake=Handdruk… handshakeDlg.button.stopTrust=Stoppen met vertrouwen -handshakeDlg.button.reTrust=Stop wantrouwen +handshakeDlg.button.reTrust=Wantrouwen stopzetten handshakeDlg.label.outgoingMessage=Uitgaand bericht handshakeDlg.label.incomingMessage=Inkomend bericht handshakeDlg.error.noPeers=Kan geen handshake uitvoeren zonder correspondenten. @@ -781,14 +790,16 @@ upgradeInfo.encSubject.title=Versleutelen van het onderwerp van het bericht upgradeInfo.encSubject.desc=We hebben een nieuwe manier ontwikkeld die het onderwerp van de e-mail naar het versleutelde bericht verplaatst en het zichtbare onderwerp vervangt door ‘Versleuteld bericht’. Als zo’n bericht ontsleuteld is, wordt het originele onderwerp automatisch vervangen. Het vervangen van het onderwerp staat standaard aan; er is een optie om dit uit te schakelen als u dit niet wilt. (Noot: voor deze optie is het noodzakelijk dat het bericht met PGP/MIME wordt verzonden.) upgradeInfo.buttons.title=Gewijzigd gedrag van de knoppen Versleutelen en Ondertekenen -upgradeInfo.buttons.desc=De knoppen Versleutelen en Ondertekenen in het berichtopstelvenster werken nu zowel voor het OpenPGP- als het S/MIME-protocol. Als beide algoritmes mogelijk zijn, zal Enigmail proberen het protocol waarvoor alle sleutels beschikbaar zijn te prefereren. +upgradeInfo.buttons.desc=De knoppen Versleutelen en Ondertekenen in het berichtopstelvenster werken nu zowel voor het OpenPGP- als het S/MIME-protocol. Als beide algoritmes mogelijk zijn, zal Enigmail het protocol waarvoor alle sleutels beschikbaar zijn te verkiezen. upgradeInfo.autocrypt.title=Ondersteuning voor Autocrypt upgradeInfo.autocrypt.desc=Enigmail ondersteunt nu Autocrypt, een nieuwe standaard om sleutels te verspreiden als onderdeel van verzonden berichten. Enigmail importeert sleutels van Autocrypt-compatibele berichten automatisch, zodat na verloop van tijd meer en meer berichten versleuteld kunnen worden. upgradeInfo.pEp.title=Nieuwe p≡p-juniormodus (Pretty Easy Privacy) -upgradeInfo.pEp.desc=Enigmail heeft nu een p≡p-juniormodus. Momenteel moet u hiervoor handmatig p≡p installeren; dit zal in toekomstige versies veranderen. Met de p≡p-juniormodus kunt u OpenPGP-versleuteling zo transparant als mogelijk gebruiken; u hoeft zich niet meer te bekommeren om sleutelbeheer en het synchroniseren van sleutels tussen apparaten. +upgradeInfo.pEp.desc=Enigmail heeft nu een p≡p-juniormodus. Met de p≡p-juniormodus kunt u OpenPGP-versleuteling zo transparant als mogelijk gebruiken; u hoeft zich niet meer te bekommeren om sleutelbeheer en het synchroniseren van sleutels tussen apparaten. upgradeInfo.bottom.desc=Bezoek onze documentatie voor hulp over het gebruik van Enigmail. +#strings in pEpAdapter.jsm pep.missingGnuPG=Om Enigmail/p≡p te gebruiken, is GunPG vereist. Omdat we het niet konden vinden, stellen wij voor het voor u te downloaden en installeren. +pep.updateAvailable=Er is een nieuwe versie van Enigmail/p≡p beschikbaar. Wilt u de update downloaden en installeren? #strings in enigmailAbout.html aboutEnigmail.tabName=Over Enigmail @@ -799,6 +810,7 @@ aboutEnigmail.documentation=Documentatie: aboutEnigmail.testing=Testen: aboutEnigmail.userSupport=Gebruikersondersteuning: +aboutEnigmail.userSupport.team=het team en de leden van de lijst/het forum aboutEnigmail.localization=Lokalisatie: Zie de pagina Enigmail taalpakketten aboutEnigmail.Credits=Credits: aboutEnigmail.origAuthor=Oorspronkelijke auteur van de Enigmail-extensie @@ -808,3 +820,38 @@ aboutEnigmail.licenseSupportTitle=licentie & ondersteuning aboutEnigmail.license=Enigmail OpenPGP is opensource en gelicentieerd onder de %S aboutEnigmail.support=Ondersteuning en download is beschikbaar op www.enigmail.net. + +#strings in updateGnuPG.html +updateGnuPG.tabName=GnuPG bijwerken +updateGnuPG.title=Updates voor GnuPG +updateGnuPG.introduction.desc=Enigmail heeft GnuPG nodig voor het uitvoeren van de cryptografische. Wij raden u aan om un installatie van GnuPG up-to-date te houden. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +updateGnuPG.noUpdateRequired=GnuPG is up-to-date. +updateGnuPG.cannotUpdate.header=Enigmail ondersteunt alleen bijwerken van de volgende pakketten: +updateGnuPG.cannotUpdate.footer=Het lijkt erop dat u een andere variant van GunPG gebruikt; het is daarom helaas niet mogelijk voor Enigmail om uw GnuPG-installatie bij te werken. +updateGnuPG.installUpdate=Update installeren +updateGnuPG.noMoreUpdates=Niet op toekomstige updates controleren +updateGnuPG.checkUpdate=Controleren op GnuPG-updates + + +#strings in keyserver.jsm +keyserver.error.aborted=Afgebroken +keyserver.error.unknown=Er is een onbekende fout opgetreden +keyserver.error.serverError=De sleutelserver meldde een fout. +keyserver.error.importError=Kon de gedownloade sleutel niet importeren. +keyserver.error.unavailable=De sleutelserver is niet beschikbaar. +keyserver.error.securityError=De sleutelserver ondersteunt geen versleutelde toegang. +keyserver.error.certificateError=Het certificaat van de sleutelserver is ongeldig. +keyserver.error.unsupported=De sleutelserver wordt niet ondersteund door Enigmail. + +#strings in mimeDecrypt.jsm +mimeDecrypt.encryptedPart.attachmentLabel=Versleuteld berichtdeel +mimeDecrypt.encryptedPart.concealedData=Dit is een versleuteld berichtdeel. U kunt dit een een apart venster openen door op de bijlage te klikken. + +#strings in gnupg-key.jsm +import.secretKeyImportError=Er is een fout opgetreden in GnuPG bij het importeren van de geheime sleutels. Het importeren is mislukt. + +#strings in importSettings.js +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 diff -Nru enigmail-2.0.12+ds1/lang/pl/enigmail.dtd enigmail-2.1.3+ds1/lang/pl/enigmail.dtd --- enigmail-2.0.12+ds1/lang/pl/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/pl/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ -Mozilla Public License 2.0."> - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,16 +63,8 @@ - - -„Transfer kluczy Autocrypt” wymaga, aby klient poczty e-mail na drugim urządzeniu był zgodny z funkcją Autocrypt. -Chociaż jest to łatwiejsze rozwiązanie, tylko kilka aplikacji obsługuje ten standard. -Innym sposobem jest „Utworzenie i przywrócenie kopii zapasowej” swoich ustawień. -Spowoduje to utworzenie pliku ZIP zawierającego wszystkie wymagane informacje i klucze, które można skopiować na nowe urządzenie. -Enigmail może bezpośrednio zaimportować te ustawienia, w przypadku innych klientów poczty e-mail plik ZIP można rozpakować i obsłużyć ręcznie."> - @@ -89,23 +72,24 @@ - + + - + ”"> - - - + + + @@ -122,6 +106,9 @@ + + + @@ -214,6 +201,7 @@ + @@ -222,8 +210,8 @@ - - + + @@ -252,7 +240,7 @@ - + @@ -341,7 +329,7 @@ - + @@ -350,7 +338,7 @@ - + @@ -373,7 +361,6 @@ - @@ -472,7 +459,7 @@ - + @@ -547,7 +534,7 @@ - + @@ -670,127 +657,33 @@ - - + - - - - - - - - - - - - - - - - - -Uwaga! Enigmail będzie zawsze weryfikować podpisy w wiadomościach dla wszystkich tożsamości i kont, niezależnie od tego czy obsługa Enigmail jest włączona, czy nie."> - + Ten asystent przeprowadzi Cię przez proces konfiguracji."> - +Jeśli wyrażasz zgodę, kliknij przycisk „Zainstaluj GnuPG”, aby pobrać i zainstalować GnuPG."> + - - - - - - - - - - - - - - - - - - -klucz publiczny jest dla innych do wysyłania ci zaszyfrowanych e-maili. Możesz go udostępniać."> -klucz prywatny jest dla ciebie do odszyfrowywania tych e-maili oraz do wysyłania podpisanych e-maili. - Nie udostępniaj go nikomu."> -klucz prywatny jest dla ciebie do odszyfrowywania i wysyłania podpisanych wiadomości e-mail. -Nie udostępniaj go nikomu. -Aby zabezpieczyć twój klucz prywatny, w następnych dwóch oknach program poprosi Cię o podanie hasła."> -hasło zabezpiecza twój klucz prywatny."> -nie są zalecane."> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - wyeksportuj swoje dane ze swojego starego komputera za pomocą Asystenta eksportu w Ustawieniach Enigmail - zaimportuj dane na nowy komputer za pomocą tego asystenta. - "> - - - - - - -Dziękujemy za wybór Enigmail."> - - - - - - - - - + + + + + + + + + + + @@ -811,12 +704,10 @@ - - wyeksportuj swoje dane ze swojego starego komputera za pomocą tego asystenta - zaimportuj dane na swój nowy komputer za pomocą Asystenta konfiguracji. - "> + + + @@ -863,7 +754,7 @@ - + @@ -877,9 +768,19 @@ - + + - + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/pl/enigmail.properties enigmail-2.1.3+ds1/lang/pl/enigmail.properties --- enigmail-2.0.12+ds1/lang/pl/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/pl/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -78,7 +78,7 @@ passSpaceProblem=Z powodów technicznych hasło nie może zaczynać się lub kończyć spacją. changePassFailed=Nie udało się zmienić hasła. -keyConfirm=Czy utworzyć klucz publiczny i prywatny dla „%S”? +# keyConfirm=Generate public and secret key for '%S'? keyMan.button.generateKey=&Utwórz klucz keyAbort=Czy przerwać tworzenie klucza? keyMan.button.generateKeyAbort=&Przerwij tworzenie klucza @@ -86,14 +86,14 @@ expiryTooLong=Nie można tworzyć kluczy ważnych dłużej niż 100 lat. expiryTooLongShorter=Nie można tworzyć kluczy, których okres ważności jest dłuższy niż 90 lat. expiryTooShort=Klucz musi być ważny przynajmniej jeden dzień. -keyGenFailed=Nie udało się utworzyć klucza. Szczegóły wykonywanej operacji można znaleźć w konsoli Enigmail (menu Enigmail -> Opcje debugowania). +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. setKeyExpirationDateFailed=Data wygaśnięcia nie mogła zostać zmieniona # Strings in enigmailMessengerOverlay.js securityInfo=Informacja Enigmail\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Załączniki do tej wiadomości nie zostały podpisane ani zaszyfrowane*\n\n +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=Wiadomość prawdopodobnie została podpisana/zaszyfrowana za pomocą PGP/MIME – naciśnij przycisk „Odszyfruj/Weryfikuj”, aby to sprawdzić saveAttachmentHeader=Enigmail: Zapisz odszyfrowany załącznik @@ -102,7 +102,7 @@ beginPgpPart=********* *POCZĄTEK CZĘŚCI SZYFROWANEJ / PODPISANEJ* ********* endPgpPart=********** *KONIEC CZĘŚCI SZYFROWANEJ / PODPISANEJ* ********** -notePartEncrypted=Enigmail: *Niektóre fragmenty wiadomości NIE zostały podpisane lub zaszyfrowane* +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *Znaleziono bloki wielu wiadomości – przerwano odszyfrowanie/weryfikację* decryptOkNoSig=Uwaga!\n\nWiadomość została odszyfrowana, ale nie można prawidłowo zweryfikować podpisu. @@ -114,6 +114,7 @@ fixBrokenExchangeMsg.failed=Nie udało się naprawić wiadomości. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S wksConfirmSuccess=Wysłano e-mail potwierdzający. wksConfirmFailure=Wysłanie potwierdzającej wiadomości e-mail nie powiodło się. @@ -148,10 +149,9 @@ minimalLineWrapping=Ustawiono zawijanie wierszy dłuższych niż %S znaków. Aby poprawnie szyfrować lub podpisywać wiadomości, ta wartość musi wynosić co najmniej 68.\nCzy ustawić zawijanie wiersza powyżej 68 znaków? warning=Uwaga signIconClicked=Zmieniono ręcznie opcje podpisywania. Dlatego też, podczas komponowania tej wiadomości dezaktywacja/aktywacja podpisywania nie zależy od dezaktywacji/aktywacji szyfrowania. -errorOwnKeyUnusable=ID klucza '%S' skonfigurowane dla wybranej tożsamości nie daje poprawnego klucza OpenPGP.\n\nUpewnij się, że twój klucz OpenPGP nie wygasł oraz że ustawienia konta wskazują na ten klucz.\nJeśli twój klucz nie wygasł, sprawdź czy zaufanie właściciela ustawione jest na pełne lub absolutne. +# 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=Błąd podczas zapisywania projektu # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. -# msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=Błąd wewnętrzny: zadeklarowane szyfrowanie wyłączone @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=Enigmail jest wyłączona dla wybranej tożsamości msgCompose.protectSubject.tooltip=Chroń temat wiadomości msgCompose.noSubjectProtection.tooltip=Nie chroń tematu wiadomości -msgCompose.encryptedSubjectStub=Zaszyfrowana wiadomość msgCompose.protectSubject.dialogTitle=Czy włączyć ochronę tematu wiadomości? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? msgCompose.protectSubject.yesButton=Chroń &temat @@ -179,7 +178,7 @@ msgCompose.pepSendTrusted=Bezpieczne i zaufane # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -# pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=Czy zapisać wiadomość %1$S do %2$S w katalogu „Niewysłane”? onlineSend=Czy wysłać wiadomość %S do %S? -encryptKeysNote=Informacja: wiadomość jest zaszyfrowana za pomocą następującego ID użytkownika/klucza: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S hiddenKey= -signFailed=Błąd w Enigmail! Szyfrowanie/podpisanie nie powiodło się. Czy wysłać wiadomość bez szyfrowania/podpisu? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=&Wyślij niezaszyfrowaną wiadomość recipientsSelectionHdr=Wybierz odbiorców do szyfrowania @@ -225,9 +224,9 @@ signOffWithReason=Podpisanie: WYŁĄCZONE (%S) reasonEnabledByDefault=domyślnie włączone reasonManuallyForced=ręcznie wymuszone -reasonByRecipientRules=wymuszone przez reguły odbiorców +# reasonByRecipientRules=forced by per-recipient rules reasonByAutoEncryption=wymuszony przez szyfrowanie automatyczne -reasonByConflict=z powodu konfliktu w przepisach otrzymujących +# reasonByConflict=due to conflict in per-recipient rules reasonByEncryptionMode=ze względu na tryb szyfrowania # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=Zostanie użyte PGP/Inline # Attach own key status (tooltip strings): -attachOwnKeyNo=Twój własny klucz nie zostanie dołączony -attachOwnKeyYes=Własny klucz zostanie dołączony -# attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Wykryto kolizję reguł Enigmail dla odbiorcy\n%S\n\nCzy wysłać wiadomość z tymi ustawieniami? msgCompose.button.configure=&Konfiguruj @@ -269,6 +268,10 @@ clickDetailsButton=; kliknij na przycisk „Szczegóły”, aby uzyskać więcej informacji clickImportButton=; kliknij na przycisk "Importuj klucz", aby zaimportować klucz keyTypeUnsupported=; ten typ klucza nie jest wspierany przez twoją wersję GnuPG +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Rozszyfruj msgPart=Część wiadomości %S msgSigned=podpisana msgSignedUnkownKey=podpisana nieznanym kluczem @@ -280,8 +283,10 @@ needKey=Błąd – potrzebny klucz, aby odszyfrować wiadomość failedDecrypt=Błąd – odszyfrowanie nie powiodło się badPhrase=Błąd – nieprawidłowe hasło +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=Błąd – nie powiodło się odszyfrowanie/weryfikacja viewInfo=; Widok » Informacje o zabezpieczeniach wiadomości, aby zobaczyć szczegóły +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=Odszyfrowana wiadomość decryptedMsgWithFormatError=Rozszyfrowana wiadomość (formatowanie uszkodzone prawdopodobnie przez serwer Exchange, wiadomość może być trudna do odczytania). @@ -326,6 +331,7 @@ autocryptSetupReq.setupMsg.backup=Możesz zachować tą wiadomość i użyć jej jako kopii zapasowej twojego klucza prywatnego. Jeśli chcesz to zrobić, powinieneś zapisać hasło i przechowywać je bezpiecznie. autocryptSetupReq.message.import=Aby zaimportować ustawienia i klucz(e) do Enigmail, proszę kliknąć na przycisk „Rozpocznij konfigurację” na pasku statusu. autocryptSetupReq.message.sent=Aby zaimportować ustawienia, proszę kliknąć na wiadomości na twoim nowym urządzeniu i postępować według instrukcji. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js oldGpgVersion20=Nie udało się zainicjować Enigmail.\n\nUżywasz GnuPG w wersji %1$S, która nie jest już odsługiwana. Enigmail wymaga GnuPG w wersji %2$S lub nowszej. Proszę uaktualnić swoją instalację GnuPG albo Enigmail nie będzie działać. @@ -337,6 +343,8 @@ prefs.warnAskNever=Ostrzeżenie! Włączenie tej opcji oznacza niezaszyfrowane wiadomości bez żadnej informacji o brakującym kluczu dla któregoś z odbiorców – Enigmail nie poinformuje o takim przypadku! prefs.warnIdleTimeForUnknownAgent=Twój system używa specjalistycznych narzędzi do obsługi haseł, takich jak np. gnome-keyring, seahorse-agent lub Portfel KDE. Niestety Enigmail nie może kontrolować limitu czasu hasła dla używanego narzędzia. Dlatego poszczególne ustawienia limitu czasu w Enigmail są pomijane. prefEnigmail.oneKeyserverOnly=Błąd – w ustawieniach automatycznego pobierania brakujących kluczy OpenPGP można wskazać tylko jeden serwer kluczy. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +aboutLicense.desc=Enigmail jest oprogramowaniem open source udostępnianym na licencji Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=Błąd – nie podano hasła noPGPblock=Błąd – nie znaleziono prawidłowego bloku danych OpenPGP unverifiedReply=Cytowana część wiadomości (odpowiedzi) została prawdopodobnie zmodyfikowana -keyInMessageBody=Nie znaleziono klucza w treści wiadomości. Kliknij "Importuj klucz", aby go zaimportować. +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=Błąd – podpis nie pasuje -cantImport=Błąd przy importowaniu klucza publicznego\n\n +# cantImport=Error importing public key\n\n doImportOne=Czy zaimportować %1$S (%2$S)? doImportMultiple=Czy zaimportować następujące klucze?\n\n%S previewFailed=Nie można wczytać pliku klucza publicznego. @@ -366,14 +374,15 @@ sc.removeCard=Ta operacja wymaga usunięcia karty SmartCard z czytnika.\nUsuń kartę i ponów operację. sc.noCardAvailable=Nie znaleziono karty SmartCard w czytniku\nWłóż kartę do czytnika i ponów operację sc.noReaderAvailable=Brak dostępu do czytnika kart SmartCard\nPodłącz czytnik, włóż swoją kartę i ponów operację -# keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. -# keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. keyError.resolutionAction=Proszę wybrać ważny klucz w sekcji OpenPGP ustawień konta. missingPassphrase=Brak hasła errorHandling.gpgAgentInvalid=Twój system zawiera wersję programu gpg-agent, która nie jest wspierana przez twoją wersję GnuPG. errorHandling.gpgAgentError=Program GnuPG zgłosił błąd komunikacji z gpg-agent (składnikiem GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=Nie odnaleziono programu GnuPG „%S”.\nSprawdź w ustawieniach Enigmail czy jest określona prawidłowa ścieżka do programu GnuPG. @@ -384,9 +393,8 @@ prefBad=NIEPRAWIDŁOWY podpis od %S failCancel=Błąd – użytkownik anulował odbiór klucza -failNoServer=Błąd – nie wprowadzono nazwy serwera kluczy -failNoID=Błąd – brak ID klucza do pobrania failKeyExtract=Błąd – nie powiodło się uzyskanie klucza +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=Błąd – pierwszy blok OpenPGP nie jest blokiem klucza publicznego importKeyConfirm=Czy zaimportować klucze publiczne osadzone w wiadomości? failKeyImport=Błąd – nie powiodło się zaimportowanie klucza @@ -425,6 +433,8 @@ identityName=Tożsamość: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. enableEnigmail=&Wyłącz p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Uaktywniono szyfrowanie, ale nie wybrano żadnego klucza. Aby szyfrować wiadomości wysyłane do %S, należy wybrać co najmniej jeden ważny klucz z listy dostępnych. Czy chcesz wyłączyć szyfrowanie wiadomości do %S? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=Wybrana funkcja nie jest dostępna w trybie offline. Włącz tryb online i spróbuj ponownie. -protocolNotSupported=Przy użyciu wybranego protokołu „%S://” pobranie kluczy OpenPGP nie jest możliwe. -gpgkeysDisabled=Pomóc może włączenie opcji „extensions.enigmail.useGpgKeysTool”. noKeyserverConn=Nie można połączyć się z serwerem kluczy %S. -keyDownloadFailed=Nie powiodło się pobieranie kluczy z serwera. Status wiadomości:\n%S internalError=Wystąpił wewnętrzny błąd. Nie można pobrać/zaimportować kluczy. -noKeyFound=Niestety nie udało się znaleźć kluczy pasujących do podanych kryteriów wyszukiwania.\nIdentyfikatory kluczy (ID) powinny być poprzedzone znakami „0x” (np. 0xABCDEF12). -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Nie powiodło się wyszukiwanie lub pobieranie kluczy z serwera – nie można uruchomić programu gpgkeys_%S. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Nie powiodło się ustawienie poziomu zaufania dla właściciela @@ -490,7 +493,6 @@ asciiArmorFile=Opakowanie ASCII (*.asc) importKeyFile=Import plik klucza OpenPGP gnupgFile=Pliki GnuPG -createKeyOK=Twój klucz został utworzony. saveRevokeCertAs=Utwórz i zapisz certyfikat unieważnienia # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=Nie udało się utworzyć certyfikatu unieważnienia. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%S (0x%S) pub-pryw defaultPubKeyFilename=Eksportowane-klucze-publiczne defaultPubSecKeyFilename=Eksportowane-klucze-publiczne-i-prywatne -noSecretKeys=Nie znaleziono klucza prywatnego.\n\nCzy chcesz utworzyć własny klucz? sendKeysOk=Klucze zostały wysyłane sendKeysFailed=Nie udało się wysłać kluczy receiveKeysOk=Klucze zostały zaktualizowane receiveKeysFailed=Nie udało się pobrać kluczy +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=Czy chcesz zaimportować klucze ze schowka? importFromUrl=Pobierz klucz publiczny z tego URL: copyToClipbrdFailed=Nie udało się skopiować wybranych kluczy do schowka. copyToClipbrdOK=Skopiowano klucze do schowka -deleteSecretKey=UWAGA! Zamierzasz usunąć klucz prywatny!\nJeśli usuniesz ten klucz, nie będziesz mieć możliwości odszyfrowania wiadomości zaszyfrowanych tym kluczem ani unieważnienia tego klucza.\n\nCzy na pewno chcesz usunąć obydwa klucze, prywatny i publiczny\n„%S”? +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=UWAGA! Zamierzasz usunąć klucze prywatne!\nJeśli usuniesz ten klucz, nie będziesz mieć możliwości odszyfrowania wiadomości zaszyfrowanych tym kluczem.\n\nCzy na pewno chcesz usunąć wszystkie zaznaczone klucze prywatne i publiczne? deletePubKey=Czy chcesz usunąć klucz publiczny\n„%S”? deleteSelectedPubKey=Czy chcesz usunąć wybrane klucze publiczne? @@ -529,7 +531,7 @@ revokeKeyQuestion=Zaraz unieważnisz klucz '%S'.\n\nNie będziesz w stanie podpisywać tym kluczem, oraz po dystrybucji, inni nie będą mogli używać go do szyfrowania. Nadal możesz używać go do odszyfrowywania starych wiadomości.\n\nPotwierdzić? revokeKeyOk=Klucz został unieważniony. Jeżeli klucz jest dostępny na serwerze kluczy, zalecane jest ponowne wysłanie go na serwer, tak aby inni użytkownicy otrzymali informację o unieważnieniu. revokeKeyFailed=Nie udało się unieważnić tego klucza. -# revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! revokeKeyAlreadyRevoked=Klucz 0x%S już jest unieważniony. refreshAllQuestion=Nie wybrano żadnego klucza. Czy chcesz odświeżyć wszystkie klucze? refreshKeyServiceOn.warn=Uwaga: Twoje klucze są odświeżane w tle tak bezpiecznie jak to możliwe.\nOdświeżenie wszystkich twoich klucz naraz może niepotrzebnie ujawnić informacje na twój temat.\nCzy na pewno chcesz to zrobić? @@ -541,21 +543,21 @@ keyMan.button.import=&Importuj keyMan.button.refreshAll=&Odśwież wszystkie klucze keyMan.button.revokeKey=&Unieważnij klucz -keyMan.button.skip=Pomiń klucz keylist.noOtherUids=Nie ma innych tożsamości keylist.hasOtherUids=Także znany jako -keylist.noPhotos=Brak zdjęcia -keylist.hasPhotos=Zdjęcia +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos keyMan.addphoto.filepicker.title=Wybierz zdjęcie do dodania -keyMan.addphoto.warnLargeFile=Wybrany plik jest większy niż 25 kB.\nNie zaleca się dodawania bardzo dużych plików, ponieważ klucz będzie wówczas bardzo duży. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. keyMan.addphoto.noJpegFile=Wybrany plik nie jest w formacie JPEG. Wybierz inny plik. keyMan.addphoto.failed=Nie można dodać zdjęcia. # noWksIdentity=The key %S does not have a WKS identity. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -keyman.addBlacklistKey.msg=Czy na pewno chcesz żeby p≡p przestał używać klucza "%1$S (%2$S)" do szyfrowania wiadomości? -keyman.removeBlacklistKey.msg=Czy zezwolić p≡p na używanie klucza "%1$S (%2$S)" dla przyszłych wiadomości? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Nie udało się zmienić numeru PIN -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Trwa odświeżanie kluczy… Proszę czekać. keyserverProgress.uploading=Trwa wysyłanie kluczy, proszę czekać... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service keyserverProgress.wksUploadCompleted=Twój klucz publiczny został wysłany do dostawcy. Otrzymasz e-mail z potwierdzeniem, że zainicjowałeś wgrywanie. keyserverTitle.refreshing=Odświeżanie kluczy keyserverTitle.uploading=Wysyłanie kluczy +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=Twoje hasło powinno składać się z co najmniej 8 znaków! -setupWizard.reallyCancel=Czy na pewno chcesz zamknąć Asystenta konfiguracji Enigmail? setupWizard.invalidGpg=Wybrany plik GnuPG nie jest plikiem wykonywalnym. Wybierz inny plik. -setupWizard.specifyFile=Aby kontynuować, musisz określić przynajmniej plik klucza publicznego. setupWizard.installFailed=Wygląda na to, że instalacja się nie powiodła. Spróbuj ponownie uruchomić instalację lub zainstaluj GnuPG ręcznie i zlokalizować go, używając przycisku Przeglądaj… # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. setupWizard.downloadImpossible=W tej chwili nie można pobrać GnuPG. Proszę spróbować później lub odwiedzić stronę https://gnupg.org/, aby pobrać GnuPG. -setupWizard.hashSumError=Asystent nie może zweryfikować spójności pobranego pliku. Plik może być uszkodzony lub został zmieniony. Czy mimo wszystko chcesz kontynuować instalację? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? setupWizard.importSettingsFile=Wybierz plik kopii zapasowej do wczytania -setupWizard.invalidSettingsFile=Podany plik nie jest poprawnym plikiem zapasowym ustawień Enigmail. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. setupWizard.gpgConfExists=Plik konfiguracyjny GnuPG już istnieje. Czy chcesz nadpisać go plikiem ze swojej poprzedniej instalacji? -setupWizard.noGpgHomeDir=Wygląda na to, że skonfigurowano GnuPG dla %S. To nie jest katalog i nie może być użyty. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Podczas pobierania GnuPG wystąpił błąd. Otwórz proszę dziennik konsoli, aby zobaczyć szczegółowe informacje. @@ -654,12 +662,12 @@ filter.term.pgpencrypted.label=Zaszyfrowany OpenPGP # filter.encrypt.label=Encrypt to key (Enigmail) filter.keyRequired=Musisz wybrać klucz odbiorcy. -filter.keyNotFound=Nie można odnaleźć klucza szyfrowania dla "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -converter.decryptBody.failed=Nie można odszyfrować wiadomości z tematem\n"%S".\nSpróbować przy użyciu innego hasła czy pominąć tę wiadomość? -# converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? saveLogFile.title=Zapisz plik dziennika @@ -691,13 +699,13 @@ enigmailSettings=Ustawienia Enigmail # defaultBackupFileName=Enigmail-export specifyExportFile=Podaj nazwę pliku do wyeksportowania -# homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm -# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. -# expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -expiry.keysMissingOwnerTrust=Brak zaufania dla następujących kluczy prywatnych.\n%S.\nZalecamy ustawienie "Ufasz certyfikatom" na absolutne we właściwościach kluczy. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. expiry.OpenKeyManager=Otwórz zarządzanie kluczami Enigmail expiry.OpenKeyProperties=Właściwości Open Key @@ -709,6 +717,7 @@ gpghomedir.notwritable=Katalog "%S" zawierający twoje klucze OpenPGP nie jest zapisywalny. gpghomedir.notdirectory=Katalog "%S" zawierający twoje klucze OpenPGP jest plikiem, a nie katalogiem. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. @@ -728,12 +737,12 @@ # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. pepPrivacyStatus.RatingTrustedSuggestion=Nie jest wymagane żadne działanie! -pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Uwaga, ta wiadomość może nie być bezpieczna. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Proszę podać wymaganie informacje. -# pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. pepPrivacyStatus.RatingBrokenExplanation=Ta wiadomość jest niepoprawnie zaszyfrowana lub sformatowana. pepPrivacyStatus.RatingHaveNoKeyExplanation=Nie można odszyfrować tej wiadomości, ponieważ nie ma dostępnego klucza. @@ -763,16 +772,16 @@ handshakeDlg.label.outgoingMessage=Wiadomość wychodząca handshakeDlg.label.incomingMessage=Wiadomość przychodząca handshakeDlg.error.noPeers=Handshake nie jest możliwy przy braku korespondentów. -handshakeDlg.error.noProtection=Włącz ochronę aby użyć funkcji Handshake. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -enigmail.acSetupPasswd.descEnterPasswd=Proszę podać kod konfiguracyjny, który jest wyświetlony na innym urządzeniu -enigmail.acSetupPasswd.descCopyPasswd=Aby kontynuować konfigurację, proszę podaj poniżej kod konfiguracyjny, wyświetlony na innym urządzeniu +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm autocrypt.setupMsg.subject=Wiadomość konfiguracyjna Autocrypt # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html upgradeInfo.doctitle=Co nowego w wersji 2.0 Enigmail? @@ -785,10 +794,12 @@ upgradeInfo.autocrypt.title=Wsparcie dla Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. -# upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. +upgradeInfo.bottom.desc=Proszę odwiedzić naszą dokumentację, aby uzyskać pomoc w używaniu Enigmail. +#strings in pEpAdapter.jsm # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=O Enigmail @@ -799,6 +810,7 @@ aboutEnigmail.documentation=Dokumentacja: aboutEnigmail.testing=Testowanie: aboutEnigmail.userSupport=Wsparcie użytkowników: +# aboutEnigmail.userSupport.team=the team and the list/forum members aboutEnigmail.localization=Lokalizacja: Zobacz stronę pakietów językowych Enigmail aboutEnigmail.Credits=Zasługi: aboutEnigmail.origAuthor=Pierwotny autor rozszerzenia Enigmail @@ -808,3 +820,38 @@ aboutEnigmail.licenseSupportTitle=Licencja i wsparcie aboutEnigmail.license=Enigmail OpenPGP jest otwartym oprogramowaniem open source na licencji %S. aboutEnigmail.support=Wsparcie i pliki do pobrania są dostępne na www.enigmail.net. + +#strings in updateGnuPG.html +updateGnuPG.tabName=Aktualizacja GnuPG +updateGnuPG.title=Aktualizacje GnuPG +updateGnuPG.introduction.desc=Enigmail wymaga programu GnuPG aby móc realizować swoje funkcje kryptograficzne. Zalecamy posiadanie aktualnej instalacji GnuPG. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +updateGnuPG.noUpdateRequired=GnuPG jest aktualny. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +updateGnuPG.installUpdate=Zainstaluj aktualizację +updateGnuPG.noMoreUpdates=Nie sprawdzaj przyszłych aktualizacji +updateGnuPG.checkUpdate=Sprawdź aktualizacje GnuPG + + +#strings in keyserver.jsm +keyserver.error.aborted=Przerwano +keyserver.error.unknown=Wystąpił nieznany błąd +keyserver.error.serverError=Serwer kluczy zakomunikował błąd. +keyserver.error.importError=Zaimportowanie pobranego klucza nie powiodło się. +keyserver.error.unavailable=Serwer kluczy nie jest dostępny. +keyserver.error.securityError=Serwer kluczy nie wspiera dostępu szyfrowanego. +keyserver.error.certificateError=Certyfikat serwera kluczy jest nieprawidłowy. +keyserver.error.unsupported=Ten serwer kluczy nie jest wspierany przez Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/pt-BR/enigmail.dtd enigmail-2.1.3+ds1/lang/pt-BR/enigmail.dtd --- enigmail-2.0.12+ds1/lang/pt-BR/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/pt-BR/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ -Licença Pública Mozilla 2.0"> - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,15 +63,7 @@ - - - - - A 'Trasferência de chave criptográfica Automática' requer que o cliente de mail no outro dispositivo seja compatível com a criptografia automática. - Embora seja a solução mais fácil, apenas um número limitado de clientes suportam este padrão. - A outra forma é 'Copiar & restaurar' suas configurações. - Isto vai criar um arquivo ZIP com todas as informações necessárias e chaves, que você poderá copiar para o seu novo dispositivo. - O Enigmail pode importar diretamente estas configurações; para outros clientes de mail, o arquivo ZIP pode ser descompactado e movido de forma manual."> + @@ -94,12 +77,13 @@ + - + '"> @@ -122,6 +106,9 @@ + + + @@ -214,6 +201,7 @@ + @@ -222,8 +210,8 @@ - - + + @@ -350,7 +338,7 @@ - + @@ -373,7 +361,6 @@ -Criptografia Automática é um padrão que define como conseguir criptografia fim-a-fim de e-mails. Ela especifica como os programas de e-mail negociam as capacidades de encriptação utilizando e-mails regulares."> @@ -461,8 +448,8 @@ - - + + @@ -547,7 +534,7 @@ - + @@ -628,7 +615,7 @@ - + @@ -670,135 +657,36 @@ - - - - - - - - - - - - - - - - - - - - -Nota: O Enigmail irá sempre verificar assinaturas, caso existam, em mensagens de todas as contas e identidades não importando se o Enigmail está especificamente configurado ou não"> - + + - - + - - - - - - - - - - - - - - - - - -public key é para outros enviarem para você emails criptografados. Você pode distribuí-la para todos."> -private key é somente sua para descriptografar esses mails e para enviar emails assinados. -Você não deve distribuí-la para ninguém."> -chave privada é para você descriptografar esses mails e para enviar emails assinados. -Você não deve dá-la para ninguém. -Para tornar segura a sua chave privada, lhe será solicitada uma senha nos dois diálogos a seguir."> -senha é uma senha que protege a sua chave privada. Ela previne o mau uso da sua chave privada."> - NÃO são recomendados."> - - - - - - - - - - - - - - - - - - - - - - - - -Será solicitada a sua senha para isto. Por Favor transfira o certificado para uma mídia na qual seja armazenado de forma segura, como um CD ou Pendrive. Se alguém obter acesso a este certificado ele podera inutilizar a sua chave."> - - - - - - - - - - - -exporte seus dados do velho computador utilizando o assistente de cópia de segurança das preferências do Enigmail -importe os dados para o seu novo computador utilizando este assistente. -"> - - - - - - -Obrigado por utilizar o Enigmail."> -Por Favor confirme a requisição de que vai procurar na sua caixa postal se assim quiser."> - - - - - - - - + + + + + + + + + + + - + @@ -814,12 +702,9 @@ - -exporte seus dados do velho computador utilizando este assistente -importe os dados para o seu novo computador utilizando o assistente de configuração. -"> + + + @@ -838,7 +723,7 @@ - + @@ -865,7 +750,7 @@ - + @@ -879,12 +764,19 @@ - -Por Favor selecione abaixo a conta para a qual você quer transferir a sua chave. -Nós vamos mostrar um código de ajuste (senha) na próxima tela, o qual será necessário digitar no outro dispositivo para poder importar a sua chave e ajustes relacionados."> + + -Por Favor troque para o outro dispositivo agora e abra a mensagem. Será lhe pedido um código de configuração. Por favor digite os seguintes dígitos no comando:"> + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/pt-BR/enigmail.properties enigmail-2.1.3+ds1/lang/pt-BR/enigmail.properties --- enigmail-2.0.12+ds1/lang/pt-BR/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/pt-BR/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=Alerta do Enigmail -enigConfirm=Confirmação do Enigmail +# enigConfirm=Enigmail Confirmation enigInfo=Informação acerca do Enigmail enigError=Erro do Enigmail enigPrompt=Pergunta do Enigmail @@ -78,7 +78,7 @@ passSpaceProblem=Devido a questões técnicas, sua senha não pode iniciar ou terminar com um caracter de espaço. changePassFailed=A mudança de senha falhou. -keyConfirm=Gerar chaves pública e privada para '%S'? +# keyConfirm=Generate public and secret key for '%S'? keyMan.button.generateKey=&Gerar Chave keyAbort=Abortar geração da chave? keyMan.button.generateKeyAbort=&Abortar Geração de Chaves @@ -86,14 +86,14 @@ expiryTooLong=Você não pode criar uma chave que expire em mais do que 100 anos. expiryTooLongShorter=Você não pode criar uma chave que expira daqui a mais de 90 anos. expiryTooShort=Sua chave deve ser válida por pelo menos um dia. -keyGenFailed=A geração da chave falhou. Por favor verifique o console Enigmail (Menu Enigmail > Depuração do Enigmail) para detalhes. +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. setKeyExpirationDateFailed=A data de validade não pôde ser mudada # Strings in enigmailMessengerOverlay.js securityInfo=Informações de Segurança do Enigmail\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Anexos desta mensagem não foram assinados ou criptografados*\n\n +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=Mensagem possivelmente criptografada ou assinada com PGP/MIME; clique no botao Descriptografar para verificar saveAttachmentHeader=Enigmail: Salvar anexo descriptografada @@ -102,7 +102,7 @@ beginPgpPart=********* *INÍCIO DA PARTE CRIPTOGRAFADA ou ASSINADA* ********* endPgpPart=********** *FIM DA PARTE CRIPTOGRAFADA ou ASSINADA* ********** -notePartEncrypted=Enigmail: *Partes da mensagem NÃO foram assinadas ou criptografada* +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *Múltiplos blocos de mensagem encontrados -- descriptografia/verificação cancelada* decryptOkNoSig=Aviso\n\nA descriptografia foi efetuada com sucesso, mas a assinatura não pode ser verificada corretamente @@ -114,6 +114,7 @@ fixBrokenExchangeMsg.failed=Não obteve êxito reparando a mensagem enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key wksNoIdentity=Esta chave não está ligada a nenhuma das suas contas de mail. Por favor adicione uma conta para ao menos um dos seguintes endereço(s) de mail:\n\n%S wksConfirmSuccess=Email de confirmação enviado. wksConfirmFailure=Envio do email de confirmação falhou @@ -148,10 +149,9 @@ minimalLineWrapping=Você definiu a quebra de linha em %S caracteres. Para a correta criptografia e/ou assinatura, este valor precisa ser de pelo menos 68 caracteres.\nVocê deseja alterar a quebra de linha para 68 caracteres agora? warning=Aviso signIconClicked=Você alterou manualmente a assinatura. Logo, enquanto você estiver compondo esta mensagem, (des)ativar a assinatura não depende mais de (de)ativar a criptografia. -errorOwnKeyUnusable=O Id da chave: '%S' configurado para a identidade atual não fornece uma chave OpenPGP utilizável.\n\nPor favor garanta que você tem uma chave OpenGP válida e que não tenha expirado, e que suas configurações de conta apontem para esta chave.\nSe sua chave não expirou, então verifique se a confiança no Proprietário está setado em Completo ou Ultimate. +# 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=Erro durante o salvamento do rascunho msgCompose.partiallyEncrypted.short=Esteja atento quantoa vazamento de informação sensível - email parcialmente criptografado. -msgCompose.partiallyEncrypted.mimeMsg=A mensagem que você está respondendo, contém partes não-criptografas junto a partes criptografadas. Algumas partes criptografadas não serão apresentadas a você.\n\nSe o remetente não foi capaz de descriptografar a parte originalmente ocultada, você poderá estar vazando informação confidencial que o remetente não foi capaz de descriptografar.\nNós recomendamos que você não responda esta mensagem, mas que crie uma nova mensagem contendo a sua resposta. msgCompose.partiallyEncrypted.inlinePGP=A mensagem que você está respondendo, contém partes não-criptografas junto a partes criptografadas. Se o remetente não foi capaz de descriptografar a parte originalmente ocultada, você poderá estar vazando informação confidencial que o remetente não foi capaz de descriptografar.\n\nPor Favor considere remover todos o texto entre aspas da sua resposta para este remetente. msgCompose.internalEncryptionError=Erro Interno: criptografia prometida desativada @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=Enigmail foi desabilitado para a identidade selecionada msgCompose.protectSubject.tooltip=Proteja o assunto da mensagem msgCompose.noSubjectProtection.tooltip=Não proteger o assunto da mensagem -msgCompose.encryptedSubjectStub=Mensagem Criptografada msgCompose.protectSubject.dialogTitle=Habilitar a proteção do assunto? msgCompose.protectSubject.question=emails regulares criptografados contêm o assunto sem alteração\nNós criamos um padrão para esconder o assunto original da mensagem dentro da parte criptografada\ne substituímos com um texto padrão, de forma ao assunto só possa ser visto após o email ter sido descriptografado.\n\nVocê quer proteger o assunto nas mensagens criptografadas? msgCompose.protectSubject.yesButton=&Proteger o Assunto @@ -179,7 +178,7 @@ msgCompose.pepSendTrusted=Seguro & Confiável pep.alert.disabledForIdentity=p≡p está desativado pra a identidade atual. Por favor habilite p≡p via as preferências do Enigmail/p≡p . -pep.alert.weakReply=Você está prestes a encaminhar ou responder a uma mensagem insegura. Se você escolher continuar, informações confidenciais podem ser vazadas, colocando você e seu parceiro de comunicações em risco. Tem certeza que deseja continuar? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=Salvar %S mensagem para %S a pasta de Mensagens Não Enviadas? onlineSend=Enviar %S mensagem para %S? -encryptKeysNote=Nota: a mensagem está criptografada com as seguintes Identidades / Chaves: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S hiddenKey= -signFailed=Erro no Enigmail; Criptografia/assinatura falharam; enviar mensagem sem criptografia? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=Enviar Mensagem &Sem Criptografia recipientsSelectionHdr=Selecione os Destinatários para Criptografia @@ -225,9 +224,9 @@ signOffWithReason=Assinar: DESLIGADO (%S) reasonEnabledByDefault=Habilitar por padrão reasonManuallyForced=forçar manualmente -reasonByRecipientRules=imposto pelas regras do destinatário +# reasonByRecipientRules=forced by per-recipient rules reasonByAutoEncryption=forçado por auto encriptação -reasonByConflict=devido a conflito nas regras do destinatário +# reasonByConflict=due to conflict in per-recipient rules reasonByEncryptionMode=Devido ao modo de encriptação # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=Será usado Inline PGP # Attach own key status (tooltip strings): -attachOwnKeyNo=A sua chave não será anexada -attachOwnKeyYes=A sua chave será anexada -attachOwnKeyDisabled=A sua própria chave não pode ser anexada. Você tem que selecionar uma chave específica\nna seção de configuração de conta do OpenPGP para habilitar esta funcionalidade. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Detectadas regras por destinatário conflitantes\n%S\n\nEnviar a mensagem com estas configurações? msgCompose.button.configure=&Configurar @@ -269,6 +268,10 @@ clickDetailsButton=; clique no botão 'Detalhes' para mais informações clickImportButton=; clique no botão 'Importar chave' para importar a chave keyTypeUnsupported=;o tipo de chave não é suportado pela sua versão de GnuPG +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Descriptografar msgPart=Parte da mensagem %S msgSigned=assinada msgSignedUnkownKey=assinada com uma chave desconhecida @@ -280,8 +283,10 @@ needKey=Erro - chave secreta necessária para descriptografar a mensagem failedDecrypt=Erro - descriptografia falhou badPhrase=Erro - senha incorreta +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=Erro - descriptografia/verificação falhou viewInfo=; Ver > Informações de Segurança da Mensagem para detalhes +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=Mensagem descriptografada decryptedMsgWithFormatError=Mensagem desencriptada (restaurado o PGP quebrado no email, provavelmente causado por um servidor Exchange antigo, então o resultado pode não ser ideal para a leitura) @@ -326,6 +331,7 @@ autocryptSetupReq.setupMsg.backup=Você pode manter esta mensagem e usá-la como cópia de segurança para a sua chave secreta. Se você quiser fazer isto, você deve anotar a senha e armazená-la de forma segura. autocryptSetupReq.message.import=Para importar as configurações e chave(s) no Enigmail, por favor clique no botão "Iniciar Configuração" na barra de estado. autocryptSetupReq.message.sent=Por favor clique na mensagem em seu novo dispositivo e siga as instruções para importar as configurações. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js oldGpgVersion20=A inicialização do Enigmail falhou.\n\nVocê está utilizando o GnuPG versão %1$S, que não é mais suportada. O Enigmail necessita da GnuPG versão %2$S ou mais recente. Por favor atualize a sua instalação do GnuPG, ou o Enigmail não irá funcionar. @@ -337,6 +343,8 @@ prefs.warnAskNever=Aviso: ativar esta opção fará com que os emails sejam enviados sem criptografia sem nenhum tipo de aviso caso não existe a chave correspondente para um dos destinatários -- o Enigmail não irá informá-lo se isto ocorrer! prefs.warnIdleTimeForUnknownAgent=O seu sistema utilizar uma ferramenta especial para obter senhas, como o gnome-keyring ou seahorse-agent. Infelizmente o Enigmail não pode controlar o timeout para entrara de senhas na ferramenta que você está utilizando. Logo, os tempos definidos para timeout no Enigmail serão ignorados. prefEnigmail.oneKeyserverOnly=Erro - você pode especificar apenas um servidor de chaves para baixar automaticamente as chaves OpenPGP que estiverem faltando. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +aboutLicense.desc= O Enigmail é um software de código aberto e é licenciado sob o Licença Pública Mozilla 2.0 # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=Erro - nenhuma senha fornecida noPGPblock=Erro - Bloco de dados PGP-armor válido não encontrado unverifiedReply=Parte da mensagem indentada (resposta) provavelmente foi alterada -keyInMessageBody=Foi encontrada uma chave no corpo da mensagem. Clique em 'Importar Chave' para importar a chave +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=Erro - Assinatura não confere -cantImport=Erro ao importar chave pública\n\n +# cantImport=Error importing public key\n\n doImportOne=Importar %1$S (%2$S)? doImportMultiple=Importar as seguintes chaves?\n\n%S previewFailed=Não consigo ler o arquivo da chave pública. @@ -366,14 +374,15 @@ sc.removeCard=A operação não necessita de um SmartCard na leitora.\nPor favor remova o seu SmartCard e repita a operação. sc.noCardAvailable=Não foi possível encontrar um SmartCard válido na sua leitora\nPor favor insira o SmartCard e repita a operação. sc.noReaderAvailable=A sua leitora de SmartCard não pode ser acessada\nPor favor conecte a sua leitora de SmartCard reader, insira o cartão e repita a operação. -keyError.keySpecNotFound=O endereço de mail "%S" não casa com a chave na sua cadeia de chaves. -keyError.keyIdNotFound=A chave configurada de ID "%S" não pôde ser encontrada na sua lista de chaves. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. keyError.resolutionAction=Por favor selecione uma chave vãlida na seção OpenPGP das configurações da sua conta. missingPassphrase=Senha não preenchida errorHandling.gpgAgentInvalid=Seu sistema está utilizando uma versão do agente pgp que não está adaptado para funcionar com a sua versão de GnuPG. errorHandling.gpgAgentError=GnuPG avisou sobre um erro de comunicação com o gpg-agente ( um componente do GnuPG). errorHandling.dirmngrError=GnuPG avisou sobre um erro de comunicação com o dirmngr ( um componente do GnuPG). errorHandling.pinentryError=GnuPG não pode consultar sua senha via pinentry. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. errorHandling.readFaq=Esta é uma configuração do sistema ou algum erro de configuração que impede o Enigmail de funcionar corretamente e não pode ser corrigido automaticamente.\n\nNós recomendamos fortemente que você consulte o nosso site web de suporte através do endereço https://enigmail.net/faq. gpgNotFound=Não foi possível localizar o programa do GnuPG '%S'.\nCertifique-se de que o caminho do executável do GnuPG esteja configurado corretamente nas Preferências do Enigmail. @@ -384,9 +393,8 @@ prefBad=Assinatura INVÁLIDA de %S failCancel=Erro - Recebimento de chave cancelado pelo usuário -failNoServer=Erro - Nenhum servidor de chaves especificado para receber chave -failNoID=Erro - Nenhuma identidade de chave especificada para se receber chave failKeyExtract=Erro - comando de extração de chave falhou +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=Erro - Primeiro bloco OpenPGP não é o bloco de chave pública importKeyConfirm=Importar chave(s) pública(s) contidas na mensagem? failKeyImport=Erro - importação de chave falhou @@ -425,6 +433,8 @@ identityName=Identidade: %S switchPepMode=Se você estiver utilizando o modo 'p≡p Junior' do Enigmail.\n\nAo habilitar o suporte ao OpenPGP ou ao S/MIME para uma conta, você estará desabilitando p≡p e utilizando usará o modo 'regular' do Enigmail sem p≡p. enableEnigmail=&Desabilitando p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Você ativou a criptografia, mas não selecionou uma chave. Para poder criptografar emails enviados para %S, você precisa especificar uma ou mais chaves válidas a partir de sua relação de chaves. Você deseja desabilitar a criptografia para %S? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=A funão que você selecionou não está disponível em modo offline. Por favor vá para o modo online e tente novamente. -protocolNotSupported=O protocolo '%S://' que você selecionou não é suportado para baixar chaves OpenPGP. -gpgkeysDisabled=Talvez ajude habilitar a opção 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=Não foi possível conectar ao servidor de chaves em %S. -keyDownloadFailed=Falha ao baixar chave do servidor de chaves. Mensagem de status é:\n%S internalError=Um erro interno ocorreu. As chaves não puderam ser baixadas ou importadas. -noKeyFound=Desculpe, não pude encontrar nenhuma resultado que atenda aos parâmetros de busca especificados.\nVerifique se os ID's de chave estão prefixados com \\"0x\\" (ex: 0xABCDEF12). -keyDownload.keyUnavailable=Lamentamos, mas a chave com o ID %S não está disponível no servidor de chaves. É provavel que o proprietário da chave não tenha a enviado para o servidor de chaves.\n\nPor favor peça ao remetente da mensagem que lhe envie a chave por email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Falha ao buscar ou baixar chave do servidor de chaves: gpgkeys_%S não pode ser executado. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Falha ao definir o nível de confiança @@ -490,7 +493,6 @@ asciiArmorFile=ASCII Seguro importKeyFile=Importar Arquivo de Chave OpenPGP gnupgFile=Arquivos do GnuPG -createKeyOK=Sua chave foi gerada saveRevokeCertAs=Criar e Salvar Certificado de Revogação revokeCertOK=O certificado de revogação foi criado com sucesso. Você pode utilizá-lo para invalidar a sua chave pública, exemplo: no caso de ter perdido a sua chave secreta. revokeCertFailed=O certificado de revogação não pode ser criado. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%S (0x%S) pub-sec defaultPubKeyFilename=Chaves-públicas-exportadas defaultPubSecKeyFilename=Chaves-públicas-e-secretas-exportadas -noSecretKeys=Nenhuma chave secreta foi encontrada.\n\nDeseja gerar a sua chave agora? sendKeysOk=Chave(s) enviada(s) com sucesso sendKeysFailed=Envio de chaves falhou receiveKeysOk=Chave(s) atualizadas com sucesso receiveKeysFailed=Baixa de chaves falhou +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=Você deseja importar chaves a partir do clipboard? importFromUrl=Baixe a chave pública nesta URL: copyToClipbrdFailed=Não foi possível copiar a(s) chave(s) selecionadas para o clipboard. copyToClipbrdOK=Chave(s) copiadas para o clipboard -deleteSecretKey=AVISO: Você está prestes a remover uma chave secreta!\nSe você apagar a sua chave secreta, não será mais possível descriptografar nenhuma mensagem criptografada com esta chave,e não será mais possível revogá-la também.\n\nVocê realmente quer apagar AMBAS as chaves secreta e pública\n'%S'? +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=AVISO: Você está prestes a apagar as chaves secretas!\nSe você apagar a sua chave secreta, não será mais possível descriptografar nenhuma mensagem criptografada com esta chave.\n\nVocê realmente quer apagar AMBAS as chaves secreta e pública selecionadas? deletePubKey=Você quer apagar a chave pública\n'%S'? deleteSelectedPubKey=Você quer apagar as chaves públicas? @@ -529,7 +531,7 @@ revokeKeyQuestion=Você está prestes a revogar a chave '%S'.\n\nNão será mais permitido assinar utilizando esta chave, e uma vez distribuída, outros também não serão mais permitidos criptografar utilizando eta chave. Você ainda poderá usar esta chave para descriptografar mensagens antigas.\n\nDeseja continuar? revokeKeyOk=A chave foi revogada. Se a sua chave está disponível em um servidor de chaves, é recomendado que você reenvie-a para que outros usuários vejam a revogação. revokeKeyFailed=A chave não pode ser revogada. -revokeKeyNotPresent=Você não tem chave (0x%S) que se encaixe neste cerificado de revogação!\n\nSe você perdeu a sua chave, você precisa importá-lo (ex: de um servidor de chaves) antes de revogar o certificado! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! revokeKeyAlreadyRevoked=A chave 0x%S já foi revogada anteriormente. refreshAllQuestion=Você não selecionou uma chave. Você quer atualizar TODAS as chaves? refreshKeyServiceOn.warn=Aviso: Suas chaves estão sendo atualizadas em segundo plano o mais seguro quão é possível.\nAtualizar todas as suas chaves de uma só vez irá revelar informação acerca de você de forma desnecessária.\nVocê quer realmente fazer isto? @@ -541,21 +543,21 @@ keyMan.button.import=&Importar keyMan.button.refreshAll=Atualiza&r Todas as Chaves keyMan.button.revokeKey=&Revogar Chave -keyMan.button.skip=&Pular Chave keylist.noOtherUids=Não possui outras identidades keylist.hasOtherUids=Também conhecido como -keylist.noPhotos=Foto não disponível -keylist.hasPhotos=Fotos +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos keyMan.addphoto.filepicker.title=Selecionar foto para acrescentar -keyMan.addphoto.warnLargeFile=O arquivo que você escolheu é maior que 25kb.\nNão é recomendado acrescentar arquivos de foto muito grandes, pois as chaves se tornarão igualmente grandes. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. keyMan.addphoto.noJpegFile=O arquivo selecionado não parece ser um arquivo JPEG. Escolha outro tipo de arquivo. keyMan.addphoto.failed=A foto não pode ser acrescentada. noWksIdentity=A chave %S não tem uma identidade WKS. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -keyman.addBlacklistKey.msg=Você realmente quer parar p≡p de usar a chave "%1$S (%2$S)" para criptografar as mensagens? -keyman.removeBlacklistKey.msg=Você deseja permitir que p≡p use a chave "%1$S (%2$S)" para as futuras mensagens? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? keyman.addBlacklistKey.button=Colocar a chave na &Lista negra keyman.removeBlacklistKey.button=&Remover a chave da lista negra @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Falha ao trocar o PIN -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Atualizando chaves, por favor aguarde ... keyserverProgress.uploading=Enviando chaves, por favor aguarde ... keyserverProgress.wksUploadFailed=Não foi possível enviar a sua chave para o serviço de chaves Web keyserverProgress.wksUploadCompleted=A sua chave publica foi enviada com sucesso ao seu provedor. Você receberá um email para confirmar que foi feito o envio. keyserverTitle.refreshing=Atualizar Chaves keyserverTitle.uploading=Envio de Chaves +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=Sua senha deve conter pelo menos 8 caracteres! -setupWizard.reallyCancel=Você realmente deseja cancelar o Assistente de Configuração do Enigmail? setupWizard.invalidGpg=O arquivo que você especificou não é um executável do GnuPG. Especifique um arquivo diferente. -setupWizard.specifyFile=Você precisa escolher pelo menos um arquivo de chave pública para continuar. setupWizard.installFailed=Parece que a instalação não obteve êxito. Tente instalar novamente, ou instale o GnuPG manualmente e localize-o com o botão "Localizar". setupWizard.downloadForbidden=Para a sua segurança, nós não vamos baixar o GnuPG. Por favor visite https://gnupg.org/ para baixar o GnuPG. setupWizard.downloadImpossible=Não é possível baixar o GnuPG agora. Tente mais tarde ou navegue em https://gnupg.org/ para poder baixar o GnuPG. -setupWizard.hashSumError=O assistente não conseguiu verificar a integridade do arquivo baixado. O arquivo pode estar corrompido ou ter sido manipulado. Deseja continuar a instalação mesmo assim? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? setupWizard.importSettingsFile=Escolha de onde será carregado o arquivo de cópia de segurança -setupWizard.invalidSettingsFile=O arquivo especificado não é um arquivo de segurança das configurações do Enigmail. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. setupWizard.gpgConfExists=Há um arquivo de configuração existente do GnuPG. Deseja sobrescrever com o arquivo da sua instalação antiga? -setupWizard.noGpgHomeDir=Parece que você configurou %S para usar o GnuPG. Contudo, este não é um diretório - você não pode utilizá-lo +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. setupWizard.unmachtedIds=As seguintes identidades da sua antiga configuração não puderam ser encontradas:\n%S\nAs configurações para estas identidades serão ignoradas. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Um erro aconteceu ao tentar baixar o GnuPG. Verifique o log de erros para mais detalhes. @@ -654,12 +662,12 @@ filter.term.pgpencrypted.label=Criptografado por OpenPGP filter.encrypt.label=Encriptografar para a chave (Enigmail) filter.keyRequired=Você precisa selecionar uma chave do destinatário. -filter.keyNotFound=Não foi possível encontrar uma chave de encriptação para "%S". -filter.warn.keyNotSecret=Aviso - o filtro de ação "Encriptar para a chave" substitui os recipientes.\n\nSe você não possuir a chave secreta para "%S" vocÊ não poderá mais poder ler os mails. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -converter.decryptBody.failed=Não foi possível descriptografar a mensagem com o assunto\n"%S".\nVocê quer tentar novamente com uma senha diferente ou quer abandonar a mensagem? -converter.decryptAtt.failed=Não foi possível descriptografar o anexo "%1$S"\nda mensagem cujo assunto é\n"%2$S".\nVocê deseja tentar novamente com outra senha ou quer desistir da mensagem? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? saveLogFile.title=Salvar Arquivo de Log @@ -691,13 +699,13 @@ enigmailSettings=Configurações do Enigmail defaultBackupFileName=Enigmail-Exportar specifyExportFile=Especifique o nome do arquivo para exportação -homedirParamNotSUpported=Parâmetros adicionais para configurar o caminho. como o --homedir e o --keyring não são suportados para exportação/recuperação das suas configurações. Por favor utilize métodos alternativos como o ajuste da variável de ambiente GNUPGHOME. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm -expiry.keyExpiresSoon=Sua chave %1$S vai expirar em menos do que %2$S dias.\n\nNós recomendamos que você crie um novo par de chaves e configure as contas correspondentes para usar a nova chave. -expiry.keysExpireSoon=As seguintes chaves que você possue irão expirar em menos que %1$S dias:\n%2$S Nós recomendamos que você crie novas chaves e configure as suas contas para utilizar novas chaves. -expiry.keyMissingOwnerTrust=Sua chave secreta %S perdeu a confiabilidade.\n\nNós recomendamos que você configure "Sua confiança nos certificados" para Ultimate nas propriedades da chave. -expiry.keysMissingOwnerTrust=As seguintes chaves secretas que você possue perderam a confiança.\n%S.\nRecomendamos que ajuste "Você confia nos certificações" para definir as propriedades da chave. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. expiry.OpenKeyManager=Abrir o gerenciador de chaves do Enigmail expiry.OpenKeyProperties=Abrir as propriedades da Chave @@ -709,6 +717,7 @@ gpghomedir.notwritable=Não há permissão de escrita para o diretório '%S' que contém as suas chaves OpenPGP. gpghomedir.notdirectory=O diretório '%S' que contém suas chaves OpenPGP é um arquivo invês de ser um diretório. gpghomedir.notusable=Por Favor corrija as permissões do diretório ou altere a localização do diretório "home" do seu GnuPG. GnuPG nãopoderá funcionar de outra forma. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=As palavras-confiáveis p≡p para a própria conta não puderam ser verificadas. @@ -728,12 +737,12 @@ pepPrivacyStatus.RatingMistrustSuggestion=Re-estabeleça a conexão com seu parceiro de comunicação e tente completar outra negociação. pepPrivacyStatus.RatingReliableSuggestion=Complete a negociação com o seu parceiro de comunicação através da troca de trustwords pessoalmente ou pelo telefone. A negociação é necessária apenas uma única vez para cada parceiro e serve para garantir a comunicação de forma segura e confiável. pepPrivacyStatus.RatingTrustedSuggestion=Nenhuma ação se faz necessária! -pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Cuidado! esta mensagem pode não ser segura. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Por favor adicione as informações necessárias. -pepPrivacyStatus.RatingUnderAttackSuggestion=verifique a parte o conteúdo da mensagem com o seu parceiro de comunicação. -pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Garanta que o estado da segurança para cada um dos parceiros de comunicação listados esteja ao menos em seguro. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". pepPrivacyStatus.RatingUnencryptedSuggestion=Por favor peça ao seu parceiro de comunicação para utilizar uma solução de criptografia ou instalar o p≡p. -pepPrivacyStatus.RatingUnreliableSuggestion=Esta mensagem não possui uma criptografia confiável ou não possue uma assinatura. Peça ao seu parceiro de comunicação para atualizar a sua solução criptográfica ou intalar o p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. pepPrivacyStatus.RatingBrokenExplanation=Esta mensagem tem criptografia danificada ou formato inválido. pepPrivacyStatus.RatingHaveNoKeyExplanation=Esta mensagem não pôde ser descriptografada porque a chave não está disponível. @@ -763,16 +772,16 @@ handshakeDlg.label.outgoingMessage=Enviando mensagem handshakeDlg.label.incomingMessage=Recebendo mensagem handshakeDlg.error.noPeers=Não é possivel trocar informação sem que haja algum correspondente. -handshakeDlg.error.noProtection=Por favor habilite a proteção para poder utilizar a função de negociação. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -enigmail.acSetupPasswd.descEnterPasswd=Por Favor digite o código de configuração que é mostrado no outro dispositivo -enigmail.acSetupPasswd.descCopyPasswd=Por favor digite o código de configuração mostrado abaixo no outro dispositivo para continuar o processo de configuração +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm autocrypt.setupMsg.subject=Ajustar Mensagem para modo de Auto-encriptação autocrypt.setupMsg.msgBody=Para configurar o seu novo dispositivo para Auto-encriptar, por favor siga as instruções que serão mostradas no seu novo dispositivo. -autocrypt.setupMsg.fileTxt=Este é o arquivo de Auto-criptografia usado para transferir as configurações e chaves entre os clientes. Você pode descriptografá-lo usando o código de configuração mostrado no seu antigo dispositivo, e então importar a chave na sua cadeia de chaves. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html upgradeInfo.doctitle=O que há de novo no Enigmail 2.0? @@ -785,10 +794,12 @@ upgradeInfo.autocrypt.title=Suporte para Auto-encriptação upgradeInfo.autocrypt.desc=O Enigmail agora suporta Criptografia Automática, um novo padrão para distribuir as chave como parte das mensagens enviadas. O Enigmail automaticamente importa as chaves de mensagens compatíveis com a Criptografia Automatica, desta forma mais e mais emials poderão ser criptografados com o passar do tempo. upgradeInfo.pEp.title=Novo p≡p Modo Junior (Pretty Easy Privacy) -upgradeInfo.pEp.desc=Enigmail agora contém um modo Júnior p≡p. No momento você precisa instalar manualmente o p≡p para este propósito; Isto mudará nas futuras versões. O p≡p modo júnior permite que você use a criptografia OpenPGP o mais transparente possível; você não precisa mais se preocupar com a gerência de chaves e com a sincronização de chaves entre os dispositivos. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. upgradeInfo.bottom.desc=Por favor acesse noss documentaçãopara obter ajuda no uso do Enigmail. +#strings in pEpAdapter.jsm pep.missingGnuPG=Para poder usar o Enigmail/p≡p, o GnuPG é pré-requisito. Assim como não o encontramos instalado, nós sugerimos baixar e fazer a instalação. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=Sobre o Enigmail @@ -799,6 +810,7 @@ aboutEnigmail.documentation=Documentação: aboutEnigmail.testing=Testando: aboutEnigmail.userSupport=Suporte ao Usuário: +# aboutEnigmail.userSupport.team=the team and the list/forum members aboutEnigmail.localization=Localização: Veja o a página dos pacotes de tradução para o Enigmail aboutEnigmail.Credits=Créditos: aboutEnigmail.origAuthor=Autor Original da extensão do Enigmail @@ -808,3 +820,38 @@ aboutEnigmail.licenseSupportTitle=Licença & Suporte aboutEnigmail.license=Enigmail OpenPGP é open source e está licenciado sob a %S aboutEnigmail.support=Suporte e distribuição disponível em www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/pt-PT/enigmail.dtd enigmail-2.1.3+ds1/lang/pt-PT/enigmail.dtd --- enigmail-2.0.12+ds1/lang/pt-PT/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/pt-PT/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ - - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,11 +63,8 @@ - - - @@ -89,12 +77,13 @@ + - + @@ -117,6 +106,9 @@ + + + @@ -209,6 +201,7 @@ + @@ -217,8 +210,8 @@ - - + + @@ -345,7 +338,7 @@ - + @@ -368,7 +361,6 @@ - @@ -456,8 +448,8 @@ - - + + @@ -542,7 +534,7 @@ - + @@ -623,7 +615,7 @@ - + @@ -665,133 +657,36 @@ - - - - - - - - - - - - - - - - - - - - -Nota:O Enigmail verificará sempre as assinaturas das - mensagens para cada conta ou identidade, independentemente de estar ou não ativado."> - + + - - + - - - - - - - - - - - - - - - - - -chave pública serve para que outras pessoas lhe enviem mensagens cifradas. Pode distribuí-la a todos."> -chave pública serve para que você decifre essas mensagens e assine as suas mensagens. -Não a deve dar a ninguém."> -chave pública serve para que você decifre essas mensagens e assine as suas mensagens. -Não a deve dar a ninguém. -Para proteger a sua chave privada, ser-lhe-á pedida uma frase de acesso nos próximos dois diálogos."> -frase de acesso é uma senha para proteger a sua chave privada. Evita uma utilização errada da sua chave privada."> -não são recomendados."> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - exportar os seus dados do seu computador antigo usando o assistente de cópia de segurança nas Preferências do Enigmail - importar os dados para o seu novo computador usando este assistente. - "> - - - - - - -Obrigado por usar o Enigmail."> - - - - - - - - - + + + + + + + + + + + - + @@ -807,12 +702,9 @@ - - exportar os seus dados do seu computador antigo usando este assistente - importar os dados para o seu novo computador usando o Assistente de Configuração. - "> + + + @@ -832,7 +724,7 @@ - + @@ -859,7 +751,7 @@ - + @@ -873,9 +765,19 @@ - + + - + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/pt-PT/enigmail.properties enigmail-2.1.3+ds1/lang/pt-PT/enigmail.properties --- enigmail-2.0.12+ds1/lang/pt-PT/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/pt-PT/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=Enigmail: Aviso -enigConfirm=Enigmail: Confirmação +# enigConfirm=Enigmail Confirmation # enigInfo=Enigmail Information enigError=Enigmail: Erro enigPrompt=Enigmail: Comando @@ -78,7 +78,7 @@ passSpaceProblem=Devido a problemas técnicos, a sua senha não pode começar nem acabar com um espaço. changePassFailed=A alteração da senha falhou. -keyConfirm=Criar chave pública e privada para '%S'? +# keyConfirm=Generate public and secret key for '%S'? keyMan.button.generateKey=&Criar Chave keyAbort=Abortar criação da nova chave? keyMan.button.generateKeyAbort=&Abortar Criação de Chave @@ -86,14 +86,14 @@ expiryTooLong=Não pode criar uma chave com o prazo de expiração superior a 100 anos. expiryTooLongShorter=Não pode criar uma chave que expire em mais de 90 anos. expiryTooShort=A chave tem de ser válida por um mínimo de um dia. -keyGenFailed=Não foi possível criar a chave. Por favor, verifique a consola do Enigmail (Menu Enigmail > Depuração) para mais detalhes. +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. setKeyExpirationDateFailed=A data de expiração não pôde ser alterada # Strings in enigmailMessengerOverlay.js securityInfo=Informação de Segurança Enigmail\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Os anexos a esta mensagem não foram assinados nem cifrados*\n\n +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=Mensagem possivelmente assinada ou cifrada com PGP/MIME. Clique Decifrar para verificar. saveAttachmentHeader=Enigmail: Guardar anexo decifrado @@ -102,7 +102,7 @@ beginPgpPart=********* *INÍCIO de PARTE ASSINADA ou CIFRADA* ********* endPgpPart=********** *FIM de PARTE ASSINADA ou CIFRADA* ********** -notePartEncrypted=Enigmail: *Partes da mensagem NÃO foram assinadas ou cifradas* +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *Encontrados múltiplos blocos de mensagem -- verificação/decifração abortada* decryptOkNoSig=Aviso\n\nA mensagem foi corretamente decifrada mas não foi possível verificar a assinatura @@ -114,6 +114,7 @@ fixBrokenExchangeMsg.failed=Não foi possível reparar a mensagem. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. @@ -148,10 +149,9 @@ minimalLineWrapping=Configurou a quebra automática de linha para %S caracteres. Para cifrar ou assinar corretamente, este valor deve ser pelo menos 68.\nDeseja alterar a quebra automática de linha para 68 caracteres? warning=Aviso signIconClicked=Alterou manualmente a assinatura. Desta forma, ao compor esta mensagem, (des)ativar a assinatura já não depende de (des)ativar a cifra. -errorOwnKeyUnusable=A chave com Identificador '%S' configurada para a identidade atual não contém uma chave OpenPGP utilizável.\n\nPor favor assegure-se de que tem uma chave OpenPGP válida e dentro do prazo de expiração.\nSe a sua chave ainda não expirou, verifique se definiu a confiança no utilizador para total ou máxima. +# 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=Erro ao guardar rascunho # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. -# msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=Erro Interno: desativada a cifra prometida @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=O Enigmail está desativado para a identidade seleccionada # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject -msgCompose.encryptedSubjectStub=Mensagem Cifrada # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject @@ -179,7 +178,7 @@ # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -# pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=Guardar a mensagem %1$S para %2$S na pasta Mensagens Não Enviadas? onlineSend=Enviar mensagem %1$S para %2$S? -encryptKeysNote=Nota: a mensagem está cifrada com os seguintes Identificadores / Chaves de Utilizador: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S hiddenKey= -signFailed=Erro no Enigmail; Não foi possível assinar/cifrar; enviar mensagem não cifrada? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=&Enviar Mensagem Não Cifrada recipientsSelectionHdr=Escolha os Destinatários para os quais Cifrar @@ -225,9 +224,9 @@ signOffWithReason=Assinar: Desligado (%S) reasonEnabledByDefault=ativado por omissão reasonManuallyForced=forçado manualmente -reasonByRecipientRules=forçado pelas regras por destinatário +# reasonByRecipientRules=forced by per-recipient rules reasonByAutoEncryption=forçado por modo de cifra automática -reasonByConflict=devido a conflito nas regras por destinatário +# reasonByConflict=due to conflict in per-recipient rules reasonByEncryptionMode=devido ao modo de cifra # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=Será usado PGP embebido # Attach own key status (tooltip strings): -attachOwnKeyNo=A sua chave não será anexada -attachOwnKeyYes=A sua chave será anexada -attachOwnKeyDisabled=A sua chave não pode ser anexada. Deve selecionar uma chave específica\nna secção OpenPGP nas Definições da conta para ativar esta funcionalidade. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Detetado conflito em regras por destinatário\n%S\n\nEnviar mensagem com esta configuração? msgCompose.button.configure=&Configurar @@ -269,6 +268,10 @@ clickDetailsButton=; premir o botão 'Detalhes' para mais informação clickImportButton=; premir o botão 'Importar Chave' para transferir a chave keyTypeUnsupported=; o tipo de chave não é suportado pela sua versão do GnuPG +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Decifrar msgPart=Parte da mensagem %S msgSigned=assinada msgSignedUnkownKey=assinada com chave desconhecida @@ -280,8 +283,10 @@ needKey=Erro - não foi encontrada a chave privada correspondente para decifrar a mensagem failedDecrypt=Erro - foi impossível decifrar badPhrase=Erro - senha incorreta +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=Erro - foi impossível decifrar/verificar viewInfo=; Escolha Ver > Informação de segurança da mensagem para mais informação +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=Mensagem decifrada decryptedMsgWithFormatError=Mensagem decifrada (restaurado o formato PGP defeituoso provavelmente causado por um servidor Exchange antigo, podendo resultar numa mensagem de difícil leitura) @@ -326,6 +331,7 @@ # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. @@ -337,6 +343,8 @@ prefs.warnAskNever=Aviso: ativar esta opção terá como resultado mensagens não cifradas serem enviadas sem qualquer aviso sempre que não for encontrada qualquer chave para um dos destinatários -- O OpenPG não o informará se isto acontecer! prefs.warnIdleTimeForUnknownAgent=O seu sistema possui uma ferramenta especial para gestão de senhas, como o gnome-keyring ou seahorse-agent. Infelizmente, o Enigmail não pode controlar o tempo de expiração da chave com a ferramenta que está a usar. Por esse motivo a configuração do tempo de expiração respetiva será ignorada. prefEnigmail.oneKeyserverOnly=Erro - Apenas pode indicar um servidor de chaves para importação automática de chaves OpenPGP. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +# aboutLicense.desc=Enigmail is open source and licensed under the Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=Erro - senha não introduzida noPGPblock=Erro - Não foi encontrado um bloco OpenPGP válido unverifiedReply=A parte indentada da mensagem (resposta) foi provavelmente modificada -keyInMessageBody=Foi encontrada uma chave no corpo da mensagem. Clique 'Importar Chave' para a importar +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=Erro - Assinatura não coincidente -cantImport=Erro ao importar chave pública\n\n +# cantImport=Error importing public key\n\n doImportOne=Importar %1$S (%2$S)? doImportMultiple=Importar as seguintes chaves?\n\n%S previewFailed=Não foi possível ler o ficheiro de chave pública. @@ -366,14 +374,15 @@ sc.removeCard=A operação não necessita de qualquer SmartCard inserido no leitor.\nPor favor remova o SmartCard e repita a operação. sc.noCardAvailable=Não foi encontrado qualquer SmartCard no seu leitor\nPor favor, insira o SmartCard e repita a operação. sc.noReaderAvailable=Não foi possível aceder ao seu leitor de SmartCards\nPor favor, ligue o seu leitor de SmartCards, insira o seu cartão e repita a operação. -keyError.keySpecNotFound=O endereço de correio eletrónico "%S" não corresponde a nenhuma chave no seu porta-chaves. -keyError.keyIdNotFound=O Identificador da chave "%S" configurado não foi encontrado no seu porta-chaves. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. keyError.resolutionAction=Por favor selecione uma chave válida na secção OpenPGP nas Definições da conta. missingPassphrase=Introduza uma frase de acesso errorHandling.gpgAgentInvalid=O seu sistema está a executar uma versão do gpg-agent que não é adequada para a sua versão GnuPG. errorHandling.gpgAgentError=O GnuPG reportou um erro na comunicação com gpg-agent (uma componente do GnuPG). errorHandling.dirmngrError=O GnuPG reportou um erro na comunicação com dirmngr (um componente do GnuPG). errorHandling.pinentryError=O GnuPG não consegue consultar a sua frase de acesso via pinentry. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. errorHandling.readFaq=Isto é um erro provocado por configurações ou definições de sistema que impede o Enigmail de funcionar corretamente e não pode ser resolvido automaticamente.\n\nRecomenda-se veementemente que consulte o nosso sítio web de suporte em https://enigmail.net/faq. gpgNotFound=Foi impossível encontrar o GnuPG em '%S'.\nCertifique-se de que configurou corretamente a localização do executável GnuPG nas Preferências do Enigmail. @@ -384,9 +393,8 @@ prefBad=Assinatura INVÁLIDA de %S failCancel=Erro - Importação de chave cancelada pelo utilizador -failNoServer=Erro - Nenhum servidor configurado do qual importar a chave -failNoID=Erro - Não foi indicado o Identificador da chave a importar failKeyExtract=Erro - O comando de extração de chave falhou +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=Erro - O primeiro bloco OpenPGP não contém uma chave pública importKeyConfirm=Importar chave(s) pública(s) contidas na mensagem? failKeyImport=Erro - a importação de chave falhou @@ -425,6 +433,8 @@ identityName=Identidade: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Ativou a cifra mas não selecionou uma chave. Para cifrar o correio enviado para %1$S, necessita de escolher uma ou várias chaves válidas da sua lista de chaves. Deseja desativar a cifra para %2$S? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=A função que seleccionou não está disponível quando desligado da Internet. Por favor, ligue-se à rede e tente novamente. -protocolNotSupported=O protocolo '%S://' que seleccionou não é suportado para importar chaves OpenPGP. -gpgkeysDisabled=Ativar a opção 'extensions.enigmail.useGpgKeysTool' pode ajudar. noKeyserverConn=Foi impossível estabelecer ligação com o servidor %S. -keyDownloadFailed=A transferência de chave do servidor falhou. Mensagem do sistema:\n%S internalError=Ocorreu um erro interno. Foi impossível transferir ou importar as chaves. -noKeyFound=Desculpe, não foi possível encontrar uma chave com o critério de busca especificado.\nPor favor, note que os identificadores de chave devem conter o prefixo \\"0x\\" (por ex: 0xABCDEF12). -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=A procura ou importação das chaves do servidor falhou: foi impossível executar gpgkeys_%S. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Erro ao definir a confiança no utilizador @@ -490,7 +493,6 @@ asciiArmorFile=Armadura ASCII (*.asc) importKeyFile=Importar Ficheiro com Chaves OpenPGP gnupgFile=Ficheiros GnuPG -# createKeyOK=Your Key has been generated saveRevokeCertAs=Criar e Guardar Certificado de Revogação # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=O certificado de revogação não pôde ser criado. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%1$S (0x%2$S) pub-sec defaultPubKeyFilename=Chaves-publicas-exportadas defaultPubSecKeyFilename=Chaves-publicas-e-privadas-exportadas -noSecretKeys=Não foram encontradas chaves privadas.\n\nDeseja criar a sua chave agora? sendKeysOk=Chave(s) enviadas com sucesso sendKeysFailed=Erro ao enviar as chaves receiveKeysOk=Chave(s) atualizada(s) com sucesso receiveKeysFailed=Erro ao importar as chaves +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=Deseja importar chaves da Área de Transferência? importFromUrl=Descarregar chave pública deste URL: copyToClipbrdFailed=Foi impossível copiar as chaves seleccionadas para a Área de Transferência. copyToClipbrdOK=Chave(s) copiada(s) para a Área de Transferência -deleteSecretKey=AVISO: Está prestes a remover uma chave privada!\nAo remover a sua chave privada ficará impedido de decifrar qualquer mensagem cifrada para essa chave ou de a revogar.\n\nTem a certeza de que deseja remover AMBAS as chaves, pública e privada\n'%S'? +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=AVISO: Está prestes a apagar chaves privadas!\nSe apagar a sua chave privada, não poderá mais decifrar mensagens cifradas para essa chave.\n\nDeseja realmente apagar AMBAS as chaves seleccionadas, pública e privada? deletePubKey=Deseja remover a chave pública\n'%S'? deleteSelectedPubKey=Deseja apagar as chaves públicas? @@ -529,7 +531,7 @@ revokeKeyQuestion=Está prestes a revogar a chave %S.\n\nIrá perder a hipótese de assinar com esta chave e, após distribuído este certificado, mais ninguém lhe poderá enviar mensagens cifradas com essa chave. Poderá continuar a usar a chave para decifrar mensagens antigas.\n\nDeseja continuar? revokeKeyOk=A chave foi revogada. Se tinha a chave disponível num servidor, deve exportá-la de novo, para que todos possam ver a revogação. revokeKeyFailed=Foi impossível revogar a chave. -# revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Não seleccionou qualquer chave. Deseja refrescar TODAS as chaves? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? @@ -541,21 +543,21 @@ keyMan.button.import=&Importar keyMan.button.refreshAll=&Refrescar Todas as Chaves keyMan.button.revokeKey=&Revogar Chave -keyMan.button.skip=&Saltar Chave keylist.noOtherUids=Não tem outras identidades keylist.hasOtherUids=Também conhecido como -keylist.noPhotos=Sem fotografia disponível -keylist.hasPhotos=Fotografias +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos keyMan.addphoto.filepicker.title=Seleccionar fotografia a adicionar -keyMan.addphoto.warnLargeFile=O ficheiro que escolheu é maior que 25 kB.\nNão é recomendado usar ficheiros muito grandes pois isso aumenta consideravelmente o tamanho das chaves. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. keyMan.addphoto.noJpegFile=O ficheiro seleccionado não aparenta estar no formato JPEG. Por favor, seleccione um ficheiro diferente. keyMan.addphoto.failed=A fotografia não pôde ser adicionada. # noWksIdentity=The key %S does not have a WKS identity. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? -# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=A alteração do PIN falhou -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Refrescando as chaves, aguarde por favor... keyserverProgress.uploading=Transferindo as chaves, aguarde por favor ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Refrescar Chaves keyserverTitle.uploading=Transferência de Chaves +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=A sua senha deve conter pelo menos 8 caracteres! -setupWizard.reallyCancel=Deseja realmente fechar o Assistente de Configuração do Enigmail? setupWizard.invalidGpg=O ficheiro que escolheu não é um executável GnuPG. Por favor, indique outro ficheiro. -setupWizard.specifyFile=Necessita de indicar pelo menos uma chave pública para continuar. setupWizard.installFailed=Parece que a instalação não foi bem sucedida. Tente instalar de novo ou instalar o GnuPG manualmente e localizá-lo usando o botão Procurar. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. -setupWizard.hashSumError=O assistente não foi capaz de verificar a integridade do ficheiro transferido. O ficheiro pode estar corrompido ou ter sido manipulado. Deseja continuar a instalação de qualquer forma? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? setupWizard.importSettingsFile=Indique o ficheiro da cópia de segurança -setupWizard.invalidSettingsFile=O ficheiro indicado não é uma cópia de segurança das Definições do Enigmail. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. setupWizard.gpgConfExists=O ficheiro de configuração do GnuPG já existe. Deseja substituí-lo pelo ficheiro da sua instalação anterior? -# setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Ocorreu um erro ao tentar transferir o GnuPG. Por favor verifique a Consola de Erro para mais detalhes. @@ -654,12 +662,12 @@ # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. -# filter.keyNotFound=Could not find an encryption key for "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -converter.decryptBody.failed=Não foi possível decifrar a mensagem com o assunto\n"%S".\nDeseja repetir com uma frase senha diferente ou saltar a mensagem? -converter.decryptAtt.failed=Não foi possível decifrar o anexo "%1$S"\nda mensagem com o assunto\n"%2$S".\nDeseja repetir com uma frase senha diferente ou saltar a mensagem? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? saveLogFile.title=Guardar Ficheiro de Registo @@ -691,13 +699,13 @@ enigmailSettings=DefinicoesEnigmail defaultBackupFileName=Enigmail-export specifyExportFile=Indique o nome do ficheiro para exportar -homedirParamNotSUpported=Parâmetros adicionais que configuram caminhos como --homedir e --keyring não são suportados na exportação/restauração. Por favor use métodos alternativos tais como definir a variável de ambiente GNUPGHOME. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #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=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -expiry.keysMissingOwnerTrust=As suas chaves que se seguem não são de confiança:\n%S.\nRecomenda-se que configure "Confio nos certificados" para totalmente nas propriedades da chave. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. expiry.OpenKeyManager=Abrir Gestor de Chaves do Enigmail # expiry.OpenKeyProperties=Open Key Properties @@ -709,6 +717,7 @@ # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. @@ -728,12 +737,12 @@ # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! -# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Por favor, adicione a informação necessária. -# pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. pepPrivacyStatus.RatingHaveNoKeyExplanation=Esta mensagem não pode ser decifrada porque a chave não está disponível. @@ -763,16 +772,16 @@ handshakeDlg.label.outgoingMessage=Mensagem a enviar handshakeDlg.label.incomingMessage=Mensagem recebida # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. -# handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device -# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? @@ -785,10 +794,12 @@ # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. +#strings in pEpAdapter.jsm # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=Sobre o Enigmail @@ -799,6 +810,7 @@ # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: +# aboutEnigmail.userSupport.team=the team and the list/forum members # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension @@ -808,3 +820,38 @@ # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/ro/am-enigprefs.properties enigmail-2.1.3+ds1/lang/ro/am-enigprefs.properties --- enigmail-2.0.12+ds1/lang/ro/am-enigprefs.properties 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ro/am-enigprefs.properties 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,2 @@ +# Strings used in the Mozill AccountManager +prefPanel-enigprefs=Securitate OpenPGP diff -Nru enigmail-2.0.12+ds1/lang/ro/enigmail.dtd enigmail-2.1.3+ds1/lang/ro/enigmail.dtd --- enigmail-2.0.12+ds1/lang/ro/enigmail.dtd 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ro/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,780 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/ro/enigmail.properties enigmail-2.1.3+ds1/lang/ro/enigmail.properties --- enigmail-2.0.12+ds1/lang/ro/enigmail.properties 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ro/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,857 @@ +Enigmail=Enigmail + + +##################################################################### +# Strings used within enigmailCommon.js and enigmailCommon.jsm +##################################################################### + +# enigAlert=Enigmail Alert +# enigConfirm=Enigmail Confirmation +# enigInfo=Enigmail Information +# enigError=Enigmail Error +# enigPrompt=Enigmail Prompt + +dlgYes=&Da +# dlgNo=&No +# dlgKeepSetting=Remember my answer and do not ask me again +# dlgNoPrompt=Do not show me this dialog again +# dlg.button.delete=&Delete +# dlg.button.cancel=&Cancel +# dlg.button.close=&Close +dlg.button.continue=Con&tinuare +# dlg.button.skip=&Skip +# dlg.button.overwrite=&Overwrite +# dlg.button.view=&View +dlg.button.retry=&Reîncercați +# dlg.button.ignore=&Ignore +# dlg.button.install=&Install +# dlg.button.ok=&OK + +# repeatPrefix=\n\nThis alert will repeat %S +# repeatSuffixSingular=more time. +repeatSuffixPlural=de mai multe ori. +# noRepeat=\n\nThis alert will not repeat until you upgrade Enigmail. + +# pgpNotSupported=You seem to be using Enigmail together with PGP 6.x\n\nUnfortunately, PGP 6.x has a number of issues that prevent Enigmail from working correctly. Therefore, Enigmail does not support PGP 6.x anymore; please switch to GnuPG (GPG) instead.\n\nIf you need help on switching to GnuPG, check the Help section of the Enigmail homepage. +# initErr.howToFixIt=In order to use Enigmail, GnuPG is required. If you did not install GnuPG yet, the easiest way to do this is using the "Setup Wizard" button below. +initErr.setupWizard.button=Configurare inițială (&Setup) +# passphraseCleared=The passphrase has been cleared. +# cannotClearPassphrase=You are using a non-standard tool (such as gnome-keyring) for passphrase handling. Clearing the passphrase is therefore not possible from within Enigmail. +noPhotoAvailable=Nu este disponibilă nici o fotografie +# debugLog.title=Enigmail Debug Log +# error.photoPathNotReadable=Photo path '%S' is not readable + +generalError=Eroare: %S + +# Strings in configure.jsm +# enigmailCommon.versionSignificantlyChanged=This new version of Enigmail has significant changes in the handling of preferences and options. We tried to transfer the old settings to this new version. However, we cannot cover all cases automatically. Please double check the resulting new preferences and options. +# enigmailCommon.checkPreferences=Check Preferences ... +# preferences.defaultToPgpMime=We have changed the default message encoding in Enigmail from Inline-PGP to PGP/MIME. We recommend you keep this as default.\n\nIf you still wish to use Inline-PGP by default, you can do so in the Account Settings under OpenPGP Security. + +##################################################################### +# Strings in enigmailAbout.js +##################################################################### + +usingVersion=Folosiți Enigmail versiunea %S +# enigmailPepVersion=Enigmail/p≡p version %S +# usingAgent=Using %1$S executable %2$S to encrypt and decrypt +agentError=EROARE: Nu poate fi accesat serviciul Enigmail principal! + +##################################################################### +# Strings in enigmailKeygen.js +##################################################################### + +# accessError=Error in accessing Enigmail service +# onlyGPG=Key generation only works with GnuPG (not with PGP)! + +# keygenComplete=Key generation completed! Identity <%S> will be used for signing. +# revokeCertRecommended=We highly recommend to create a revocation certificate for your key. This certificate can be used to invalidate your key, e.g. in case your secret key gets lost or compromised. Do you want to create such a revocation certificate now? +# keyMan.button.generateCert=&Generate Certificate +# genCompleteNoSign=Key generation completed! +genGoing=Generarea cheii este deja în desfășurare! + +# passNoMatch=Passphrase entries do not match; please re-enter +# passCheckBox=Please check box if specifying no passphrase for key +# passUserName=Please specify user name for this identity +# keygen.missingUserName=There is no name specified for the selected account/identity. Please enter a value in the field "Your name" in the account settings. +# keygen.passCharProblem=You are using special characters in your passphrase. Unfortunately, this can cause troubles for other applications. We recommend you choose a passphrase consisting only of any of these characters:\na-z A-Z 0-9 /.;:-,!?(){}[]%* +# passSpaceProblem=Due to technical reasons, your passphrase may not start or end with a space character. +changePassFailed=Schimbarea parolei a eșuat + +# keyConfirm=Generate public and secret key for '%S'? +keyMan.button.generateKey=&Generați cheia +# keyAbort=Abort key generation? +# keyMan.button.generateKeyAbort=&Abort Key Generation +keyMan.button.generateKeyContinue=&Continuați generarea cheii +expiryTooLong=Nu puteți crea o cheie care să expire în mai mult de 100 de ani. +# expiryTooLongShorter=You cannot create a key that expires in more than 90 years. +# expiryTooShort=Your key must be valid for at least one day. +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. +# setKeyExpirationDateFailed=The expiration date could not be changed + +# Strings in enigmailMessengerOverlay.js +# securityInfo=Enigmail Security Info\n\n + +enigHeader=Enigmail: +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n +# possiblyPgpMime=Possibly PGP/MIME encrypted or signed message; use 'Decrypt/Verify' function to verify + +saveAttachmentHeader=Enigmail: Salvați atașamentul descifrat +# noTempDir=Could not find a temporary directory to write to\nPlease set the TEMP environment variable +# attachmentPgpKey=The attachment '%S' you are opening appears to be an OpenPGP key file.\n\nClick 'Import' to import the keys contained or 'View' to view the file contents in a browser window + +# beginPgpPart=********* *BEGIN ENCRYPTED or SIGNED PART* ********* +endPgpPart=********** *SFÂRȘITUL PĂRȚII CRIPTATE sau SEMNATE* ********** +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* +# noteCutMessage=Enigmail: *Multiple message blocks found -- decryption/verification aborted* + +# decryptOkNoSig=Warning\n\nDecryption was successful, but the signature could not be verified correctly +# msgOvl.button.contAnyway=&Continue Anyway +# signature.verifiedOK=The signature for attachment %S was successfully verified +# signature.verifyFailed=The signature for attachment %S could not be verified +# attachment.noMatchToSignature=Could not match attachment '%S' to a signature file +# attachment.noMatchFromSignature=Could not match signature file '%S' to an attachment +# fixBrokenExchangeMsg.failed=Did not succeed to repair message. +enigmail.msgViewColumn.label=Enigmail +# enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key +# wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S +# wksConfirmSuccess=Confirmation email sent. +# wksConfirmFailure=Sending the confirmation email failed. +# autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? +# autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. +# autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. +# autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. +# autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? +# autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. + +##################################################################### +# Strings in enigmailMsgComposeOverlay.js +##################################################################### + +# keysToExport=Select OpenPGP Keys to Insert +# keysToUse=Select OpenPGP Key(s) to use for %S +pubKey=Cheie publică pentru %S\n + +# windowLocked=Compose window is locked; send cancelled +# sendUnencrypted=Failed to initialize Enigmail.\nSend unencrypted message? +# composeSpecifyEmail=Please specify your primary email address, which will be used to choose the signing key for outgoing messages.\n If you leave it blank, the FROM address of the message will be used to choose the signing key. +# sendingHiddenRcpt=This message has BCC (blind copy) recipients. If this message is encrypted, it is possible to hide the BCC recipients but users of some products (e.g. PGP Corp.) will not be able to decrypt the message. Given this, we recommend to avoid BCC-emails with encrypted messages. +# sendWithHiddenBcc=Hide BCC recipients +# sendWithShownBcc=Encrypt normally +# sendingNews=Encrypted send operation aborted.\n\nThis message cannot be encrypted because there are newsgroup recipients. Please re-send the message without encryption. +# sendToNewsWarning=Warning: you are about to send an encrypted email to a newsgroup.\n\nThis is discouraged because it only makes sense if all members of the group can decrypt the message, i.e. the message needs to be encrypted with the keys of all group participants. Please send this message only if you know exactly what you are doing.\n\nContinue? +# hasHTML=HTML email warning:\nThis message may contain HTML, which could cause signing/encryption to fail. To avoid this in the future, you should press the SHIFT key when clicking on the Compose/Reply button to send signed email.\nIf you sign email by default, you should uncheck the 'Compose Messages in HTML' preference box to permanently disable HTML email for this email account. +# strippingHTML=Message contains HTML formatting information that will be lost when converting to plain text for signing/encryption. Do you wish to proceed? +# msgCompose.button.sendAnyway=&Send Message Anyway +# attachWarning=Attachments to this message are not local, they cannot be encrypted. In order to encrypt the attachments, store them as local files first and attach these files. Do you wish to send the message anyway? +# quotedPrintableWarn=You have enabled 'quoted-printable' encoding for sending messages. This may result in incorrect decryption and/or verification of your message.\nDo you wish to turn off sending 'quoted-printable' messages now? +# minimalLineWrapping=You have set line wrapping to %S characters. For correct encryption and/or signing, this value needs to be at least 68.\nDo you wish to change line wrapping to 68 characters now? +# warning=Warning +# signIconClicked=You have manually modified signing. Therefore, while you are composing this message, (de)activating signing does not depend anymore on (de)activating encryption. +# 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.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. + +# msgCompose.internalEncryptionError=Internal Error: promised encryption disabled +msgCompose.internalError=S-a produs o eroare internă. + +# msgCompose.toolbarTxt.signAndEncrypt=This message will be signed and encrypted +# msgCompose.toolbarTxt.signOnly=This message will be signed +# msgCompose.toolbarTxt.encryptOnly=This message will be encrypted +# msgCompose.toolbarTxt.noEncryption=This message will be unsigned and unencrypted +# msgCompose.toolbarTxt.disabled=Enigmail is disabled for the selected identity +# msgCompose.protectSubject.tooltip=Protect the message subject +# msgCompose.noSubjectProtection.tooltip=Do not protect the message subject +# msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? +# msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? +# msgCompose.protectSubject.yesButton=&Protect subject +# msgCompose.protectSubject.noButton=&Leave subject unprotected + +# msgCompose.detailsButton.label=Details ... +# msgCompose.detailsButton.accessKey=D + +msgCompose.pepSendUnknown=Necunoscut +msgCompose.pepSendUnsecure=Nesigur +msgCompose.pepSendSecure=Sigur +# msgCompose.pepSendTrusted=Secure & Trusted + +# pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? + + +# note: should end with double newline: +# sendAborted=Send operation aborted.\n\n + +# details: +# keyNotTrusted=Not enough trust for key '%S' +# keyNotFound=Key '%S' not found +# keyRevoked=Key '%S' revoked +# keyExpired=Key '%S' expired + +statPGPMIME=PGP/MIME +# statSMIME=S/MIME +# statSigned=SIGNED +# statEncrypted=ENCRYPTED +# statPlain=UNSIGNED and UNENCRYPTED + +# offlineSave=Save %1$S message to %2$S in Unsent Messages folder? + +# onlineSend=Send %1$S message to %2$S? +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S +hiddenKey= + +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? +# msgCompose.button.sendUnencrypted=&Send Unencrypted Message +# recipientsSelectionHdr=Select Recipients for Encryption + +# configureNow=You did not yet configure Enigmail security for the selected identity. Do you want to do this now? + +# encryption/signing status and associated reasons: +encryptMessageAuto=Cifrați mesajul (automat) +encryptMessageNorm=Cifrați mesajul +signMessageAuto=Semnați mesajul (automat) +signMessageNorm=Semnați mesajul + +encryptOff=Cifrare: NU +# encryptOnWithReason=Encryption: ON (%S) +encryptOffWithReason=Cifrare: NU (%S) +# encryptOn=Encryption: ON +# signOn=Signing: ON +# signOff=Signing: OFF +signOnWithReason=Semnare: DA (%S) +signOffWithReason=Semnare: NU (%S) +reasonEnabledByDefault=implicit activ +# reasonManuallyForced=manually forced +# reasonByRecipientRules=forced by per-recipient rules +# reasonByAutoEncryption=forced by auto encryption +# reasonByConflict=due to conflict in per-recipient rules +# reasonByEncryptionMode=due to encryption mode + +# should not be used anymore: +encryptYes=Mesajul va fi cifrat +# encryptNo=Message will not be encrypted + +# should not be used anymore: +# signYes=Message will be signed +# signNo=Message will not be signed + + +# PGP/MIME status: +pgpmimeNormal=Protocol: PGP/MIME +# inlinePGPNormal=Protocol: Inline PGP +# smimeNormal=Protocol: S/MIME +# pgpmimeAuto=Protocol: PGP/MIME (auto) +# inlinePGPAuto=Protocol: Inline PGP (auto) +smimeAuto=Protocol: S/MIME (automat) + +# should not be used anymore +# pgpmimeYes=PGP/MIME will be used +# pgpmimeNo=Inline PGP will be used + +# Attach own key status (tooltip strings): +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. + +# rulesConflict=Conflicting per-recipient rules detected\n%S\n\nSend message with these settings? +# msgCompose.button.configure=&Configure +# msgCompose.button.send=&Send Message +# msgCompose.button.save=&Save Message + +# Strings in enigmailMsgHdrViewOverlay.js +keyNeeded=Cheia publică %S este necesară pentru a verifica semnătura +# keyUsed=Public key %S used to verify signature +# clickDecrypt=; use 'Decrypt/Verify' function +# clickDecryptRetry=; use 'Decrypt/Verify' function to retry +# clickDetailsButton=; click on 'Details' button for more information +# clickImportButton=; click on the 'Import Key' button to import the key +# keyTypeUnsupported=; the key type is not supported by your version of GnuPG +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +# headerView.button.decrypt=Decrypt +msgPart=Parte a mesajului %S +msgSigned=semnat +# msgSignedUnkownKey=signed with unknown key +msgEncrypted=cifrat +# msgSignedAndEnc=signed and encrypted + +unverifiedSig=Semnătură neverificată +# incompleteDecrypt=Decryption incomplete +# needKey=Error - no matching secret key found to decrypt message +# failedDecrypt=Error - decryption failed +badPhrase=Eroare - parolă greșită +# missingMdcError=Error - missing or broken integrity protection (MDC) +# failedDecryptVerify=Error - decryption/verification failed +# viewInfo=; View > Message security info for details +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. + +decryptedMsg=Mesaj descifrat +# decryptedMsgWithFormatError=Decrypted message (restored broken PGP email format probably caused by an old Exchange server, so that the result might not be perfect to read) + +usedAlgorithms=Algoritmi utilizați: %1$S și %2$S +# pepStatusInfo.text=p≡p Message Status. +# pepStatusInfo.title.m3=Under Attack +pepStatusInfo.info.m3=Mesajul nu este sigur și a fost modificat pe traseu. +# pepStatusInfo.title.m1=Mistrusted +# pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted +pepStatusInfo.title.r0=Necunoscut +# pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. +# pepStatusInfo.title.r1=Cannot Decrypt +# pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. +# pepStatusInfo.title.r2=Cannot Decrypt +# pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. +pepStatusInfo.title.r3=Nesigur +pepStatusInfo.info.r3=Acest mesaj este transmis nesigur. +# pepStatusInfo.title.r4=Unsecure for Some +# pepStatusInfo.info.r4=This message is unsecure for some communication partners. +pepStatusInfo.title.r5=Securitate incertă +# pepStatusInfo.info.r5=This message has unreliable protection. +# pepStatusInfo.title.r6=Secure... +pepStatusInfo.info.r6=Acest mesaj este sigur, dar este totuși necesar să verificați identitatea interlocutorului Dvs.. +# pepStatusInfo.title.r7=Secure & Trusted +# pepStatusInfo.info.r7=This message is secure and trusted. + +pepStatusInfo.color.green=Verde +pepStatusInfo.color.yellow=Galben +pepStatusInfo.color.red=Roșu +# pepRevokeTrust.question=Do you really want to cancel the trust for %S? +# pepRevokeMistrust.question=Do you really want to re-trust the key for %S? +# pepRevokeTrust.doRevoke=Cancel &trust + +# wksConfirmationReq=Web Key Directory Confirmation Request +# wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. +# wksConfirmationReq.button.label=Confirm Request + +# autocryptSetupReq=Perform Autocrypt Setup +# autocryptSetupReq.button.label=Start Setup +# autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. +# autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. +# autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. +# autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. + +# strings in pref-enigmail.js +# oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. +# locateGpg=Locate GnuPG program +# invalidGpgPath=GnuPG cannot be executed with the path provided. Enigmail is therefore deactivated until you change the path to GnuPG again or until you restart the application. +warningsAreReset=Toate avertismentele au fost anulate. +# prefs.gpgFound=GnuPG was found in %S +# prefs.gpgNotFound=Could not find GnuPG +# prefs.warnAskNever=Warning: activating this option will result in unencrypted emails without any further information if there is no key for one of the recipients -- Enigmail will not inform you if this happens! +# prefs.warnIdleTimeForUnknownAgent=Cannot connect to gpg-agent. Maybe your system uses a specialized tool for passphrase handling (e.g. gnome-keyring, seahorse-agent, KDE wallet manager, ...). Unfortunately Enigmail cannot control the passphrase timeout for the tool you are using. Therefore the respective timeout settings in Enigmail are disregarded. +# prefEnigmail.oneKeyserverOnly=Error - you can only specify one keyserver for automatic downloading of missing OpenPGP keys. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +# aboutLicense.desc=Enigmail is open source and licensed under the Mozilla Public License 2.0. + +# Strings used in core.jsm +# (said file also re-uses some strings from above) + +# enterAdminPin=Please type in the ADMIN PIN of your SmartCard +# enterCardPin=Please type your SmartCard PIN + +# notInit=Error - Enigmail service not yet initialized +# badCommand=Error - encryption command failed +cmdLine=linie de comandă și afișare: +# notRequired=Error - no encryption required +notComplete=Eroare - generarea cheii nu este încă finalizată +invalidEmail=Eroare - adrese de e-mail incorecte +# noPassphrase=Error - no passphrase supplied +# noPGPblock=Error - No valid armored OpenPGP data block found +# unverifiedReply=Indented message part (reply) was probably modified +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key +# sigMismatch=Error - Signature mismatch +# cantImport=Error importing public key\n\n +# doImportOne=Import %1$S (%2$S)? +# doImportMultiple=Import the following keys?\n\n%S +# previewFailed=Can't read public key file. + +# Strings used in errorHandling.jsm +# sc.wrongCardAvailable=The SmartCard %1$S found in your reader cannot be used to process the message.\nPlease insert your SmartCard %2$S and repeat the operation. +# sc.insertCard=The operation requires your SmartCard %S.\nPlease insert the required SmartCard and repeat the operation. +# sc.removeCard=The operation requires no SmartCard to be in the reader.\nPlease remove your SmartCard and repeat the operation. +# sc.noCardAvailable=No SmartCard could be found in your reader\nPlease insert your SmartCard and repeat the operation. +# sc.noReaderAvailable=Your SmartCard reader could not be accessed\nPlease attach your SmartCard reader, insert your card, and repeat the operation. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. +# keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. +missingPassphrase=Parolă lipsă +# errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. +# errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). +# errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). +# errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. +# errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. + +# gpgNotFound=Unable to locate GnuPG program '%S'.\nMake sure you have set the GnuPG executable path correctly in the Enigmail Preferences. +# gpgNotInPath=Unable to locate GnuPG executable in the PATH.\nMake sure you have set the GnuPG executable path correctly in the Enigmail Preferences. +enigmailNotAvailable=Serviciul principal Enigmail nu este disponibil + +# prefGood=Good signature from %S +# prefBad=BAD signature from %S + +# failCancel=Error - Key receive cancelled by user +# failKeyExtract=Error - key extraction command failed +# failKeyNoSubkey=No valid (sub-)key +# notFirstBlock=Error - First OpenPGP block not public key block +# importKeyConfirm=Import public key(s) embedded in message? +failKeyImport=Eroare - importarea cheii a eșuat +# fileWriteFailed=Failed to write to file %S + +# importKey=Import public key %S from keyserver: +uploadKey=Trimiteți cheia publică %S la serverul de chei: +keyId=Identificator de cheie +# keyAndSigDate=Key ID: 0x%1$S / Signed on: %2$S +# keyFpr=Key fingerprint: %S +# noEmailProvided=You did not provide an email address! +# keyAlreadySigned=The key is already signed, you cannot sign it twice. + +##################################################################### +# Strings used in enigmailKeySelection.js +##################################################################### + +# selKeyExpired=expired %S +createdHeader=Creat +# atLeastOneKey=No key selected! You have to select at least one key to accept this dialog +# fewerKeysThanRecipients=You have selected a smaller number of keys than recipients. Are you sure that the list of keys to encrypt is complete? +# userSel.button.goBack=Select more Keys +# userSel.secretKeySel.title=Select a Secret OpenPGP Key to Sign Your Messages +# userSel.problemNoKey=No valid key +# userSel.problemMultipleKeys=Multiple keys +# should be same as thunderbird ENTITY sendLaterCmd.label: +sendLaterCmd.label=Expediați mai târziu + +# Strings used in enigmailAttachmentDialog.js +# pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. +# first=first +second=al doilea + +# Strings used in am-enigprefs.js / enigmailEditIdentity.js +# encryptKeyHeader=Select OpenPGP Key for Encryption +identityName=Identitate: %S +# switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. +# enableEnigmail=&Disable p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + + +# Strings used in enigmailSingleRcptSettings.js +# noEncryption=You have activated encryption, but you did not select a key. In order to encrypt emails sent to %1$S, you need to specify one or several valid key(s) from your key list. Do you want to disable encryption for %2$S? +# noKeyToUse=(none - no encryption) +# noEmptyRule=The Rule may not be empty! Please set an email address in the Rule field. +# invalidAddress=The email address(es) you have entered are not valid. You should not set the names of the recipients, just the email addresses. E.g.:\nInvalid: Some Name \nValid: some.name@address.net +# noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. + +# Strings used in enigmailRulesEditor.js +# never=Never +always=Întotdeauna +# possible=Possible +deleteRule=Confirmați ștergerea regulii selectate? +# nextRcpt=(Next recipient) +# negateRule=Not +# addKeyToRule=Add key %1$S (%2$S) to per-recipient rule + +# Strings used in enigmailSearchKey.js +# needOnline=The function you have selected is not available in offline mode. Please go online and try again. +# noKeyserverConn=Could not connect to keyserver at %S. +# internalError=An internal error occurred. The keys could not be downloaded or imported. +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. + +# Strings in enigmailEditKeyTrustDlg.xul +# setKeyTrustFailed=Setting owner trust failed + + +# Strings in enigmailSignKeyDlg.js +# signKeyFailed=Key signing failed +# alreadySigned.label=Note: the key %S is already signed with the selected secret key. +# alreadySignedexportable.label=Note: the key %S is already signed exportable with the selected secret key. A local signature does not make sense. +# partlySigned.label=Note: some user IDs of key %S are already signed with the selected secret key. +# noTrustedOwnKeys=No eligible key found for signing! You need at least one fully trusted secret key in order to sign keys. + +# Strings in enigmailKeyManager.js +# keyMan.loadingKeys=Loading keys, please wait ... +# keyValid.unknown=unknown +# keyValid.invalid=invalid +# keyValid.disabled=disabled +# keyValid.revoked=revoked +keyValid.expired=expiră +# keyValid.noSubkey=no valid subkey + +# keyTrust.untrusted=untrusted +# keyTrust.marginal=marginal +# keyTrust.full=trusted +# keyTrust.ultimate=ultimate +# keyTrust.group=(group) +# keyType.public=pub +# keyType.publicAndSec=pub/sec +# keyMan.enableKey=Enable Key +# keyMan.disableKey=Disable Key +userAtt.photo=Atribut al utilizatorului (imagine JPEG) + +# asciiArmorFile=ASCII Armored Files (*.asc) +# importKeyFile=Import OpenPGP Key File +gnupgFile=Fișiere GnuPG +# saveRevokeCertAs=Create & Save Revocation Certificate +# revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. +# revokeCertFailed=The revocation certificate could not be created. + +addUidOK=Identificatorul utilizatorului a fost adăugat cu succes +# addUidFailed=Adding the User ID failed +# noKeySelected=You should select at least one key in order to perform the selected operation +# exportToFile=Export Public Key To File +exportKeypairToFile=Exportați cheia secretă și cea publică în fișierul +# exportSecretKey=Do you want to include the secret key in the saved OpenPGP key file? +saveKeysOK=Cheile au fost salvate cu succes +saveKeysFailed=Salvarea cheilor a eșuat +importKeysFailed=Importarea cheilor a eșuat +enableKeyFailed=Activarea/dezactivarea cheilor a eșuat +# specificPubKeyFilename=%1$S (0x%2$S) pub +specificPubSecKeyFilename=%1$S (0x%2$S) pub-sec +defaultPubKeyFilename=Chei-publice-exportate +# defaultPubSecKeyFilename=Exported-public-and-secret-keys + +sendKeysOk=Cheile au fost trimise cu succes +sendKeysFailed=Trimiterea cheilor a eșuat +receiveKeysOk=Cheile au fost actualizate cu succes +receiveKeysFailed=Descărcarea cheilor a eșuat +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. + +# importFromClip=Do you want to import some key(s) from clipboard? +# importFromUrl=Download public key from this URL: +# copyToClipbrdFailed=Could not copy the selected key(s) to the clipboard. +# copyToClipbrdOK=Key(s) copied to clipboard + +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? +# deleteMix=WARNING: You are about to delete secret keys!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key.\n\nDo you really want to delete BOTH, the selected secret and public keys? +# deletePubKey=Do you want to delete the public key\n'%S'? +# deleteSelectedPubKey=Do you want to delete the public keys? +# deleteKeyFailed=The key could not be deleted. +# revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? +# revokeKeyOk=The key has been revoked. If your key is available on a key server, it is recommended to re-upload it, so that others can see the revocation. +revokeKeyFailed=Cheia nu poate fi revocată. +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! +# revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. +# refreshAllQuestion=You did not select any key. Would you like to refresh ALL keys? +# refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? +# refreshKey.warn=Warning: depending on the number of keys and the connection speed, refreshing all keys could be quite a lengthy process! +# downloadContactsKeys.warn=Warning: depending on the number of contacts and the connection speed, downloading all keys could be quite a lengthy process! +# downloadContactsKeys.importFrom=Import contacts from address book '%S'? +# keyMan.button.exportSecKey=Export &Secret Keys +# keyMan.button.exportPubKey=Export &Public Keys Only +keyMan.button.import=&Import +# keyMan.button.refreshAll=&Refresh All Keys +keyMan.button.revokeKey=&Revocați cheia + +# keylist.noOtherUids=Has no other identities +keylist.hasOtherUids=Cunoscut și ca +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos + +# keyMan.addphoto.filepicker.title=Select photo to add +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. +# keyMan.addphoto.noJpegFile=The selected file does not appear to be a JPEG file. Please choose a different file. +# keyMan.addphoto.failed=The photo could not be added. +# noWksIdentity=The key %S does not have a WKS identity. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. + +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? +# keyman.addBlacklistKey.button=&Blacklist the key +# keyman.removeBlacklistKey.button=&Remove key from Blacklist + +# Strings in enigmailManageUidDlg.xul +# changePrimUidFailed=Changing the primary User ID failed +# changePrimUidOK=The primary user ID was changed successfully +# revokeUidFailed=Revoking the user ID %S failed +# revokeUidOK=User ID %S was revoked successfully. If your key is available on a key server, it is recommended to re-upload it, so that others can see the revocation. +# revokeUidQuestion=Do you really want to revoke the user ID %S? + +# Strings in enigmailKeyImportInfo.xul +importInfoTitle=SUCCESS! Cheile au fost importate +# importInfoBits=Bits +importInfoCreated=Creat +# importInfoFpr=Fingerprint +importInfoDetails=(Detalii) +importInfoNoKeys=Nu a fost importată nici o cheie. + +# Strings in enigmailKeyDetailsDlg.xul +keyTypePublic=cheie publică +keyTypePrimary=cheie primară +keyTypeSubkey=subcheie +keyTypePair=pereche de chei +keyExpiryNever=niciodată +keyAlgorithm_1=RSA +keyAlgorithm_2=RSA +keyAlgorithm_3=RSA +keyAlgorithm_16=ELG +# keyAlgorithm_17=DSA +# keyAlgorithm_18=ECDH +keyAlgorithm_19=ECDSA +keyAlgorithm_20=ELG +# keyAlgorithm_22=EDDSA +# keyUsageEncrypt=Encrypt +# keyUsageSign=Sign +# keyUsageCertify=Certify +# keyUsageAuthentication=Authentication +# keyDoesNotExpire=Key does not expire + +# Strings in enigmailGenCardKey.xul +# keygen.started=Please wait while the key is being generated .... +keygen.completed=Cheia a fost generată. Identificatorul noii chei este: 0x%S +# keygen.keyBackup=The key is backed up as %S +# keygen.passRequired=Please specify a passphrase if you want to create a backup copy of your key outside your SmartCard. + +# Strings in enigmailSetCardPin.xul +cardPin.processFailed=Eroare la generarea PIN-ului + +# Strings in enigRetrieveProgres.js +# keyserverProgress.refreshing=Refreshing keys, please wait ... +# keyserverProgress.uploading=Uploading keys, please wait ... +# keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service +# keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. +# keyserverTitle.refreshing=Refresh Keys +# keyserverTitle.uploading=Key Upload +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. + +# Strings in enigmailSetupWizard +# setupWizard.invalidGpg=The file you specified is not a GnuPG executable. Please specify a different file. +# setupWizard.installFailed=It seems that the installation was not successful. Please either retry the installation, or install GnuPG manually and locate it using the Browse button. +# setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. +# setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? +setupWizard.importSettingsFile=Indicați fișierul din care se va încărca salvarea +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. +# setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. +# setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. + +# Strings in installGnuPG.jsm +# installGnuPG.downloadFailed=An error occurred while trying to download GnuPG. Please check the console log for further details. +# installGnuPG.installFailed=An error occurred while installing GnuPG. Please check the console log for further details. + +# Strings in enigmailAddUidDlg.xul +# addUidDlg.nameOrEmailError=You have to fill in a name and an email address +# addUidDlg.nameMinLengthError=The name must at least have 5 characters +# addUidDlg.invalidEmailError=You must specify a valid email address + +# Strings in enigmailCardDetails.js +# Carddetails.NoASCII=OpenPGP Smartcards only support ASCII characters in Firstname/Name. + + +# network error types +# errorType.SecurityCertificate=The security certificate presented by the web service is not valid. +# errorType.SecurityProtocol=The security protocol used by the web service is unknown. +# errorType.Network=A network error has occurred. + +# filter stuff +# filter.folderRequired=You must select a target folder. +# filter.decryptMove.label=Decrypt permanently (Enigmail) +# filter.decryptCopy.label=Create decrypted Copy (Enigmail) +# filter.decryptMove.warnExperimental=Warning - the filter action "Decrypt permanently" may lead to destroyed messages.\n\nWe strongly recommend that you first try the "Create decrypted Copy" filter, test the result carefully, and only start using this filter once you are satisified with the result. +# filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted +# filter.term.pgpencrypted.label=OpenPGP Encrypted +# filter.encrypt.label=Encrypt to key (Enigmail) +# filter.keyRequired=You must select a recipient key. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. + +# strings in enigmailConvert.jsm +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? + +# saveLogFile.title=Save Log File + +# strings in gpg.jsm +unknownSigningAlg=Algoritm de semnare necunoscut (ID: %S) +# unknownHashAlg=Unknown cryptographic hash (ID: %S) + +# strings in keyRing.jsm +keyring.photo=Fotografie +# keyRing.pubKeyRevoked=The key %1$S (key ID %2$S) is revoked. +# keyRing.pubKeyExpired=The key %1$S (key ID %2$S) has expired. +# keyRing.pubKeyNotForSigning=The key %1$S (key ID %2$S) cannot be used for signing. +# keyRing.pubKeyNotForEncryption=The key %1$S (key ID %2$S) cannot be used for encryption. +# keyRing.keyDisabled=The key %1$S (key ID %2$S) is disabled; it cannot be used. +# keyRing.keyNotTrusted=The key %1$S (key ID %2$S) is not trusted enough. Please set the trust level of your key to "ultimate" to use it for signing. +# keyRing.keyInvalid=The key %1$S (key ID %2$S) is not valid. Please consider verifying it correctly. Alternatively use the Default encryption settings in the Enigmail preferences dialog. +# keyRing.signSubKeysRevoked=All signing-subkeys of key %1$S (key ID %2$S) are revoked. +# keyRing.signSubKeysExpired=All signing-subkeys of key %1$S (key ID %2$S) have expired. +# keyRing.signSubKeysUnusable=All signing-subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. +# keyRing.encSubKeysRevoked=All encryption subkeys of key %1$S (key ID %2$S) are revoked. +# keyRing.encSubKeysExpired=All encryption subkeys of key %1$S (key ID %2$S) have expired. +# keyRing.noSecretKey=You do not seem to have the secret key for %1$S (key ID %2$S) on your keyring; you cannot use the key for signing. +# keyRing.encSubKeysUnusable=All encryption subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. + + +#strings in exportSettingsWizard.js +# cannotWriteToFile=Cannot save to file '%S'. Please select a different file. +# dataExportError=An error occurred during exporting your data. +# enigmailSettings=EnigmailSettings +# defaultBackupFileName=Enigmail-export +specifyExportFile=Indicați numele fișierului pentru exportare +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. + +#strings in expiry.jsm +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +expiry.OpenKeyManager=Administrarea cheilor Open Enigmail +# expiry.OpenKeyProperties=Open Key Properties + +#strings in pEpDecrypt.jsm +# pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. + +#strings in gpgAgent.jsm +# gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. +# gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. +# gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. +# gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. + +#strings in pepTrustWords.js +# pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. +pepTrustWords.cannotFindKey=Nu se poate găsi cheia pentru %S. +# pepTrustWords.cannotStoreChange=Could not change trust for %S. +# pepTrustWords.generalFailure=Cannot obtain trustwords for %S. +pepTrustWords.partnerFingerprint=Amprentă pentru %S: + +#strings in mimeWkdHandler.jsm +# wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. +# wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. + +#strings in pepHandshake.js + +# pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. +# pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. +# pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. +# pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. +pepPrivacyStatus.RatingTrustedSuggestion=Nu este necesară nici o acțiune! +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. +# pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". +# pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. + +# pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. +# pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. +# pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. +pepPrivacyStatus.RatingReliableExplanation=Acest mesaj este sigur, dar este totuși necesar să verificați identitatea interlocutorului Dvs.. +# pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. +# pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. +pepPrivacyStatus.RatingUnderAttackExplanation=Mesajul nu este sigur și a fost modificat pe traseu. +pepPrivacyStatus.RatingUnencryptedExplanation=Acest mesaj este transmis nesigur. +# pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. +# pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. + +# pepPrivacyStatus.RatingBrokenText=Broken +# pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt +# pepPrivacyStatus.RatingMistrustText=Mistrusted +pepPrivacyStatus.RatingReliableText=Sigur +# pepPrivacyStatus.RatingTrustedText=Secure & Trusted +pepPrivacyStatus.RatingUndefinedText=Necunoscut +# pepPrivacyStatus.RatingUnderAttackText=Under Attack +# pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some +pepPrivacyStatus.RatingUnencryptedText=Nesigur +pepPrivacyStatus.RatingUnreliableText=Securitate incertă + +# handshakeDlg.button.initHandshake=Handshake... +# handshakeDlg.button.stopTrust=Stop Trusting +# handshakeDlg.button.reTrust=Stop Mistrusting +handshakeDlg.label.outgoingMessage=Mesaj trimis +handshakeDlg.label.incomingMessage=Mesaj primit +# handshakeDlg.error.noPeers=Cannot handshake without any correspondents. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. + +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. + +#strings in autocrypt.jsm + +# autocrypt.setupMsg.subject=Autocrypt Setup Message +# autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. + +#strings in upgradeInfo.html +# upgradeInfo.doctitle=What's New in Enigmail v2.0? +# upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! +# upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: +# upgradeInfo.encSubject.title=Encrypting the Message Subject +# upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) +# upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons +# upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. +# upgradeInfo.autocrypt.title=Support for Autocrypt +# upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. +# upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. +# upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. + +#strings in pEpAdapter.jsm +# pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? + +#strings in enigmailAbout.html +# aboutEnigmail.tabName=About Enigmail +# aboutEnigmail.title=OpenPGP support provided by Enigmail +# aboutEnigmail.team=Enigmail is developed by the Enigmail Team: +# aboutEnigmail.projectLeader=Lead Developer: +# aboutEnigmail.usability=Usability: +# aboutEnigmail.documentation=Documentation: +# aboutEnigmail.testing=Testing: +# aboutEnigmail.userSupport=User Support: +# aboutEnigmail.userSupport.team=the team and the list/forum members +# aboutEnigmail.localization=Localization: See the Enigmail Language Packs page +# aboutEnigmail.Credits=Credits: +# aboutEnigmail.origAuthor=Original author of the Enigmail extension +# aboutEnigmail.icons=Icons: +# aboutEnigmail.formerMembers=Former team members: +# aboutEnigmail.projectHosting=Project hosting: +# aboutEnigmail.licenseSupportTitle=License & Support +# aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S +# aboutEnigmail.support=Support and download is available from www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/ro/help/compose.html enigmail-2.1.3+ds1/lang/ro/help/compose.html --- enigmail-2.0.12+ds1/lang/ro/help/compose.html 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ro/help/compose.html 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,88 @@ + + + + + Enigmail Help: Message Composition + + + + + +

Enigmail Help

+ +

Using Enigmail when composing messages

+ +
+
Enigmail menu in Mail/Compose window
+ +
+
+
Sign message
+ +
Enable/Disable sending signed mail. User is notified, if signing fails.
+ +
Encrypt message
+
+

Enable/Disable encryption to all recipient(s) before sending. User is notified, if encryption fails.

+ +

If Display selection when necessary is set in Preferences -> Key Selection tab, a list of keys will pop up if there are addresses in the list of recipients for the message for whom you have no public key.

+ +

If Never display OpenPGP key selection dialog is set in Preferences -> Key Selection tab, and there are addresses in the list of recipients for the message for whom you have no public key, the message will be sent unencrypted.

+
+ +
Use PGP/MIME for this message
+ +
+ Enable/Disable the use of PGP/MIME for this message. + +

If you know the recipient(s) can read mail using the PGP/MIME format, you should use it.

+ +

This feature is dependent on the settings in Preferences -> PGP/MIME tab being set to Allow to use PGP/MIME or Always use PGP/MIME.

+
+ +
Default composition options
+ +
+
    +
  • Signing/Encryption Options...: shortcut to Account Settings -> OpenPGP Options.
  • + +
  • Send options...: shortcut to Preferences -> Send tab.
  • + +
  • Key selection options...: shortcut to Preferences -> Key Selection tab.
  • + +
  • PGP/MIME options...: shortcut to Preferences -> PGP/MIME tab.
  • +
+
+ +
Undo encryption
+ +
+

If there is a failure when actually sending mail, such as the POP server not accepting the request, Enigmail will not know about it, and the encrypted message will continue to be displayed in the Compose window. Choosing this menu item will undo the encryption/signing, reverting the Compose window back to its original text.

+ +

As a temporary fix, this option may also be used to decrypt the quoted text when replying to encrypted messages. Enigmail should automatically decrypt the quoted message, but if that fails for some reason, you can use this menu item to force it.

+
+ +
Insert public key
+ +
insert ASCII-armored public key block at the current cursor location in the Compose window. You will be prompted for the email addresses of the key(s) to be inserted. Keys inserted in this manner will automatically be recognized at the receiving end by Enigmail. After key insertion, you may still choose to sign/encrypt the mail as needed. Also, do not insert more than one key block in a message; just specify multiple email addresses, separated by commas or spaces, when prompted.
+ +
Clear save passphrase
+ +
Clears cached passphrase. Useful if you have multiple passphrases.
+ +
Help
+ +
Displays Help information from the website (this page).
+
+
+
+
+ +

Further help is available on the Enigmail Help web page

+ + diff -Nru enigmail-2.0.12+ds1/lang/ro/help/editRcptRule.html enigmail-2.1.3+ds1/lang/ro/help/editRcptRule.html --- enigmail-2.0.12+ds1/lang/ro/help/editRcptRule.html 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ro/help/editRcptRule.html 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,83 @@ + + + + + Enigmail Help: Edit Per-Recipient Rule + + + + + +

Enigmail Help

+ +

Using the Enigmail Rules Editor: Edit Per-Recipient Rule

+ +

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. In this dialog, you can specify the rules for a single recipient, and for a group of recipients with very similar attributes.

+ +
+
Set Enigmail Rules for
+ +
Contains the email addresses of the recipients (without names, i.e. just an address like somebody@email.domain). You can specify several email addresses, separated by spaces. The address specified here can consist of only the domain section so that mail to any address at that domain will be matched, e.g. @email.domain will allow matching to body@email.domain, somebody@email.domain, anybody@email.domain, etc.
+ +
Apply rule if recipient ...
+ +
+ This modifies the matching of the email addresses. If multiple addresses are entered, the setting will apply to all. The examples below are based on body@email.domain entered in the Enigmail Rules field above. + +
    +
  • Is exactly: with this setting, the rule will only trigger on emails to body@email.domain (exact, case insensitive matching).
  • + +
  • Contains: with this setting, any email address containing the string is matched, e.g. anybody@email.domain or body@email.domain.net
  • + +
  • Begins with: with this setting, any email address starting with the string is matched, e.g. body@email.domain.net, body@email.domain-name.com.
  • + +
  • Ends with: with this setting, any email address ending with the string is matched, e.g. anybody@email.domain , somebody@email.domain.
  • +
+
+ +
Continue with the next rule for the matching address
+ +
Enabling this function will allow you to define a rule but not have to specify a KeyID in the Use the following OpenPGP keys: field, so that the email address is used to check for a key at the time of sending. Also, further rules for the same address(es) will be processed as well.
+ +
Do not check further rules for the matching address
+ +
Enabling this function stops processing any other rules for the matching address(es) if this rule is matched; i.e. rule processing continues with the next recipient.
+ +
Use the following OpenPGP keys:
+ +
Use the Select Key(s).. button to select the recipient keys to be used for encryption. As in the action above, no further rules for the matching address(es) are processed.
+ +
Default for Signing
+ +
+ Enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are: + +
    +
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • + +
  • Yes, if selected from in Message Composition: leave signing as specified in the message composition window
  • + +
  • Always: enable signing, even if it was not enabled in the message composition window
  • +
These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always. +
+ +
Encryption
+ +
Enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
+ +
PGP/MIME
+ +
Enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning are the same as for message signing.
+
+ +

The rules are processed in the order displayed in the list in the Per-Recipient Rules Editor. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.

+
+ +

Further help is available on the Enigmail Per-Recipient Settings page

+ + diff -Nru enigmail-2.0.12+ds1/lang/ro/help/help.html enigmail-2.1.3+ds1/lang/ro/help/help.html --- enigmail-2.0.12+ds1/lang/ro/help/help.html 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ro/help/help.html 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,35 @@ + + + + +Enigmail Help + + + +

Enigmail Help

+

Using Enigmail when reading messages

+
    +
  • Decrypt button in main Mail window
    + This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
  • +
  • Pen and Key icons in Message Header display
    + The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options: +
      +
    • Enigmail Security info: allows you to view the output status from GnuPG for the message.
    • +
    • Copy Enigmail Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
    • +
    • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
    • +
    • S/MIME Security info: allows you to view the S/MIME Security Info for the message.
    • +
    +

    If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

    +

    You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

    +

    Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

    +

    To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

    +
  • +
  • Opening encrypted attachments / importing attached OpenPGP keys
    + Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.
  • +
+
+

Further help is available on the Enigmail Help web page
+If you have questions or comments about enigmail, please send a message to the Enigmail mailing list

+

Enigmail is open source and licensed under the Mozilla Public License 2.0

+ + diff -Nru enigmail-2.0.12+ds1/lang/ro/help/initError.html enigmail-2.1.3+ds1/lang/ro/help/initError.html --- enigmail-2.0.12+ds1/lang/ro/help/initError.html 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ro/help/initError.html 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,46 @@ + + + + + Enigmail Help: How to Resolve Problems with Initializing Enigmail + + + + + +

Enigmail Help

+ +

How to Resolve Problems with Initializing Enigmail

+ +

There are several reasons why initializing Enigmail does not succeed. The most common ones are described below; + for more information please visit the Enigmail Support page.

+ +
+
GnuPG could not be found
+
+

+ In order for Enigmail to work, the tool GnuPG needs to be installed. + If GnuPG cannot be found, then first make sure that the executable gpg.exe (on Windows; gpg on other platforms) is installed on your computer. + If GnuPG is installed, and Enigmail cannot find it, then you need to manually set the path to GnuPG in the Enigmail Preferences (menu Enigmail > Preferences) +

+ +
Enigmail Core Service failed to initialize
+ +
+

+ Enigmail works only if it is built using the same build environment as Thunderbird or SeaMonkey was built. This means that you can use the official Enigmail releases only if you use the official releases of Thunderbird or SeaMonkey provided by mozilla.org. +

+

+ If you use a Thunderbird or SeaMonkey version coming from some other source (e.g. the provider of your Linux distribution), or if you built the application yourself, you should either use an Enigmail version built by the same source, or build Enigmail yourself. For building Enigmail, refer to the Source Code section on the Enigmail home page. Please don't file any bug report concerning this problem, it is not solvable. +

+
+
+ +

Further help is available on the Enigmail Support Web Site.

+ + diff -Nru enigmail-2.0.12+ds1/lang/ro/help/messenger.html enigmail-2.1.3+ds1/lang/ro/help/messenger.html --- enigmail-2.0.12+ds1/lang/ro/help/messenger.html 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ro/help/messenger.html 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,57 @@ + + + + + Enigmail Help: Message Reading + + + + + +

Enigmail Help

+ +

Using Enigmail when reading messages

+ +
+
Decrypt button in main Mail window
+ +
This button can be used for several purposes: decrypt, verify, or import public keys. Normally decryption/verification happens automatically, although this can be disabled through a preference. However, if this fails, usually a short error message will appear in the Enigmail status line. If you click the Decrypt button, you will be able to see a more detailed error message, including the output from the GnuPG command.
+ +
Pen and Key icons in Message Header display
+ +
+ The Pen and Key icons in the Message Header display indicate if the message you are reading was signed and/or encrypted and if the signature is good, i.e. the message has not been changed since it was signed. If the message has been changed, the Pen icon will change to a Broken Pen to indicate that the signature is bad. Right clicking on either the Pen or Key icons will bring up a menu with the following options: + +
    +
  • Enigmail Security info: allows you to view the output status from GnuPG for the message.
  • + +
  • Copy Enigmail Security info: copies the output status from GnuPG to the clipboard; to paste into a reply message, etc.
  • + +
  • View OpenPGP Photo ID: allows you to view the Photo ID of the person who sent the message, if they have a photo embedded in their Public Key. (This option will only be enabled if a Photo ID exists in their key.)
  • + +
  • S/MIME Security info: allows you to view the S/MIME Security Info for the message.
  • +
+ +

If you do not have keyserver-options auto-key-retrieve set in your gpg.conf file and you read a message which is signed or encrypted, you will see a Pen icon in the headers display area with a Question mark on it, the Enigmail status line in the headers area will say Part of the message signed; click pen icon for details and the message in the Message Pane will show all the OpenPGP message block indicators and the signature block.

+ +

You may also see this if you have keyserver-options auto-key-retrieve set in your gpg.conf file and the OpenPGP key is not available on the default keyserver.

+ +

Clicking on the Pen and Question mark icon will bring up a window advising that the key is unavailable in your keyring. Clicking on OK will bring up another window with a list of keyservers from which you can select to download the sender's public key from.

+ +

To configure the list of keyservers you wish to use, go to Enigmail -> Preferences -> Basic tab and enter the keyserver addresses in the Keyserver(s): box, separated by a comma. The first keyserver in the list will be used as the default.

+
+ +
Opening encrypted attachments / importing attached OpenPGP keys
+ +
Attachments named *.pgp, *.asc and *.gpg are recognized as attachments that can be handled specially by Enigmail. Right clicking on such an attachment enables two special menu items in the context menu: Decrypt and Open and Decrypt and Save. Use these two menu items if you want Enigmail to decrypt an attachment before opening or saving it. If an attachment is recognized as an OpenPGP key file, you are offered to import the keys it into your keyrings.
+
+
+ +

Further help is available on the Enigmail Help web page

+ + diff -Nru enigmail-2.0.12+ds1/lang/ro/help/rulesEditor.html enigmail-2.1.3+ds1/lang/ro/help/rulesEditor.html --- enigmail-2.0.12+ds1/lang/ro/help/rulesEditor.html 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ro/help/rulesEditor.html 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,63 @@ + + + + + Enigmail Help: Rules Editor + + + + + +

Enigmail Help

+ +

Using the Enigmail Rules Editor

+ +

In the Rules Editor, you can specify defaults per recipient for enabling encryption, signing and PGP/MIME, and to define what OpenPGP key(s) to use. Each rule consists of 5 fields and is represented on a single line:

+ +
+
Email
+ +
The e-mail(s) from the To:, Cc: and Bcc: fields to match. The matching works on substrings (Further details can be found in the Edit Rule dialog)
+ +
OpenPGP Key(s)
+ +
a list of OpenPGP Key ID's to use for the recipient
+ +
Sign
+ +
+ enable or disable message signing. This either uses or overrides what you have specified in the message composition window. The values are: + +
    +
  • Never: disable signing, even if it was enabled in the message composition window (overrules the other values)
  • + +
  • Possible: leave signing as specified in the message composition window
  • + +
  • Always: enable signing, even if it was not enabled in the message composition window
  • +
+ +

These signing settings are applied for all rules that match. If one of the rules disables signing, the message will not be signed, regardless of other rules that specify Always.

+
+ +
Encrypt
+ +
enable or disable message encryption. The allowed settings and their meaning are the same as for message signing.
+ +
PGP/MIME
+ +
enable or disable the use of the PGP/MIME (RFC 3156) message encoding. If PGP/MIME is disabled, the messages are encoded using "inline PGP". The allowed values and their meaning a re the same as for message signing.
+
+ +

The rules are processed in the order displayed in the list. Whenever a rule matches a recipient and contains a OpenPGP Key ID, in addition to using the specified Key ID, the recipient is not considered anymore when processing further rules.

+ +

Note: The rule editor is not yet complete. It is possible to write some more advanced rules by directly editing the rules file (these rules should then not be edited anymore in the rule editor). Further information for directly editing the file is available on the Enigmail Homepage

+
+ +

Further help is available on the Enigmail Help web page

+ + diff -Nru enigmail-2.0.12+ds1/lang/ro/help/sendingPrefs.html enigmail-2.1.3+ds1/lang/ro/help/sendingPrefs.html --- enigmail-2.0.12+ds1/lang/ro/help/sendingPrefs.html 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ro/help/sendingPrefs.html 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,42 @@ + + + + + Enigmail Help: Edit OpenPGP Rule + + + + + +

Enigmail Help

+ +

Defining Preferences to Send Encrypted

+ +

In the Sending Preferences you can choose the general model and preferences for encryption.

+
+
Convenient Encryption
+
With these settings, emails are encrypted without confirmation whenever possible. +

This setup is appropriate, if you just want to improve your privacy by sending emails encrypted instead of unencrypted if that's possible. +

The effect is like sending emails as letters instead of postcards. Unlike postcards, letters usually hide their contents while in transit. +

Note however that as with letters you can't be sure that nobody is opening the letter while it is in transit (although, some technical effort is necessary for that). +

A concrete risk is that you accidentally use "faked keys" you got from somewhere or somebody claiming that the key belongs to the person you want to send emails to. To avoid this risk, you can either use the trust model of PGP (see below) or you should always verify, whether the fingerprint of a public key is correct.

+ +
Manual Encryption
+
This option allows you to specify the different preferences for encryption according to your needs. You can specify +
    +
  • whether replies to encrypted/signed emails should automatically also be encrypted/signed-
  • +
  • whether to use the trust model of Enigmail to accept keys (this means that to use a key you either have to sign the key or have enough other people you trust having signed the key).
  • +
  • whether you want to automatically send emails encrypted if all keys are accepted.
  • +
  • whether and when you want to finally confirm sending an email.
  • +
+
+ + If it is important for you that content you send encrypted can't be read by other people or organizations, you should use the manual preferences at least choose the option to accept keys only if you or other people signed them. While this model reduces the risk of using faked keys, it requires that you actively sign keys and declare owner trust using the key managament dialog. + + + diff -Nru enigmail-2.0.12+ds1/lang/ru/enigmail.dtd enigmail-2.1.3+ds1/lang/ru/enigmail.dtd --- enigmail-2.0.12+ds1/lang/ru/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ru/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ -Общественной лицензии Mozilla 2.0."> - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,15 +63,7 @@ - - - - - Для работы функции "Передача ключей автошифром" необходимо, чтобы почтовый клиент на другом устройстве поддерживал автошифр. - Это более простое решение, но в настоящий момент этот стандарт поддерживают лишь несколько приложений. - Второй способ — выполнить резервное копирование и восстановление параметров. - В результате резервного копирования создаётся ZIP-файл со всей необходимой информацией и ключами. Этот файл можно скопировать на новое устройство. - Enigmail может напрямую импортировать эти параметры. При использовании других почтовых клиентов вы можете распаковать ZIP-файл и обработать его содержимое вручную."> + @@ -94,12 +77,13 @@ + - + »"> @@ -122,6 +106,9 @@ + + + @@ -214,6 +201,7 @@ + @@ -222,8 +210,8 @@ - - + + @@ -383,11 +371,6 @@ -Автошифр - стандарт удобного -сквозного шифрования электронной почты. Он описывает, как почтовые -программы договариваются о возможностях шифрования с помощью обычной -электронной почты."> @@ -480,8 +463,8 @@ - - + + @@ -568,7 +551,7 @@ - + @@ -649,7 +632,7 @@ - + @@ -693,35 +676,9 @@ - - - - - - - - - - - - - - - - - - - - -Примечание: Enigmail будет всегда проверять -подписи под каждым сообщением для каждой учетной записи независимо -от того, включен ли он для нее или нет"> - + + - - + - - - - - - - - - - - - - - - - - -открытый ключ предназначен -для других: им они шифруют сообщения для вас. -Его можно передавать всем."> -Закрытый ключ — только ваш: вы расшифровываете и подписываете им сообщения. -Не давайте его никому."> -Закрытый ключ — только ваш: вы расшифровываете и подписываете им сообщения. -Не давайте его никому. -Для защиты закрытого ключа вам нужно ввести парольную фразу в двух следующих окнах."> -Парольная фраза — это пароль, защищающий ваш закрытый ключ. Она помешает воспользоваться закрытым ключом злоумышленникам."> -не рекомендуется."> - - - - - - - - - - - - - - - - - - - - - - - - -Для этого у вас запросят пароль. Перенесите сертификат на носитель, -который можно хранить в надежном месте, например, компакт-диск или карту памяти. -Если кто-то получит доступ к этому сертификату, ваш ключ могут сделать -непригодным."> - - - - - - - - - - - -экспорт данных со старого компьютера с помощью мастера сохранения -из настроек Enigmail -импорт данных на новом компьютере с помощью -этого мастера. -"> - - - - - - -Спасибо за то, что пользуетесь Enigmail."> -Подтвердите -запрос, который вы найдете в своей входящей почте, если вы желаете этого."> - - - - - - - - + + + + + + + + + + + - + @@ -861,14 +727,9 @@ - -экспорт данных со старого компьютера с помощью этого -мастера -импорт данных на новом компьютере с помощью мастера -установки. -"> + + + @@ -890,9 +751,7 @@ Подробности — по нажатию на пиктограмму."> - + @@ -922,8 +781,7 @@ - + @@ -938,21 +796,20 @@ - -Выберите ниже учетную запись, ключ которой нужно передать. -В следующем окне мы выведем код настройки (пароль), который нужно будет -ввести на другом устройстве, чтобы импортировать ключ и его настройки."> + + - -Теперь перейдите на другое устройство и откройте сообщение. -У вас запросят код настройки. Введите в ответ следующие цифры:"> + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/ru/enigmail.properties enigmail-2.1.3+ds1/lang/ru/enigmail.properties --- enigmail-2.0.12+ds1/lang/ru/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/ru/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=Предупреждение Enigmail -enigConfirm=Подтверждение Enigmail +# enigConfirm=Enigmail Confirmation enigInfo=Сведения Enigmail enigError=Ошибка Enigmail enigPrompt=Приглашение Enigmail @@ -78,7 +78,7 @@ passSpaceProblem=Из-за технических ограничений парольная фраза не может начинаться или заканчиваться пробелом. changePassFailed=Не удалось сменить парольную фразу. -keyConfirm=Создать открытые и закрытые ключи для '%S'? +# keyConfirm=Generate public and secret key for '%S'? keyMan.button.generateKey=&Создать ключ keyAbort=Прервать генерацию ключа? keyMan.button.generateKeyAbort=&Прервать генерацию ключа @@ -86,14 +86,14 @@ expiryTooLong=Нельзя создать ключ со сроком действия более 100 лет. expiryTooLongShorter=Нельзя создать ключ со сроком действия более 90 лет. expiryTooShort=Ключ должен быть действителен минимум один день. -keyGenFailed=Не удалось создать ключ. Подробнее см. в консоли Enigmail (меню «Enigmail > Параметры отладки»). +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. setKeyExpirationDateFailed=Не удалось изменить дату окончания срока действия. # Strings in enigmailMessengerOverlay.js securityInfo=Информация о защите Enigmail\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Вложения в это сообщение не зашифрованы и не снабжены цифровой подписью* +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=Возможно, сообщение зашифровано или подписано с помощью PGP/MIME; для проверки используйте функцию «Расшифровать/Проверить» saveAttachmentHeader=Enigmail: сохранение расшифрованного вложения @@ -102,7 +102,7 @@ beginPgpPart=********* *НАЧАЛО ЗАШИФРОВАННОЙ ИЛИ ПОДПИСАННОЙ ЧАСТИ СООБЩЕНИЯ* ********* endPgpPart=********** *КОНЕЦ ЗАШИФРОВАННОЙ ИЛИ ПОДПИСАННОЙ ЧАСТИ СООБЩЕНИЯ* ********** -notePartEncrypted=Enigmail: *Некоторые части этого сообщения НЕ зашифрованы и НЕ подписаны* +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *В сообщении обнаружено несколько блоков. Расшифровка/проверка подписи прервана* decryptOkNoSig=Предупреждение\n\nРасшифровка прошла успешно, но корректно проверить цифровую подпись не удалось. @@ -114,6 +114,7 @@ fixBrokenExchangeMsg.failed=Не удалось восстановить сообщение. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key wksNoIdentity=Этот ключ не связан ни с одной вашей учётной записью электронной почты. Добавьте учётную запись как минимум для одного из следующих адресов электронной почты:\n\n%S wksConfirmSuccess=Подтверждающее сообщение отправлено. wksConfirmFailure=Не удалось отправить подтверждающее сообщение. @@ -148,10 +149,9 @@ minimalLineWrapping=Вы указали, что необходимо переносить строки длиннее следующего количества символов: %S. Для корректного шифрования и/или подписывания это значение должно быть не менее 68.\nУвеличить ширину строк до 68 символов? warning=Предупреждение signIconClicked=Вы самостоятельно указали, нужно ли подписывать это сообщение, поэтому использование подписи больше не зависит от использования шифрования. -errorOwnKeyUnusable=Ключ текущего профиля с ID «%S» не согласован с подходящим ключом OpenPGP. \n \nУбедитесь, что у вас есть действительный, не просроченный ключ OpenPGP и он указан в настройках аккаунта. \nЕсли срок действия вашего ключа не истёк, проверьте, установлен ли для этого ключа уровень доверия «Полный» или «Абсолютный». +# 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=Ошибка сохранения черновика msgCompose.partiallyEncrypted.short=Остерегайтесь раскрытия конфиденциальных данных: сообщение зашифровано частично. -msgCompose.partiallyEncrypted.mimeMsg=Сообщение, на которое вы отвечаете, содержало зашифрованные и незашифрованные части. Некоторые зашифрованные части сообщения для вас невидимы.\n\nЕсли отправитель изначально не смог самостоятельно расшифровать скрытые части сообщения, вы рискуете раскрыть содержащуюся в них конфиденциальную информацию.\n\nРекомендуем не отвечать на это сообщение, а создать новое сообщение и вставить в него ответ. msgCompose.partiallyEncrypted.inlinePGP=Сообщение, на которое вы отвечаете, содержало зашифрованные и незашифрованные части. Если отправитель изначально не смог самостоятельно расшифровать некоторые части сообщения, вы рискуете раскрыть содержащуюся в них конфиденциальную информацию.\n\nРекомендуем удалить весь цитируемый текст из ответа этому отправителю. msgCompose.internalEncryptionError=Внутренняя ошибка: ожидаемое шифрование отключено @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=Enigmail отключён для выбранного профиля msgCompose.protectSubject.tooltip=Защитить тему сообщения msgCompose.noSubjectProtection.tooltip=Не защищать тему сообщения -msgCompose.encryptedSubjectStub=Зашифрованное сообщение msgCompose.protectSubject.dialogTitle=Включить защиту темы? msgCompose.protectSubject.question=Обычно зашифрованные сообщения содержат неизменённую тему.\n\nМы разработали стандарт, позволяющий скрывать исходную тему в зашифрованном сообщении\nи заменять её на замещающий текст. Таким образом тему можно прочитать только после расшифровки сообщения.\n\nЗащищать тему в зашифрованных сообщениях? msgCompose.protectSubject.yesButton=&Защищать тему @@ -179,7 +178,7 @@ msgCompose.pepSendTrusted=Защищено и доверенно pep.alert.disabledForIdentity=Для текущей учётной записи p≡p отключён. Включите p≡p в параметрах Enigmail/p≡p. -pep.alert.weakReply=Вы собираетесь ответить на зашифрованное сообщение или переслать его, не используя шифрование. Это может привести к нарушению конфиденциальности информации и создаёт угрозу для вас и вашего собеседника. Продолжить? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=Сохранить %1$S сообщение с адресатами %2$S в папку «Исходящие»? onlineSend=Отправить сообщение %1$S адресату %2$S? -encryptKeysNote=Примечание: сообщение зашифровано для следующих идентификаторов пользователя/ключей: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S hiddenKey= -signFailed=Ошибка Enigmail — не удалось выполнить шифрование или подпись. Отправить незашифрованное сообщение? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=&Отправить незашифрованное сообщение recipientsSelectionHdr=Выберите адресатов зашифрованного сообщения @@ -225,9 +224,9 @@ signOffWithReason=Подпись: ОТКЛЮЧЕНО (%S) reasonEnabledByDefault=включено по умолчанию reasonManuallyForced=включено вручную -reasonByRecipientRules=включено настройками получателя +# reasonByRecipientRules=forced by per-recipient rules reasonByAutoEncryption=включено автошифрованием -reasonByConflict=по причине конфликта в правилах получателя +# reasonByConflict=due to conflict in per-recipient rules reasonByEncryptionMode=по причине режима шифрования # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=Используется Inline PGP # Attach own key status (tooltip strings): -attachOwnKeyNo=Ваш ключ не будет вложен -attachOwnKeyYes=Ваш ключ будет вложен -attachOwnKeyDisabled=Ваш собственный ключ не может быть вложен. Для включения этой функции необходимо выбрать ключ\nв разделе «OpenPGP» параметров учётной записи. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Обнаружены конфликтующие правила на уровне получателя\n%S\n\nОтправить сообщение с этими параметрами? msgCompose.button.configure=&Настроить @@ -269,6 +268,10 @@ clickDetailsButton=; нажмите кнопку «Подробности» для просмотра дополнительной информации clickImportButton=; нажмите кнопку «Импортировать ключ» для импорта ключа keyTypeUnsupported=; тип этого ключа не поддерживается установленной версией GnuPG +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Расшифровать msgPart=Часть сообщения %S имеет следующее состояние: msgSigned=подписанное msgSignedUnkownKey=подписано неизвестным ключом @@ -280,8 +283,10 @@ needKey=Ошибка — не найден соответствующий закрытый ключ, необходимый для расшифровки failedDecrypt=Ошибка — не удалось выполнить расшифровку badPhrase=Ошибка — неверная парольная фраза +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=Ошибка — не удалось расшифровать или проверить viewInfo=; выберите «Вид -> Информация о защите Enigmail» для получения более подробной информации +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=Расшифрованное сообщение decryptedMsgWithFormatError=Расшифрованное сообщение (восстановленная копия сообщения в формате PGP, вероятно повреждённого устаревшей версией сервера Exchange, форматирование текста может быть нарушено) @@ -326,6 +331,7 @@ autocryptSetupReq.setupMsg.backup=Вы можете сохранить это сообщение и использовать его в качестве резервной копии для вашего закрытого ключа. Для этого запишите пароль и храните его в безопасном месте. autocryptSetupReq.message.import=Чтобы импортировать параметры и ключи в Enigmail, нажмите кнопку «Начать настройку» в строке состояния. autocryptSetupReq.message.sent=Для импорта параметров нажмите на сообщение на другом устройстве и следуйте инструкциям. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js oldGpgVersion20=Не удалось инициализировать Enigmail.\n\nВы используете GnuPG версии %1$S, которая больше не поддерживается. Для работы Enigmail необходима версия не ниже %2$S. Обновите версию GnuPG в своей системе. @@ -337,6 +343,8 @@ prefs.warnAskNever=Предупреждение: активация этого параметра приведёт к отправке незашифрованных сообщений без показа уведомлений в случае, если для одного из получателей нет ключа. Enigmail не проинформирует вас, если это случится. prefs.warnIdleTimeForUnknownAgent=Не удалось подключиться к gpg-agent. Возможно, вы используете специальный инструментарий для обработки парольных фраз, например GNOME Keyring, seahorse-agent или KDE Wallet Manager. Enigmail не может управлять временем запоминания парольной фразы для вашего приложения, поэтому соответствующие параметры Enigmail не будут применены. prefEnigmail.oneKeyserverOnly=Ошибка — можно указать только один сервер ключей для автоматической загрузки недостающих ключей OpenPGP. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +aboutLicense.desc=Enigmail — свободная программа, которая распространяется по Общественной лицензии Mozilla 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=Ошибка — не указана парольная фраза noPGPblock=Ошибка — не найден действительный защищённый блок данных OpenPGP unverifiedReply=Часть сообщения с отступом (ответ), возможно, была изменена. -keyInMessageBody=Ключ найден в тексте сообщения. Чтобы его импортировать, нажмите «Импортировать ключ». +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=Ошибка — несовпадение подписи -cantImport=Ошибка импорта открытого ключа\n\n +# cantImport=Error importing public key\n\n doImportOne=Импортировать %1$S (%2$S)? doImportMultiple=Импортировать эти ключи?\n\n%S previewFailed=Не удаётся прочитать файл открытого ключа. @@ -366,14 +374,15 @@ sc.removeCard=Для выполнения этой операции в считывателе не должно быть смарт-карты.\nИзвлеките смарт-карту и повторите попытку. sc.noCardAvailable=В считывателе не удалось найти смарт-карту.\nВставьте смарт-карту и повторите попытку. sc.noReaderAvailable=Считыватель смарт-карт не найден\nПодключите считыватель смарт-карт, вставьте в него смарт-карту и повторите попытку. -keyError.keySpecNotFound=Для адреса электронной почты «%S» не найден соответствующий ключ в наборе ключей. -keyError.keyIdNotFound=Настроенный идентификатор ключа «%S» не найден в наборе ключей. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. keyError.resolutionAction=Выберите действительный ключ в разделе «Защита OpenPGP» параметров учётной записи. missingPassphrase=Отсутствует парольная фраза errorHandling.gpgAgentInvalid=Версия gpg-agent в вашей системе несовместима с вашей версией GnuPG. errorHandling.gpgAgentError=GnuPG сообщил об ошибке связи с gpg-agent (компонентом GnuPG). errorHandling.dirmngrError=GnuPG сообщил об ошибке связи с dirmngr (компонентом GnuPG). errorHandling.pinentryError=GnuPG не удалось запросить вашу парольную фразу через pinentry +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. errorHandling.readFaq=Это ошибка настройки системы или конфигурации, которая препятствует корректной работе Enigmail и не может быть исправлена автоматически.\n\nНастоятельно рекомендуем обратиться на наш веб-сайт поддержки по адресу https://enigmail.net/faq. gpgNotFound=Невозможно найти программу GnuPG «%S».\nУбедитесь, что в параметрах Enigmail указан правильный путь к исполняемому файлу GnuPG. @@ -384,9 +393,8 @@ prefBad=НЕПРОВЕРЕННАЯ подпись от %S failCancel=Ошибка — получение ключа отменено пользователем -failNoServer=Ошибка — не указан сервер ключей -failNoID=Ошибка — не указан идентификатор для получения ключа failKeyExtract=Ошибка — не удалось извлечь ключ +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=Ошибка — первый блок OpenPGP не является блоком открытого ключа importKeyConfirm=Импортировать открытые ключи, вложенные в сообщение? failKeyImport=Ошибка — не удалось импортировать ключ @@ -425,6 +433,8 @@ identityName=Учетная запись: %S switchPepMode=В настоящий момент вы используете упрощённый режим p≡p в Emigmail.\n\nПри выборе OpenPGP или S/MIME для учётной записи вы отключите режим p≡p и перейдёте в «обычный» режим работы Enigmail без p≡p. enableEnigmail=&Отключить p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Вы включили шифрование, но не выбрали ключ. Для шифрования сообщений, отправляемых адресату «%1$S», необходимо выбрать один или несколько действительных ключей из списка ключей. Отключить шифрование для адресата «%2$S»? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=Выбранная функция недоступна в автономном режиме. Перейдите в режим подключения к сети и повторите попытку. -protocolNotSupported=Выбранный протокол «%S://» не поддерживает загрузку ключей OpenPGP. -gpgkeysDisabled=Возможно, поможет включение параметра 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=Не удалось соединиться с сервером ключей %S. -keyDownloadFailed=Не удалось загрузить ключ с сервера ключей. Статус: \n%S internalError=Произошла внутренняя ошибка. Не удалось загрузить или импортировать ключи. -noKeyFound=По заданным критериям не удалось найти ни одного ключа. -keyDownload.keyUnavailable=Ключ с идентификатором %S недоступен на сервере ключей. Скорее всего, владелец не загрузил его.\n\nПопросите отправителя сообщения отправить вас ключ по электронной почте. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Не удалось найти или загрузить ключ с сервера ключей: gpgkeys_%S не может быть выполнен. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Не удалось установить уровень доверия к владельцу ключа @@ -490,7 +493,6 @@ asciiArmorFile=Защищённые файлы ASCII (.asc) importKeyFile=Импорт файла ключа OpenPGP gnupgFile=Файлы GnuPG -createKeyOK=Ключ создан saveRevokeCertAs=Создать и сохранить сертификат отзыва revokeCertOK=Сертификат отзыва создан. С его помощью вы можете отозвать свой открытый ключ, например в случае утери закрытого ключа. revokeCertFailed=Не удалось создать сертификат отзыва. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%1$S (0x%2$S) pub-sec defaultPubKeyFilename=Экспортированные открытые ключи defaultPubSecKeyFilename=экспортированные-открытые-и-закрытые-ключи -noSecretKeys=Закрытые ключи не найдены.\n\nСоздать ваш собственный ключ? sendKeysOk=Ключи отправлены успешно sendKeysFailed=Не удалось отправить ключи receiveKeysOk=Ключи успешно обновлены receiveKeysFailed=Не удалось загрузить ключи +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=Импортировать ключи из буфера обмена? importFromUrl=Загрузить открытый ключ с этого URL: copyToClipbrdFailed=Не удалось скопировать выделенные ключи в буфер обмена. copyToClipbrdOK=Ключи скопированы в буфер обмена -deleteSecretKey=ПРЕДУПРЕЖДЕНИЕ: вы собираетесь удалить закрытый ключ.\nПосле удаления закрытого ключа вы не сможете расшифровать ни одного сообщения, зашифрованного этим ключом, и не сможете отозвать свой ключ.\n\nВы действительно хотите удалить ОБА выбранных ключа: и закрытый, и открытый?\n«%S» +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=ПРЕДУПРЕЖДЕНИЕ: вы собираетесь удалить закрытые ключи.\nПосле удаления закрытого ключа вы не сможете расшифровать ни одного сообщения, зашифрованного этим ключом.\n\nВы действительно хотите удалить ОБА выбранных ключа: и закрытый, и открытый? deletePubKey=Удалить открытый ключ\n'%S'? deleteSelectedPubKey=Удалить открытые ключи? @@ -529,7 +531,7 @@ revokeKeyQuestion=Вы собираетесь отозвать ключ «%S».\n\nПосле этого ключ не сможет быть использован для подписания. Как только он будет распространён, другие пользователи больше не смогут использовать этот ключ для шифрования. С помощью этого ключа можно будет расшифровывать старые сообщения.\n\nПродолжить? revokeKeyOk=Ключ отозван. Если он доступен на сервере ключей, рекомендуется отправить его заново, чтобы другие пользователи знали об изменении его статуса. revokeKeyFailed=Не удалось отозвать ключ. -revokeKeyNotPresent=У вас нет ключа (0x%S), соответствующего этому сертификату отзыва.\n\nЕсли вы потеряли ключ, импортируйте его (например, с сервера ключей) перед использованием сертификата отзыва. +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! revokeKeyAlreadyRevoked=Ключ 0x%S уже отозван. refreshAllQuestion=Вы не выбрали ни одного ключа. Обновить ВСЕ ключи? refreshKeyServiceOn.warn=Предупреждение: ваши ключи обновляются в фоновом режиме с обеспечением максимально возможного уровня безопасности.\nОдновременное обновление всех ключей приведёт к раскрытию дополнительной информации без необходимости.\nВы уверены, что хотите это сделать? @@ -541,21 +543,21 @@ keyMan.button.import=&Импорт keyMan.button.refreshAll=&Обновить все ключи keyMan.button.revokeKey=&Отозвать ключ -keyMan.button.skip=&Пропустить ключ keylist.noOtherUids=Других идентификаторов нет keylist.hasOtherUids=Прочие идентификаторы: -keylist.noPhotos=Нет фотографии -keylist.hasPhotos=Фотографии +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos keyMan.addphoto.filepicker.title=Выберите фотографию для добавления -keyMan.addphoto.warnLargeFile=Размер выбранного файла превышает 25 КБ.\nНе рекомендуется добавлять очень большие файлы, так как это существенно увеличивает размер ключей. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. keyMan.addphoto.noJpegFile=Выбранный файл не является файлом JPEG. Выберите другой файл. keyMan.addphoto.failed=Не удалось добавить фото. noWksIdentity=У ключа %S нет учётной записи WKS. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -keyman.addBlacklistKey.msg=Прекратить использовать ключ «%1$S (%2$S)» в p≡p для шифрования сообщений? -keyman.removeBlacklistKey.msg=Разрешить p≡p использовать ключ «%1$S (%2$S)» для будущих сообщений? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? keyman.addBlacklistKey.button=Добавить ключ в &чёрный список keyman.removeBlacklistKey.button=&Удалить ключ из чёрного списка @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Не удалось сменить PIN-код -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Обновление ключей... keyserverProgress.uploading=Загрузка ключей... keyserverProgress.wksUploadFailed=Не удалось загрузить ключ в сетевую службу ключей keyserverProgress.wksUploadCompleted=Ваш открытый ключ успешно отправлен вашему поставщику электронной почты. Вы получите сообщение с подтверждением того, что вы инициировали загрузку. keyserverTitle.refreshing=Обновление ключей keyserverTitle.uploading=Загрузка ключей на сервер +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=Парольная фраза должна состоять минимум из 8 символов. -setupWizard.reallyCancel=Закрыть мастер настройки Enigmail? setupWizard.invalidGpg=Выбранный файл не является исполняемым файлом GnuPG. Укажите другой файл. -setupWizard.specifyFile=Чтобы продолжить, необходимо указать как минимум файл открытого ключа. setupWizard.installFailed=Не удалось выполнить установку. Повторите попытку или установите программу GnuPG вручную и укажите её местоположение с помощью кнопки «Обзор». setupWizard.downloadForbidden=Загрузка GnuPG не будет выполнена для обеспечения вашей безопаности. Посетите сайт https://gnupg.org/, чтобы загрузить GnuPG. setupWizard.downloadImpossible=Не удаётся загрузить GnuPG. Повторите попытку позже или откройте https://gnupg.org/, чтобы выполнить загрузку вручную. -setupWizard.hashSumError=Мастеру не удалось проверить целостность загруженного файла. Возможно, он был повреждён или подменён. Продолжить установку? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? setupWizard.importSettingsFile=Указать файл резервной копии для загрузки -setupWizard.invalidSettingsFile=Указанный файл не является действительным файлом резервной копии настроек Enigmail. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. setupWizard.gpgConfExists=Файл конфигурации GnuPG уже существует. Перезаписать его, используя файл из предыдущей установки? -setupWizard.noGpgHomeDir=Вы выбрали для GnuPG размещение %S. Это не каталог, поэтому использовать его нельзя. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. setupWizard.unmachtedIds=Не удалось установить соответствие для следующих профилей из вашей предыдущей конфигурации:\n%S\nПараметры этих профилей были проигнорированы. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Во время загрузки GnuPG произошла ошибка. За дополнительной информацией обратитесь к журналу ошибок. @@ -654,12 +662,12 @@ filter.term.pgpencrypted.label=Шифрование OpenPGP filter.encrypt.label=Зашифровать на ключ (Enigmail) filter.keyRequired=Выберите ключ получателя. -filter.keyNotFound=Не удалось найти ключ шифрования для «%S». -filter.warn.keyNotSecret=Предупреждение — действие фильтра «Зашифровать на ключ» заменяет получателей.\n\nЕсли у вас нет закрытого ключа для «%S», вы больше не сможете прочитать эти сообщения. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -converter.decryptBody.failed=Не удалось расшифровать сообщение с темой\n«%S».\nПопробовать с другой парольной фразой или пропустить это сообщение? -converter.decryptAtt.failed=Не удалось расшифровать вложение «%1$S»\nиз сообщения с темой\n«%2$S».\nПопробовать с другой парольной фразой или пропустить это сообщение? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? saveLogFile.title=Сохранить файл журнала @@ -691,13 +699,13 @@ enigmailSettings=Настройки Enigmail defaultBackupFileName=Enigmail — экспорт specifyExportFile=Укажите имя файла для экспорта -homedirParamNotSUpported=Дополнительные параметры путей, такие как «--homedir» и «--keyring», при экспорте и восстановлении настроек не поддерживаются. Используйте другие способы, например переменную среды «GNUPGHOME». +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm -expiry.keyExpiresSoon=До истечения срока действия ключа «%1$S» осталось дней: %2$S.\n\nРекомендуется создать новую пару ключей и настроить соответствующие учётные записи для их использования. -expiry.keysExpireSoon=Срок действия ваших ключей, приведённых ниже, истекает менее чем через %1$S дн.:\n%2$S Рекомендуем вам создать новые ключи и настроить их использование в ваших учётных записях. -expiry.keyMissingOwnerTrust=У вашего закрытого ключа %S недостаточно высокий уровень доверия.\n\nРекомендуем в строке «Ваши настройки доверия» свойств ключа выбрать вариант «Абсолютно доверяю». -expiry.keysMissingOwnerTrust=Для приведённых ниже закрытых ключей указан недостаточно высокий уровень доверия.\n%S.\nРекомендуем в строке «Ваши настройки доверия» свойств ключа выбрать вариант «Абсолютно доверяю». +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. expiry.OpenKeyManager=Открыть Управление ключами Enigmail expiry.OpenKeyProperties=Открыть свойства ключа @@ -709,6 +717,7 @@ gpghomedir.notwritable=Каталог «%S», содержащий ваши ключи OpenPGP, недоступен для записи. gpghomedir.notdirectory=Размещение «%S», содержащее ваши ключи OpenPGP, является файлом, а не каталогом. gpghomedir.notusable=Исправьте разрешения для каталога или измените расположение «домашнего» каталога GnuPG для корректной работы. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=Невозможно проверить слова доверия p≡p для собственной учётной записи. @@ -728,12 +737,12 @@ pepPrivacyStatus.RatingMistrustSuggestion=Свяжитесь с собеседником ещё раз и попытайтесь совершить другое рукопожатие. pepPrivacyStatus.RatingReliableSuggestion=Чтобы совершить рукопожатие, обменяйтесь с собеседником паролями доверия лично или по телефону. Рукопожатие обеспечивает надёжную и безопасную связь, и его достаточно совершить только один раз для каждого собеседника. pepPrivacyStatus.RatingTrustedSuggestion=Никаких действий не требуется. -pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Учтите, что это сообщение может быть не защищено. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Укажите необходимую информацию. -pepPrivacyStatus.RatingUnderAttackSuggestion=Обратитесь к собеседнику по другому каналу и проверьте содержание этого сообщения. -pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Убедитесь, что все собеседники имеют статус защиты не ниже «Защищено». +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". pepPrivacyStatus.RatingUnencryptedSuggestion=Попросите своего собеседника использовать решение для шифрования или установить p≡p. -pepPrivacyStatus.RatingUnreliableSuggestion=Это сообщение не использует надёжное шифрование или не имеет подписи. Попросите собеседника перейти на более современное решение для шифрования или установить p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. pepPrivacyStatus.RatingBrokenExplanation=У этого сообщения повреждено шифрование или нарушено форматирование. pepPrivacyStatus.RatingHaveNoKeyExplanation=Это сообщение невозможно расшифровать, так как ключ недоступен. @@ -763,16 +772,16 @@ handshakeDlg.label.outgoingMessage=Исходящее сообщение handshakeDlg.label.incomingMessage=Входящее сообщение handshakeDlg.error.noPeers=Нельзя установить рукопожатие при отсутствии собеседников -handshakeDlg.error.noProtection=Включите защиту, чтобы использовать функцию рукопожатия. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -enigmail.acSetupPasswd.descEnterPasswd=Введите код, показанный на другом устройстве. -enigmail.acSetupPasswd.descCopyPasswd=Введите приведённый ниже код на другом устройстве, чтобы продолжить установку +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm autocrypt.setupMsg.subject=Сообщение настройки автошифра autocrypt.setupMsg.msgBody=Чтобы настроить использование автошифра на новом устройстве, следуйте инструкциям на новом устройстве. -autocrypt.setupMsg.fileTxt=Это файл установки автошифра, который используется для переноса параметров и ключей между клиентами. Вы можете расшифровать его, используя код установки на первоначальном устройстве, а затем импортировать полученный ключ в свой набор ключей. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html upgradeInfo.doctitle=Что нового в Enigmail v2.0? @@ -785,10 +794,12 @@ upgradeInfo.autocrypt.title=Поддержка автошифра upgradeInfo.autocrypt.desc=Теперь Enigmail поддерживает автошифр, новый стандарт распространения ключей в составе отправленного сообщения. Enigmail автоматически импортирует ключи из совместимых сообщений. Таким образом, с течением времени шифровать можно всё больше и больше сообщений. upgradeInfo.pEp.title=Новый упрощённый режим p≡p (Pretty Easy Privacy) -upgradeInfo.pEp.desc=В Enigmail добавлен упрощённый режим p≡p. В настоящее время p≡p необходимо установить вручную. Это будет изменено в будущих выпусках. Упрощённый режим p≡p позволяет использовать шифрование OpenPGP максимально прозрачно. Вам не нужно беспокоиться об управлении ключами и синхронизации ключей между устройствами. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. upgradeInfo.bottom.desc=Справочные материалы по Enigmail доступны в нашей документации. +#strings in pEpAdapter.jsm pep.missingGnuPG=Для использования Enigmail/p≡p необходим GnuPG. Так как его обнаружить не удалось, предлагаем вам его загрузить и установить. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=Об Enigmail @@ -799,6 +810,7 @@ aboutEnigmail.documentation=Документация: aboutEnigmail.testing=Тестирование: aboutEnigmail.userSupport=Поддержка пользователей: +# aboutEnigmail.userSupport.team=the team and the list/forum members aboutEnigmail.localization=Локализация: См. страницу языковых пакетов Enigmail aboutEnigmail.Credits=Участники: aboutEnigmail.origAuthor=Первоначальный автор расширения Enigmail @@ -808,3 +820,38 @@ aboutEnigmail.licenseSupportTitle=Лицензия и поддержка aboutEnigmail.license=OpenPGP в Enigmail — это стандарт с открытым исходным кодом, который предоставляется на условиях %S aboutEnigmail.support=Поддержка и файлы для загрузки доступны на сайте www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/sk/enigmail.dtd enigmail-2.1.3+ds1/lang/sk/enigmail.dtd --- enigmail-2.0.12+ds1/lang/sk/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/sk/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ - - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,11 +63,8 @@ - - - @@ -89,12 +77,13 @@ + - + @@ -117,6 +106,9 @@ + + + @@ -209,6 +201,7 @@ + @@ -217,8 +210,8 @@ - - + + @@ -345,7 +338,7 @@ - + @@ -368,7 +361,6 @@ - @@ -456,8 +448,8 @@ - - + + @@ -542,7 +534,7 @@ - + @@ -623,7 +615,7 @@ - + @@ -665,119 +657,35 @@ - - + - - - - - - - - - - - - - - - - - -Upozornenie: Enigmail bude vždy overovať podpisy v e-mailoch všetkých identít a účtov bez ohľadu na to, či je to v nich povolené"> - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Vďaka Vám za používanie Enigmail."> - - - - - - - - - + + + + + + + + + + + - + @@ -793,7 +701,9 @@ - + + + @@ -852,9 +762,19 @@ - + + - + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/sk/enigmail.properties enigmail-2.1.3+ds1/lang/sk/enigmail.properties --- enigmail-2.0.12+ds1/lang/sk/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/sk/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=Upozornenie Enigmail -enigConfirm=Potvrdenie Enigmail +# enigConfirm=Enigmail Confirmation # enigInfo=Enigmail Information enigError=Chyba Enigmail enigPrompt=Pripomenutie Enigmail @@ -78,7 +78,7 @@ passSpaceProblem=Z technických dôvodov, Vaše heslo nemôže začínať, ani končiť medzerou. changePassFailed=Zmena hesla zlyhala. -keyConfirm=Vytvoriť verejný a súkromný kľúč pre '%S'? +# keyConfirm=Generate public and secret key for '%S'? keyMan.button.generateKey=&Vytvoriť kľúč keyAbort=Prerušiť vytváranie kľúča? keyMan.button.generateKeyAbort=&Prerušiť vytváranie kľúča @@ -86,14 +86,14 @@ expiryTooLong=Nemôžete vytvárať kľúč, ktorý expiruje viac než za 100 rokov. expiryTooLongShorter=Nemôžte vytvoriť kľúč, ktorý expiruje za viac ako 90 rokov. expiryTooShort=Váš kľúč musí byť platný minimálne jeden deň. -keyGenFailed=Vytvorenie kľúča zlyhalo. Podrobnosti zistíte v konzole Enigmail (ponuka Enigmail > Ladenie Enigmail). +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. setKeyExpirationDateFailed=Doba expirácie sa nemôže zmeniť # Strings in enigmailMessengerOverlay.js securityInfo=Informácie zabezpečenia Enigmail\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Prílohy k tejto správe neboli podpísané alebo zašifrované*\n\n +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=Táto správa je možno zašifrovaná alebo podpísaná PGP/MIME; overíte si to po kliknutí na tlačítko "Dešifrovať" saveAttachmentHeader=Enigmail: Uložiť dešifrovanú prílohu @@ -102,7 +102,7 @@ beginPgpPart=********* *ZAČIATOK ŠIFROVANEJ alebo PODPÍSANEJ ČASTI* ********* endPgpPart=********** *KONIEC ŠIFROVANEJ alebo PODPÍSANEJ ČASTI* ********** -notePartEncrypted=Enigmail: *Časť správy nebola podpísaná alebo dešifrovaná* +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *Bol nájdený mnohonásobný blok správ -- dešifrovanie/overenie zrušené* decryptOkNoSig=Upozornenie\n\nDešifrovanie bolo úspešné, ale podpis nemohol byť správne overený @@ -114,6 +114,7 @@ # fixBrokenExchangeMsg.failed=Did not succeed to repair message. enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. @@ -148,10 +149,9 @@ minimalLineWrapping=Máte nastavené zalamovanie riadkov na %S znakov. Pre správne šifrovanie a/alebo podpisovanie musí byť táto hodnota najmenej 68.\nPrajete si teraz zmeniť zalamovanie riadkov na 68 znakov? warning=Pozor signIconClicked=Ručne ste zmenil/a podpisovanie. Pri vytváraní tejto správy preto (de)aktivácia podpisu nezávisí na (de)aktivácii šifrovania. -# 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. +# 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.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. # msgCompose.internalEncryptionError=Internal Error: promised encryption disabled @@ -164,7 +164,6 @@ # msgCompose.toolbarTxt.disabled=Enigmail is disabled for the selected identity # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject -# msgCompose.encryptedSubjectStub=Encrypted Message # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject @@ -179,7 +178,7 @@ # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -# pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=Uložiť %S správu do %S do zložky konceptov? onlineSend=Odoslať správu %S na %S? -encryptKeysNote=Upozornenie: správa je šifrovaná s nasledujúcim užívateľským ID / kľúčom: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S # hiddenKey= -signFailed=Chyba Enigmail; Šifrovanie alebo podpisovanie zlyhalo; odoslať správu nezašifrovanú? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=&Odoslať nezašifrovanú správu recipientsSelectionHdr=Určiť adresátov pre šifrovanie @@ -225,9 +224,9 @@ # signOffWithReason=Signing: OFF (%S) # reasonEnabledByDefault=enabled by default # reasonManuallyForced=manually forced -# reasonByRecipientRules=forced by recipient rules +# reasonByRecipientRules=forced by per-recipient rules # reasonByAutoEncryption=forced by auto encryption -# reasonByConflict=due to conflict in recipient rules +# reasonByConflict=due to conflict in per-recipient rules # reasonByEncryptionMode=due to encryption mode # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=Inline PGP bude použité # Attach own key status (tooltip strings): -# attachOwnKeyNo=Your own key will not be attached -# attachOwnKeyYes=Your own key will be attached -# attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Nájdené protichodné pravidlá pre príjemcov\n%S\n\nPoslať správu s týmito nastaveniami? msgCompose.button.configure=&Nastavenie @@ -269,6 +268,10 @@ # clickDetailsButton=; click on 'Details' button for more information # clickImportButton=; click on the 'Import Key' button to import the key # keyTypeUnsupported=; the key type is not supported by your version of GnuPG +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Dešifrovať msgPart=Časť správy %S msgSigned=podpísaná # msgSignedUnkownKey=signed with unknown key @@ -280,8 +283,10 @@ needKey=Chyba - pre dešifrovanie je potrebný súkromný kľúč failedDecrypt=Chyba - dešifrovanie zlyhalo badPhrase=Chyba - zlé heslo +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=Chyba - dešifrovanie/overenie zlyhalo viewInfo=; Zobraziť > Bezpečnostné informácie správy pre podrobnosti +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=Dešifrovaná správa decryptedMsgWithFormatError=Dekódovaná správa (obnovený poškodený PGP email formát pravdepodobne spôsobený starým Exchange serverom, takže výsledok nemusí byť úplne čitateľný) @@ -326,6 +331,7 @@ # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. @@ -337,6 +343,8 @@ prefs.warnAskNever=Varovanie: aktiváciou tejto voľby dosiahnete to, že správy budú odosielané nezašifrované bez ohlásenia, ak nemáte kľúč pre niektorého z príjemcov -- Enigmail Vás o tomto nebude naďalej informovať! prefs.warnIdleTimeForUnknownAgent=Váš systém používa špecializovaný nástroj pre prácu s heslami (napr. gnome-keyring alebo seahorse-agent). Bohužiaľ Enigmail nemôže kontrolovať časový limit hesla nástroja, ktorý používate. Z tohoto dôvodu príslušné nastavenia v Enigmail nebudú brané v úvahu. prefEnigmail.oneKeyserverOnly=Chyba - je možné určiť iba jeden keyserver pre automatické sťahovanie chýbajúcich kľúčov OpenPGP. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +# aboutLicense.desc=Enigmail is open source and licensed under the Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=Chyba - nebolo vyplnené heslo noPGPblock=Chyba - nenájdený platný dátový blok OpenPGP unverifiedReply=Odsadená časť správy (odpoveď) bola pravdepodobne zmenená -# keyInMessageBody=Key in message body found. Click 'Import Key' to import the key +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=Chyba - podpis nesúhlasí -cantImport=Chyba pri importovaní verejného kľúča\n\n +# cantImport=Error importing public key\n\n # doImportOne=Import %1$S (%2$S)? # doImportMultiple=Import the following keys?\n\n%S # previewFailed=Can't read public key file. @@ -366,14 +374,15 @@ sc.removeCard=Operácia vyžaduje, aby v čítačke nebola žiadna SmartCard.\nVyberte prosím SmartCard a zopakujte operáciu. sc.noCardAvailable=SmartCard v čítačke nebola nájdená\nVložte prosím SmartCard a zopakujte operáciu. sc.noReaderAvailable=Vaša čítačka SmartCard nie je pristupná\nPripojte prosím čítačku SmartCard, vložte kartu a operáciu zopakujte. -# keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. -# keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. # keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. # missingPassphrase=Missing passphrase # errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. # errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=Nie je možné nájsť program GnuPG '%S'.\nPresvedčte sa, že máte správne zadanú cestu ku spustiteľnému súboru GnuPG v nastavení Enigmail. @@ -384,9 +393,8 @@ prefBad=CHYBNÝ podpis od %S failCancel=Chyba - príjem kľúča zrušený užívateľom -failNoServer=Chyba - nie je určený keyserver pre prijatie kľúčov -failNoID=Chyba - nie je určené ID, pre ktoré prijať kľúč failKeyExtract=Chyba - extrakcia kľúča zlyhala +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=Chyba - prvý blok OpenPGP nie je blok verejného kľúča importKeyConfirm=Importovať verejný/é kľúč(e) obsiahnutý v správe? failKeyImport=Chyba - import kľúča zlyhal @@ -425,6 +433,8 @@ identityName=Identita: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Máte aktivované šifrovanie, ale nevybral/a ste žiaden kľúč. K šifrovaniu správy pre %S je potrebné vybrať jeden alebo niekoľko platných kľúčov zo zoznamu. Chcete zakázať šifrovanie pre %S? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=Funkcia, ktorú ste zvolil/a, nie je dostupná v offline móde. Prejdite prosím do online módu a skúste to znova. -protocolNotSupported=Protokol '%S://', ktorý ste zvolil/a, nie je podporovaný pre stiahnutie kľúčov OpenPGP. -gpgkeysDisabled=Môže vám pomôcť povoliť voľbu 'extensions.enigmail.useGpgKeysTool' noKeyserverConn=Nie je možné sa pripojiť na keyserver %S. -keyDownloadFailed=Zlyhalo stiahnutie kľúča z keyservera. Stavová správa:n%S internalError=Vyskytla sa vnútorná chyba. Kľúče nie je možné stiahnuť alebo importovať. -noKeyFound=Je mi ľúto, ale nemôžem nájsť žiaden kľúč, ktorý by zodpovedal zadaným kritériám pre vyhľadávanie.\nVšimnite si prosím, že ID kľúča by malo začínať na \\"0x\\" (napr. 0xABCDEF12). -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Zlyhalo hľadanie alebo sťahovanie kľúča z keyservera: gpgkeys_%S nie je možné spustiť. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Nastavenie dôveryhodnosti zlyhalo @@ -490,7 +493,6 @@ asciiArmorFile=Súbory kódované ASCII (*.asc) importKeyFile=Importuj OpenPGP súbor kľúča gnupgFile=Súbory GnuPG -# createKeyOK=Your Key has been generated saveRevokeCertAs=Vytvoriť a uložiť revokačný certifikát # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=Revokačný certifikát nemohol byť vytvorený. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%S (0x%S)_verejný-súkromný defaultPubKeyFilename=Exportované-verejné-kľúče defaultPubSecKeyFilename=Exportovaný-verejný-a-súkromný-kľúč -noSecretKeys=Neboli nájdené žiadne súkromné kľúče.\n\nPrajete si teraz vytvoriť svoj vlastný kľúč? sendKeysOk=Kľúč/e boli úspešne odoslané sendKeysFailed=Odosielanie kľúčov zlyhalo receiveKeysOk=Kľúč/e úspešne aktualizované receiveKeysFailed=Sťahovanie kľúčov zlyhalo +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=Prajete si importovať niektorý/é kľúč/e zo schránky? # importFromUrl=Download public key from this URL: copyToClipbrdFailed=Zvolený/é kľúč/e nie je možné kopírovať do schránky. copyToClipbrdOK=Kľúče boli nakopírované do schránky -deleteSecretKey=Varovanie: Snažíte se zmazať súkromný kľúč!\nAk zmažete svoj súkromný kľúč, nebudete môcť ďalej dešifrovať správy zašifrované pre tento kľúč ani kľúč revokovať.\n\nPrajete si naozaj zmazať oba kľúče (verejný i súkromný)\n'%S'? +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=POZOR: Snažíte sa zmazať súkromné kľúče!\nAk zmažete svoj súkromný kľúč, nebudete môcť ďalej dešifrovať správy zašifrované pre tento kľúč.\n\nNaozaj si prajete zmazať Vami zvolený verejný a súkromný kľúč? deletePubKey=Prajete si zmazať tento verejný kľúč\n'%S'? deleteSelectedPubKey=Prajete si zmazať tieto verejné kľúče? @@ -529,7 +531,7 @@ # revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? revokeKeyOk=Kľúč bol revokovaný. Ak je tento kľúč dostupný taktiež na keyserveri, je doporučené odoslať ho tam znova, aby ste dal/a i ostatným uživateľom vedieť o revokácii. revokeKeyFailed=Kľúč nie je možné revokovať -# revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Nevybral/a ste žiaden kľúč. Prajete si obnoviť zoznam všetkých kľúčov? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? @@ -541,21 +543,21 @@ keyMan.button.import=&Importovať keyMan.button.refreshAll=&Znova načítať všetky kľúče keyMan.button.revokeKey=&Revokovať kľúč -keyMan.button.skip=Pre&skoč kľúč keylist.noOtherUids=Nemá iné identity keylist.hasOtherUids=Ďalšia identita -keylist.noPhotos=Fotografia nie je dostupná -keylist.hasPhotos=Fotografie +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos keyMan.addphoto.filepicker.title=Vyberte obrázok pre pridanie. -keyMan.addphoto.warnLargeFile=Súbor, ktorý ste si vybrali, je väčší ako 25 kB. Nie je doporučené pridávať veľmi veľké obrázky, pretože kľúče sú potom príliš veľké. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. keyMan.addphoto.noJpegFile=Vybraný súbor sa nezdá byť súbor vo formáte JPEG. Zvoľte si prosím iný súbor keyMan.addphoto.failed=Fotka nemôže byť pridaná. # noWksIdentity=The key %S does not have a WKS identity. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? -# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Zmena PIN zlyhala -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Obnovujú sa kľúče, prosím čakajte ... keyserverProgress.uploading=Odosielanie kľúčov, prosím čakajte ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Obnoviť kľúče keyserverTitle.uploading=Odosielanie kľúča +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=Vaše heslo je kratšie než 8 znakov! -setupWizard.reallyCancel=Naozaj si prajete ukončiť sprievodcu nastavením Enigmail? setupWizard.invalidGpg=Súbor, ktorý ste zvolili, nie je spustiteľný súbor GnuPG. Prosím, zvoľte iný súbor. -setupWizard.specifyFile=Pre pokračovanie musíte zadať aspoň súbor s verejným kľúčom. setupWizard.installFailed=Vyzerá to, že inštalácia sa nepodarila. Prosím skúste inštaláciu znova, alebo nainštalujte GnuPG ručne a určite súbor pomocou tlačítka Prehľadávanie. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. -setupWizard.hashSumError=Pomocník nemôže skontrolovať integritu stiahnutého súboru. Súbor je možno poškodený, alebo neoficiálne upravený. Ste si istý, že chcete pokračovať v inštalácii? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? # setupWizard.importSettingsFile=Specify backup file to load from -# setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. # setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? -# setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Vyskytla sa chyba pri pokuse o stiahnutie GnuPG. Prosím skontrolujte záznam v konzole pre ďalšie podrobnosti. @@ -654,12 +662,12 @@ # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. -# filter.keyNotFound=Could not find an encryption key for "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -# converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? -# converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? # saveLogFile.title=Save Log File @@ -691,13 +699,13 @@ # enigmailSettings=EnigmailSettings # defaultBackupFileName=Enigmail-export # specifyExportFile=Specify file name for exporting -# homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm -# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. -# expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties @@ -709,6 +717,7 @@ # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. @@ -728,12 +737,12 @@ # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! -# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. -# pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. @@ -763,16 +772,16 @@ # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. -# handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device -# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? @@ -785,10 +794,12 @@ # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. +#strings in pEpAdapter.jsm # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=O Enigmail @@ -799,6 +810,7 @@ # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: +# aboutEnigmail.userSupport.team=the team and the list/forum members # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension @@ -808,3 +820,38 @@ # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/sl/enigmail.dtd enigmail-2.1.3+ds1/lang/sl/enigmail.dtd --- enigmail-2.0.12+ds1/lang/sl/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/sl/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ - - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,11 +63,8 @@ - - - @@ -89,12 +77,13 @@ + - + @@ -117,6 +106,9 @@ + + + @@ -209,6 +201,7 @@ + @@ -217,8 +210,8 @@ - - + + @@ -346,7 +339,7 @@ - + @@ -369,7 +362,6 @@ - @@ -457,8 +449,8 @@ - - + + @@ -543,7 +535,7 @@ - + @@ -624,7 +616,7 @@ - + @@ -666,144 +658,39 @@ - - - - - - - - - - - - - - - - - - - - -Opomba: Enigmail bo vedno preverjal podpise - -e-sporočil za vsak račun ali identiteto, ne glede na to, ali je omogočeno ali ne"> - + + - - + - - - - - - - - - - - - - - - - - -javni ključ je za druge, da vam pošljejo šifrirana gesla. Razdelite ga lahko komerkoli."> -zasebni ključ je za vas, da dešifrirate to e-pošto in pošljete podpisano e-pošto. - -Nikomur ga ne smete dati."> -zasebni ključ je za vas, da dešifrirate to e-pošto in pošljete podpisano e-pošto. - -Nikomur ga ne smete dati. - -Da zavarujete svoj javni ključ, boste pozvani za geslo v naslednjih dveh pogovornih oknih."> -Geslo zaščiti vaš zasebni ključ in prepreči njegovo zlorabo."> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - izvozite podatke s starega računalnika s čarovnikom za varnostno kopiranje iz nastavitev Enigmail - uvozite podatke v nov računalnik s tem čarovnikom. - "> - - - - - - -Hvala, ker uporabljate Enigmail."> - - - - - - - - - + + + + + + + + + + + - + @@ -819,12 +706,9 @@ - - izvozite podatke s starega računalnika s tem čarovnikom - uvozite podatke v nov računalnik s čarovnikom za namestitev. - "> + + + @@ -885,9 +769,19 @@ - + + - + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/sl/enigmail.properties enigmail-2.1.3+ds1/lang/sl/enigmail.properties --- enigmail-2.0.12+ds1/lang/sl/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/sl/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=Enigmail – opozorilo -enigConfirm=Enigmail – potrditev +# enigConfirm=Enigmail Confirmation # enigInfo=Enigmail Information enigError=Enigmail – napaka enigPrompt=Enigmail – prompt @@ -78,7 +78,7 @@ passSpaceProblem=Vaše geslo se iz tehničnih razlogov ne sme začeti ali končati s presledkom. changePassFailed=Sprememba gesla ni uspela. -keyConfirm=Ustvari javni in skriti ključ za '%S'? +# keyConfirm=Generate public and secret key for '%S'? keyMan.button.generateKey=&Ustvari ključ keyAbort=Prekinem ustvarjanje ključa? keyMan.button.generateKeyAbort=&Ustavi tvorbo ključa @@ -86,14 +86,14 @@ expiryTooLong=Ne morete ustvariti ključa, ki postane neveljaven kasneje kot v 100 letih. expiryTooLongShorter=Ključa, ki poteče čez več kot 90 let, ne morete ustvariti. expiryTooShort=Vaš ključ mora biti veljaven najmanj en dan. -keyGenFailed=Ustvarjanje ključa ni uspelo. Prosimo, za podrobnosti preverite konzolo Enigmail (Meni Enigmail > Razhroščevanje Enigmail). +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. setKeyExpirationDateFailed=Datuma prenehanja veljavnosti ni mogoče spremeniti # Strings in enigmailMessengerOverlay.js securityInfo=Varnostne informacije Enigmail\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Priloge temu sporočilu niso podpisane ali šifrirane*\n\n +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=Najverjetneje šifrirano ali podpisano sporočilo PGP/MIME; za preverjanje kliknite gumb Dešifriraj saveAttachmentHeader=Enigmail: Shrani dešifrirano priponko @@ -102,7 +102,7 @@ beginPgpPart=********* *ZACETEK SIFRIRANEGA ali PODPISANEGA DELA* ********* endPgpPart=********** *KONEC SIFRIRANEGA ali PODPISANEGA DELA* ********** -notePartEncrypted=Enigmail: *Deli sporocila NISO bili podpisani ali sifrirani* +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *Najdenih je več blokov sporočila -- dešifriranje/preverjanje prekinjeno* decryptOkNoSig=Pozor\n\nDešifriranje je bilo uspešno, a podpisa ni mogoče preveriti. @@ -114,6 +114,7 @@ fixBrokenExchangeMsg.failed=Sporočila ni uspelo popraviti. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. @@ -148,10 +149,9 @@ minimalLineWrapping=Prelom besedila ste nastavili na %S znakov. Za pravilno šifriranje in podpisovanje mora biti ta vrednost najmanj 68.\nŽelite zdaj vrednost nastaviti na 68? warning=Opozorilo signIconClicked=Spremenili ste nastavitve za podpisovanje. Zato za to sporočilo nič več ne velja (de-)aktivacija podpisovanja skupaj z (de-)aktivacijo šifriranja. -errorOwnKeyUnusable=ID ključa '%S', ki je nastavljen za trenutno identiteto, ne dobavi uporabnega ključa OpenPGP.\n\nZagotovite, da imate veljaven ključ OpenPGP in da vaše nastavitve računa nanj kažejo.\nČe vaš ključ ni potekel, preverite, ali ste zaupanje lastniku nastavili na polno ali skrajno. +# 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=Napaka med shranjevanjem osnutka # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. -# msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=Notranja napaka: obljubljeno šifriranje onemogočeno @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=Za izbrano identiteto je Enigmail onemogočen # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject -msgCompose.encryptedSubjectStub=Šifrirano sporočilo # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject @@ -179,7 +178,7 @@ # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -# pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=Želite shraniti sporočilo %S, namenjeno %S, v mapo 'Neodposlana sporočila'? onlineSend=Želite poslati sporočilo %S prejemniku %S? -encryptKeysNote=Napotek\\: Sporočilo je šifrirano z naslednjimi ključi identitete uporabnikov\\: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S hiddenKey= -signFailed=Napaka v programu Enigmail; šifriranje oz. podpisovanje ni uspelo. Želite poslati sporočilo nezavarovano? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=&Pošlji nešifrirano sporočilo recipientsSelectionHdr=Izberite prejemnika šifriranja @@ -225,9 +224,9 @@ signOffWithReason=Podpisovanje: IZKLJUČENO (%S) reasonEnabledByDefault=privzeto omogočeno reasonManuallyForced=ročno vsiljeno -reasonByRecipientRules=vsiljeno s pravili prejemnika +# reasonByRecipientRules=forced by per-recipient rules reasonByAutoEncryption=vsiljeno s samo-šifriranjem -reasonByConflict=zaradi spora v pravilih prejemnika +# reasonByConflict=due to conflict in per-recipient rules reasonByEncryptionMode=zaradi načina šifriranja # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=Uporabljen bo vrinjen PGP # Attach own key status (tooltip strings): -attachOwnKeyNo=Vaš lasten ključ ne bo pripet -attachOwnKeyYes=Vaš lasten ključ bo pripet -attachOwnKeyDisabled=Vašega lastnega ključa ni mogoče pripeti. Izbrati morate določen ključ\nv odseku OpenPGP v nastavitvah računa, da omogočite to značilnost. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Najdena so nasprotujoča si pravila za prejemnika\n%S\n\nŽelite poslati sporočilo s temi nastavitvami? msgCompose.button.configure=Pri&lagodi @@ -269,6 +268,10 @@ clickDetailsButton=; za več informacij kliknite na gumb 'Podrobnosti' clickImportButton=; za prenos ključa kliknite na gumb 'Uvozi ključ' keyTypeUnsupported=; vaša različica GnuPG ne podpira te vrste ključa +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Dešifriraj msgPart=Del sporočila %S msgSigned=podpisan msgSignedUnkownKey=podpisano z neznanim ključem @@ -280,8 +283,10 @@ needKey=Napaka - Za dešifriranje je potreben skrivni ključ failedDecrypt=Napaka - Dešifriranje ni uspelo badPhrase=Napaka - Napačno geslo +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=Napaka - Dešifriranje/preverjanje ni uspelo viewInfo=; Za podrobnosti izberite Pogled > Informacije o varnosti sporočila +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=Dešifrirano sporočilo decryptedMsgWithFormatError=Dešifrirano sporočilo (obnovljena pokvarjena oblika e-pošte PGP, ki jo je povzročil star strežnik Exchange, tako da rezultat verjetno ne bo popoln za branje) @@ -326,6 +331,7 @@ # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. @@ -337,6 +343,8 @@ prefs.warnAskNever=Opozorilo: z aktivacijo te možnosti boste povzročili nešifrirana e-sporočila brez dodatnih opozoril, če ključ za enega od prejemnikov ne obstaja -- Enigmail vas o tem ne bo opozarjal! prefs.warnIdleTimeForUnknownAgent=Vaš sistem uporablja specializirano orodje za ravnanje z gesli, kot sta gnome-keyring ali seahorse-agent. Žal OpenGPG ne more nadzorovati časovne prekoračitve gesla za orodje, ki ga uporabljate. Zato se ustrezne nastavitve časovne prekoračitve v Enigmail ne upoštevajo. prefEnigmail.oneKeyserverOnly=Napaka - navedete lahko le en strežnik ključev za samodejno prenašanje manjkajočih ključev OpenPGP. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +# aboutLicense.desc=Enigmail is open source and licensed under the Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=Napaka – Niste vnesli gesla noPGPblock=Napaka – Ni nobenega veljavnega bloka OpenPGP unverifiedReply=Del sporočila (odgovor) je bil morda spremenjen -keyInMessageBody=Najdena ključ in telo sporočila. Kliknite 'Uvozi ključ', da ga uvozite +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=Napaka – Podpis ni pravilen -cantImport=Napaka pri uvozu javnega ključa\n\n +# cantImport=Error importing public key\n\n doImportOne=Uvozi %1$S (%2$S)? doImportMultiple=Uvozi naslednje ključe?\n\n%S previewFailed=Javnega ključa ni mogoče brati. @@ -366,14 +374,15 @@ sc.removeCard=Postopek ne potrebuje prisotnosti pametne kartice v bralniku.\nProsimo, odstranite svojo pametno kartico in ponovite postopek. sc.noCardAvailable=V vašem bralniku ni nobene pametne kartice.\nProsimo, vstavite svojo pametno kartico in ponovite postopek. sc.noReaderAvailable=Vaš bralnik pametnih kartic ni dosegljiv.\nProsimo, povežite svoj bralnik pametnih kartic, vstavite kartico in ponovite postopek. -keyError.keySpecNotFound=E-poštnega naslova "%S" ni mogoče ujemati s ključem na vaši verigi. -keyError.keyIdNotFound=Nastavljenega ID ključa "%S" ni mogoče najti na vaši verigi. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. keyError.resolutionAction=Izberte veljaven ključ v odseku OpenPGP v nastavitvah računa. missingPassphrase=Manjka geslo errorHandling.gpgAgentInvalid=Vaš sistem izvaja različico gpg-agenta, ki ni primerna za vašo različico GnuPG-ja. errorHandling.gpgAgentError=GnuPG je sporočil napako v komunikaciji z gpg-agentom (sestavni del GnuPG-ja). errorHandling.dirmngrError=GnuPG je sporočil napako v komunikaciji z dirmngr-jem (sestavni del GnuPG-ja). errorHandling.pinentryError=GnuPG ne more poizvedeti za vaše geslo preko vnosa PIN-a. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. errorHandling.readFaq=To je napaka namestitve ali nastavitve sistema, ki preprečuje pravilno delovanje Enigmaila in se je ne da samodejno popraviti.\n\nZelo priporočamo, da se posvetujete z našo spletno stranjo za podporo na https://enigmail.net/faq. gpgNotFound=Ni mogoče najti programa GnuPG '%S'.\nPreverite, da je pot do programa GnuPG v nastavitvah Enigmail podana pravilno. @@ -384,9 +393,8 @@ prefBad=NAPAČEN podpis %S failCancel=Napaka - Uporabnik je prekinil sprejem ključa -failNoServer=Napaka - Strežnik ključev ni podan -failNoID=Napaka - Ni bila podana identiteta ključa failKeyExtract=Napaka - Ekstrakcija ključa ni uspela +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=Napaka - Prvi blok OpenPGP ni javni blok ključa importKeyConfirm=Želite uvoziti v sporočilu vsebovani javni ključ? failKeyImport=Napaka - Ključa ni mogoče uvoziti @@ -425,6 +433,8 @@ identityName=Identiteta: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Vklopili ste šifriranje, niste pa izbrali nobenega ključa. Da bi pošiljali %S šifrirana sporočila, morate izbrati enega ali več veljavnih ključev. Želite izklopiti šifriranje? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=Funkcija, ki ste jo izbrali, ni na voljo v načinu brez povezave. Prosimo, povežite se in poskusite znova. -protocolNotSupported=Protokol '%S://', ki ste ga izbrali, ni podprt za prenos ključev OpenPGP. -gpgkeysDisabled=Pomagalo bo, če omogočite izbiro 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=Ni se mogoče povezati s strežnikom ključev na naslovu %S. -keyDownloadFailed=Prenos ključa s strežnika ključev ni uspel. Sporočilo o stanju se glasi:\n%S internalError=Prišlo je do notranje napake. Ključev ni bilo mogoče prenesti ali uvoziti. -noKeyFound=Oprostite, a ni mogoče najti nobenega ključa, ki bi ustrezal navedenemu e-poštnemu naslovu. -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Iskanje ali prenos ključa s strežnika ključev: gpgkeys_%S ni bilo mogoče izvesti. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Nastavljanje zaupanja ključa ni uspelo @@ -490,7 +493,6 @@ asciiArmorFile=Zavarovane datoteke ASCII (*.asc) importKeyFile=Uvozi datoteko ključa OpenPGP gnupgFile=Datoteke GnuPG -# createKeyOK=Your Key has been generated saveRevokeCertAs=Ustvari in shrani potrdilo o preklicu # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=Potrdila o preklicu ni bilo mogoče ustvariti. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%1$S (0x%2$S) jav-skr defaultPubKeyFilename=Izvoženi-javni-ključi defaultPubSecKeyFilename=Izvoženi-javni-in-skrivni-ključi -noSecretKeys=Najdenih ni bilo skrivnih ključev.\n\nŽelite zdaj tvoriti svoj lastni ključ? sendKeysOk=Ključ(i) uspešno poslani sendKeysFailed=Pošiljanje ključev ni uspelo receiveKeysOk=Ključ(i) uspešno posodobljeni receiveKeysFailed=Prenos ključev ni uspel +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=Želite uvoziti nekatere ključe iz odložišča? importFromUrl=Prenesi javni ključ iz tega URL-ja: copyToClipbrdFailed=Kopiranje izbranega ključa(-ev) v odložišče ni uspelo. copyToClipbrdOK=Ključ(i) kopirani v odložišče -deleteSecretKey=OPOZORILO: Izbrisati želite skrivni ključ!\nČe izbrišete svoj skrivni ključ, ne boste več mogli dešifrirati sporočil, šifriranih za ta ključ.\n\nResnično želite izbrisati OBA, skrivni ključ in javni ključ\n'%S'? +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=OPOZORILO: Izbrisati želite skrivne ključe!\nČe izbrišete svoj skrivni ključ, ne boste več mogli dešifrirati sporočil, šifriranih za ta ključ.\n\nResnično želite izbrisati OBA, skrivni ključ in javni ključ? deletePubKey=Želite izbrisati javni ključ\n'%S'? deleteSelectedPubKey=Želite izbrisati javne ključe? @@ -529,7 +531,7 @@ revokeKeyQuestion=Ste pred preklicem ključa '%S'.\n\nS tem ključem ne boste mogli več podpisovati in ga porazdelitvi ne boste več mogli uporabljati za šifriranje. Še vedno ga lahko uporabljate za dešifriranje starih sporočil.\n\nAli želite nadaljevati? revokeKeyOk=Ključ je bil preklican. Če je vaš ključ na voljo na strežniku ključev, je priporočljivo, da ga ponovno naložite nanj, tako da drugi lahko opazijo preklic. revokeKeyFailed=Ključa ni mogoče preklicati. -# revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Nobenega ključa niste izbrali. Bi radi osvežili VSE ključe? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? @@ -541,21 +543,21 @@ keyMan.button.import=&Uvozi keyMan.button.refreshAll=&Osveži vse ključe keyMan.button.revokeKey=&Prekliči ključ -keyMan.button.skip=Pre&skoči ključ keylist.noOtherUids=Nima drugih identitet keylist.hasOtherUids=Znan(a) tudi kot -keylist.noPhotos=Fotografija ni na voljo -keylist.hasPhotos=Fotografije +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos keyMan.addphoto.filepicker.title=Izberite fotografijo za dodajanje -keyMan.addphoto.warnLargeFile=Datoteka, ki ste jo izbrali, je večja od 25kB.\nNe priporočamo, da dodajate velike datoteke, ker se s tem zelo povečujejo ključi. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. keyMan.addphoto.noJpegFile=Izbrana datoteka ni datoteka JPEG. Izberite drugo datoteko. keyMan.addphoto.failed=Slike ni mogoče dodati. # noWksIdentity=The key %S does not have a WKS identity. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? -# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Sprememba PIN ni uspela -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Osveževanje ključev je v teku, prosimo, počakajte ... keyserverProgress.uploading=Prenašanje ključev je v teku, prosimo, počakajte ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Osveževanje ključev keyserverTitle.uploading=Prenos ključev +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=Geslo mora vsebovati najmanj osem znakov! -setupWizard.reallyCancel=Resnično želite zapreti namestitvenega čarovnika Enigmail? setupWizard.invalidGpg=Datoteka, ki ste jo navedli, ni izvršljiv program GnuPG. Navedite drugo datoteko. -setupWizard.specifyFile=Za nadaljevanje morate navesti vsaj datoteko javnega ključa. setupWizard.installFailed=Zdi se, da namestitev ni bila uspešna. Ponovno poskusite z namestitvijo ali namestite GnuPG ročno in ga poiščite z gumbom Prebrskaj. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. -setupWizard.hashSumError=Čarovnik integritete prenesen datoteke ni uspel preveriti. Datoteka je morda okvarjena ali škodljivo spremenjena. Želite kljub temu nadaljevati z nameščanjem? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? setupWizard.importSettingsFile=Navedite datoteko varnostne kopije za nalaganje -setupWizard.invalidSettingsFile=Navedena datoteka ni pravilna datoteka varnostne kopije nastavitev Enigmaila. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. setupWizard.gpgConfExists=Datoteka nastavitev GnuPG že obstaja. Ali jo želite prepisati z datoteko iz stare namestiteve? -# setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Pri prenašanju GnuPG je prišlo do napake. Preverite zapisnik konzole za podrobnosti. @@ -654,12 +662,12 @@ # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. -# filter.keyNotFound=Could not find an encryption key for "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -converter.decryptBody.failed=Sporočila z zadevo "%S" ni bilo mogoče šifrirati.\nAli želite ponovno poskusiti z drugim geslom ali želite sporočilo preskočiti? -converter.decryptAtt.failed=Priponke "%1$S" v sporočilu z zadevo\n"%2$S"\nni bilo mogoče dešifrirati.\nAli želite ponovno poskusiti z drugim geslom ali želite sporočilo preskočiti?\n +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? saveLogFile.title=Shrani zapisniško datoteko @@ -691,13 +699,13 @@ enigmailSettings=Nastavitve Enigmail defaultBackupFileName=Izvoz Enigmail specifyExportFile=Navedite ime datoteke za izvoz -homedirParamNotSUpported=Dodatni parametri, ki določajo poti, kot je --homedir in --keyring, niso podprti za izvažanje/obnavljanje nastavitev. Uporabite nadomestne načine, kot je nastavitev spremenljivke okolja GNUPGHOME. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #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=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties @@ -709,6 +717,7 @@ # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. @@ -728,12 +737,12 @@ # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! -# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. -# pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. @@ -763,16 +772,16 @@ # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. -# handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device -# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? @@ -785,10 +794,12 @@ # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. +#strings in pEpAdapter.jsm # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=O programu Enigmail @@ -799,6 +810,7 @@ # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: +# aboutEnigmail.userSupport.team=the team and the list/forum members # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension @@ -808,3 +820,38 @@ # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/sq/enigmail.dtd enigmail-2.1.3+ds1/lang/sq/enigmail.dtd --- enigmail-2.0.12+ds1/lang/sq/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/sq/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ -Mozilla Public License 2.0."> - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,15 +63,7 @@ - - - - -'Shpërngulje Autocrypt e Kyçeve' lyp që klienti i postë te pajisja tjetër të mbulojë protokollin Autocrypt. -Ndërkohë që kjo është zgjidhja më e lehtë, këtë standard e mbulojnë vetëm një numër i kufizuar klientësh. -Mënyra tjetër është të 'Kopjeruani & riktheni' gjetkë rregullimet tuaj. -Kjo do të krijojë një kartelë ZIP me krejt të dhënat dhe kyçet e nevojshëm, që mund ta kopjoni te pajisja juaj e re. -Enigmail-i mund t’i importojë drejtpërsëdrejti këto rregullime; për klientë të tjerë poste, kartela ZIP mund të shpaketohet dhe të trajtohet dorazi."> + @@ -94,12 +77,13 @@ + - + '"> @@ -122,6 +106,9 @@ + + + @@ -214,6 +201,7 @@ + @@ -222,8 +210,8 @@ - - + + @@ -350,7 +338,7 @@ - + @@ -373,7 +361,6 @@ -Autocrypt është një standard që përcakton se si të arrihet fshehtëzim skaj-më-skaj i email-eve. Ai specifikon se si programet email trajtojnë aftësi fshehtëzimi duke përdorur email-e të zakonshëm."> @@ -461,8 +448,8 @@ - - + + @@ -547,7 +534,7 @@ - + @@ -670,141 +657,40 @@ - - + - - - - - - - - - - - - - - - - - -Shënim: Enigmail-i do të verifikojë përherë nënshkrimet - në email-e, për çdo llogari ose identitet, pavarësisht se është aktivizuar apo jo për një të tillë"> - + Ky ndihmës mund t’ju udhëheqë nëpër procesin e rregullimit."> - - + - - - - - - - - - - - - - - - - - -Kyçi juaj publik shërben për t'u përdorur nga të tjerët që t'ju dërgojnë mesazhe të fshehtëzuar. Mund t'ia jepni kujtdo."> -Kyçi juaj privat shërben që ju vetë t'i shfshehtëzoni këto email-e dhe që të dërgoni email-e të nënshkruar. - S'duhet t’ia jepni ndokujt."> -Kyçi juaj privat shërben që ju t'i shfshehtëzoni këto email-e dhe të dërgoni email-e të nënshkruar. - S'duhet t'ia jepni ndokujt. - Që ta siguroni kyçin tuaj privat, në dy hapat vijues do t'ju kërkohet një frazëkalim."> -Frazëkalimi juaj është një fjalëkalim për mbrojtjen e kyçit tuaj privat. Ai parandalon përdorimin e paautorizuar të kyçit tuaj privat."> -Nuk këshillohen shkronjat me shenja sipër (p.sh. ë, é, ñ) dhe shkronja specifike të një gjuhe të caktuar."> - - - - - - - - - - - - - - - - - - - - - - - - -Për këtë do t'ju kërkohet të jepni fjalëkalimin tuaj. Ju lutemi, shpërnguleni dëshminë te një media që mund të depozitohet gjetkë pa rrezik, b.f., CD ose diskth USB. Nëse dikush arrin të hyjë në këtë dëshmi, mund ta përdorë për ta bërë të papërdorshëm kyçin tuaj."> - - - - - - - - - - - - eksportoni të dhënat tuaja prej kompjuterit të vjetër duke përdorur ndihmësin e kopjeruajtjeve te Parapëlqimet për Enigmail-in - importojini të dhënat tuaja te kompjuteri i ri duke përdorur këtë ndihmës. - "> - - - - - - -Faleminderit që përdorni Enigmail-in."> -Ju lutemi, ripohojeni kërkesën që do të gjeni te mesazhet tuaj të marrë, nëse doni të bëhet kështu. -"> - - - - - - - - + + + + + + + + + + + - + @@ -820,12 +706,10 @@ - - eksportoni të dhënat tuaja prej kompjuterit të vjetër duke përdorur këtë ndihmës - importojini të dhënat tuaja te kompjuteri i ri duke përdorur Ndihmësin e Rregullimeve. - "> + + + @@ -886,12 +770,21 @@ - - Ju lutemi, përzgjidhni më poshtë llogarinë për të cilën doni të shpërngulet kyçi juaj. - Te skena vijuese do të shfaqim një kod rregullimi (fjalëkalim) të cilin do t’ju duhet ta jepni te pajisja tjetër, që të mund të importohet kyçi juaj dhe rregullimet e ruajtura."> + + -Ju lutemi, tani kaloni te pajisja tjetër dhe hapeni mesazhin. Do t’ju kërkohet një kod rregullimi. Ju lutemi, shtypni te kutiza shifrat vijuese:"> + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/sq/enigmail.properties enigmail-2.1.3+ds1/lang/sq/enigmail.properties --- enigmail-2.0.12+ds1/lang/sq/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/sq/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -86,7 +86,7 @@ expiryTooLong=Nuk mund të krijoni një kyç që skadon për më shumë se 100 vjet. expiryTooLongShorter=Nuk mund të krijoni një kyç që skadon për më shumë se 90 vjet. expiryTooShort=Kyçi juaj duhet të jetë i vlefshëm të paktën për një ditë. -keyGenFailed=Prodhimi i kyçit dështoi. Ju lutemi, për hollësi kontrolloni konsolën Enigmail (Menuja Enigmail > Diagnostikim Enigmail-i). +keyGenFailed=Prodhimi i kyçit dështoi. Ju lutemi, për hollësi kontrolloni konsolën Enigmail (Menuja Enigmail > Mundësi Diagnostikimi). setKeyExpirationDateFailed=Data e skadimit s’u ndryshua dot # Strings in enigmailMessengerOverlay.js @@ -114,6 +114,7 @@ fixBrokenExchangeMsg.failed=Nuk pati sukses në ndreqjen e mesazhit. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +detailsDlg.importKey=Importoni kyç wksNoIdentity=Ky kyç s’është i lidhur me ndonjë nga llogaritë tuaja email. Ju lutemi, shtoni një llogari për të paktën një nga adresat vijuese email:\n\n%S wksConfirmSuccess=Email-i i ripohimit u dërgua. wksConfirmFailure=Dërgimi i email-it të ripohimit dështoi. @@ -148,10 +149,9 @@ minimalLineWrapping=Keni caktuar mbështjellje rreshti në %S shenja. Për fshehtëzim dhe/ose nënshkrim të saktë, kjo vlerë lypset të jetë e pakta 68.\nDëshironi ta kaloni tani mbështjelljen e rreshtave në 68 shenja? warning=Kujdes signIconClicked=E keni ndryshuar dorazi nënshkrimin. Ndaj, teksa hartoni mesazhin, (ç)aktivizimi i nënshkrimit s’varet më nga (ç)aktivizimi i fshehtëzimit. -errorOwnKeyUnusable=ID-ja '%S' e kyçit, e formësuar për identitetin e tanishëm nuk sjell ndonjë kyç OpenPGP të përdorshëm.\n\nJu lutemi, sigurohuni që keni një kyç OpenPGP të vlefshëm, që s’ka skaduar, dhe që rregullimet tuaja shpien te ai kyç.\nNëse kyçi juaj s’ka skaduar, atëherë kontrolloni nëse për të keni caktuar besueshmëri Zotëruesi si plotësisht ose përfundimisht. +errorOwnKeyUnusable=ID-ja '%S' e kyçit, e formësuar për identitetin e tanishëm nuk sjell ndonjë kyç OpenPGP të përdorshëm.\n\nJu lutemi, sigurohuni që keni një kyç OpenPGP të vlefshëm, që s’ka skaduar, dhe që rregullimet tuaja të llogarisë shpien te ai kyç.\nNëse kyçi juaj s’ka skaduar, atëherë kontrolloni nëse për të keni caktuar besueshmëri Zotëruesi si "plotësisht" ose "përfundimisht". msgCompose.cannotSaveDraft=Gabim teksa ruhej skica msgCompose.partiallyEncrypted.short=Kini mendjen te rrjedhje informacionesh konfidenciale - email i fshehtëzuar pjesërisht. -msgCompose.partiallyEncrypted.mimeMsg=Mesazhi të cilit po i përgjigjeni përmbante pjesë të pafshehtëzuara dhe të fshehtëzuara. Disa pjesë të fshehtëzuara të mesazhit janë të padukshme për ju.\n\nNëse dërguesi s’qe fillimisht në gjendje të shfshehtëzonte pjesë të fshehura të mesazhit, mund të jeni duke lënë zbuluar informacion konfidencial që dërguesi s’qe në gjendje ta fshehtëzonte.\n\nKëshillojmë të mos i përgjigjeni këtij mesazhi, por të krijoni një mesazh të ri që të përmbajë përgjigjen tuaj. msgCompose.partiallyEncrypted.inlinePGP=Mesazhi të cilit po i përgjigjeni përmbante pjesë të pafshehtëzuara dhe të fshehtëzuara. Nëse dërguesi s’qe fillimisht në gjendje të shfshehtëzonte pjesë të mesazhit, mund të jeni duke lënë zbuluar informacion konfidencial që dërguesi s’qe në gjendje ta fshehtëzonte.\n\nJu lutemi, shihni mundësinë e heqjes nga përgjigja juaj për këtë dërgues të krejt tekstit të cituar prej mesazhit të tij. msgCompose.internalEncryptionError=Gabim i Brendshëm: fshehtëzimi i premtuar është i çaktivizuar @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=Për identitetin e përzgjedhur Enigmail-i është i çaktivizuar msgCompose.protectSubject.tooltip=Mbroje subjektin e mesazhit msgCompose.noSubjectProtection.tooltip=Mos e mbro subjektin e mesazhit -msgCompose.encryptedSubjectStub=Mesazh i Fshehtëzuar msgCompose.protectSubject.dialogTitle=Të Aktivizohet Mbrojtja e Subjektit? msgCompose.protectSubject.question=Email-et e rregullt të fshehtëzuar përmbajnë subjekt të paredaktuar.\nKemi caktuar një standard për fshehje të subjektit origjinal të mesazhit të fshehtëzuar\ndhe zëvendësuar atë me tekst kot, në mënyrë që subjekti të jetë i dukshëm vetëm pasi email-i të fshehtëzohet.\n\nDoni të mbrohet subjekti në mesazhe të fshehtëzuar? msgCompose.protectSubject.yesButton=&Mbro Subjektin @@ -179,7 +178,7 @@ msgCompose.pepSendTrusted=I sigurt & I besueshëm pep.alert.disabledForIdentity=p≡p është e çaktivizuar për identitetin e tanishëm. Ju lutemi, aktivizojeni p≡p që nga parapëlqimet për Enigmail/p≡p. -pep.alert.weakReply=Ju ndan një hap nga përcjellja apo përgjigja ndaj një mesazhi të sigurt me një të pasigurt. Nëse vendosni të vazhdohet, mund të ketë rrjedhje informacionesh konfidenciale, duke ju vënë ju dhe partnerin e komunikimit në rrezik. Jeni i sigurt se doni të vazhdohet? +pep.alert.weakReply=Ju ndan një hap nga përcjellja apo përgjigja ndaj një mesazhi të sigurt, por mesazhi që po dërgoni do të jetë i pasigurt. Nëse zgjidhni të vazhdohet, mund të ketë rrjedhje informacionesh konfidenciale, duke ju vënë ju dhe partnerin e komunikimit në rrezik. Jeni i sigurt se doni të vazhdohet? # note: should end with double newline: @@ -203,7 +202,7 @@ encryptKeysNote=Shënim: Mesazhi është i fshehtëzuar për ID Përdoruesi / Kyçet vijues: %S hiddenKey= -signFailed=Gabim te Enigmail-i; Fshehtëzimi/nënshkrimi dështoi; të dërgohet mesazhi i pafshehtëzuar? +signFailed=Gabim te Enigmail-i: fshehtëzimi/nënshkrimi dështoi. Të dërgohet mesazhi i pafshehtëzuar? msgCompose.button.sendUnencrypted=&Dërgoje Mesazh të Pafshehtëzuar recipientsSelectionHdr=Përzgjidhni Marrës për Fshehtëzime @@ -252,9 +251,9 @@ pgpmimeNo=Do të përdoret PGP brendazi # Attach own key status (tooltip strings): -attachOwnKeyNo=Kyçi juaj s’do të bashkëngjitet -attachOwnKeyYes=Kyçi juaj do të bashkëngjitet -attachOwnKeyDisabled=Kyçi juaj s’mund të bashkëngjitet. Që të aktivizohet kjo veçori, duhet të përzgjidhni një kyç të dhënë te ndarja OpenPGP e Rregullimeve të Llogarisë. +attachOwnKeyNo=Kyçi juaj publik s’do të bashkëngjitet +attachOwnKeyYes=Kyçi juaj publik do të bashkëngjitet +attachOwnKeyDisabled=Kyçi juaj publik s’mund të bashkëngjitet. Që të aktivizohet kjo veçori, duhet të përzgjidhni\nnjë kyç të dhënë te ndarja OpenPGP e Rregullimeve të Llogarisë. rulesConflict=U kap përplasje me rregulla sipas-marrësish\n%S\n\nTë dërgohet mesazhi duke përdorur këto rregullime? msgCompose.button.configure=&Formësojeni @@ -269,6 +268,10 @@ clickDetailsButton=; për më tepër të dhëna, klikoni mbi butonin 'Hollësi' clickImportButton=; që ta shkarkoni kyçin klikoni mbi butonin 'Importoje Kyçin' keyTypeUnsupported=; lloji i kyçit nuk mbulohet nga versioni juaj i GnuPG-së +decryptManually=; klikoni mbi butonin 'Shfshehtëzoje' që të shfshehtëzohet mesazhi +verifyManually=; klikoni mbi butonin 'Verifikoje' që të verifikohet nënshkrimi +headerView.button.verify=Verifikoje +headerView.button.decrypt=Shfshehtëzoje msgPart=Pjesë e mesazhit %S msgSigned=i nënshkruar msgSignedUnkownKey=nënshkruar me kyç të panjohur @@ -280,8 +283,10 @@ needKey=Gabim - s’u gjet kyçi privat/i fshehtë përkatës për shfshehtëzimin e mesazhit failedDecrypt=Gabim - shfshehtëzimi dështoi badPhrase=Gabim - frazëkalim i gabuar +missingMdcError=Gabim - mungon mbrojtje integriteti ose është e dëmtuar (MDC) failedDecryptVerify=Gabim - shfshehtëzimi/verifikimi dështoi viewInfo=; Parje > Të dhëna sigurie mesazhi, për hollësi +brokenExchangeMessage=Mesazh PGP/MIME prej MS-Exchange i dëmtuar. decryptedMsg=Mesazhi u shfshehtëzua decryptedMsgWithFormatError=Mesazhi u shfshehtëzua (u rikthye format email-i PGP i dëmtuar, shkaktuar me gjasa nga një shërbyes i vjetër Exchange, ndaj përfundimi mund të mos jetë përsosmërisht i lexueshëm) @@ -326,6 +331,7 @@ autocryptSetupReq.setupMsg.backup=Mund ta mbani këtë mesazh dhe ta përdorni si kopjeruajtje të kyçit tuaj të fshehtë. Nëse doni të bëhet kështu, duhet të shkruani fjalëkalimin diku dhe ta ruani në mënyrë të sigurt. autocryptSetupReq.message.import=Që të importohen në Enigmail rregullimet dhe kyçi(et), ju lutemi, klikoni te shtylla e gjendjeve mbi butonin "Nise Rregullimin". autocryptSetupReq.message.sent=Ju lutemi, klikoni mbi mesazhin te pajisja juaj e re dhe ndiqni udhëzimet për importim rregullimesh. +postbox.cannotUseQuickReply.message=Po i përgjigjeni një mesazhi të fshehtëzuar. Ju lutemi, përdorni ikonën "zgjeroje" në cepin e sipërm djathtas të fushës për tekste që ta hapni përgjigjen tuaj në një dritare, dhe dërgojeni mesazhin prej andej. # strings in pref-enigmail.js oldGpgVersion20=Gatitja e Enigmail-it dështoi.\n\nPo përdorni GnuPG version %1$S, që nuk mbulohet më. Enigmail-i lyp GnuPG version %2$S ose më të ri. Ju lutemi, përmirësoni instalimin tuaj të GnuPG-së, ose Enigmail-i nuk do të funksionojë. @@ -337,6 +343,8 @@ prefs.warnAskNever=Kujdes: aktivizimi i kësaj mundësie do të sjellë email-e të pafshehtëzuar, pa dhënë asnjë hollësi tjetër, nëse s’ka kyç për një nga marrësit -- Enigmail s’do t’ju njoftojë, nëse ndodh kjo! prefs.warnIdleTimeForUnknownAgent=Nuk lidhet dot me gpg-agent. Ndoshta sistemi juaj përdor ndonjë mjet të posaçëm për trajtim frazëkalimesh (p.sh. gnome-keyring, seahorse-agent, KDE wallet manager, ...). Për fat të keq, Enigmail-i s’e kontrollon dot intervalin kohor të vlefshmërisë së frazëkalimit për mjetin që po përdorni. Ndaj rregullimet mbi intervalin kohor përkatës te Enigmail-i nuk janë marrë parasysh. prefEnigmail.oneKeyserverOnly=Gabim - mund të përcaktoni vetëm një shërbyes kyçesh për shkarkim të vetvetishëm kyçesh OpenPGP që mungojnë. +acSetupMessage.desc=Shpërngulni kyçin tuaj te një tjetër pajisje që mund të përdorë Autocrypt. (Ç’është Autocrypt-i) +aboutLicense.desc=Enigmail-i është me burim të hapur dhe i licencuar sipas Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -366,14 +374,15 @@ sc.removeCard=Veprimi nuk lyp pasjen e një Karte të Mençur te lexuesi.\nJu lutemi, hiqeni Kartën tuaj të Mençur dhe përsëritni veprimin. sc.noCardAvailable=S’u gjet Kartë e Mençur te lexuesi juaj\nJu lutemi, futni Kartën tuaj të Mençur dhe përsëritni veprimin. sc.noReaderAvailable=S’u fut dot te lexuesi juaj i Kartave të Mençura\nJu lutemi, vendosni lexuesin tuaj të Kartave të Mençura, futni kartën tuaj dhe përsëritni veprimin. -keyError.keySpecNotFound=Adresës email "%S" s’i gjendet dot një kyç te vargu juaj i kyçeve. -keyError.keyIdNotFound=ID-ja e formësuar e kyçit "%S" s’gjendet dot te vargu juaj i kyçeve. +keyError.keySpecNotFound=Adresës email '%S' s’i gjendet dot një kyç te vargu juaj i kyçeve. +keyError.keyIdNotFound=ID-ja e formësuar e kyçit '%S' s’gjendet dot te vargu juaj i kyçeve. keyError.resolutionAction=Ju lutemi, përzgjidhni një kyç të vlefshëm, te ndarja OpenPGP e Rregullimeve tuaja për Llogarinë. missingPassphrase=Mungon frazëkalim errorHandling.gpgAgentInvalid=Sistemi juaj xhiron një version të gpg-agent që s’është i përshtatshëm për versionin tuaj të GnuPG-së. errorHandling.gpgAgentError=GnuPG-ja njoftoi një gabim te ndërlidhja me gpg-agent (një përbërës i GnuPG-së). errorHandling.dirmngrError=GnuPG-ja njoftoi një gabim në ndërlidhjen me dirmngr (një përbërës i GnuPG-së). errorHandling.pinentryError=GnuPG-ja s’mund të kërkojë për frazëkalimin tuaj me pinentry. +errorHandling.pinentryCursesError=Instalimi juaj i GnuPG-së është formësuar të përdorë konsolën për pinentry-n. Por, kur përdoret Enigmail-i, lypset të përdoret një version grafik i pinentry-t. errorHandling.readFaq=Ky është një gabim rregullimi sistemi ose formësimi që e pengon Enigmail-in të funksionojë si duhet dhe s’mund të ndreqet vetvetiu.\n\nKëshillojmë me forcë që të shihni te sajti ynë i asistencës, https://enigmail.net/faq. gpgNotFound=S’arrihet të lokalizohet programi GnuPG '%S'.\nSigurohuni që e keni caktuar saktë shtegun për te i ekzekutueshmi GnuPG te Parapëlqimet për Enigmail-in. @@ -384,9 +393,8 @@ prefBad=Nënshkrim i KEQ nga %S failCancel=Gabim - Marrja e kyçit u anulua nga përdoruesi -failNoServer=Gabim - S’u tregua shërbyes kyçesh prej nga të merret kyçi -failNoID=Gabim - S’u tregua ID kyçi për të cilin të merret kyçi failKeyExtract=Gabim - urdhri për përftim kyçi dështoi +failKeyNoSubkey=(Nën)Kyç jo i vlefshëm notFirstBlock=Gabim - Blloku i parë te OpenPGP s’është bllok kyçi publik importKeyConfirm=Të importohet i trupëzuar në mesazh kyçi(kyçet) publik? failKeyImport=Gabim - importimi i kyçit dështoi @@ -425,6 +433,8 @@ identityName=Identitet: %S switchPepMode=Po përdorni mënyrën 'p≡p Junior' të Enigmail-it.\n\nDuke aktivizuar OpenPGP ose S/MIME për një llogari, çaktivizohet p≡p dhe përdoret mënyra 'regular' e Enigmail-it, pa p≡p. enableEnigmail=&Çaktivizoje p≡p +amPrefAutocrypt.desc=Autocrypt është një standard që përkufizon se si të kryhet fshehtëzim i volitshëm skaj-më-skaj i email-eve. Përcakton se si programet e email-it negociojnë aftësi fshehtëzimi duke përdorur email-e të zakonshëm. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Keni aktivizuar fshehtëzimin, por s’keni përzgjedhur kyç. Që të fshehtëzohen email-et e dërguar për %1$S, lypset të përcaktoni prej listës suaj të kyçeve një ose disa kyçe të vlefshëm. Doni të çaktivizohet fshehtëzimi për %2$S? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=Funksioni që keni përzgjedhur nuk mund të kihet nën mënyrën offline. Ju lutemi, lidhuni në internet dhe riprovoni. -protocolNotSupported=Protokolli '%S://' që keni përzgjedhur nuk mbulohet për shkarkim kyçesh OpenPGP. -gpgkeysDisabled=Aktivizimi i mundësisë 'extensions.enigmail.useGpgKeysTool' mund të ndihmonte këtu. noKeyserverConn=S’u lidh dot me shërbyesin e kyçeve te %S. -keyDownloadFailed=Dështoi në shkarkim kyçesh nga shërbyesi i kyçeve. Mesazhi përkatës është:\n%S internalError=Ndodhi një gabim i brendshëm. Kyçet s’u shkarkuan ose importuan dot. -noKeyFound=Na ndjeni, s’u gjet dot ndonjë kyç që të kishte përputhje me kriterin e dhënë për kërkim.\nJu lutemi, kini parasysh që ID-ja e kyçit duhet të paraprihet me "0x" (p.sh. 0xABCDEF12). -keyDownload.keyUnavailable=Na ndjeni, por kyçi me ID %S s’është i passhëm te shërbyesi i kyçeve. Ka shumë mundësi që i zoti i kyçit të mos e ketë ngarkuar kyçin e tij te shërbyesi i kyçeve.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Dështoi në kërkim ose shkarkim kyçesh prej shërbyesi kyçesh: gpgkeys_%S s’u ekzekutua dot. - +noKeyFound=S’gjetëm dot ndonjë kyç me përputhje me kriterin e dhënë për kërkim. +keyDownload.keyUnavailable=Kyçi me ID %S s’është i passhëm te shërbyesi i kyçeve. Sipas shumicës së gjasave, i zoti i kyçit s’e ka ngarkuar kyçin e tij te shërbyesi i kyçeve.\n\nJu lutemi, kërkojini dërguesit të mesazhit t’ju dërgojë me amil kyçin e tij publik. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Caktimi i besueshmërisë së pronarit dështoi @@ -490,7 +493,6 @@ asciiArmorFile=ASCII Armored Files (*.asc) importKeyFile=Importo Kartelë Kyçi OpenPGP gnupgFile=Kartela GnuPG -createKeyOK=Kyçi juaj u prodhua saveRevokeCertAs=Krijoni & Ruani Dëshmi Shfuqizimi revokeCertOK=Dëshmia e shfuqizimeve u krijua me sukses. Mund ta përdorni që të shfuqizoni kyçin tuaj publik, p.sh. në rast se humbni kyçin tuaj të fshehtë. revokeCertFailed=Dëshmia e shfuqizimit s’u krijua dot. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%S (0x%S) pub-fshe defaultPubKeyFilename=Kyçe-publikë-të-eksportuar defaultPubSecKeyFilename=Kyçe-publikë-dhe-të-fshehtë-të-eksportuar -noSecretKeys=S’u gjetën kyçe të fshehtë.\n\nDoni ta prodhoni tani kyçin tuaj? sendKeysOk=Kyçet u dërguan me sukses sendKeysFailed=Dërgimi i kyçeve dështoi receiveKeysOk=Kyçet u përditësuan me sukses receiveKeysFailed=Shkarkimi i kyçeve dështoi +keyUpload.verifyEmails=Shërbyesi i kyçeve do t’ju dërgojë një email për çdo adresë email të kyçit tuaj të ngarkuar. Që të ripohoni publikimin e kyçit tuaj, do t’ju duhet të klikoni mbi lidhjen në secilin prej email-eve që do të merrni. importFromClip=Doni të importoni ndonjë kyç(disa kyçe) nga e papastra? importFromUrl=Shkarkoje kyçin publik prej kësaj URL-je: copyToClipbrdFailed=S’u kopjua(n) dot kyçi(et) i(e) përzgjedhur te e papastra. copyToClipbrdOK=Kyçet u kopjuan te e papastra -deleteSecretKey=KUJDES: Ju ndan një hap nga fshirja e një kyçi të fshehtë!\nNëse fshini kyçin tuaj të fshehtë, nuk do të jeni më në gjendje të fshehtëzoni dhe shfshehtëzoni mesazhe të fshehtëzuar për atë kyç, dhe nuk mund ta shfuqizoni më kyçin tuaj.\n\nDoni vërtet t’i fshini QË TË DY, kyçin e fshehtë dhe atë publik\n'%S'? +deleteSecretKey=KUJDES: Ju ndan një hap nga fshirja e një kyçi të fshehtë!\nNëse fshini kyçin tuaj të fshehtë, nuk do të jeni më në gjendje të fshehtëzoni dhe shfshehtëzoni mesazhe të fshehtëzuar për atë kyç, dhe as do të jeni në gjendje ta shfuqizoni.\n\nDoni vërtet t’i fshini QË TË DY, kyçin e fshehtë dhe atë publik\n'%S'? deleteMix=KUJDES: Ju ndan një hap nga fshirja e kyçeve të fshehtë!\nNëse fshini kyçin tuaj të fshehtë, nuk do të jeni më në gjendje të fshehtëzoni dhe shfshehtëzoni mesazhe të fshehtëzuar për atë kyç.\n\nDoni vërtet t’i fshini QË TË DY, kyçin e fshehtë të përzgjedhur dhe atë publik? deletePubKey=Doni ta fshini kyçin publik\n'%S'? deleteSelectedPubKey=Doni t’i fshini kyçet publikë? @@ -529,7 +531,7 @@ revokeKeyQuestion=Ju ndan një hap nga shfuqizimi i kyçit '%S'.\n\nNuk do të jeni më në gjendje të nënshkruani me këtë kyç, dhe pasi të shpërndahet, të tjerët nuk do të jenë më në gjendje të fshehtëzojnë me këtë kyç. Mundeni prapëseprapë ta përdorni kyçin për shfshehtëzimin e mesazhe të vjetër.\n\nDoni të vazhdoni? revokeKeyOk=Kyçi është shfuqizuar. Nëse kyçi juaj gjendet te një shërbyes kyçesh, këshillohet ta ringarkoni, që të tjerët të mund ta vënë re shfuqizimin. revokeKeyFailed=Kyçi s’u shfuqizua dot. -revokeKeyNotPresent=S’keni kyç (0x%S) që hyn në këtë dëshmi shfuqizimesh!\n\nNëse keni humbur kyçin tuaj, duhet ta importoni (për shembull, nga një shërbyes kyçesh) përpara dëshmisë së shfuqizimit! +revokeKeyNotPresent=S’keni kyç (0x%S) që përputhet në këtë dëshmi shfuqizimesh!\n\nNëse keni humbur kyçin tuaj, duhet ta importoni (për shembull, nga një shërbyes kyçesh) përpara importimit të dëshmisë së shfuqizimit! revokeKeyAlreadyRevoked=Kyçi 0x%S është i shfuqizuar tashmë. refreshAllQuestion=Nuk përzgjodhët ndonjë kyç. Do të donit të rifreskonit KREJT kyçet? refreshKeyServiceOn.warn=Kujdes: Kyçet tuaj po rifreskohen në prapaskenë, aq pa rrezik sa është e mundur.\nRifreskimi i krejt kyçeve tuaj njëherësh do të zbulojë, pa qenë nevoja, të dhëna rreth jush.\nDoni vërtet ta bëni këtë? @@ -541,21 +543,21 @@ keyMan.button.import=&Importo keyMan.button.refreshAll=&Rifresko Krejt Kyçet keyMan.button.revokeKey=&Shfuqizoje Kyçin -keyMan.button.skip=&Anashkaloje Kyçin keylist.noOtherUids=Nuk ka identitete të tjerë keylist.hasOtherUids=I njohur edhe si -keylist.noPhotos=Nuk ka fotografi -keylist.hasPhotos=Fotografi +keylist.noPhotos=S’ka foto +keylist.hasPhotos=Foto keyMan.addphoto.filepicker.title=Përzgjidhni foto për shtim keyMan.addphoto.warnLargeFile=Kartela që keni zgjedhur është më e madhe se sa 25 kB.\nNuk këshillohet të shtoni kartela shumë të mëdha, ngaqë kështu kyçet bëhen shumë të mëdhenj. keyMan.addphoto.noJpegFile=Kartela e përzgjedhur nuk duket se është kartelë JPEG. Ju lutemi, zgjidhni një tjetër kartelë. keyMan.addphoto.failed=Fotoja s’u shtua dot. noWksIdentity=Kyçi %S nuk ka identitet WKS. +wksUpload.noKeySupported=Ngarkimi s’qe i suksesshëm - furnizuesi juaj i shërbimit s’duket se mbulon WKS-në. -keyman.addBlacklistKey.msg=Doni vërtet të ndalni përdorimin nga p≡p të kyçit "%1$S (%2$S)" për fshehtëzim mesazhesh? -keyman.removeBlacklistKey.msg=Doni të lejoni p≡p të përdorë kyçin "%1$S (%2$S)" për mesazhe të ardhshëm? +keyman.addBlacklistKey.msg=Doni vërtet të ndalet përdorimi nga p≡p i kyçit "%1$S (%2$S)" për fshehtëzim mesazhesh? +keyman.removeBlacklistKey.msg=Doni të lejohet p≡p të përdorë kyçin '%1$S (%2$S)' për mesazhe të ardhshëm? keyman.addBlacklistKey.button=Shtojeni kyçin në &listë të zezë keyman.removeBlacklistKey.button=&Hiqe kyçin nga Lista e zezë @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Dështoi në ndryshim PIN-i -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Kyçet po rifreskohen, ju lutemi, prisni ... keyserverProgress.uploading=Kyçet po ngarkohen, ju lutemi, prisni ... keyserverProgress.wksUploadFailed=S’u ngarkua dot kyçi juaj te Shërbimi Webkey keyserverProgress.wksUploadCompleted=Kyçi juaj publik u parashtrua me sukses te furnizuesi juaj i internetit. Do të merrni një email për ripohimin e faktit se ngarkimin e nisët ju. keyserverTitle.refreshing=Rifreskoni Kyçet keyserverTitle.uploading=Ngarkim Kyçi +keyserver.result.download.none=S’u shkarkua kyç. +keyserver.result.download.1of1=Kyçi u shkarkua me sukses. +keyserver.result.download.1ofN=U shkarkua me sukses 1 nga %S kyçet. +keyserver.result.download.NofN=U shkarkuan me sukses %1$S nga %2$S kyçe. +keyserver.result.uploadOne=U ngarkua me sukses 1 kyç. +keyserver.result.uploadMany=U ngarkuan me sukses %S kyçe. # Strings in enigmailSetupWizard -passphrase.min8keys=Frazëkalimi juaj duhet të përmbajë të paktën 8 shenja! -setupWizard.reallyCancel=Doni ta mbyllni vërtet Ndihmësin e Rregullimit të Enigmail-it? setupWizard.invalidGpg=Kartela që keni treguar s’është i ekzekutueshëm GnuPG-je. Ju lutemi, përcaktoni një kartelë tjetër. -setupWizard.specifyFile=Që të mund të vazhdohet, lypset të përcaktoni të paktën një kartelë kyçi publik. setupWizard.installFailed=Duket se instalimi s’qe i suksesshëm. Ju lutemi, ose riprovoni instalimin, ose instalojeni GnuPG-në dorazi dhe lokalizojeni duke përdorur butonin Shfletoni. setupWizard.downloadForbidden=Për hir të sigurisë tuaj, nuk do ta shkarkojmë GnuPG-në. Ju lutemi, që të shkarkoni GnuPG-në, vizitoni https://gnupg.org/. setupWizard.downloadImpossible=S’shkarkojmë dot GnuPG-në. Ju lutemi, provoni më vonë ose vizitoni https://gnupg.org/ që të mund të shkarkoni GnuPG-në. setupWizard.hashSumError=Ndihmësi s’verifikoi dot pacenueshmërinë e kartelës së shkarkuar. Kartela mund të jetë e dëmtuar ose e manipuluar. Doni të vazhdohet instalimi, sido që të jetë? setupWizard.importSettingsFile=Përcaktoni kartelë kopjeruajtjeje prej nga të ngarkohet -setupWizard.invalidSettingsFile=Kartela e treguar s’është kartelë e saktë kopjeruajtjeje Rregullimesh Enigmail-i. +setupWizard.invalidSettingsFile=Kartela e treguar s’është kartelë e vlefshme kopjeruajtjeje Rregullimesh Enigmail-i. setupWizard.gpgConfExists=Kartela e formësimit të GnuPG-së ekziston tashmë. Doni të mbishkruhet me atë prej instalimit tuaj të vjetër? setupWizard.noGpgHomeDir=Duket se e keni formësuar %S të përdorë GnuPG-në. Por, kjo s’është një drejtori - s’mund ta përdorni. setupWizard.unmachtedIds=Identitetet vijues të rregullimit tuaj të vjetër nuk u përputhën dot me gjë:\n%S\nRregullimet për këto identitete u anashkaluan. +setupWizard.foundAcSetupMessage=U gjet Mesazh Ujdisjeje Autocrypt-i. Që të niset procedura e ujdisjes së Autocrypt-it, klikoni mbi butonin Nis Ujdisjen më poshtë. +setupWizard.foundAcNoSetupMsg=Kemi përcaktuar se po përdorni një klient email që mund të përdorë Autocrypt-in, por s’gjetëm dot ndonjë Mesazh Ujdisjeje Autocrypt-i. Këshillojmë të krijoni një Mesazh Ujdisjeje Autocrypt-i në pajisjen tuaj ekzistuese dhe mandej të klikoni mbi Riskano Të Marrë. Ndryshe, mund të eksportoni rregullimet dhe kyçet tuaj që nga një instalim ekzistues Enigmail-i, dhe të rimerrni këto rregullimet këtu. +setupWizard.setupComplete=Enigmail-i tani është i formësuar si duhet dhe gati për t’u përdorur. Për të dhëna të mëtejshme mbi përdorimin e Enigmail-it, vizitoni faqen tonë. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Ndodhi një gabim teksa provohej të shkarkohej GnuPG-ja. Ju lutemi, për hollësi të mëtejshme kontrolloni regjistrin e konsolës. @@ -654,12 +662,12 @@ filter.term.pgpencrypted.label=Fshehtëzuar me OpenPGP filter.encrypt.label=Fshehtëzoje me kyçin (Enigmail) filter.keyRequired=Duhet të përzgjidhni një kyç marrësi. -filter.keyNotFound=S’u gjet kyç fshehtëzimi për "%S". -filter.warn.keyNotSecret=Kujdes - veprimi i "Fshehtëzoje me kyç" zëvendëson marrësit.\n\nNëse nuk e keni kyçin e fshehtë për "%S", s’do të jeni më në gjendje të lexoni email-et. +filter.keyNotFound=S’u gjet dot kyç fshehtëzimi për '%S'. +filter.warn.keyNotSecret=Kujdes - veprimi "Fshehtëzoje me kyç" zëvendëson marrësit.\n\nNëse s’e keni kyçin e fshehtë për "%S", s’do të jeni më në gjendje të lexoni email-et. # strings in enigmailConvert.jsm -converter.decryptBody.failed=Nuk shfshehtëzoi dot mesazhin me subjekt\n"%S".\nDoni të riprovoni me një tjetër frazëkalim apo doni të anashkalohet mesazhi? -converter.decryptAtt.failed=Nuk shfshehtëzoi dot bashkëngjitjen "%1$S"\ne mesazhit me subjekt\n"%2$S".\nDoni të riprovoni me një tjetër frazëkalim apo doni të anashkalohet mesazhi? +converter.decryptBody.failed=S’u shfshehtëzua dot mesazhi me subjekt\n'%S'.\nDoni të riprovoni me një tjetër frazëkalim apo doni të anashkalohet mesazhi? +converter.decryptAtt.failed=S’u shfshehtëzua dot bashkëngjitja '%1$S'\ne mesazhit me subjekt\n'%2$S'.\nDoni të riprovoni me një tjetër frazëkalim apo doni të anashkalohet mesazhi? saveLogFile.title=Ruaje Kartelën Regjistër @@ -694,10 +702,10 @@ homedirParamNotSUpported=Për eksportimin/rikthimin e rregullimeve tuaja nuk mbulohen parametra shtesë që formësojnë shtigje, të tillë si --homedir dhe --keyring . Ju lutemi, përdorni metoda alternative, të tilla si rregullimi i ndryshores së mjedisit GNUPGHOME. #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=Sa vijon nga kyçet tuaj do të skadojë në më pak se %1$S ditë:\n%2$S Rekomandojmë të krijoni kyçe të rinj dhe të formësoni llogaritë tuaja të përdorin kyçet e rinj. -expiry.keyMissingOwnerTrust=Kyçit tuaj të fshehtë %S i mungon besueshmëria.\n%S.\nKëshillojmë që "Bazoheni në dëshmi" t’i përshoqëroni vlerën Përfundimisht, te vetitë e kyçit. -expiry.keysMissingOwnerTrust=Kyçit vijues nga kyçet tuaj të fshehtë i mungon besueshmëria.\n%S.\nKëshillojmë që "Bazoheni në dëshmi" t’i përshoqëroni vlerën Përfundimisht, te vetitë e kyçit. +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ë saj. +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ë përkatëse për përdorim të tyre. +expiry.keyMissingOwnerTrust=Kyçit tuaj të fshehtë %S i mungon besueshmëria.\n\nKëshillojmë që "Bazoheni në dëshmi" t’i përshoqëroni vlerën "përfundimisht", te vetitë e kyçit. +expiry.keysMissingOwnerTrust=Kyçit vijues nga kyçet tuaj të fshehtë i mungon besueshmëria.\n%S.\nKëshillojmë që "Bazoheni në dëshmi" t’i përshoqëroni vlerën "përfundimisht", te vetitë e kyçit. expiry.OpenKeyManager=Hap Administrim Kyçesh Enigmail expiry.OpenKeyProperties=Veti Kyçi të Hapur @@ -709,6 +717,7 @@ gpghomedir.notwritable=Drejtoria '%S' që përmban kyçet tuaj OpenPGP s’është e shkrueshme. gpghomedir.notdirectory=Drejtoria '%S' që përmban kyçet tuaj OpenPGP është një kartelë, në vend se një drejtori. gpghomedir.notusable=Ju lutemi, ndreqni lejet mbi drejtorinë ose ndryshoni vendin e drejtorisë tuaj GnuPG "home". Përndryshe GnuPG-ja s’mund të funksionojë si duhet. +gpgAgent.noAutostart=Po përdorni GnuPG version %S. Ky version lyp që të nisni paraprakisht gpg-agent, përpara se të nisni Thunderdbird-in, dhe parangarkimin e ndryshores "GPG_AGENT_INFO" të mjedisit.\n\nKëto parakushte nuk janë plotësuar - s’mund të përdorni Enigmail-in, pa zgjidhur këtë çështje. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=S’verifikohen dot Trustwords p≡p për llogarinë tuaj. @@ -730,10 +739,10 @@ pepPrivacyStatus.RatingTrustedSuggestion=S’ka nevojë për veprim! pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Kini parasysh që ky mesazh mund të mos jetë i sigurt. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Ju lutemi, shtoni të dhënat e nevojshme. -pepPrivacyStatus.RatingUnderAttackSuggestion=Verifikoni ndarazi lëndën e këtij mesazhi me partnerin e komunikimit tuaj. -pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Sigurohuni që gjendja e privatësisë për çdo partner komunikimi të pranishëm në listë të jetë të paktën e sigurt. +pepPrivacyStatus.RatingUnderAttackSuggestion=Verifikoni lëndën e këtij mesazhi me partnerin e komunikimit tuaj duke përdorur një tjetër kanal. +pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Sigurohuni që gjendja e privatësisë për çdo partner komunikimi të pranishëm në listë të jetë të paktën "e sigurt". pepPrivacyStatus.RatingUnencryptedSuggestion=Ju lutemi, kërkojini partnerit tuaj në komunikim një zgjidhje për fshehtëzim ose instaloni p≡p. -pepPrivacyStatus.RatingUnreliableSuggestion=Ky mesazh nuk ka as fshehtëzim të besueshëm, as nënshkrim të besueshëm. Kërkojini partnerit tuaj të komunikimt të përmirësojë metodën e tij për fshehtëzimet ose të instalojë p≡p. +pepPrivacyStatus.RatingUnreliableSuggestion=Ky mesazh nuk ka fshehtëzim të besueshëm, ose i mungon nënshkrim. Kërkojini partnerit tuaj të komunikimt të përmirësojë metodën e tij për fshehtëzimet, ose të instalojë p≡p. pepPrivacyStatus.RatingBrokenExplanation=Ky mesazh ka fshehtëzim ose formatim të dëmtuar. pepPrivacyStatus.RatingHaveNoKeyExplanation=Ky mesazh nuk shfshehtëzohet dot, ngaqë kyçi s’është i passhëm. @@ -763,16 +772,16 @@ handshakeDlg.label.outgoingMessage=Mesazh ikës handshakeDlg.label.incomingMessage=Mesazh ardhës handshakeDlg.error.noPeers=S’bëhet dot duarshtrëngim pa ndonjë korrespondent. -handshakeDlg.error.noProtection=Ju lutemi, që të mund të përdorni funksionin Handshake, aktivizoni mbrojtjen. +handshakeDlg.error.noProtection=Ju lutemi, që të mund të përdorni funksionin "Handshake", aktivizoni mbrojtjen. -enigmail.acSetupPasswd.descEnterPasswd=Ju lutemi, jepni kodin e rregullimit që shfaqet te pajisja tjetër +enigmail.acSetupPasswd.descEnterPasswd=Ju lutemi, jepni kodin e rregullimit që shfaqet te pajisja tjetër. enigmail.acSetupPasswd.descCopyPasswd=Ju lutemi, që të vazhdohet me rregullimin, jepni te pajisja juaj tjetër kodin e rregullimit më poshtë #strings in autocrypt.jsm autocrypt.setupMsg.subject=Mesazhi Rregullimi Autocrypt-i autocrypt.setupMsg.msgBody=Që të rregulloni pajisjen tuaj të re për Autocrypt-in, ju lutemi, ndiqni udhëzimet që duhet të shfaqen nga pajisja juaj e re. -autocrypt.setupMsg.fileTxt=Kjo është kartela e rregullimit të Autocrypt-it e përdorur për të shpërngulur rregullime dhe kyçe mes klientësh. Mund ta shfshehtëzoni duke përdorur kodin e rregullimit të paraqitur te pajisja juaj e vjetër, dhe mandej të importoni kyçin e atyshëm te vargu juaj i kyçeve. +autocrypt.setupMsg.fileTxt=Kjo është kartela e ujdisjes së Autocrypt-it e përdorur për të shpërngulur rregullime dhe kyçe mes klientësh. Mund ta shfshehtëzoni duke përdorur kodin e rregullimit të shfaqur te pajisja juaj e vjetër, dhe mandej të importoni kyçin te vargu juaj i kyçeve. #strings in upgradeInfo.html upgradeInfo.doctitle=Ç’ka të Re te Enigmail v2.0? @@ -785,10 +794,12 @@ upgradeInfo.autocrypt.title=Mbulim për Autocrypt-in upgradeInfo.autocrypt.desc=Enigmail-i tani mbulon Autocrypt, një standard i ri për shpërndarje të kyçeve si pjesë e mesazhit të dërguar. Enigmail-i importon vetvetiu kyçe nga mesazhe që janë në pajtim me Autocrypt-in, në mënyrë që me kalimin e kohës, të mund të fshehtëzohen gjithnjë e më shumë email-e. upgradeInfo.pEp.title=p≡p Junior Mode (Pretty Easy Privacy) e re -upgradeInfo.pEp.desc=Enigmail-i tani përmban një p≡p Junior Mode. Për këtë qëllim, hëpërhë lypset të instaloni dorazi p≡p; në versionet e ardhshme kjo do të ndryshojë. p≡p Junior Mode ju lejon të përdorni fshehtëzim OpenPGP në mënyrën më transparente të mundshme; s’keni pse e çani më kokën për administrim kyçesh dhe njëkohësim kyçesh mes pajisjesh. +upgradeInfo.pEp.desc=Enigmail-i tani përmban një p≡p Junior Mode. p≡p Junior Mode ju lejon të përdorni fshehtëzim OpenPGP në mënyrën më transparente të mundshme; s’keni pse e çani më kokën për administrim kyçesh dhe njëkohësim kyçesh mes pajisjesh. upgradeInfo.bottom.desc=Për ndihmë rreth përdorimit të Enigmail-it, ju lutemi, vizitoni dokumentimin tonë. +#strings in pEpAdapter.jsm pep.missingGnuPG=Që të mund të përdorni Enigmail/p≡p, GnuPG-ja është i domosdoshëm. Ngaqë nuk e gjetëm, këshillojmë të shkarkohet dhe të instalohet për ju. +pep.updateAvailable=Ka të gatshëm një version të ri të mekanizmit të fshehtëzimeve Enigmail/p≡p. Doni të shkarkohet dhe instalohet përditësimi? #strings in enigmailAbout.html aboutEnigmail.tabName=Mbi Enigmail-in @@ -799,6 +810,7 @@ aboutEnigmail.documentation=Dokumentim: aboutEnigmail.testing=Testim: aboutEnigmail.userSupport=Asistencë Përdoruesi: +aboutEnigmail.userSupport.team=ekipi dhe anëtarët e listës/forumit aboutEnigmail.localization=Përkthim: Shihni faqen e Paketave Gjuhësore për Enigmail-in aboutEnigmail.Credits=Kredite: aboutEnigmail.origAuthor=Autori origjinal i zgjerimit Enigmail @@ -808,3 +820,38 @@ aboutEnigmail.licenseSupportTitle=Licencë & Asistencë aboutEnigmail.license=OpenPGP-ja e Enigmail-it është me burim të hapët dhe e licencuar sipas %S aboutEnigmail.support=Asistencë dhe shkarkime gjeni te www.enigmail.net. + +#strings in updateGnuPG.html +updateGnuPG.tabName=Përditësim GnuPG +updateGnuPG.title=Përditësime për GnuPG +updateGnuPG.introduction.desc=Që të përmbushë funksionet e veta kriptografike, Enigmail-i lyp GnuPG-në. Këshillojmë ta mbani të përditësuar instalimin tuaj të GnuPG-së. +updateGnuPG.updateRequired=Ka të gatshëm një version më të ri të of GnuPG-së. Këshillojmë me forcë ta mbani të përditësuar instalimin tuaj të GnuPG-së. Ju lutemi, klikoni mbi butonin Instalo Përditësim që të shkarkohet dhe instalohet përditësimi. +updateGnuPG.noUpdateRequired=GnuPG-ja është e përditësuar. +updateGnuPG.cannotUpdate.header=Enigmail-i mbulon vetëm përditësim të paketave vijuese: +updateGnuPG.cannotUpdate.footer=Duket se përdorni ndonjë variant tjetër të GnuGP-së; ndaj, mjerisht, s’është e mundur që Enigmail-i të përditësojë instalimin tuaj të GnuGP-së. +updateGnuPG.installUpdate=Instalo Përditësimin +updateGnuPG.noMoreUpdates=Mos kontrollo për përditësime të ardhshme +updateGnuPG.checkUpdate=Kontrollo për Përditësime të GnuPG-së + + +#strings in keyserver.jsm +keyserver.error.aborted=U ndërpre +keyserver.error.unknown=Ndodhi një gabim i panjohur. +keyserver.error.serverError=Shërbyesi i kyçeve njoftoi një gabim. +keyserver.error.importError=S’u arrit të importohej kyçi i shkarkuar. +keyserver.error.unavailable=Shërbyesi i kyçeve s’është në funksionim. +keyserver.error.securityError=Shërbyesi i kyçeve nuk mbulon hyrje të fshehtëzuara në të. +keyserver.error.certificateError=Dëshmia e shërbyesit të kyçeve s’është e vlefshme. +keyserver.error.unsupported=Shërbyesi i kyçeve s’mbulohet nga Enigmail. + +#strings in mimeDecrypt.jsm +mimeDecrypt.encryptedPart.attachmentLabel=Pjesa e fshehtëzuar e mesazhit +mimeDecrypt.encryptedPart.concealedData=Kjo është një pjesë e fshehtëzuar e mesazhit. Lypset ta hapni në një dritare veçmas, përmes klikimit mbi bashkëngjitjen. + +#strings in gnupg-key.jsm +import.secretKeyImportError=Ndodhi një gabim në GnuP, teksa importoheshin kyçet e fshehtë. Importimi s’qe i suksesshëm. + +#strings in importSettings.js +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 diff -Nru enigmail-2.0.12+ds1/lang/sv/enigmail.dtd enigmail-2.1.3+ds1/lang/sv/enigmail.dtd --- enigmail-2.0.12+ds1/lang/sv/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/sv/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ -Mozilla Public License 2.0."> - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,15 +63,7 @@ - - - - - 'Autocrypt-nyckelöverföring' kräver att e-postklienten på den andra enheten är Autocrypt-kompatibel. - Även om det här är den enklare lösningen, stödjer endast ett begränsat antal klienter denna standard. - Det andra sättet är att 'Säkerhetskopiera och återställa' dina inställningar. - Detta skapar en ZIP-fil med all information och nycklar som du kan kopiera till din nya enhet. - Enigmail kan importera dessa inställningar direkt; för andra e-postklienter kan ZIP-filen packas upp och hanteras manuellt."> + @@ -94,12 +77,13 @@ + - + '"> @@ -122,10 +106,13 @@ + + + - + @@ -192,8 +179,8 @@ - - + + @@ -214,6 +201,7 @@ + @@ -222,8 +210,8 @@ - - + + @@ -350,7 +338,7 @@ - + @@ -373,7 +361,6 @@ -Autocrypt är en standard som definierar hur man kan uppnå bekväm end-to-end-kryptering av e-post. Den specificerar hur e-postprogram förhandlar krypteringsfunktioner med vanliga e-postmeddelanden."> @@ -461,8 +448,8 @@ - - + + @@ -507,18 +494,18 @@ - + - + - + - - - - + + + + - + @@ -547,7 +534,7 @@ - + @@ -629,7 +616,7 @@ - + @@ -670,145 +657,39 @@ - - - - - - - - - - - - - - - - - - - - -OBS: Enigmail kommer alltid att verifiera signaturer på e-post för varje konto eller identitet, oavsett om den är aktiverad eller inte"> - + + - - + - - - - - - - - - - - - - - - - - -publika nyckel är till för andra för att skicka krypterad e-post till dig. Du kan distribuera den till alla."> -privata nyckel är till för dig själv för att dekryptera e-post och skicka signerad e-post. - - -Du bör inte ge till någon."> -privata nyckel är till för dig själv för att dekryptera e-post och skicka signerad e-post. - -Du bör inte ge till någon. - -För att säkra din privata nyckel, kommer du att bli tillfrågad om en lösenfras i följande två dialogrutor."> -lösenfras är ett lösenord för att skydda din privata nyckel. Den förhindrar missbruk av din privata nyckel."> -inte."> - - - - - - - - - - - - - - - - - - - - - - - - -Du kommer att bli uppmanad att ange ditt lösenord för detta. Överför certifikatet till ett medium som kan lagras säkert, som en CD eller USB-minne. Om någon får tillgång till detta certifikat kan de använda den för att göra din nyckel oanvändbar."> - - - - - - - - - - - - -exportera data från den gamla datorn med hjälp av backupguiden från inställningarna i Enigmail - -importera data till den nya datorn med hjälp av den här guiden. - -"> - - - - - - -Tack för att du använder Enigmail."> -Vänligen bekräfta önskan som du hittar i din inkorg om du vill göra det."> - - - - - - - - + + + + + + + + + + + - + - + @@ -824,17 +705,10 @@ - - -exportera data från den gamla datorn med hjälp av den här guiden - -importera data till den nya datorn med hjälp av installationsguiden. - -"> + + + @@ -856,7 +730,7 @@ - + @@ -883,7 +757,7 @@ - + @@ -897,12 +771,21 @@ - - Vänligen välj nedan det konto som du vill överföra nyckeln till. + + -Vänligen växla till den andra enheten nu och öppna meddelandet. Du bör uppmanas att ange en konfigurationskod. Vänligen skriv följande siffror i prompten:"> + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/sv/enigmail.properties enigmail-2.1.3+ds1/lang/sv/enigmail.properties --- enigmail-2.0.12+ds1/lang/sv/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/sv/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=Enigmail Varning -enigConfirm=Enigmail Bekräfta +enigConfirm=Enigmail Bekräftelse enigInfo=Enigmail Information enigError=Enigmail Fel enigPrompt=Enigmail Prompt @@ -78,7 +78,7 @@ passSpaceProblem=På grund av tekniska skäl, kan din lösenordsfras inte börja eller sluta med ett blanksteg. changePassFailed=Att ändra lösenfrasen misslyckades. -keyConfirm=Skapa publika och privata nycklar för '%S'? +keyConfirm=Skapa publik och privat nyckel för '%S'? keyMan.button.generateKey=&Skapa nyckel keyAbort=Avbryta nyckelgenerering? keyMan.button.generateKeyAbort=&Avbryt nyckelgenerering @@ -86,7 +86,7 @@ expiryTooLong=Du kan inte skapa en nyckel som löper i mer än 100 år. expiryTooLongShorter=Du kan inte skapa en nyckel som löper i mer än 90 år. expiryTooShort=Din nyckel måste vara giltigt i minst ett dygn. -keyGenFailed=Nyckelgenerering misslyckades. Vänligen kontrollera Enigmail konsolen (Menyn Enigmail > Felsök Enigmail) för detaljer. +keyGenFailed=Nyckelgenerationen misslyckades. Kontrollera Enigmail-konsolen (Meny Enigmail > Felsökningsinställnigar) för detaljer. setKeyExpirationDateFailed=Förfallodatumet kan inte ändras # Strings in enigmailMessengerOverlay.js @@ -114,6 +114,7 @@ fixBrokenExchangeMsg.failed=Misslyckades att reparera meddelande. enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key wksNoIdentity=Den här nyckeln är inte länkad till någon av dina e-postkonton. Lägg till ett konto för minst en av följande e-postadress(er):\n\n%S wksConfirmSuccess=Bekräftelsemejl skickat. wksConfirmFailure=Sändning av bekräftelsemejl misslyckades. @@ -130,7 +131,7 @@ keysToExport=Välj OpenPGP nycklar att infoga keysToUse=Välj OpenPGP-nycklar som ska användas för %S -pubKey=Publik nyckel för %S\n +pubKey=Offentlig nyckel för %S\n windowLocked=Skrivfönstret är låst; skicka avbryts sendUnencrypted=Det gick inte att initiera Enigmail.\nSkicka okrypterat meddelande? @@ -148,10 +149,9 @@ minimalLineWrapping=Du har ställt radbrytning till %S tecken. För korrekt kryptering och/eller signering, måste detta värde vara minst 68.\nVill du ändra radbrytning till 68 tecken nu? warning=Varning signIconClicked=Du har manuellt ändrat signering. Därför, medan du skriver det här meddelandet, (av)aktivera signering beror inte längre på att (av)aktivera kryptering. -errorOwnKeyUnusable=Nyckeln-ID '%S' konfigurerad för den aktuella identiteten är inte en användbar OpenPGP-nyckel.\n\nSe till att du har en giltig, ej upphörd OpenPGP-nyckel och att kontoinställningarna pekar på den nyckeln.\nOm din nyckel inte har upphört, kontrollera att du satte ägarförtroende till betrodd eller ultimat. +errorOwnKeyUnusable=Nyckeln-ID '%S' konfigurerad för den aktuella identiteten ger inte en användbar OpenPGP-nyckel.\n\nSe till att du har en giltig, ej upphörd OpenPGP-nyckel och att dina kontoinställningar pekar på den nyckeln.\nOm din nyckel inte upphört, kontrollera om du ställde in Ägarförtroende till "betrodd" eller "ultimat". msgCompose.cannotSaveDraft=Fel vid sparande av utkast msgCompose.partiallyEncrypted.short=Akta dig för att läcka känslig information - delvis krypterad e-post. -msgCompose.partiallyEncrypted.mimeMsg=Meddelandet du svarar på innehöll både okrypterade och krypterade delar. Vissa krypterade meddelandedelar är osynliga för dig.\n\nOm avsändaren inte kunde dekryptera de dolda meddelandedelarna ursprungligen kan du läcka konfidentiell information eftersom avsändaren inte kunde avkoda ursprunget.\n\nVi rekommenderar att du inte svarar på meddelandet, utan skapar ett nytt meddelande som innehåller ditt svar. msgCompose.partiallyEncrypted.inlinePGP=Meddelandet du svarar på innehöll både okrypterade och krypterade delar. Om avsändaren inte kunde avkoda vissa meddelandedelar ursprungligen kan du läcka konfidentiell information om att avsändaren inte kunde avkryptera sig själva.\n\nTänk på att ta bort all citerad text från ditt svar till den här avsändaren. msgCompose.internalEncryptionError=Internt fel: utlovad kryptering inaktiverad @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=Enigmail är inaktiverad för den valda identiteten msgCompose.protectSubject.tooltip=Skydda meddelandets ämnesrad msgCompose.noSubjectProtection.tooltip=Skydda inte meddelandets ämnesrad -msgCompose.encryptedSubjectStub=Krypterat meddelande msgCompose.protectSubject.dialogTitle=Aktivera skydd av ämne? msgCompose.protectSubject.question=Normalt krypterade mejl innehåller det oskyddade ämnet.\nVi har fastställt en standard för att dölja det ursprungliga ämnet i det krypterade meddelandet\noch ersatt det med en dummytext, så att ämnet bara är synligt efter att e-posten dekrypterats.\n\nVill du skydda ämnet i krypterade meddelanden? msgCompose.protectSubject.yesButton=&Skydda ämne @@ -179,7 +178,7 @@ msgCompose.pepSendTrusted=Säker & betrodd pep.alert.disabledForIdentity=p≡p är inaktiverad för den aktuella identiteten. Vänligen aktivera p≡p via Enigmail/p≡p inställningarna. -pep.alert.weakReply=Du är på väg att vidarebefordra eller svara på ett säkert meddelande som osäkert. Om du väljer att fortsätta kan det hända att konfidentiell information läcker, vilket kan sätta dig och din kommunikationspartner i fara. Är du säker på att du vill fortsätta? +pep.alert.weakReply=Du håller på att vidarebefordra eller svara på ett säkert meddelande, men det meddelande du skickar kommer att vara osäkert. Om du väljer att fortsätta kan konfidentiell information läcka och sätta dig och din kommunikationspartner i fara. Är du säker på att du vill fortsätta? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=Spara %1$S meddelande till %2$S i Utkorgen? onlineSend=Skicka %1$S meddelande till %2$S? -encryptKeysNote=OBS: meddelande krypteras med följande användar-ID's / Nycklar: %S +encryptKeysNote=Obs! Meddelandet är krypterat för följande användar-ID / nycklar: %S hiddenKey= -signFailed=Fel i Enigmail; Kryptering/signering misslyckades; skicka meddelande okrypterat? +signFailed=Fel i Enigmail: kryptering/signering misslyckades. Skicka meddelandet okrypterat? msgCompose.button.sendUnencrypted=&Skicka meddelande okrypterat recipientsSelectionHdr=Välj mottagare för kryptering @@ -225,9 +224,9 @@ signOffWithReason=Signering: AV (%S) reasonEnabledByDefault=aktiverad som standard reasonManuallyForced=tvinga manuellt -reasonByRecipientRules=tvingad av mottagarregler +reasonByRecipientRules=tvingad av per-mottagare regler reasonByAutoEncryption=tvingad av auto-kryptering -reasonByConflict=på grund av konflikten i mottagarregler +reasonByConflict=på grund av konflikt i per-mottagare regler reasonByEncryptionMode=på grund av krypteringsläge # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=Inline PGP kommer att användas # Attach own key status (tooltip strings): -attachOwnKeyNo=Din egen nyckel kommer inte bifogas -attachOwnKeyYes=Din egen nyckel kommer att bifogas -attachOwnKeyDisabled=Din egen nyckel kan inte bifogas. Du måste välja en specifik nyckel\ni OpenPGP-delen av kontoinställningar för att aktivera den här funktionen. +attachOwnKeyNo=Din egna offentliga nyckel kommer inte att bifogas +attachOwnKeyYes=Din egna offentliga nyckel kommer att bifogas +attachOwnKeyDisabled=Din egna offentliga nyckel kan inte bifogas. Du måste välja en specifik nyckel\ni avsnittet OpenPGP i kontoinställningarna för att aktivera den här funktionen. rulesConflict=Motstridiga per-mottagare regler upptäckta\n%S\n\nSkicka meddelandet med dessa inställningar? msgCompose.button.configure=&Konfigurera @@ -262,13 +261,17 @@ msgCompose.button.save=&Spara meddelande # Strings in enigmailMsgHdrViewOverlay.js -keyNeeded=Publik nyckel %S behövs för att verifiera signatur -keyUsed=Publik nyckel %S används för att verifiera signatur +keyNeeded=Offentlig nyckel %S behövs för att verifiera signatur +keyUsed=Offentlig nyckel %S används för att verifiera signatur clickDecrypt=; klicka på knappen Dekryptera clickDecryptRetry=; klicka på knappen Dekryptera för att försöka igen clickDetailsButton=; klicka på 'Detaljer' för med information clickImportButton=; klicka på knappen 'Importera nyckel' för att hämta nyckel keyTypeUnsupported=; nyckeltypen stöds inte av din version av GnuPG +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Dekryptera msgPart=En del av meddelandet %S msgSigned=signerad msgSignedUnkownKey=signerad med okänd nyckel @@ -280,8 +283,10 @@ needKey=Fel - privat nyckel krävs för att dekryptera meddelandet failedDecrypt=Fel - dekryptering misslyckades badPhrase=Fel - dålig lösenfras +missingMdcError=Fel - saknas eller trasigt integritetsskydd (MDC) failedDecryptVerify=Fel - dekryptering/verifiering misslyckades viewInfo=; Visa > Meddelande säkerhetsinformation för detaljer +brokenExchangeMessage=Trasigt PGP/MIME-meddelande från MS-Exchange. decryptedMsg=Dekrypterat meddelande decryptedMsgWithFormatError=Dekrypterade meddelandet (återställd bruten PGP e-postformat sannolikt orsakad av en gammal Exchange-server, så resultatet kanske inte är perfekt för att läsa) @@ -317,7 +322,7 @@ pepRevokeTrust.doRevoke=Avbryt &förtroende wksConfirmationReq=Bekräftelsebegäran av Webkey-katalog -wksConfirmationReq.message=Detta meddelande har skickats av din e-postleverantör för att bekräfta utplaceringen av din publika OpenPGP-nyckel\ni deras Webkey-katalog.\nAtt tillhandahålla din publika nyckel hjälper andra att upptäcka din nyckel och därmed kunna kryptera meddelanden till dig.\n\nOm du vill distribuera din nyckel i Webkey-katalogen nu, klicka på knappen "Bekräfta begäran" i statusfältet.\nAnnars ignorerar du bara det här meddelandet. +wksConfirmationReq.message=Detta meddelande har skickats av din e-postleverantör för att bekräfta utplaceringen av din offentliga OpenPGP-nyckel\ni deras Webkey-katalog.\nAtt tillhandahålla din offentliga nyckel hjälper andra att upptäcka din nyckel och därmed kunna kryptera meddelanden till dig.\n\nOm du vill distribuera din nyckel i Webkey-katalogen nu, klicka på knappen "Bekräfta begäran" i statusfältet.\nAnnars ignorerar du bara det här meddelandet. wksConfirmationReq.button.label=Bekräfta begäran autocryptSetupReq=Utför Autocrypt konfiguration @@ -326,6 +331,7 @@ autocryptSetupReq.setupMsg.backup=Du kan behålla det här meddelandet och använda det som en säkerhetskopia för din hemliga nyckel. Om du vill göra det ska du skriva ner lösenordet och lagra det säkert. autocryptSetupReq.message.import=För att importera inställningarna och nycklarna i Enigmail, klicka på knappen "Starta konfiguration" i statusfältet. autocryptSetupReq.message.sent=Klicka på meddelandet på din nya enhet och följ anvisningarna för att importera inställningarna. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js oldGpgVersion20=Initialisering av Enigmail misslyckades.\n\nDu använder GnuPG version %1$S, som inte längre stöds. Enigmail kräver GnuPG version %2$S eller nyare. Uppgradera din installation av GnuPG eller Enigmail kommer inte att fungera. @@ -337,6 +343,8 @@ prefs.warnAskNever=Varning: aktivera det här alternativet kommer att resultera i okrypterade e-post utan någon ytterligare information om det inte finns nyckel för en av mottagarna -- Enigmail kommer inte att informera dig om detta händer! prefs.warnIdleTimeForUnknownAgent=Ditt system använder ett specialiserat verktyg för hantering av lösenfraser, såsom gnome-keyring eller seahorse-agent. Tyvärr kan inte Enigmail styra lösenfrasens timeout för det verktyg du använder. Därför bortses respektive timeoutinställning i Enigmail. prefEnigmail.oneKeyserverOnly=Fel - du kan bara ange en nyckelserver för automatisk nedladdning av saknade OpenPGP nycklar. +acSetupMessage.desc=Överför din nyckel till en annan Autocrypt-aktiverad enhet. (Vad är Autocrypt) +aboutLicense.desc=Enigmail har öppen källkod och är licensierad under Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,12 +361,12 @@ noPassphrase=Fel - ingen uppgift om lösenfras noPGPblock=Fel - Inget giltigt skyddat OpenPGP datablock finns unverifiedReply=Indragen meddelandedel (svar) troligen ändrats -keyInMessageBody=Nyckel hittades i meddelandet. Klicka på "Importera nyckel" för att importera nyckeln +keyInMessageBody=En nyckel hittades i meddelandet. Klicka på 'Importera nyckel' för att importera nyckeln sigMismatch=Fel - Signaturen matchar inte -cantImport=Fel vid import av publik nyckel\n\n +cantImport=Fel vid import av den offentliga nyckeln\n\n doImportOne=Importera %1$S (%2$S)? doImportMultiple=Importera följande nycklar?\n\n%S -previewFailed=Kan inte läsa den publika nyckelfilen. +previewFailed=Kan inte läsa den offentliga nyckelfilen. # Strings used in errorHandling.jsm sc.wrongCardAvailable=SmartCard %S finns i din läsare kan inte användas för att behandla meddelandet.\nSätt in ditt SmartCard %S och upprepa operationen. @@ -366,14 +374,15 @@ sc.removeCard=Operationen kräver inget SmartCard i läsaren.\nTa bort ditt SmartCard och upprepa operationen. sc.noCardAvailable=Inget SmartCard kunde hittas i din läsare.\nSätt in ditt SmartCard och upprepa operationen. sc.noReaderAvailable=Ingen åtkomst till din SmartCard-läsare.\nKoppla in din SmartCard-läsare, sätt in ditt kort, och upprepa operationen. -keyError.keySpecNotFound=E-postadressen "%S" kan inte matchas till en nyckel i din nyckelring. -keyError.keyIdNotFound=Den konfigurerade nyckel-ID "%S" kan inte hittas i din nyckelring. +keyError.keySpecNotFound=E-postadressen '%S' kan inte matchas med en nyckel på din nyckelring. +keyError.keyIdNotFound=Det konfigurerade nyckel-ID '%S' kan inte hittas på din nyckelring. keyError.resolutionAction=Välj en giltig nyckel i OpenPGP-delen av dina kontoinställningar. missingPassphrase=Lösenord saknas errorHandling.gpgAgentInvalid=Systemet kör en version av gpg-agent som inte är lämplig för din GnuPG-version. errorHandling.gpgAgentError=GnuPG rapporterade ett fel i kommunikationen med gpg-agent (en komponent i GnuPG). errorHandling.dirmngrError=GnuPG rapporterade ett fel i kommunikationen med dirmngr (en komponent i GnuPG). errorHandling.pinentryError=GnuPG kan inte fråga efter ditt lösenord via pinentry. +errorHandling.pinentryCursesError=Din GnuPG-installation är konfigurerad för att använda konsolen för pinentry. Men när du använder Enigmail behöver du en grafisk version av pinentry. errorHandling.readFaq=Detta är ett systeminställnings eller konfigurationsfel som hindrar Enigmail från att fungera ordentligt och kan inte fixas automatiskt.\n\nVi rekommenderar starkt att du tittat på vår supportwebbplats på https://enigmail.net/faq. gpgNotFound=Kan inte hitta GnuPG programmet '%S'.\nSe till att du har ställt in GnuPG körbara sökväg korrekt i Enigmail inställningar. @@ -384,16 +393,15 @@ prefBad=Dålig signatur från %S failCancel=Fel - Mottagande av nyckel avbröts av användaren -failNoServer=Fel - Ingen nyckelserver specificerad att motta nyckeln från -failNoID=Fel - Inget nyckel-ID specificerad att ta emot nyckel för failKeyExtract=Fel - nyckel-extraktionskommando misslyckades -notFirstBlock=Fel - Första OpenPGP blocket inte publik nyckelblock -importKeyConfirm=Importera publik nyckel inbäddad i meddelandet? +failKeyNoSubkey=Ingen giltig (under-)nyckel +notFirstBlock=Fel - Första OpenPGP blocket inte offentlig nyckelblock +importKeyConfirm=Importera offentlig nyckel inbäddad i meddelandet? failKeyImport=Fel - nyckelimport misslyckades fileWriteFailed=Det gick inte att skriva till filen %S -importKey=Importera publik nyckel %S från nyckelserver: -uploadKey=Skicka publik nyckel %S till nyckelserver: +importKey=Importera offentlig nyckel %S från nyckelserver: +uploadKey=Skicka offentlig nyckel %S till nyckelserver: keyId=Nyckel-ID keyAndSigDate=Nyckel-ID: 0x%1$S / Signerad: %2$S keyFpr=Nyckelns fingeravtryck: %S @@ -425,6 +433,8 @@ identityName=Identitet: %S switchPepMode=Du använder för närvarande 'p≡p Junior'-läge av Enigmail.\n\nGenom att aktivera OpenPGP eller S/MIME för ett konto, inaktiverar du p≡p och använder 'normal'-läget för Enigmail utan p≡p. enableEnigmail=I&naktivera p≡p +amPrefAutocrypt.desc=Autocrypt är en standard som definierar hur man uppnår lämplig end-to-end-kryptering av e-post. Det specificerar hur e-postprogram förhandlar om krypteringsfunktioner med vanliga e-postmeddelanden. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Du har aktiverat kryptering, men du har inte valt någon nyckel. För att kunna kryptera e-post som skickas till %1$S, måste du ange en eller flera giltiga nycklar från din nyckellista. Vill du inaktivera kryptering för %2$S? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=Funktionen du valt är inte tillgänglig offline. Vänligen gå online och försök igen. -protocolNotSupported=Protokollet '%S://' som du har valt stöds inte för nedladdning av OpenPGP-nycklar. -gpgkeysDisabled=Det kan hjälpa att aktivera alternativet 'extensions.enigmail.useGpgKeysTool'. noKeyserverConn=Det gick inte att ansluta till nyckelserver på %S. -keyDownloadFailed=Det gick inte att hämta nyckeln från nyckelserver. Statusmeddelande är:\n%S internalError=Ett internt fel uppstod. Nycklarna kan inte laddas ner eller importeras. -noKeyFound=Jag är ledsen, kunde inte hitta någon nyckel som matchar det angivna sökkriterierna.\nObservera att nyckel-ID bör ha prefix "0x" (t.ex. 0xABCDEF12). -keyDownload.keyUnavailable=Vi är ledsna, men nyckeln med ID %S är inte tillgänglig på nyckelservern. Mest troligt har ägaren av nyckeln inte laddat upp den till nyckelservern.\n\nVänligen be avsändaren av meddelandet att skicka sin nyckel via e-post. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Det gick inte att söka eller ladda ner nyckeln från nyckelserver: gpgkeys_%S kunde inte köras. - +noKeyFound=Vi kunde inte hitta någon nyckel som matchade de angivna sökkriterierna. +keyDownload.keyUnavailable=Nyckeln med ID %S är inte tillgänglig på nyckelservern. Troligtvis har ägaren av nyckeln inte ladda upp sin nyckel till nyckelservern.\n\nBe avsändaren av meddelandet att skicka dig sin offentliga nyckel via e-post. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Ställa in ägarförtroende misslyckades @@ -490,16 +493,15 @@ asciiArmorFile=ASCII skyddade filer (*.asc) importKeyFile=Importera OpenPGP nyckelfil gnupgFile=GnuPG filer -createKeyOK=Din nyckel har genererats saveRevokeCertAs=Skapa och spara återkallningscertifikat -revokeCertOK=Återkallningscertifikatet har skapats. Du kan använda den för att upphäva din publika nyckel, t.ex. om du skulle förlora din hemliga nyckel. +revokeCertOK=Återkallningscertifikatet har skapats. Du kan använda den för att upphäva din offentliga nyckel, t.ex. om du skulle förlora din hemliga nyckel. revokeCertFailed=Återkallningscertifikatet kunde inte skapas. addUidOK=Användar-ID har lagts till addUidFailed=Lägga till användar-ID misslyckades noKeySelected=Du bör välja minst en nyckel för att utföra vald åtgärd -exportToFile=Exportera publik nyckel till fil -exportKeypairToFile=Exportera privat och publik nyckel till fil +exportToFile=Exportera offentlig nyckel till fil +exportKeypairToFile=Exportera privat och offentlig nyckel till fil exportSecretKey=Vill du inkludera den privata nyckeln i den sparade OpenPGP nyckelfilen? saveKeysOK=Nycklarna har sparats saveKeysFailed=Spara nycklarna misslyckades @@ -507,29 +509,29 @@ enableKeyFailed=Aktivering/inaktivering av nycklarna misslyckades specificPubKeyFilename=%1$S (0x%2$S) pub specificPubSecKeyFilename=%1$S (0x%2$S) pub-priv -defaultPubKeyFilename=Exporterade-publika-nycklar -defaultPubSecKeyFilename=Exporterade-publika-och-privata-nycklar -noSecretKeys=Inga privata nycklar hittades.\n\nVill du skapa din egen nyckel nu? +defaultPubKeyFilename=Exporterade-offentliga-nycklar +defaultPubSecKeyFilename=Exporterade-offentliga-och-privata-nycklar sendKeysOk=Nyckel skickad sendKeysFailed=Skicka nycklar misslyckades receiveKeysOk=Nyckel uppdaterad receiveKeysFailed=Nedladdningen av nycklar misslyckades +keyUpload.verifyEmails=Nyckelservern skickar dig ett mejl för varje e-postadress till din uppladdade nyckel. För att bekräfta att du publicerar din nyckel måste du klicka på länken i varje e-postmeddelande som du får. importFromClip=Vill du importera någon nyckel från urklipp? -importFromUrl=Hämta publik nyckel från denna URL: +importFromUrl=Hämta offentlig nyckel från denna URL: copyToClipbrdFailed=Det gick inte att kopiera den valda nyckeln till urklipp. copyToClipbrdOK=Nyckel kopierad till urklipp -deleteSecretKey=VARNING: Du är på väg att ta bort en privat nyckel!\nOm du tar bort din privata nyckel, kommer du inte längre att kunna dekryptera några meddelanden som är krypterade med den nyckeln.\n\nVill du verkligen ta bort BÅDA, den privata och den publika nyckeln\n'%S'? -deleteMix=VARNING: Du är på väg att ta bort privata nycklar!\nOm du tar bort din privata nyckel, kommer du inte längre att kunna dekryptera några meddelanden med den nyckeln.\n\nVill du verkligen ta bort BÅDA, den valda privata och publika nyckeln? -deletePubKey=Vill du ta bort den publika nyckeln\n'%S'? -deleteSelectedPubKey=Vill du ta bort de publika nycklarna? +deleteSecretKey=VARNING: Du är på väg att ta bort en privat nyckel!\nOm du tar bort din privata nyckel kommer du inte längre att kunna dekryptera meddelanden krypterade för den nyckeln, och du kommer inte heller att kunna återkalla den.\n\nVill du verkligen ta bort BÅDE, den privata nyckeln och den offentliga nyckeln\n'%S'? +deleteMix=VARNING: Du är på väg att ta bort privata nycklar!\nOm du tar bort din privata nyckel, kommer du inte längre att kunna dekryptera några meddelanden med den nyckeln.\n\nVill du verkligen ta bort BÅDA, den valda privata och offentliga nyckeln? +deletePubKey=Vill du ta bort den offentliga nyckeln\n'%S'? +deleteSelectedPubKey=Vill du ta bort de offentliga nycklarna? deleteKeyFailed=Nyckeln kan inte tas bort. revokeKeyQuestion=Du håller på att spärra nyckel '%S'. \n \nDu kommer inte längre att kunna signera med denna nyckel och när den har distribuerats, kan andra inte längre kryptera med den nyckeln. Du kan fortfarande använda nyckeln för att dekryptera gamla meddelanden. \n \nVill du fortsätta? revokeKeyOk=Nyckeln har återkallats. Om din nyckel finns tillgänglig på en nyckelserver, rekommenderas att ladda upp den på nytt, så att andra kan se återkallelsen. revokeKeyFailed=Nyckeln kan inte återkallas. -revokeKeyNotPresent=Du har ingen nyckel (0x%S) som passar till detta återkallningscertifikat!\n\nOm du har tappat bort din nyckel måste du importera den (t.ex. från en nyckelserver) före återkallningscertifikatet! +revokeKeyNotPresent=Du har ingen nyckel (0x%S) som matchar detta återkallningscertifikat!\n\nOm du har tappat bort din nyckel måste du importera den (t.ex. från en nyckelserver) innan du importerar återkallningscertifikatet! revokeKeyAlreadyRevoked=Nyckeln 0x%S har redan återkallats. refreshAllQuestion=Du har inte valt någon nyckel. Vill du uppdatera ALLA nycklar? refreshKeyServiceOn.warn=Varning: Dina nycklar uppdateras för närvarande i bakgrunden så säkert som möjligt.\nUppdatering av alla dina nycklar på en gång kan avslöja information om dig.\nVill du verkligen göra det här? @@ -537,25 +539,25 @@ downloadContactsKeys.warn=Varning: Beroende på antalet kontakter och anslutningshastighet, kan hämtning av alla nycklar vara en ganska lång process! downloadContactsKeys.importFrom=Importera kontakter från adressboken '%S'? keyMan.button.exportSecKey=Exportera &privata nycklar -keyMan.button.exportPubKey=Exportera endast &publika nycklar +keyMan.button.exportPubKey=Exportera endast &offentliga nycklar keyMan.button.import=&Importera keyMan.button.refreshAll=&Uppdatera alla nycklar keyMan.button.revokeKey=&Återkalla nyckel -keyMan.button.skip=&Hoppa över nyckel keylist.noOtherUids=Har inga andra identiteter keylist.hasOtherUids=Även känd som -keylist.noPhotos=Inget foto tillgängligt -keylist.hasPhotos=Fotografier +keylist.noPhotos=Ingen bild tillgänglig +keylist.hasPhotos=Bilder keyMan.addphoto.filepicker.title=Välj foto att lägga till -keyMan.addphoto.warnLargeFile=Filen du har valt är större än 25 kB.\nDet rekommenderas inte att lägga till mycket stora filer eftersom nycklarna blir mycket stora av detta. +keyMan.addphoto.warnLargeFile=Filen du valt är större än 25 kB.\nDet rekommenderas inte att lägga till stora filer eftersom det orsakar större nycklar. keyMan.addphoto.noJpegFile=Den valda filen verkar inte vara en JPEG-fil. Välj en annan fil. keyMan.addphoto.failed=Fotot kan inte läggas till. noWksIdentity=Nyckeln %S har ingen WKS-identitet. +wksUpload.noKeySupported=Uppladdningen lyckades inte - din leverantör tycks inte stödja WKS. -keyman.addBlacklistKey.msg=Vill du verkligen att p≡p ska sluta använda nyckeln "%1$S (%2$S)" för kryptering av meddelanden? -keyman.removeBlacklistKey.msg=Vill du tillåta p≡p att använda nyckel "%1$S (%2$S)" för framtida meddelanden? +keyman.addBlacklistKey.msg=Vill du verkligen att p≡p ska sluta använda nyckeln '%1$S (%2$S)' för kryptering av meddelanden? +keyman.removeBlacklistKey.msg=Vill du tillåta p≡p att använda nyckeln '%1$S (%2$S)' för framtida meddelanden? keyman.addBlacklistKey.button=&Svartlista nyckel keyman.removeBlacklistKey.button=&Ta bort nyckel från svartlista @@ -575,7 +577,7 @@ importInfoNoKeys=Inga nycklar importerade. # Strings in enigmailKeyDetailsDlg.xul -keyTypePublic=publik nyckel +keyTypePublic=offentlig nyckel keyTypePrimary=primär nyckel keyTypeSubkey=undernyckel keyTypePair=nyckelpar @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Det gick inte att ändra PIN-kod -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Uppdaterar nycklar, vänta ... keyserverProgress.uploading=Laddar upp nycklar, vänta ... keyserverProgress.wksUploadFailed=Det gick inte att ladda upp din nyckel till Webkey-tjänsten keyserverProgress.wksUploadCompleted=Din offentliga nyckel har skickats till din leverantör. Du kommer att få ett mejl för att bekräfta att du startade uppladdningen. keyserverTitle.refreshing=Uppdatera nycklar keyserverTitle.uploading=Nyckeluppladdning +keyserver.result.download.none=Ingen nyckel hämtad. +keyserver.result.download.1of1=Nyckel hämtad. +keyserver.result.download.1ofN=Hämtade 1 av %S nycklar. +keyserver.result.download.NofN=Hämtade %1$S av %2$S nycklar. +keyserver.result.uploadOne=1 nyckel uppladdad. +keyserver.result.uploadMany=%S nycklar uppladdade. # Strings in enigmailSetupWizard -passphrase.min8keys=Din lösenfras bör innehålla åtminstone 8 tecken! -setupWizard.reallyCancel=Vill du verkligen stänga Enigmail installationsguide? setupWizard.invalidGpg=Filen du angav är inte en körbar GnuPG. Ange en annan fil. -setupWizard.specifyFile=Du måste åtminstone ange en publik nyckelfil för att fortsätta. setupWizard.installFailed=Det verkar som om installationen misslyckades. Antingen göra om installationen, eller installera GnuPG manuellt och lokalisera den med hjälp av knappen Bläddra. setupWizard.downloadForbidden=För din egen säkerhet laddar vi inte ner GnuPG. Besök https://gnupg.org/ för att ladda ner GnuPG. setupWizard.downloadImpossible=Vi kan inte ladda ner GnuPG just nu. Vänligen försök senare eller besök https://gnupg.org/ för att ladda ner GnuPG. setupWizard.hashSumError=Guiden kunde inte verifiera integriteten för den nedladdade filen. Filen kan vara trasig eller manipulerad. Vill du fortsätta installationen ändå? setupWizard.importSettingsFile=Ange säkerhetskopieringsfil att läsa från -setupWizard.invalidSettingsFile=Den angivna filen är inte en korrekt säkerhetskopieringsfil med inställningar för Enigmail. +setupWizard.invalidSettingsFile=Den angivna filen är inte en säkerhetskopieringsfil för Enigmail inställningar. setupWizard.gpgConfExists=Konfigurationsfil för GnuPG finns redan. Vill du skriva över den med den från din gamla installation? -setupWizard.noGpgHomeDir=Det verkar som om du har konfigurerat %S för GnuPG. Det här är dock inte en katalog - du kan inte använda den. +setupWizard.noGpgHomeDir=Det verkar som om du konfigurerat %S som ska användas med GnuPG. Det här är dock inte en katalog - du kan inte använda den. setupWizard.unmachtedIds=Följande identiteter från din gamla inställning kunde inte matchas:\n%S\nInställningarna för dessa identiteter hoppades över. +setupWizard.foundAcSetupMessage=Hittade Autocrypt konfigurationsmeddelande. För att initiera Autocrypt installationsprocedur, klicka på knappen Starta konfiguration nedan. +setupWizard.foundAcNoSetupMsg=Vi bestämde oss för att du använder enAutocrypt-kompatibel e-postklient, men vi kunde inte hitta någon Autocrypt konfigurationsmeddelande. Vi rekommenderar att du skapar ett Autocrypt-konfigurationsmeddelande på din befintliga enhet och sedan på klickar på Sök i inkorgen igen. Alternativt kan du exportera dina inställningar och nycklar från en befintlig Enigmail-installation och återställa dessa inställningar här. +setupWizard.setupComplete=Enigmail är nu korrekt konfigurerad och redo att användas. För mer information om hur du använder Enigmail, besök vår hemsida. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Ett fel inträffade vid försök att hämta GnuPG. Kontrollera konsolloggen för mer detaljer. @@ -654,12 +662,12 @@ filter.term.pgpencrypted.label=OpenPGP Krypterad filter.encrypt.label=Kryptera till nyckel (Enigmail) filter.keyRequired=Du måste välja en mottagarnyckel. -filter.keyNotFound=Det gick inte att hitta en krypteringsnyckel för "%S". -filter.warn.keyNotSecret=Varning - filteråtgärden "Kryptera till nyckel" ersätter mottagarna.\n\nOm du inte har den hemliga nyckeln för "%S" kan du inte längre läsa mejlen. +filter.keyNotFound=Det gick inte att hitta en krypteringsnyckel för '%S'. +filter.warn.keyNotSecret=Varning - filteråtgärden "Kryptera till nyckel" ersätter mottagarna.\n\nOm du inte har den privata nyckeln för '%S' kan du inte längre läsa e-postmeddelandena. # strings in enigmailConvert.jsm -converter.decryptBody.failed=Det gick inte att dekryptera meddelandet med ämne \n"%S". \nVill du försöka igen med en annan lösenfras eller vill du hoppa över meddelandet? -converter.decryptAtt.failed=Det gick inte att dekryptera bilagan "%1$S" \nför meddelandet med ämnet \n"%2$S". \nVill du försöka igen med en annan lösenfras eller vill du hoppa över meddelandet? +converter.decryptBody.failed=Kunde inte dekryptera meddelande med ämne\n'%S'.\nVill du försöka igen med en annan lösenfras eller vill du hoppa över meddelandet? +converter.decryptAtt.failed=Det gick inte att dekryptera bilagan '%1$S'\ni meddelandet med ämne\n'%2$S'.\nVill du försöka igen med en annan lösenfras eller vill du hoppa över meddelandet? saveLogFile.title=Spara loggfil @@ -691,13 +699,13 @@ enigmailSettings=Enigmail Inställningar defaultBackupFileName=Enigmail-exportera specifyExportFile=Ange filnamnet för export -homedirParamNotSUpported=Ytterligare parametrar som konfigurerar sökvägar såsom --homedir och --keyring stöds inte för exportera/återställa dina inställningar. Vänligen använd alternativa metoder, såsom att ställa in miljövariabeln GNUPGHOME. +homedirParamNotSUpported=Ytterligare parametrar som konfigurerar sökvägar som --homedir och --keyring stöds inte för export/återställning av dina inställningar. Använd alternativa metoder som att ställa in miljövariabeln GNUPGHOME. #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 av dina nycklar upphör att gälla om 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. -expiry.keyMissingOwnerTrust=Din hemliga nyckel %S saknar förtroende.\n\nVi rekommenderar att du ställer in "Du litar på certifiering" till ultimat i nyckelegenskaper. -expiry.keysMissingOwnerTrust=Följande av dina hemliga nycklar saknar förtroende.\n%S.\nVi rekommenderar att du ställer in "Du litar på certifiering" till ultimat i nyckelegenskaper. +expiry.keyExpiresSoon=Din nyckel %1$S upphör om mindre än %2$S dagar.\n\nVi rekommenderar att du skapar ett nytt nyckelpar och konfigurerar motsvarande konton för att använda det. +expiry.keysExpireSoon=Följande nycklar upphör att gälla om mindre än %1$S dagar:\n%2$S. Vi rekommenderar att du skapar nya nycklar och konfigurerar motsvarande konton för att använda dem. +expiry.keyMissingOwnerTrust=Din privata nyckel %S saknar förtroende.\n\nVi rekommenderar att du anger "Du litar på certifiering" till "ultimat" i nyckelegenskaper. +expiry.keysMissingOwnerTrust=Följande av dina privata nycklar saknar förtroende.\n%S.\nVi rekommenderar att du anger "Du litar på certifiering" till "ultimat" i nyckelegenskaper. expiry.OpenKeyManager=Öppna Enigmail nyckelhantering expiry.OpenKeyProperties=Öppna nyckelegenskaper @@ -709,6 +717,7 @@ gpghomedir.notwritable=Katalogen '%S' som innehåller dina OpenPGP-nycklar är inte skrivbar. gpghomedir.notdirectory=Katalogen '%S' som innehåller dina OpenPGP-nycklar är en fil istället för en katalog. gpghomedir.notusable=Korrigera katalogbehörigheterna eller ändra platsen för din GnuPG "hem"-katalog. GnuPG kan inte fungera korrekt annars. +gpgAgent.noAutostart=Du använder GnuPG-version %S. Den här versionen kräver att du startar gpg-agent innan Thunderdbird startas och att miljövariabeln "GPG_AGENT_INFO" är förladdad.\n\nDessa förutsättningar är inte uppfyllda. Du kan inte använda Enigmail tills du löser problemet. #strings in pepTrustWords.js pepTrustWords.cannotVerifyOwnId=Kan inte verifiera p≡p Förtroendeord för eget konto. @@ -728,12 +737,12 @@ pepPrivacyStatus.RatingMistrustSuggestion=Upprepa anslutningen med din kommunikationspartner och försök att slutföra en annan handskakning. pepPrivacyStatus.RatingReliableSuggestion=Slutför en handskakning med din kommunikationspartner genom att byta förtroendeord personligen eller via telefon. En handskakning behövs endast en gång per partner och säkerställer säker och betrodd kommunikation. pepPrivacyStatus.RatingTrustedSuggestion=Ingen åtgärd krävs! -pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Var medveten om att det här meddelandet inte är säkert. +pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Var medveten om att det här meddelandet kanske inte är säkert. pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Vänligen lägg till nödvändig information. -pepPrivacyStatus.RatingUnderAttackSuggestion=Kontrollera separat innehållet i meddelandet med din kommunikationspartner. -pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Se till att integritetsstatusen för varje kommunikationspartner som anges är åtminstone säker. +pepPrivacyStatus.RatingUnderAttackSuggestion=Verifiera innehållet i det här meddelandet med din kommunikationspartner med en annan metod. +pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Se till att integritetsstatusen för varje kommunikationspartner som anges är åtminstone "säker". pepPrivacyStatus.RatingUnencryptedSuggestion=Fråga din kommunikationspartner om att använda en krypteringslösning eller installera p≡p. -pepPrivacyStatus.RatingUnreliableSuggestion=Det här meddelandet har ingen tillförlitlig kryptering eller ingen signatur. Be din kommunikationspartner att uppgradera sin krypteringslösning eller installera p≡p. +pepPrivacyStatus.RatingUnreliableSuggestion=Det här meddelandet har ingen tillförlitlig kryptering eller saknar en signatur. Be din kommunikationspartner att uppgradera sin krypteringslösning eller installera p≡p. pepPrivacyStatus.RatingBrokenExplanation=Det här meddelandet har trasig kryptering eller formatering. pepPrivacyStatus.RatingHaveNoKeyExplanation=Det här meddelandet kan inte dekrypteras eftersom nyckeln inte är tillgänglig. @@ -765,14 +774,14 @@ handshakeDlg.error.noPeers=Kan inte handskaka utan några korrespondenter. handshakeDlg.error.noProtection=Vänligen aktivera skyddet för att använda handskakningsfunktionen. -enigmail.acSetupPasswd.descEnterPasswd=Vänligen ange konfigurationskoden som visas på den andra enheten +enigmail.acSetupPasswd.descEnterPasswd=Vänligen ange konfigurationskoden som visas på den andra enheten. enigmail.acSetupPasswd.descCopyPasswd=Vänligen ange konfigurationskoden nedan på din andra enhet för att fortsätta med konfigurationen #strings in autocrypt.jsm autocrypt.setupMsg.subject=Autocrypt konfigurationsmeddelande autocrypt.setupMsg.msgBody=För att ställa in din nya enhet för Autocrypt, följ instruktionerna som ska presenteras av din nya enhet. -autocrypt.setupMsg.fileTxt=Det här är Autocrypt-konfigurationsfil som används för att överföra inställningar och nycklar mellan klienter. Du kan dekryptera den med hjälp av konfigurationskoden som presenteras på din gamla enhet och sedan importera nyckeln till din nyckelring. +autocrypt.setupMsg.fileTxt=Det här är en Autocrypt-konfigurationsfil som används för att överföra inställningar och nycklar mellan klienter. Du kan dekryptera det med hjälp av konfigurationskoden som visas på din gamla enhet och sedan importera nyckeln till din nyckelring. #strings in upgradeInfo.html upgradeInfo.doctitle=Vad är nytt i Enigmail v2.0? @@ -785,10 +794,12 @@ upgradeInfo.autocrypt.title=Stöd för Autocrypt upgradeInfo.autocrypt.desc=Enigmail stöder nu Autocrypt, en ny standard för att distribuera nycklar som en del i att skicka meddelanden. Enigmail importerar automatiskt nycklar från Autocrypt-kompatibla meddelanden, så att fler och fler e-postmeddelanden över tiden kan krypteras. upgradeInfo.pEp.title=Nytt p≡p Junior-läge (Pretty Easy Privacy) -upgradeInfo.pEp.desc=Enigmail innehåller nu ett p≡p Junior-läge. Du behöver för närvarande manuellt installera p≡p för detta ändamål; detta kommer att förändras i en framtida version. p≡p Junior-läge låter dig använda OpenPGP-kryptering så transparent som möjligt; du behöver inte ta hand om nyckelhantering och synkronisering av nycklar mellan enheter längre. +upgradeInfo.pEp.desc=Enigmail innehåller nu ett p≡p Junior-läge. Med p≡p Junior-läge kan du använda OpenPGP-kryptering så transparent som möjligt; du behöver inte ta hand om nyckelhantering och synkronisering av nycklar mellan enheter längre. upgradeInfo.bottom.desc=Besök vår dokumention för hjälp med att använda Enigmail. +#strings in pEpAdapter.jsm pep.missingGnuPG=För att kunna använda Enigmail/p≡p krävs GnuPG. Eftersom vi inte kunde hitta det, föreslår vi att vi hämtar och installerar det för dig. +pep.updateAvailable=En ny version av Enigmail/p≡p kryptomotor är tillgänglig. Vill du ladda ner och installera uppdateringen? #strings in enigmailAbout.html aboutEnigmail.tabName=Om Enigmail @@ -799,7 +810,8 @@ aboutEnigmail.documentation=Dokumentation: aboutEnigmail.testing=Testning: aboutEnigmail.userSupport=Användarstöd: -aboutEnigmail.localization=Lokalisering: Se sidan Enigmail Language Packs +aboutEnigmail.userSupport.team=laget och list/forummedlemmarna +aboutEnigmail.localization=Översättning: Se sidan Enigmail Language Packs aboutEnigmail.Credits=Erkännande: aboutEnigmail.origAuthor=Ursprunglig författare till tillägget Enigmail aboutEnigmail.icons=Ikoner: @@ -808,3 +820,38 @@ aboutEnigmail.licenseSupportTitle=Licens & Support aboutEnigmail.license=Enigmail OpenPGP har öppen källkod och är licensierad under %S aboutEnigmail.support=Support och nedladdning är tillgänglig från www.enigmail.net. + +#strings in updateGnuPG.html +updateGnuPG.tabName=GnuPG-uppdatering +updateGnuPG.title=Uppdateringar för GnuPG +updateGnuPG.introduction.desc=Enigmail kräver GnuPG att utföra sina kryptografiska funktioner. Vi rekommenderar att du håller din GnuPG-installation uppdaterad. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +updateGnuPG.noUpdateRequired=GnuPG är aktuell. +updateGnuPG.cannotUpdate.header=Enigmail stöder endast uppdatering av följande paket: +updateGnuPG.cannotUpdate.footer=Du verkar använda någon annan variant av GnuGP; tyvärr är det därför inte möjligt för Enigmail att uppdatera din GnuGP-installation. +updateGnuPG.installUpdate=Installera uppdatering +updateGnuPG.noMoreUpdates=Kontrollera inte efter framtida uppdateringar +updateGnuPG.checkUpdate=Kontrollera efter GnuPG-uppdateringar + + +#strings in keyserver.jsm +keyserver.error.aborted=Avbruten +keyserver.error.unknown=Ett okänt fel uppstod +keyserver.error.serverError=Nyckelservern rapporterade ett fel. +keyserver.error.importError=Misslyckades med att importera den nedladdade nyckeln. +keyserver.error.unavailable=Nyckelservern är inte tillgänglig. +keyserver.error.securityError=Nyckelservern stöder inte krypterad åtkomst. +keyserver.error.certificateError=Nyckelserverns certifikat är inte giltigt. +keyserver.error.unsupported=Nyckelservern stöds inte av Enigmail. + +#strings in mimeDecrypt.jsm +mimeDecrypt.encryptedPart.attachmentLabel=Krypterad meddelandedel +mimeDecrypt.encryptedPart.concealedData=Detta är en krypterad meddelandedel. Du måste öppna den i ett separat fönster genom att klicka på bilagan. + +#strings in gnupg-key.jsm +import.secretKeyImportError=Ett fel har uppstått i GnuPG medan du importerar privata nycklar. Importen lyckades inte. + +#strings in importSettings.js +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 diff -Nru enigmail-2.0.12+ds1/lang/tr/enigmail.dtd enigmail-2.1.3+ds1/lang/tr/enigmail.dtd --- enigmail-2.0.12+ds1/lang/tr/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/tr/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -1,9 +1,7 @@ - + - - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,11 +63,8 @@ - - - @@ -89,12 +77,13 @@ + - + @@ -117,6 +106,9 @@ + + + @@ -209,6 +201,7 @@ + @@ -345,7 +338,7 @@ - + @@ -368,7 +361,6 @@ - @@ -456,8 +448,8 @@ - - + + @@ -542,7 +534,7 @@ - + @@ -623,7 +615,7 @@ - + @@ -665,114 +657,30 @@ - - + - - - - - - - - - - - - - - - - - -Not: Enigmail ayarlarda etkin olup olmamasına bakmadan herzaman her kimlikteki ya da hesaptaki imzaları doğrulayacaktır."> - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Enigmail kullandığınız için teşekkürler."> - - - - - - - - - + + + + + + + + + + + @@ -793,7 +701,9 @@ - + + + @@ -852,9 +762,19 @@ - + + - + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/tr/enigmail.properties enigmail-2.1.3+ds1/lang/tr/enigmail.properties --- enigmail-2.0.12+ds1/lang/tr/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/tr/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,13 +6,13 @@ ##################################################################### enigAlert=Enigmail Uyarı -enigConfirm=Enigmail Doğrula -# enigInfo=Enigmail Information +enigConfirm=Enigmail Onayı +enigInfo=Enigmail Bilgisi enigError=Enigmail Hata enigPrompt=Enigmail Bilgi İstemi dlgYes=Evet -dlgNo=Hayır +dlgNo=&Hayır dlgKeepSetting=Cevabımı hatırla ve tekrar sorma dlgNoPrompt=Bu diyaloğu tekrar gösterme dlg.button.delete=&Sil @@ -20,12 +20,12 @@ dlg.button.close=&Kapat dlg.button.continue=&Devam dlg.button.skip=&Atla -# dlg.button.overwrite=&Overwrite +dlg.button.overwrite=Ü&zerine yaz dlg.button.view=&Göster -# dlg.button.retry=&Retry -# dlg.button.ignore=&Ignore -# dlg.button.install=&Install -# dlg.button.ok=&OK +dlg.button.retry=&Yeniden dene +dlg.button.ignore=&Görmezden gel +dlg.button.install=&Kur +dlg.button.ok=&Tamam repeatPrefix=\n\nBu uyarı tekrar edecek %S repeatSuffixSingular=kere daha. @@ -33,27 +33,27 @@ noRepeat=\n\nBu uyarı Enigmail'i yükseltene kadar tekrar etmeyecek. pgpNotSupported=Enigmail'yi PGP 6.x sürümüyle kullanıyor görünüyorsunuz\n\nPGP 6.x Enigmail'in düzgün çalışmasını bazı sebeplerden engellediğinden Enigmail 6.x desteklemiyor; lütfen GnuPG (GPG)'ye geçiş yapın.\n\nGnuPG'ye geçiş konusunda yardıma ihtiyacınız olursa, Enigmail ana sayfasından Yardım kısmına göz atın. -# initErr.howToFixIt=In order to use Enigmail, GnuPG is required. If you did not install GnuPG yet, the easiest way to do this is using the "Setup Wizard" button below. -# initErr.setupWizard.button=&Setup Wizard +initErr.howToFixIt=Enigmail'i kullanmak için GnuPG'ye ihtiyacınız var. Henüz GnuPG kurmadıysanız, aşağıdaki "Kurulum Sihirbazı" düğmesine basarak kolayca kurabilirsiniz. +initErr.setupWizard.button=&Kurulum Sihirbazı passphraseCleared=Parola temizlendi. -# cannotClearPassphrase=You are using a non-standard tool (such as gnome-keyring) for passphrase handling. Clearing the passphrase is therefore not possible from within Enigmail. +cannotClearPassphrase=Parola yönetimi için (gnome-keyring gibi) standart olmayan bir araç kullanıyorsunuz. Bu nedenle parolayı sıfırlamayı Enigmail'den yapamazsınız. noPhotoAvailable=Hiçbir fotoğraf uygun değil debugLog.title=Enigmail Debug Log -# error.photoPathNotReadable=Photo path '%S' is not readable +error.photoPathNotReadable='%S' fotoğraf adresi okunmuyor -# generalError=Error: %S +generalError=Hata: %S # Strings in configure.jsm -# enigmailCommon.versionSignificantlyChanged=This new version of Enigmail has significant changes in the handling of preferences and options. We tried to transfer the old settings to this new version. However, we cannot cover all cases automatically. Please double check the resulting new preferences and options. -# enigmailCommon.checkPreferences=Check Preferences ... -# preferences.defaultToPgpMime=We have changed the default message encoding in Enigmail from Inline-PGP to PGP/MIME. We recommend you keep this as default.\n\nIf you still wish to use Inline-PGP by default, you can do so in the Account Settings under OpenPGP Security. +enigmailCommon.versionSignificantlyChanged=Enigmail'in bu yeni sürümü ayarlar ve seçenekler ile ilgili önemli değişiklikler getiriyor. Eski ayar yapısını otomatik taşımayı denedik, ama her durumda başarılı olmayabilir. Lütfen yeni ayar ve seçenekleri iki kez kontrol edin. +enigmailCommon.checkPreferences=Ayarları Kontrol Et ... +preferences.defaultToPgpMime=Enigmail'in öntanımlı mesaj kodlamasını Inline-PGP yerine PGP/MIME olarak değiştirdik. Size de bu öntanımı kullanmanızı öneriyoruz.\n\nYine de Inline-PGP'yi öntanımlı yapmak isterseniz, OpenPGP Güvenlik bölümündeki Hesap Ayarları başlığı altından değiştirebilirsiniz. ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=Enigmail %S sürümü kullanıyorsunuz -# enigmailPepVersion=Enigmail/p≡p version %S +enigmailPepVersion=Enigmail/p≡p sürüm %S usingAgent=Şifreleme ve deşifreleme için %S çalışıtırılabiliri %S kullanılıyor agentError=HATA: Enigmime servisine ulaşılamadı! @@ -73,12 +73,12 @@ passNoMatch=Parolalar uyuşmuyor, lütfen tekrar girin passCheckBox=Anahtar için bir parola girmeyecekseniz lütfen kutuyu işaretleyin passUserName=Lütfen bu kimlik için bir kullanıcı adı belirleyin -# keygen.missingUserName=There is no name specified for the selected account/identity. Please enter a value in the field "Your name" in the account settings. -# keygen.passCharProblem=You are using special characters in your passphrase. Unfortunately, this can cause troubles for other applications. We recommend you choose a passphrase consisting only of any of these characters:\na-z A-Z 0-9 /.;:-,!?(){}[]%* -# passSpaceProblem=Due to technical reasons, your passphrase may not start or end with a space character. +keygen.missingUserName=Seçilen hesap/kimlik için belirlenmiş bir isim yok. Lütfen hesap ayarlarında bulunan "İsminiz" alanını doldurun. +keygen.passCharProblem=Parolanız özel karakterler içeriyor. Ne yazık ki bu başka uygulamalarda soruna yol açabilir. Sadece aşağıdaki karakterlerden oluşan bir parola kullanmanızı öneriyoruz:\na-z A-Z 0-9 /.;:-,!?(){}[]%* +passSpaceProblem=Teknik nedenlerle parolanızın ilk ya da son karakteri boşluk olamaz. changePassFailed=Parola değişimi başarısız. -keyConfirm='%S' için genel ve özel anahtarlar oluşturulsun mu? +keyConfirm='%S' için açık ve gizli anahtar üretilsin mi? keyMan.button.generateKey=Anahtar &Üret keyAbort=Anahtar üretiminden çık? keyMan.button.generateKeyAbort=Anahtar Üretimini &İptal Et @@ -86,14 +86,14 @@ expiryTooLong=100 yıldan uzun sürede kaybolan bir anahtar oluşturamazsınız. expiryTooLongShorter=90 yıldan uzun sürede kaybolan bir anahtar oluşturamazsınız. expiryTooShort=Anahtarınız en az bir günlük olmalı. -keyGenFailed=Anahtar üretimi başarısız. Daha fazla bilgi için Enigmail konsoluna göz atın ( Enigmail Menüsü > Hata ayıklama ) -# setKeyExpirationDateFailed=The expiration date could not be changed +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. +setKeyExpirationDateFailed=Son kullanma tarihi değiştirilemez # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail Güvenlik Bilgisi\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Bu mesajın ekleri imzalanmadı ve şifrelenmedi*\n\n +enigContentNote=Enigmail: *Bu mesajın ekleri ne imzalandı ne şifrelendi*\n\n possiblyPgpMime=Muhtemelen PGP/MIME mesajı şifreledi ya da imzaladı; doğrulamak için Deşifre düğmesine tıklayın saveAttachmentHeader=Enigmail: Deşifre edilmiş eki kaydet @@ -102,23 +102,24 @@ beginPgpPart=********* *SIFRELI veya IMZALI KISIM BASLANGICI* ********* endPgpPart=********** *SIFRELI veya IMZALI KISIM BITISI* ********** -notePartEncrypted=Enigmail: *Mesajın bazı kısımları şifrelenmedi veya imzalanmadı* +notePartEncrypted=Enigmail *Bu mesajın bazı bölümleri şifrelenMEdi ve imzalanMAdı* noteCutMessage=Enigmail: *Birden fazla mesaj bloğu bulundu -- deşifre/doğrulama işlemi durduruldu* decryptOkNoSig=Uyarı\n\nDeşifre işlemi başarılıydı, ama imza düzgün doğrulanamadı msgOvl.button.contAnyway=Yine de &devam et -# signature.verifiedOK=The signature for attachment %S was successfully verified -# signature.verifyFailed=The signature for attachment %S could not be verified -# attachment.noMatchToSignature=Could not match attachment '%S' to a signature file -# attachment.noMatchFromSignature=Could not match signature file '%S' to an attachment -# fixBrokenExchangeMsg.failed=Did not succeed to repair message. +signature.verifiedOK=Eklenen dosya %S için imza başarıyla onaylandı +signature.verifyFailed=Eklenen dosya %S için imza onaylanamadı +attachment.noMatchToSignature=Eklenen dosya %S bir imza dosyasıyla eşleşmedi +attachment.noMatchFromSignature=İmza dosyası '%S' eklenen bir dosya ile eşleşmedi +fixBrokenExchangeMsg.failed=Mesaj tamir edilemedi. enigmail.msgViewColumn.label=Enigmail -# enigmailPep.msgViewColumn.label=Enigmail/p≡p -# wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S -# wksConfirmSuccess=Confirmation email sent. -# wksConfirmFailure=Sending the confirmation email failed. -# autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? -# autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. +enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key +wksNoIdentity=Bu anahtar herhangi bir hesabınıza bağlı değil. Lütfen aşağıdaki eposta adres(ler)i -en azından biri- için hesap ekleyin:\n\n%S +wksConfirmSuccess=Onay epostası gönderildi. +wksConfirmFailure=Onay mesajı gönderilemedi. +autocrypt.importSetupKey.accountPreconfigured=Hesabınız zaten Autocrypt için doğru şekilde ayarlanmış.\n\nBu yapılandırma mesajıyla ayarların üzerine yazmak istediğinize emin misiniz? +autocrypt.importSetupKey.selfCreated=Bu mesaj şu anda çalışan Enigmail kopyası tarafından oluşturuldu.\n\nAyarları taşımak istediğiniz eposta yazılımına geçip mesaja tıklayarak ayarları o yazılıma taşıyın. # autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. # autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. # autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? @@ -148,10 +149,9 @@ minimalLineWrapping=Satır bitimi %S karakter yapmışsınız. Düzgün şifreleme veya imzalama için bu değerin en az 68 olması gerek.\n 68'e değiştirmek istiyor musunuz? warning=Uyarı signIconClicked=İmzalamayı elle değiştirdiniz. Yani, bu mesajı yazarken, imzayı kapatmak artık şifrelemeyi kapatmaya bağımlı değil. -# 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. +# 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.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. # msgCompose.internalEncryptionError=Internal Error: promised encryption disabled @@ -164,7 +164,6 @@ # msgCompose.toolbarTxt.disabled=Enigmail is disabled for the selected identity # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject -# msgCompose.encryptedSubjectStub=Encrypted Message # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject @@ -179,7 +178,7 @@ # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -# pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=%S mesajı Gönderilmemiş Mesajlar klasöründe %S e kaydedelim mi? onlineSend=%S mesajını %S e gönder? -encryptKeysNote=Not: mesaj şu Kullanıcı ID'si / Anahtarları ile şifreli: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S # hiddenKey= -signFailed=Enigmail'de hata; Şifreleme/imzalama başarısız; şifrelenmemiş posta gönder? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=Şifrelenmemiş Me&sajı Gönder recipientsSelectionHdr=Şifreleme için alıcıları seçin @@ -225,9 +224,9 @@ # signOffWithReason=Signing: OFF (%S) # reasonEnabledByDefault=enabled by default # reasonManuallyForced=manually forced -# reasonByRecipientRules=forced by recipient rules +# reasonByRecipientRules=forced by per-recipient rules # reasonByAutoEncryption=forced by auto encryption -# reasonByConflict=due to conflict in recipient rules +# reasonByConflict=due to conflict in per-recipient rules # reasonByEncryptionMode=due to encryption mode # should not be used anymore: @@ -252,9 +251,9 @@ # pgpmimeNo=Inline PGP will be used # Attach own key status (tooltip strings): -# attachOwnKeyNo=Your own key will not be attached -# attachOwnKeyYes=Your own key will be attached -# attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Çakışan alıcı bazlı kurallar bulundu\n%S\n\nMesajı bu ayarlarla göndermek ister misiniz? msgCompose.button.configure=&Ayarla @@ -269,6 +268,10 @@ # clickDetailsButton=; click on 'Details' button for more information # clickImportButton=; click on the 'Import Key' button to import the key # keyTypeUnsupported=; the key type is not supported by your version of GnuPG +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Deşifre msgPart=%S mesajının bir bölümü msgSigned=imzalı # msgSignedUnkownKey=signed with unknown key @@ -280,8 +283,10 @@ needKey=Hata - mesajı deşifre etmek için gizli anahtar gerekli failedDecrypt=Hata - deşifreleme başarısız badPhrase=Hata - kötü parola +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=Hata - deşifreleme/doğrulama başarısız viewInfo=; detaylar için Görünüm > Mesaj güvenliği bilgisi +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=Deşifrelenmiş mesaj # decryptedMsgWithFormatError=Decrypted message (restored broken PGP email format probably caused by an old Exchange server, so that the result might not be perfect to read) @@ -326,6 +331,7 @@ # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. @@ -337,6 +343,8 @@ prefs.warnAskNever=Uyarı: bu seçeneğin işaretlenmesi alıcılardan birinin anahtarı yoksa, daha fazla bilgi verilmeyen şifrelenmemiş mesajlara neden olacaktır -- Enigmail böyle bir durumda sizi uyarmayacaktır! # prefs.warnIdleTimeForUnknownAgent=Cannot connect to gpg-agent. Maybe your system uses a specialized tool for passphrase handling (e.g. gnome-keyring, seahorse-agent, KDE wallet manager, ...). Unfortunately Enigmail cannot control the passphrase timeout for the tool you are using. Therefore the respective timeout settings in Enigmail are disregarded. prefEnigmail.oneKeyserverOnly=Hata - kayıp OpePGP anahtarlarının otomatik indirilebilmesi için sadece bir anahtar sunucu belirtebilirsiniz. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +# aboutLicense.desc=Enigmail is open source and licensed under the Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=Hata - parola sağlanmamış noPGPblock=Hata - Düzgün zırhlı(armored) OpenPGP veri bloğu bulunamadı unverifiedReply=İçerden başlatılmış mesaj kısmı (cevap) muhtemelen değiştirilmiş -# keyInMessageBody=Key in message body found. Click 'Import Key' to import the key +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=Hata - İmza kayıp -cantImport=Genel anahtar aktarımında hata\n\n +# cantImport=Error importing public key\n\n # doImportOne=Import %1$S (%2$S)? # doImportMultiple=Import the following keys?\n\n%S # previewFailed=Can't read public key file. @@ -366,14 +374,15 @@ sc.removeCard=Bu işlem okuyucuda hiçbir akıllı kartın olmamasını gerektiriyor.\nLütfen akıllı kartı çıkarıp işlemi tekrarlayın. sc.noCardAvailable=Okuyucunuzda SmartCard bulunamadı\nLütfen SmartCard'ınızı takıp işlemi tekrarlayın sc.noReaderAvailable=SmartCard okuyucunuza ulaşılamadı\nLütfen SmartCard okuyucunuzu takın, kartınızı takın, ve işlemi tekrarlayın -# keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. -# keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. # keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. # missingPassphrase=Missing passphrase # errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. # errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). # errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). # errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. # errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. gpgNotFound=GnuPG programı bulunamadı '%S'.\nGnuPG çalıştırılabilirinin yolunu düzgün girdiğinizi Enigmail Seçenekler menüsünden kontrol edin @@ -384,9 +393,8 @@ prefBad=%S şahsından KÖTÜ İmza failCancel=Hata - Anahtar alımı kullanıcı tarafından iptal edildi -failNoServer=Hata - Anahtar alınacak anahtar sunucu belirtilmedi -failNoID=Hata - Anahtar almak için ID belirtilmemiş failKeyExtract=Hata - anahtar çıkartma komutu başarısız +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=Hata - İlk OpenPGP bloğu genel anahtar bloğu değil importKeyConfirm=Mesajda gömülü olan genel anahtar(lar)ı ekleyelim mi? failKeyImport=Hata - anahtar eklemesi başarısız @@ -425,6 +433,8 @@ identityName=Kimlik: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Şifrelemeyi aktif ettiniz, ama anahtar seçmediniz. %S e gönderilen postaları şifrelemek için, anahtar listenizden bir ya da daha fazla doğru anahtar seçmelisiniz. %S için şifrelemeyi kapatmak istiyor musunuz? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=Seçtiğiniz fonksiyon çevrimdışı modda kullanılamaz. Çevrimiçi olup tekrar deneyin. -protocolNotSupported=Seçtiğiniz '%S://' protokolü OpenPGP anahtarları indirmek için uygun değil. -gpgkeysDisabled='extensions.enigmail.useGpgKeysTool' seçeneğini açmak yardımcı olabilir. noKeyserverConn=%S konumundaki anahtar sunucuya bağlanılamadı. -keyDownloadFailed=Anahtar sunucudan anahtar indirilemedi. Durum mesajı:\n%S internalError=Dahili hata. Anahtarlar indirilemedi veya aktarılamadı. -noKeyFound=Üzgünüm, belirtilen arama kriterlerine uygun anahtar bulunamadı.\nAnahtar ID'lerinin "0x" öneki ile kullanılmaları gerektiğini unutmayın(ör: 0xABCDEF12). -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Anahtar getirmede ya da aramada hata: gpgkeys_%S çalıştırılamadı. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Anahtar sahibi güvenilirliği başarısız @@ -490,7 +493,6 @@ asciiArmorFile=ASCII Zırhlı Dosyalar (*.asc) # importKeyFile=Import OpenPGP Key File gnupgFile=GnuPG Dosyaları -# createKeyOK=Your Key has been generated saveRevokeCertAs=İptal etme sertifikası Oluştur & Kaydet # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=İptal sertifikası oluşturulamadı. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%S (0x%S) pub-sec defaultPubKeyFilename=Aktarilmis-genel-anahtarlar defaultPubSecKeyFilename=Aktarilmis-genel-ve-ozel-anahtarlar -noSecretKeys=Özel anahtar bulunamadı.\n\nAnahtarınızı şimdi üretmek ister misiniz? sendKeysOk=Anahtar(lar) gönderildi sendKeysFailed=Anahtarlar gönderileMEdi receiveKeysOk=Anahtar(lar) güncellendi receiveKeysFailed=Anahtarlar indirilemedi +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=Panodan anahtar aktarmak ister misiniz? # importFromUrl=Download public key from this URL: copyToClipbrdFailed=Seçili anahtar(lar) panoya kopyalanamadı copyToClipbrdOK=Anahtar(lar) panoya kopyalandı -deleteSecretKey=UYARI: Bir özel anahtar silmek üzeresiniz!\nözel anahtarınızı silerseniz bu anahtar için şifrelenmiş hiçbir mesajı açamazsınız, ve anahtarınızı artık iptal edemezsiniz.\n\nGerçekten hem özel hem genel anahtarınızı silmek istiyor musunuz\n'%S'? +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=UYARI: özel anahtarları silmek üzeresiniz!\nözel anahtarınızı silerseniz, bu anahtar için şifrelenmiş mesajları açamazsınız.İKİSİNİ de, seçili özel ve genel anahtarları silmek istediğinizden emin misiniz? deletePubKey=Genel anahtarı silmek istiyor musunuz\n'%S'? deleteSelectedPubKey=Genel anahtarları silmek istiyor musunuz? @@ -529,7 +531,7 @@ # revokeKeyQuestion=You are about to revoke the key '%S'.\n\nYou will no longer be able to sign with this key, and once distributed, others will no longer be able to encrypt with that key. You can still use the key to decrypt old messages.\n\nDo you want to proceed? revokeKeyOk=Anahtar iptal edildi. Anahtarınız bir anahtar sunucudaysa, tekrar yüklemeniz önerilir, böylece diğerleri iptal edildiğini görebilir. revokeKeyFailed=Anahtar iptal edilemedi. -# revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Anahtar seçmediniz. TÜM anahtarları yenilemek ister misiniz? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? @@ -541,21 +543,21 @@ keyMan.button.import=&İçe Aktar keyMan.button.refreshAll=&Tüm Anahtarları Tazele keyMan.button.revokeKey=&Anahtarı Hükümsüz Kıl -# keyMan.button.skip=&Skip Key keylist.noOtherUids=Başka kimliği yoktur keylist.hasOtherUids=Ayrıca şöyle bilinir -keylist.noPhotos=Uygun fotoğraf yok -keylist.hasPhotos=Fotoğraflar +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos # keyMan.addphoto.filepicker.title=Select photo to add -# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files because the keys get very large by this. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. # keyMan.addphoto.noJpegFile=The selected file does not appear to be a JPEG file. Please choose a different file. # keyMan.addphoto.failed=The photo could not be added. # noWksIdentity=The key %S does not have a WKS identity. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? -# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=PIN değiştirilemedi -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Anahtarlar yenileniyor, lütfen bekleyin ... keyserverProgress.uploading=Anahtarlar gönderiliyor, lütfen bekleyin ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Anahtarları Yenile keyserverTitle.uploading=Anahtarları Gönder +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=Parolanız en az 8 karakter olmalı! -setupWizard.reallyCancel=Enigmail Kurulum Sihirbazından gerçekten mi çıkmak istiyorsunuz? # setupWizard.invalidGpg=The file you specified is not a GnuPG executable. Please specify a different file. -# setupWizard.specifyFile=You need to at least specify a public key file in order to proceed. # setupWizard.installFailed=It seems that the installation was not successful. Please either retry the installation, or install GnuPG manually and locate it using the Browse button. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. -# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or manipulated. Do you want to continue the installation anyway? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? # setupWizard.importSettingsFile=Specify backup file to load from -# setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. # setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? -# setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm # installGnuPG.downloadFailed=An error occurred while trying to download GnuPG. Please check the console log for further details. @@ -654,12 +662,12 @@ # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. -# filter.keyNotFound=Could not find an encryption key for "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -# converter.decryptBody.failed=Could not decrypt message with subject\n"%S".\nDo you want to retry with a different passphrase or do you want to skip the message? -# converter.decryptAtt.failed=Could not decrypt attachment "%1$S"\nof message with subject\n"%2$S".\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? # saveLogFile.title=Save Log File @@ -691,13 +699,13 @@ # enigmailSettings=EnigmailSettings # defaultBackupFileName=Enigmail-export # specifyExportFile=Specify file name for exporting -# homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm -# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. -# expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties @@ -709,6 +717,7 @@ # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. @@ -728,12 +737,12 @@ # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! -# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. -# pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. @@ -763,16 +772,16 @@ # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. -# handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device -# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? @@ -785,10 +794,12 @@ # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. +#strings in pEpAdapter.jsm # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=Enigmail Hakkında @@ -799,6 +810,7 @@ # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: +# aboutEnigmail.userSupport.team=the team and the list/forum members # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension @@ -808,3 +820,38 @@ # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/vi/enigmail.dtd enigmail-2.1.3+ds1/lang/vi/enigmail.dtd --- enigmail-2.0.12+ds1/lang/vi/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/vi/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ - - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,11 +63,8 @@ - - - @@ -89,12 +77,13 @@ + - + @@ -117,6 +106,9 @@ + + + @@ -209,6 +201,7 @@ + @@ -217,8 +210,8 @@ - - + + @@ -345,7 +338,7 @@ - + @@ -368,7 +361,6 @@ - @@ -456,8 +448,8 @@ - - + + @@ -542,7 +534,7 @@ - + @@ -623,7 +615,7 @@ - + @@ -665,117 +657,30 @@ - - + - - - - - - - - - - - - - - - - - -Lưu ý: Enigmail sẽ luôn luôn kiểm chứng chữ ký - - -trên thư điện tử cho tất cả các tài khoản hoặc danh tính, bất kể là nó có được bật hay không"> - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Cám ơn bạn đã sử dụng Enigmail."> - - - - - - - - - + + + + + + + + + + + @@ -796,12 +701,9 @@ - - xuất dữ liệu từ máy cũ thông qua trình hướng dẫn này - nhập dữ liệu vào máy mới thông qua trình hướng dẫn cài đặt. - "> + + + @@ -862,9 +764,19 @@ - + + - + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/vi/enigmail.properties enigmail-2.1.3+ds1/lang/vi/enigmail.properties --- enigmail-2.0.12+ds1/lang/vi/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/vi/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=Cảnh báo Enigmail -enigConfirm=Xác nhận Enigmail +# enigConfirm=Enigmail Confirmation # enigInfo=Enigmail Information enigError=Lỗi Enigmail enigPrompt=Nhắc nhở Enigmail @@ -78,7 +78,7 @@ passSpaceProblem=Vì lý do kỹ thuật, mật khẩu của bạn không thể bắt đầu hoặc kết thúc với khoảng trắng. changePassFailed=Đổi mật khẩu thất bại. -keyConfirm=Tạo các khoá công khai và cá nhân cho '%S'? +# keyConfirm=Generate public and secret key for '%S'? keyMan.button.generateKey=&Tạo khoá keyAbort=Huỷ tạo khoá? keyMan.button.generateKeyAbort=&Huỷ tạo khoá? @@ -86,14 +86,14 @@ expiryTooLong=Bạn không thể tạo khoá có hạn dùng quá 100 năm. expiryTooLongShorter=Bạn không thể tạo khoá có hạn dùng quá 90 năm. expiryTooShort=Khoá của bạn phải còn hiệu lực trong ít nhất một ngày. -keyGenFailed=Tạo khoá thất bại. Xin xem trình điều khiển Enigmail (Trình đơn Enigmail > Dò lỗi Enigmail) để biết thêm chi tiết. +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. setKeyExpirationDateFailed=Không thể đổi ngày hết hạn. # Strings in enigmailMessengerOverlay.js securityInfo=Thông tin bảo mật cho Enigmail\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: *Các tập tin đính kèm trong tin nhắn này chưa được ký tên hoặc mã hoá*\n\n +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=Có thể tin nhắn đã được mã hoá hoặc ký tên bằng PGP/MIME; hãy dùng tính năng 'Giải mã/Xác minh' để kiểm chứng saveAttachmentHeader=Enigmail: Lưu tập tin đính kèm đã giải mã @@ -102,7 +102,7 @@ beginPgpPart=********* *BẮT ĐẦU PHẦN MÃ HOÁ hoặc KÝ TÊN* ********* endPgpPart=********** *KẾT THÚC PHẦN MÃ HOÁ hoặc KÝ TÊN* ********** -notePartEncrypted=Enigmail: *Một phần tin nhắn CHƯA được ký tên hoặc mã hoá* +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *Tìm thấy nhiều khối tin nhắn -- đã huỷ giải mã/xác minh* decryptOkNoSig=Cảnh báo\n\nGiải mã thành công, nhưng không thể xác minh chữ ký đúng cách được @@ -114,6 +114,7 @@ fixBrokenExchangeMsg.failed=Thất bại khi sửa chữa tin nhắn. enigmail.msgViewColumn.label=Enigmail # enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. @@ -148,10 +149,9 @@ minimalLineWrapping=Bạn đã cài đặt bao dòng cho các ký tự %S. Để việc mã hoá và/hoặc ký tên diễn ra đúng cách, cần đặt giá trị này ít nhất là 68.\nBạn có muốn đổi bao dòng thành 68 ký tự ngay? warning=Cảnh báo signIconClicked=Bạn đã chỉnh sửa thủ công việc ký tên. Vì vậy, khi bạn soạn tin nhắn này, bật (tắt) việc ký tên không còn phụ thuộc vào bật (tắt) mã hoá nữa. -errorOwnKeyUnusable=ID khoá '%S' đã cấu hình cho danh tính hiện tại không tạo ra khoá OpenPGP dùng được nào.\n\nHãy chắc rằng bạn có một khoá OpenPGP hợp lệ, chưa hết hạn và cài đặt tài khoản của bạn dẫn đến khoá đó.\nNếu khoá chưa hết hạn thì hãy kiểm tra xem bạn đã đặt Tín nhiệm chủ nhân thành đầy đủ hay tối cao chưa. +# 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=Lỗi khi lưu thư nháp # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. -# msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=Lỗi nội vi: mã hoá cam kết đã bị tắt @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=Đã tắt Enigmail cho danh tính được chọn # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject -msgCompose.encryptedSubjectStub=Tin nhắn đã mã hoá # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject @@ -179,7 +178,7 @@ # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -# pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=Lưu %1$S tin nhắn vào %2$S trong thư mục Tin nhắn chưa gửi? onlineSend=Gửi %1$S tin nhắn đến %2$S? -encryptKeysNote=Lưu ý: Tin nhắn được mã hoá cho những ID người dùng / Khoá sau đây: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S hiddenKey= -signFailed=Lỗi trong Enigmail; Mã hoá/ký tên thất bại; gửi tin nhắn không mã hoá? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=&Gửi tin nhắn không mã hoá recipientsSelectionHdr=Chọn người nhận để mã hoá @@ -225,9 +224,9 @@ signOffWithReason=Ký tên: TẮT (%S) reasonEnabledByDefault=bật theo mặc định reasonManuallyForced=bắt buộc thủ công -reasonByRecipientRules=bắt buộc theo quy tắc cho người nhận +# reasonByRecipientRules=forced by per-recipient rules reasonByAutoEncryption=bắt buộc theo mã hoá tự động -reasonByConflict=do mâu thuẫn giữa các quy tắc cho người nhận +# reasonByConflict=due to conflict in per-recipient rules reasonByEncryptionMode=do chế độ mã hoá # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=Inline PGP sẽ được dùng # Attach own key status (tooltip strings): -attachOwnKeyNo=Khoá của chính bạn sẽ không được đính kèm -attachOwnKeyYes=Khoá của chính bạn sẽ được đính kèm -attachOwnKeyDisabled=Không thể đính kèm khoá của chính bạn. Bạn phải chọn một khoá cụ thể\ntrong mục OpenPGP của Cài đặt tài khoản để bật tính năng này. +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=Đã phát hiện mâu thuẫn trong quy tắc cho từng người nhận\n%S\n\nGửi tin nhắn với những cài đặt này? msgCompose.button.configure=&Cấu hình @@ -269,6 +268,10 @@ clickDetailsButton=; nhấp vào nút 'Chi tiết' để biết thêm thông tin clickImportButton=; nhấp vào nút 'Nhập khoá' để nhập khoá keyTypeUnsupported=; loại khoá này không được hỗ trợ bởi phiên bản GnuPG của bạn +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=Giải mã msgPart=Một phần của tin nhắn %S msgSigned=đã ký tên msgSignedUnkownKey=đã ký tên với khoá lạ @@ -280,8 +283,10 @@ needKey=Lỗi - không thấy khoá cá nhân/bí mật trùng khớp để giải mã tin nhắn failedDecrypt=Lỗi - giải mã thất bại badPhrase=Lỗi - sai mật khẩu +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=Lỗi - giải mã/xác minh thất bại viewInfo=; Xem > Thông tin bảo mật tin nhắn để biết chi tiết +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=Tin nhắn đã giải mã decryptedMsgWithFormatError=Tin nhắn đã giải mã (định dạng đã được khôi phục của email PGP, bị hỏng có lẽ là do máy chủ Exchange cũ, vậy nên kết quả có thể không hoàn chỉnh để đọc) @@ -326,6 +331,7 @@ # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. @@ -337,6 +343,8 @@ prefs.warnAskNever=Cảnh báo: bật tuỳ chọn này sẽ dẫn đến email không được mã hoá mà không kèm thông tin gì khác nếu không có khoá cho một trong những người nhận -- Enigmail sẽ không thông báo cho bạn nếu điều này xảy ra! prefs.warnIdleTimeForUnknownAgent=Không thể kết nối đến gpg-agent. Có lẽ hệ thống của bạn sử dụng một công cụ chuyên biệt để xử lý mật khẩu (VD: gnome-keyring, seahorse-agent, trình quản lý ví KDE, ...). Đáng tiếc là Enigmail không thể kiểm soát thời gian chờ cho công cụ mà bạn đang dùng. Vậy nên cài đặt thời gian chờ tương ứng trong Enigmail sẽ bị bỏ qua. prefEnigmail.oneKeyserverOnly=Lỗi - bạn chỉ có thể chỉ định một máy chủ quản lý khoá để tự động tải về các khoá OpenPGP còn thiếu. +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +# aboutLicense.desc=Enigmail is open source and licensed under the Mozilla Public License 2.0. # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=Lỗi - chưa cung cấp mật khẩu noPGPblock=Lỗi - Không thấy khối dữ liệu OpenPGP được bảo vệ nào hợp lệ unverifiedReply=Phần tin nhắn thụt lề (hồi đáp) có lẽ đã được chỉnh sửa -keyInMessageBody=Tìm thấy khoá trong tin nhắn. Nhấp 'Nhập khoá' để nhập khoá +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=Lỗi - Chữ ký không trùng khớp -cantImport=Lỗi khi nhập khoá công khai\n\n +# cantImport=Error importing public key\n\n doImportOne=Nhập %1$S (%2$S)? doImportMultiple=Nhập những khoá sau?\n\n%S previewFailed=Không thể đọc tập tin khoá công khai. @@ -366,14 +374,15 @@ sc.removeCard=Thao tác không cần SmartCard nào trong trình đọc.\nXin lấy SmartCard của bạn ra và lặp lại thao tác. sc.noCardAvailable=Không tìm thấy SmartCard nào trong trình đọc của bạn.\nXin chèn SmartCard của bạn và lặp lại thao tác. sc.noReaderAvailable=Không thể truy cập trình đọc SmartCard của bạn.\nXin nối trình đọc SmartCard của bạn vào, gắn thẻ, và lặp lại thao tác. -keyError.keySpecNotFound=Không thể so sánh địa chỉ email "%S" với khoá trong vòng khoá của bạn. -keyError.keyIdNotFound=Không tìm thấy ID khoá đã cấu hình "%S" trong vòng khoá của bạn. +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. keyError.resolutionAction=Xin chọn một khoá hợp lệ trong mục OpenPGP của Cài đặt tài khoản. missingPassphrase=Mật khẩu còn thiếu errorHandling.gpgAgentInvalid=Hệ thống đang chạy phiên bản gpg-agent không phù hợp với phiên bản GnuPG của bạn. errorHandling.gpgAgentError=GnuPG đã báo cáo một lỗi trong giao tiếp với gpg-agent (một thành tố của GnuPG). errorHandling.dirmngrError=GnuPG đã báo cáo một lỗi trong giao tiếp với dirmngr (một thành tố của GnuPG). errorHandling.pinentryError=GnuPG không thể yêu cầu mật khẩu qua pinentry. +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. errorHandling.readFaq=Đây là lỗi cài đặt hoặc cấu hình hệ thống đã ngăn cản Enigmail hoạt động bình thường và không thể tự động xử lý.\n\nChúng tôi chân thành khuyên bạn nhận tư vấn từ trang hỗ trợ của chúng tôi tại https://enigmail.net/faq. gpgNotFound=Không thể tìm được chương trình '%S' GnuPG.\nHãy bảo đảm là bạn đã đặt đúng đường dẫn thực thi GnuPG trong Tuỳ chỉnh của Enigmail. @@ -384,9 +393,8 @@ prefBad=Chữ ký XẤU từ %S failCancel=Lỗi - Người dùng đã huỷ nhận khoá -failNoServer=Lỗi - không có máy chủ quản lý khoá nào được chỉ định để nhận khoá -failNoID=Lỗi - Không có ID khoá nào được chỉ định để nhận khoá failKeyExtract=Lỗi - lệnh trích xuất khoá đã thất bại +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=Lỗi - Khối OpenPGP đầu tiên chứ không phải khối khoá công khai importKeyConfirm=Nhập (các) khoá công khai được nhúng trong tin nhắn? failKeyImport=Lỗi - nhập khoá thất bại @@ -425,6 +433,8 @@ identityName=Danh tính: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=Bạn đã kích hoạt mã hoá, nhưng lại chưa chọn khoá. Để mã hoá các thư gửi đến %1$S, bạn cần chỉ định một (hay một vài) khoá hợp lệ từ danh sách khoá. Bạn có muốn tắt mã hoá cho %2$S không? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=Hàm bạn đã chọn không có sẵn trong chế độ ngoại tuyến. Xin hãy trực tuyến và thử lại. -protocolNotSupported=Giao thức '%S://' bạn đã chọn không được hỗ trợ tải xuống các khoá OpenPGP. -gpgkeysDisabled=Nó có thể giúp bật tuỳ chọn 'extensions.enigmail.useGpgKeysTool' noKeyserverConn=Không thể kết nối đến máy chủ quản lý khoá tại %S. -keyDownloadFailed=Thất bại khi tải xuống khoá từ máy chủ quản lý khoá. Tin nhắn trạng thái là:\n%S internalError=Đã xảy ra lỗi nội vi. Không thể tải xuống hoặc nhập khoá. -noKeyFound=Thành thật xin lỗi, không thấy khoá nào phù hợp với tiêu chuẩn tìm kiếm đã chỉ định. -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=Thất bại khi tìm hoặc tải xuống khoá từ máy chủ quản lý khoá: không thể chạy gpgkeys_%S. - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=Cài đặt tín nhiệm chủ nhân thất bại @@ -490,7 +493,6 @@ asciiArmorFile=Tập tin ASCII được bảo vệ (*.asc) importKeyFile=Nhập tập tin khoá OpenPGP gnupgFile=Các tập tin GnuPG -# createKeyOK=Your Key has been generated saveRevokeCertAs=Tạo & Lưu chứng nhận huỷ # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=Không thể tạo chứng nhận huỷ. @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%1$S (0x%2$S) c.khai-b.mật defaultPubKeyFilename=Exported-public-keys defaultPubSecKeyFilename=Exported-public-and-secret-keys -noSecretKeys=Không thấy các khoá bí mật.\n\nBạn có muốn tạo khoá của chính bạn ngay? sendKeysOk=Gửi (các) khoá thành công sendKeysFailed=Gửi khoá thất bại receiveKeysOk=Cập nhật (các) khoá thành công receiveKeysFailed=Tải khoá xuống thất bại +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=Bạn có muốn nhập (một số) khoá từ clipboard? importFromUrl=Tải về khoá công khai từ URL này: copyToClipbrdFailed=Không thể sao chép (các) khoá được chọn vào clipboard. copyToClipbrdOK=Đã sao chép (các) khoá vào clipboard -deleteSecretKey=CẢNH BÁO: Bạn sắp xoá một khoá bí mật!\nNếu xoá khoá bí mật thì bạn sẽ không thể giải mã bất kỳ tin nhắn nào đã được mã hoá với khoá đó cũng như không thể huỷ khoá của bạn nữa.\n\nCó chắc là bạn muốn xoá CẢ HAI, khoá bí mật và khoá công khai\n'%S'? +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=CẢNH BÁO: Bạn sắp xoá các khoá bí mật!\nNếu xoá khoá bí mật thì bạn sẽ không thể giải mã bất kỳ tin nhắn nào đã được mã hoá với khoá đó nữa.\n\nCó chắc là bạn muốn xoá CẢ HAI, khoá bí mật và khoá công khai được chọn? deletePubKey=Bạn có muốn xoá khoá công khai\n'%S'? deleteSelectedPubKey=Bạn có muốn xoá các khoá công khai? @@ -529,7 +531,7 @@ revokeKeyQuestion=Bạn đang chuẩn bị huỷ khoá '%S'.\n\nBạn sẽ không thể ký tên với khoá này nữa, và một khi đã phân phối, người khác sẽ không thể mã hoá với khoá đó. Bạn vẫn có thể sử dụng khoá này để giải mã tin nhắn cũ.\n\nBạn có muốn tiếp tục? revokeKeyOk=Khoá đã bị huỷ. Nếu khoá của bạn đã có trên máy chủ quản lý khoá thì bạn nên tải nó lên lại để những người khác có thể thấy là nó đã bị huỷ. revokeKeyFailed=Không thể huỷ khoá. -# revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=Bạn chưa chọn khoá nào cả. Bạn có muốn làm mới TOÀN BỘ khoá? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? @@ -541,21 +543,21 @@ keyMan.button.import=&Nhập keyMan.button.refreshAll=&Làm mới toàn bộ khoá keyMan.button.revokeKey=&Huỷ khoá -keyMan.button.skip=&Bỏ qua khoá keylist.noOtherUids=Không có danh tính nào khác keylist.hasOtherUids=Cũng được biết đến như là -keylist.noPhotos=Không có sẵn ảnh -keylist.hasPhotos=Ảnh +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos keyMan.addphoto.filepicker.title=Chọn ảnh để thêm vào -keyMan.addphoto.warnLargeFile=Tập tin bạn đã chọn vượt quá 25 kB.\nKhông nên thêm các tập tin quá lớn vì khoá cũng sẽ trở nên rất nặng. +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. keyMan.addphoto.noJpegFile=Có vẻ như tập tin đã chọn không phải định dạng JPEG. Xin chọn tập tin khác. keyMan.addphoto.failed=Không thể thêm ảnh này. # noWksIdentity=The key %S does not have a WKS identity. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? -# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=Đổi PIN thất bại -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=Đang làm mới các khoá, xin chờ ... keyserverProgress.uploading=Đang tải các khoá lên, xin chờ ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=Làm mới các khoá keyserverTitle.uploading=Tải khoá lên +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=Mật khẩu phải chứa ít nhất 8 ký tự! -setupWizard.reallyCancel=Có chắc là bạn muốn đóng Trình hướng dẫn cài đặt Enigmail không? setupWizard.invalidGpg=Tập tin bạn chỉ định không phải tập tin chạy GnuPG. Hãy chỉ định tập tin khác. -setupWizard.specifyFile=Bạn cần chỉ định ít nhất một tập tin khoá công khai để tiếp tục. setupWizard.installFailed=Có vẻ như quá trình cài đặt đã thất bại. Xin thử lại hoặc cài đặt thủ công GnuPG và chỉ đường đến nó bằng nút Duyệt tìm. # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. -setupWizard.hashSumError=Trình hướng dẫn không thể xác minh tập tin đã tải có toàn vẹn không. Nó có thể hỏng hoặc bị can thiệp. Bạn vẫn muốn tiếp tục cài đặt chứ? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? setupWizard.importSettingsFile=Chỉ định tập tin sao lưu để nạp -setupWizard.invalidSettingsFile=Tập tin đã chỉ định không phải là tập tin sao lưu cài đặt Enigmail chính xác. +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. setupWizard.gpgConfExists=Tập tin cấu hình GnuPG đã tồn tại. Bạn có muốn chép đè nó với tập tin từ bản cài đặt cũ? -# setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=Đã có lỗi khi tải về GnuPG. Xin kiểm tra nhật ký khung lệnh để biết thêm chi tiết. @@ -654,12 +662,12 @@ # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. -# filter.keyNotFound=Could not find an encryption key for "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -converter.decryptBody.failed=Không thể giải mã tin nhắn với tiêu đề\n"%S".\nBạn muốn thử lại với mật khẩu khác hay là bỏ qua tin nhắn? -converter.decryptAtt.failed=Không thể giải mã tập tin đính kèm "%1$S"\ncủa tin nhắn với tiêu đề\n"%2$S".\nBạn muốn thử lại với mật khẩu khác hay là bỏ qua tin nhắn? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? saveLogFile.title=Lưu tập tin nhật ký @@ -691,13 +699,13 @@ enigmailSettings=Cài đặt Enigmail defaultBackupFileName=Enigmail-export specifyExportFile=Chỉ định tên tập tin để xuất -homedirParamNotSUpported=Những tham số thêm để cấu hình đường dẫn như là --homedir và --keyring không được hỗ trợ để xuất/khôi phục cài đặt. Xin dùng các phương thức khác như là cài đặt biến môi trường GNUPGHOME. +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #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=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties @@ -709,6 +717,7 @@ # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. @@ -728,12 +737,12 @@ # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! -# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. -# pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. @@ -763,16 +772,16 @@ # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. -# handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device -# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? @@ -785,10 +794,12 @@ # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. +#strings in pEpAdapter.jsm # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=Thông tin về Enigmail @@ -799,6 +810,7 @@ # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: +# aboutEnigmail.userSupport.team=the team and the list/forum members # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension @@ -808,3 +820,38 @@ # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/zh-CN/enigmail.dtd enigmail-2.1.3+ds1/lang/zh-CN/enigmail.dtd --- enigmail-2.0.12+ds1/lang/zh-CN/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/zh-CN/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -2,8 +2,6 @@ -Mozilla 公共许可证 2.0 授权的开源软件。"> - @@ -25,18 +23,9 @@ - - - - - - - - - @@ -54,6 +43,8 @@ + + @@ -61,7 +52,7 @@ - + @@ -72,11 +63,8 @@ - - - @@ -89,12 +77,13 @@ + - + @@ -117,6 +106,9 @@ + + + @@ -209,6 +201,7 @@ + @@ -217,8 +210,8 @@ - - + + @@ -345,7 +338,7 @@ - + @@ -368,7 +361,6 @@ - @@ -456,8 +448,8 @@ - - + + @@ -542,7 +534,7 @@ - + @@ -623,7 +615,7 @@ - + @@ -665,130 +657,37 @@ - - - - - - - - - - - - - - - - - - - - -注意: Enigmail 将总是验证每个帐号或身份标识邮件的数 字签名,而无论它是否被允许或不"> - + + - - + - - - - - - - - - - - - - - - - - -公钥是给其他人用以向您发送加密邮件的东西。您可以将它分发给任何人。"> -私钥是仅供您自己使用的用来解密这些邮件,以及签名要发出的邮件时使用。 -您应该不将它泄露给任何人。"> -私钥是仅供您自己使用的用来解密这些邮件,以及签名要发出的邮件时使用。 -您应该不将它泄露给任何人。 -为了您的私钥的安全,您需要在接下来的两个对话框中输入一个口令。"> -口令是用来保护您的私钥的密码。它用以避免您的私钥被滥用。"> -不推荐使用元音 (e.g. ä, é, ñ) 和特定语言的字符。"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -使用 Enigmail 首选项中的备份向导,从您的旧电脑导出您的数据: -使用本向导将您的数据导入您的新电脑: -"> - - - - - - -感谢您使用 Enigmail。"> - - - - - - - - - + + + + + + + + + + + - + @@ -804,11 +703,9 @@ - -使用本向导从您的旧电脑导出您的数据: -使用本向导将您的数据导入您的新电脑: -"> + + + @@ -869,9 +766,19 @@ - + + - + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/zh-CN/enigmail.properties enigmail-2.1.3+ds1/lang/zh-CN/enigmail.properties --- enigmail-2.0.12+ds1/lang/zh-CN/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/zh-CN/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -6,7 +6,7 @@ ##################################################################### enigAlert=Enigmail 警告 -enigConfirm=Enigmail 确认 +# enigConfirm=Enigmail Confirmation # enigInfo=Enigmail Information enigError=Enigmail 错误 enigPrompt=Enigmail 提示 @@ -78,7 +78,7 @@ passSpaceProblem=因为技术原因,您的口令可能不能以空格字符开头或结尾。 changePassFailed=更改口令失败。 -keyConfirm=为“%S”创建公钥和私钥么? +# keyConfirm=Generate public and secret key for '%S'? keyMan.button.generateKey=生成密钥(&G) keyAbort=中止密钥生成? keyMan.button.generateKeyAbort=放弃密钥生成(&A) @@ -86,14 +86,14 @@ expiryTooLong=您不能创建有效期超过 100 年的密钥。 expiryTooLongShorter=您不能创建有效期超过 90 年的密钥。 expiryTooShort=您的密钥必须至少在一天内有效。 -keyGenFailed=密钥生成失败,请检查 Enigmail 终端 (菜单 安全 > 调试 Enigmail) 了解详细信息。 +# keyGenFailed=The key generation failed. Please check the Enigmail console (Menu Enigmail > Debugging Options) for details. setKeyExpirationDateFailed=过期时间不能更改 # Strings in enigmailMessengerOverlay.js securityInfo=Enigmail 安全信息\n\n enigHeader=Enigmail : -enigContentNote=Enigmail : *本邮件的附件未被数字签名或加密*\n\n +# enigContentNote=Enigmail: *Attachments to this message have not been signed nor encrypted*\r\n\r\n possiblyPgpMime=本邮件可能使用 PGP/MIME 方式加密或数字签名;点击“解密”按钮以验证 saveAttachmentHeader=Enigmail : 保存已解密附件 @@ -102,7 +102,7 @@ beginPgpPart=********* *BEGIN ENCRYPTED or SIGNED PART* ********* endPgpPart=********** *END ENCRYPTED or SIGNED PART* ********** -notePartEncrypted=Enigmail : *该邮件的某些部分“未经”数字签名或加密* +# notePartEncrypted=Enigmail: *Parts of the message have NOT been signed nor encrypted* noteCutMessage=Enigmail: *找到多个消息块 -- 解密/验证中止* decryptOkNoSig=警告\n\n解密成功,但无法验证数字签名的正确性 @@ -114,6 +114,7 @@ fixBrokenExchangeMsg.failed=修复消息未成功。 enigmail.msgViewColumn.label=Enigmail enigmailPep.msgViewColumn.label=Enigmail/p≡p +# detailsDlg.importKey=Import key # wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S # wksConfirmSuccess=Confirmation email sent. # wksConfirmFailure=Sending the confirmation email failed. @@ -148,10 +149,9 @@ minimalLineWrapping=您已经设置了在 %S 个字符处自动换行。此值必须不小于 68 以保证正确加密或数字签名。\n您希望立即将自动换行设置为 68 个字符吗? warning=警告 signIconClicked=您已经手工更改了数字签名设置。因此,您撰写此邮件时,关闭或激活邮件数字签名将不再依赖于关闭或激活邮件加密。 -errorOwnKeyUnusable=为当前账户配置的密钥ID‘%S’不是有效的OpenGPG密钥。\n\n请确认你有一个有效、未过期的OpenGPG密钥并且你的账户指向这个密钥。\n如果你的密钥没有过期,那么检查你是否为密钥设置了完全信任。 +# 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=保存草稿时出错 # msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - partially encrypted email. -# msgCompose.partiallyEncrypted.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. # msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. msgCompose.internalEncryptionError=内部错误:保证加密已禁用 @@ -164,7 +164,6 @@ msgCompose.toolbarTxt.disabled=Enigmail 已对选定的身份禁用 # msgCompose.protectSubject.tooltip=Protect the message subject # msgCompose.noSubjectProtection.tooltip=Do not protect the message subject -msgCompose.encryptedSubjectStub=已加密的邮件 # msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? # msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? # msgCompose.protectSubject.yesButton=&Protect subject @@ -179,7 +178,7 @@ # msgCompose.pepSendTrusted=Secure & Trusted # pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -# pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? +# pep.alert.weakReply=You are about to forward or reply to a secure message, but the message you are sending will be unsecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? # note: should end with double newline: @@ -200,10 +199,10 @@ offlineSave=将待发邮件 %S 保存至发件箱中的 %S 目录? onlineSend=立即将邮件 %S 发送给 %S? -encryptKeysNote=注意: 此邮件已使用下列用户/密钥标识的密钥加密: %S +# encryptKeysNote=Note: The message is encrypted for the following User IDs / Keys: %S hiddenKey=<密钥已隐藏> -signFailed=Enigmail 错误;加密/数字签名失败;发送未加密邮件? +# signFailed=Error in Enigmail: encryption/signing failed. Send the message unencrypted? msgCompose.button.sendUnencrypted=发送未加密的邮件(&S) recipientsSelectionHdr=选择加密收件人 @@ -225,9 +224,9 @@ signOffWithReason=签名:关 (%S) reasonEnabledByDefault=默认启用 reasonManuallyForced=手动强制 -reasonByRecipientRules=收件人规则强制 +# reasonByRecipientRules=forced by per-recipient rules reasonByAutoEncryption=自动加密强制 -reasonByConflict=收件人规则冲突 +# reasonByConflict=due to conflict in per-recipient rules reasonByEncryptionMode=加密模式冲突 # should not be used anymore: @@ -252,9 +251,9 @@ pgpmimeNo=内联 PGP 将被使用 # Attach own key status (tooltip strings): -attachOwnKeyNo=您拥有的密钥将不会附加 -attachOwnKeyYes=您拥有的密钥将被附加 -attachOwnKeyDisabled=您自己的密钥无法附加。您必须在“账户设置”中的 OpenPGP 部分选择一个密钥才能使用此功能。 +# attachOwnKeyNo=Your own public key will not be attached +# attachOwnKeyYes=Your own public key will be attached +# attachOwnKeyDisabled=Your own public key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. rulesConflict=检测到与收件人规则冲突\n%S\n\n使用这些设置发送邮件? msgCompose.button.configure=配置(&C) @@ -269,6 +268,10 @@ clickDetailsButton=;点击“详细信息”按钮获取更多信息 clickImportButton=;点击“导入密钥”按钮下载密钥 keyTypeUnsupported=;您的 GnuPG 版本的密钥类型不支持 +# decryptManually=; click on the 'Decrypt' button to decrypt the message +# verifyManually=; click on the 'Verify' button to verify the signature +# headerView.button.verify=Verify +headerView.button.decrypt=解密 msgPart=邮件包含已 %S 部分 msgSigned=数字签名 msgSignedUnkownKey=使用未知密钥签名 @@ -280,8 +283,10 @@ needKey=错误 - 需要使用私钥进行邮件解密 failedDecrypt=错误 - 解密失败 badPhrase=错误 - 口令不符 +# missingMdcError=Error - missing or broken integrity protection (MDC) failedDecryptVerify=错误 - 解密/验证失败 viewInfo=;选择“查看 > Enigmail 信息”查看详细信息 +# brokenExchangeMessage=Broken PGP/MIME message from MS-Exchange. decryptedMsg=已解密的邮件 decryptedMsgWithFormatError=已解密消息(已恢复格式异常的 PHP 邮件,这可能是由于一个旧版本的 Exchange 服务器导致,因此这可能并不完整) @@ -326,6 +331,7 @@ # autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. # autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. # autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. +# postbox.cannotUseQuickReply.message=You are replying to an encrypted message. Please use the "expand" icon in the upper right corner of the text box to open your reply in a window, and send the message from there. # strings in pref-enigmail.js # oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. @@ -337,6 +343,8 @@ prefs.warnAskNever=警告: 选择此项将导致在任何一个收件人没有公钥时都会使邮件不能被加密的结果 -- 此时Enigmail也不能通知到你! prefs.warnIdleTimeForUnknownAgent=无法连接到 gpg-agent。也许您的系统使用了一个特殊工具进行口令处理(例如 gnome-keyring、seahorse-agent、KDE 钱包管理器...)。遗憾的是 Enigmail 无法控制您所使用的工具的口令超时。因此,Enigmail 中设置的超时将被忽略。 prefEnigmail.oneKeyserverOnly=错误 - 您只能指定一个密钥服务器用于自动下载缺失的 OpenPGP 密钥。 +# acSetupMessage.desc=Transfer your key to another Autocrypt-enabled device. (What is Autocrypt) +aboutLicense.desc=Enigmail 是依照 Mozilla 公共许可证 2.0 授权的开源软件。 # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,9 +361,9 @@ noPassphrase=错误 - 未提供口令 noPGPblock=错误 - 未找到任何有效 ASCII ARMORED OpenPGP 数据段 unverifiedReply=邮件的缩进部分 (回复) 可能已被修改 -keyInMessageBody=消息主体中找到密钥。点击“导入密钥”导入它 +# keyInMessageBody=A key was found in the message body. Click 'Import Key' to import the key sigMismatch=错误 - 数字签名不符 -cantImport=导入公钥时发生错误\n\n +# cantImport=Error importing public key\n\n doImportOne=导入 %1$S (%2$S)? doImportMultiple=导入下列密钥?\n\n%S previewFailed=无法读取公钥文件。 @@ -366,14 +374,15 @@ sc.removeCard=此操作不需要智能卡放在读卡器中。\n请从读卡器中去除您的智能卡,然后重新进行此操作。 sc.noCardAvailable=您的读卡器中无智能卡 \n 请将智能卡插入读卡器并重试 sc.noReaderAvailable=无法访问您的智能卡读卡器 \n 请连接您的智能卡读卡器,插入您的智能卡,并重试 -keyError.keySpecNotFound=电子邮件地址 "%S" 无法匹配到您的钥匙环上的密钥。 -keyError.keyIdNotFound=已配置的密钥 ID "%S" 无法在您的钥匙环中找到。 +# keyError.keySpecNotFound=The email address '%S' cannot be matched to a key on your keyring. +# keyError.keyIdNotFound=The configured key ID '%S' cannot be found on your keyring. keyError.resolutionAction=请在您的“账户设置”中的 OpenPGP 部分选择一个有效密钥。 missingPassphrase=缺少口令 errorHandling.gpgAgentInvalid=您的系统运行的 gpg-agent 版本不适合您的 GnuPG 版本。 errorHandling.gpgAgentError=GnuPG 与 gpg-agent (GnuPG 的一个组件) 通信时报告了一个错误。 errorHandling.dirmngrError=GnuPG 与 dirmngr (GnuPG 的一个组件) 通信时报告了一个错误。 errorHandling.pinentryError=GnuPG 无法通过 pinentry 查询您的口令。 +# errorHandling.pinentryCursesError=Your GnuPG installation is configured to use the console for pinentry. However, when using Enigmail you need a graphical version of pinentry. errorHandling.readFaq=一个安装或配置的错误阻止了Enigmail正常运行,并无法自动修正。\n\n强烈推荐在支持页面参考:https://enigmail.net/faq gpgNotFound=不能在 '%S' 定位到GnuPG程序.\n确认你在Enigmail参数中已经正确设置GnuPG可执行程序路径 @@ -384,9 +393,8 @@ prefBad=该邮件已经由 %S 数字签名,但“已被”篡改 failCancel=错误 - 密钥接收被用户中断 -failNoServer=错误 - 为指定接收密钥使用的密钥服务器 -failNoID=错误 - 未指定要接收的密钥的密钥标识 failKeyExtract=错误 - 密钥提取命令失败 +# failKeyNoSubkey=No valid (sub-)key notFirstBlock=错误 - 第一个 OpenPGP 段不是公钥段 importKeyConfirm=从邮件中导入嵌入的密钥么? failKeyImport=错误 - 密钥导入失败 @@ -425,6 +433,8 @@ identityName=标识: %S # switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. # enableEnigmail=&Disable p≡p +# amPrefAutocrypt.desc=Autocrypt is a standard that defines how to achieve convenient end-to-end-encryption of e-mails. It specifies how e-mail programs negotiate encryption capabilities using regular e-mails. + # Strings used in enigmailSingleRcptSettings.js noEncryption=您已经激活加密功能,但您并未选择任何密钥。要加密发送给 %S 的邮件,您必须从您的密钥列表中选择一个或多个有效密钥。您希望取消对 %S 的加密么? @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=您选择的功能不能在离线状态下使用。请连线重试。 -protocolNotSupported=暂不支持使用“%S://”协议下载 OpenPGP 密钥。 -gpgkeysDisabled=开启“extensions.enigmail.useGpgKeysTool”也许会有帮助。 noKeyserverConn=无法连接密钥服务器 %S。 -keyDownloadFailed=从密钥服务器下载密钥失败。状态信息为:\n%S internalError=发生内部错误。密钥无法被下载或导入。 -noKeyFound=非常抱歉,找不到任何符合搜索条件的密钥。\n请注意,密钥标识应该使用“0x”开头(例如 0xABCDEF12)。 -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=从密钥服务器查找或下载密钥失败: 无法执行 gpgkeys_%S。 - +# noKeyFound=We could not find any key matching the specified search criteria. +# keyDownload.keyUnavailable=The key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their public key by email. # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=设置密钥信任级别失败 @@ -490,7 +493,6 @@ asciiArmorFile=ASCII 格式保存文件 (*.asc) importKeyFile=导入 OpenPGP 密钥文件 gnupgFile=GnuPG 文件 -# createKeyOK=Your Key has been generated saveRevokeCertAs=创建并保存撤销证书 # revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. revokeCertFailed=无法创建撤销证书。 @@ -509,19 +511,19 @@ specificPubSecKeyFilename=%S (0x%S) 公钥+私钥 defaultPubKeyFilename=已导出的公钥 defaultPubSecKeyFilename=已导出的公钥/私钥 -noSecretKeys=未找到私钥。\n\n您希望立即创建自己的密钥么? sendKeysOk=密钥发送成功 sendKeysFailed=发送密钥失败 receiveKeysOk=密钥更新成功 receiveKeysFailed=下载密钥失败 +# keyUpload.verifyEmails=The keyserver will send you an email for each email address of your uploaded key. To confirm publication of your key, you'll need to click on the link in each of the emails you'll receive. importFromClip=您希望从剪贴板导入密钥么? importFromUrl=从此网址下载公钥: copyToClipbrdFailed=无法将选中的密钥复制到剪贴板。 copyToClipbrdOK=密钥已被复制到剪贴板 -deleteSecretKey=警告: 您正在试图删除私钥!\n如果您删除了私钥,您将无法解密任何为该密钥加密的邮件。\n\n您确实要把选中的私钥和公钥“都”删除么? +# deleteSecretKey=WARNING: You are about to delete a secret key!\nIf you delete your secret key, you will no longer be able to decrypt any messages encrypted for that key, nor will you be able to revoke it.\n\nDo you really want to delete BOTH, the secret key and the public key\n'%S'? deleteMix=警告: 您正在试图删除私钥!\n如果您删除了私钥,您将无法解密任何为该密钥加密的邮件。\n\n您确实要把选中的私钥和公钥“都”删除么? deletePubKey=您希望删除此公钥\n'%S'? deleteSelectedPubKey=您确实要删除此公钥么? @@ -529,7 +531,7 @@ revokeKeyQuestion=您即将废除密钥“%S”。\n\n您将不能再使用此密钥签名,并且一旦分发,其他人将不能再使用该密钥来加密。您仍然可以使用此密钥解密旧的邮件。\n\n您确定要继续吗? revokeKeyOk=该密钥已经成功撤销。如果您曾经将密钥上传到了某个密钥服务器,您应该重新上传一次,以便其他人能得到您的密钥撤销信息。 revokeKeyFailed=该密钥不能撤销。 -# revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! +# revokeKeyNotPresent=You have no key (0x%S) which matches this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before importing the revocation certificate! # revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. refreshAllQuestion=您未选择任何密钥。您想更新“所有”的密钥么? # refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? @@ -541,21 +543,21 @@ keyMan.button.import=导入(&I) keyMan.button.refreshAll=刷新所有密钥(&R) keyMan.button.revokeKey=废除密钥(&R) -keyMan.button.skip=跳过密钥(&S) keylist.noOtherUids=已没有其他身份 keylist.hasOtherUids=也称为 -keylist.noPhotos=没有可用的照片 -keylist.hasPhotos=照片 +# keylist.noPhotos=No photo available +# keylist.hasPhotos=Photos keyMan.addphoto.filepicker.title=选择要添加的照片 -keyMan.addphoto.warnLargeFile=您已经选择的文件超过了 25 kB。\n不推荐添加很大的文件,因为这会导致得到的密钥非常大。 +# keyMan.addphoto.warnLargeFile=The file you have chosen is larger than 25 kB.\nIt is not recommended to add very large files as it causes very large keys. keyMan.addphoto.noJpegFile=选择的文件不是 JPEG 文件。请选择其他文件。 keyMan.addphoto.failed=此照片不能被添加。 # noWksIdentity=The key %S does not have a WKS identity. +# wksUpload.noKeySupported=The upload was not successful - your provider does not seem to support WKS. -# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? -# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? +# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key '%1$S (%2$S)' for encrypting messages? +# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key '%1$S (%2$S)' for future messages? # keyman.addBlacklistKey.button=&Blacklist the key # keyman.removeBlacklistKey.button=&Remove key from Blacklist @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=更换识别码失败 -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=密钥刷新中,请等待 ... keyserverProgress.uploading=密钥上传中,请等待 ... # keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service # keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. keyserverTitle.refreshing=刷新密钥 keyserverTitle.uploading=上传密钥 +# keyserver.result.download.none=No key downloaded. +# keyserver.result.download.1of1=Key successfully downloaded. +# keyserver.result.download.1ofN=Successfully downloaded 1 of %S keys. +# keyserver.result.download.NofN=Successfully downloaded %1$S of %2$S keys. +# keyserver.result.uploadOne=Successfully uploaded 1 key. +# keyserver.result.uploadMany=Successfully uploaded %S keys. # Strings in enigmailSetupWizard -passphrase.min8keys=您的口令至少要包含8个字符! -setupWizard.reallyCancel=你真的想退出 Enigmail 安装向导? setupWizard.invalidGpg=您指定的文件不是一个 GnuPG 程序。请指定另一个文件。 -setupWizard.specifyFile=您需要指定至少一个公钥文件才能继续。 setupWizard.installFailed=看起来安装未成功。请重试安装,或者手动安装 GnuPG 然后使用“浏览”按钮定位。 # setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. # setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. -setupWizard.hashSumError=本向导未能验证已下载文件的完整性。此文件可能已损坏或者被篡改。您要继续安装吗? +# setupWizard.hashSumError=The wizard could not verify the integrity of the downloaded file. The file may be broken or tampered with. Do you want to continue the installation anyway? setupWizard.importSettingsFile=指定要载入的备份文件 -setupWizard.invalidSettingsFile=指定文件不是正确的 Enigmail 设置备份文件。 +# setupWizard.invalidSettingsFile=The specified file is not a valid Enigmail Settings backup file. setupWizard.gpgConfExists=GnuPG 配置文件已经存在。您是否要使用您的旧安装覆盖它。 -# setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. +# setupWizard.noGpgHomeDir=It appears that you configured %S to be used with GnuPG. However, this is not a directory - you cannot use it. # setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +# setupWizard.foundAcSetupMessage=Found Autocrypt Setup Message. To initiate the Autocrypt setup procedure, click on the Start Setup button below. +# setupWizard.foundAcNoSetupMsg=We determined that you are using an Autocrypt-compliant email client, but we could not find any Autocrypt Setup Message. We recommend that you create an Autocrypt Setup Message on your existing device and then click on Rescan Inbox. Alternatively, you can export your settings and keys from an existing Enigmail installation, and restore these settings here. +# setupWizard.setupComplete=Enigmail is now properly configured and ready to use. For further information about using Enigmail please visit our homepage. # Strings in installGnuPG.jsm installGnuPG.downloadFailed=尝试下载 GnuPG 时出错。请检查控制台日志获取进一步细节。 @@ -654,12 +662,12 @@ # filter.term.pgpencrypted.label=OpenPGP Encrypted # filter.encrypt.label=Encrypt to key (Enigmail) # filter.keyRequired=You must select a recipient key. -# filter.keyNotFound=Could not find an encryption key for "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +# filter.keyNotFound=Could not find an encryption key for '%S'. +# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for '%S' you will no longer be able to read the emails. # strings in enigmailConvert.jsm -converter.decryptBody.failed=未能解密主题为“%S”的邮件。\n您想使用另一个口令重试吗,或者您想跳过此邮件吗? -converter.decryptAtt.failed=未能解密附件“%1$S”,邮件主题为“%2$S”。\n您想使用另一个口令重试吗,或者您想跳过此邮件吗? +# converter.decryptBody.failed=Could not decrypt message with subject\n'%S'.\nDo you want to retry with a different passphrase or do you want to skip the message? +# converter.decryptAtt.failed=Could not decrypt attachment '%1$S'\nof message with subject\n'%2$S'.\nDo you want to retry with a different passphrase or do you want to skip the message? saveLogFile.title=保存日志文件 @@ -691,13 +699,13 @@ enigmailSettings=Enigmail设置 defaultBackupFileName=Enigmail导出结果 specifyExportFile=指定导出文件名 -homedirParamNotSUpported=不支持使用附加参数指定配置文件路径(如--homedir和--keyring)来导出/恢复设置。请使用代替方法如设置环境变量GUNPGHOME。 +# homedirParamNotSUpported=Additional parameters that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. #strings in expiry.jsm -expiry.keyExpiresSoon=你的密钥%1$S将在%2$S内过期。\n\n推荐重新生成密钥并使用新密钥配置相应的账户。 -# expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. +# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use it. +# expiry.keysExpireSoon=Your following keys will expire in less than %1$S days:\n%2$S. We recommend that you create new keys and configure the corresponding accounts to use them. +# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. +# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to "ultimate" in key properties. # expiry.OpenKeyManager=Open Enigmail Key Management # expiry.OpenKeyProperties=Open Key Properties @@ -709,6 +717,7 @@ # gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. # gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. # gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +# gpgAgent.noAutostart=You are using GnuPG version %S. This version requires that you pre-start gpg-agent before Thunderdbird is started, and that the environment variable "GPG_AGENT_INFO" is pre-loaded.\n\nThese preconditions are not met - you cannot use Enigmail until you resolve this issue. #strings in pepTrustWords.js # pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. @@ -728,12 +737,12 @@ # pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. # pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. # pepPrivacyStatus.RatingTrustedSuggestion=No action needed! -# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. +# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware that this message may not be secure. # pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. -# pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. +# pepPrivacyStatus.RatingUnderAttackSuggestion=Verify the content of this message with your communication partner using a different channel. +# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least "secure". # pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. +# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or lacks a signature. Ask your communication partner to upgrade their encryption solution or install p≡p. # pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. # pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. @@ -763,16 +772,16 @@ # handshakeDlg.label.outgoingMessage=Outgoing message # handshakeDlg.label.incomingMessage=Incoming message # handshakeDlg.error.noPeers=Cannot handshake without any correspondents. -# handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. +# handshakeDlg.error.noProtection=Please enable protection in order to use the "Handshake" function. -# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device -# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup +# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device. +# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup. #strings in autocrypt.jsm # autocrypt.setupMsg.subject=Autocrypt Setup Message # autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code displayed on your old device, then import the key to your keyring. #strings in upgradeInfo.html # upgradeInfo.doctitle=What's New in Enigmail v2.0? @@ -785,10 +794,12 @@ # upgradeInfo.autocrypt.title=Support for Autocrypt # upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. # upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. +# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. # upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. +#strings in pEpAdapter.jsm # pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +# pep.updateAvailable=A new version of the Enigmail/p≡p crypto-engine is available. Would you like to download and install the update? #strings in enigmailAbout.html aboutEnigmail.tabName=关于 Enigmail @@ -799,6 +810,7 @@ # aboutEnigmail.documentation=Documentation: # aboutEnigmail.testing=Testing: # aboutEnigmail.userSupport=User Support: +# aboutEnigmail.userSupport.team=the team and the list/forum members # aboutEnigmail.localization=Localization: See the Enigmail Language Packs page # aboutEnigmail.Credits=Credits: # aboutEnigmail.origAuthor=Original author of the Enigmail extension @@ -808,3 +820,38 @@ # aboutEnigmail.licenseSupportTitle=License & Support # aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S # aboutEnigmail.support=Support and download is available from www.enigmail.net. + +#strings in updateGnuPG.html +# updateGnuPG.tabName=GnuPG Update +# updateGnuPG.title=Updates for GnuPG +# updateGnuPG.introduction.desc=Enigmail requires GnuPG to perform its cryptographic functions. We recommend that you keep your installation of GnuPG up to date. +# updateGnuPG.updateRequired=A newer version of GnuPG is available. We strongly recommend that you keep your GnuPG installation up to date. Please click on the Install Update button to download and install the update. +# updateGnuPG.noUpdateRequired=GnuPG is up to date. +# updateGnuPG.cannotUpdate.header=Enigmail only supports updating the following packages: +# updateGnuPG.cannotUpdate.footer=You seem to use some other variant of GnuGP; unfortunately it is therefore not possible for Enigmail to update your GnuGP installation. +# updateGnuPG.installUpdate=Install Update +# updateGnuPG.noMoreUpdates=Don't check for future updates +# updateGnuPG.checkUpdate=Check for GnuPG Updates + + +#strings in keyserver.jsm +# keyserver.error.aborted=Aborted +# keyserver.error.unknown=An unknown error occurred +# keyserver.error.serverError=The keyserver reported an error. +# keyserver.error.importError=Failed to import the downloaded key. +# keyserver.error.unavailable=The keyserver is not available. +# keyserver.error.securityError=The keyserver does not support encrypted access. +# keyserver.error.certificateError=The keyserver’s certificate is not valid. +# keyserver.error.unsupported=The keyserver is not supported by Enigmail. + +#strings in mimeDecrypt.jsm +# mimeDecrypt.encryptedPart.attachmentLabel=Encrypted message part +# mimeDecrypt.encryptedPart.concealedData=This is an encrypted message part. You need to open it in a separate window by clicking on the attachment. + +#strings in gnupg-key.jsm +# import.secretKeyImportError=An error has occurred in GnuPG while importing secret keys. The import was not successful. + +#strings in importSettings.js +# 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 diff -Nru enigmail-2.0.12+ds1/lang/zh-TW/enigmail.dtd enigmail-2.1.3+ds1/lang/zh-TW/enigmail.dtd --- enigmail-2.0.12+ds1/lang/zh-TW/enigmail.dtd 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/zh-TW/enigmail.dtd 2019-10-29 17:09:36.000000000 +0000 @@ -1,8 +1,6 @@ - - - - + + @@ -20,23 +18,14 @@ - + - - - - - - - - + - - - + @@ -50,57 +39,57 @@ - - - - + + + + + + - - + + - - + + - - + + - - + - - - + - + - + + - - - - - - - - - + + + + + +'"> + + + @@ -111,12 +100,15 @@ - - + + + + + @@ -127,11 +119,11 @@ - + - + @@ -145,7 +137,7 @@ - + @@ -175,21 +167,21 @@ - + - + - - - + + + - + @@ -209,6 +201,7 @@ + @@ -231,10 +224,10 @@ OpenPGP 安全性)"> - - + + - + @@ -276,10 +269,10 @@ - + - - + + @@ -298,7 +291,7 @@ - + @@ -309,11 +302,11 @@ - + - + @@ -345,11 +338,11 @@ - - + + - + @@ -358,17 +351,16 @@ - + - - - - - - - + + + + + + @@ -381,8 +373,8 @@ - - + + @@ -452,12 +444,12 @@ - + - - + + @@ -467,7 +459,7 @@ - + @@ -488,7 +480,7 @@ - + @@ -500,21 +492,21 @@ - + - + - + - + - - + + @@ -535,14 +527,14 @@ - + - + @@ -593,9 +585,9 @@ - - - + + + @@ -608,9 +600,9 @@ - + - + @@ -665,119 +657,32 @@ - - + - - - - - - - - - - - - - - - - - -注意:無論是否啟用,Enigmail將始終驗證所有帳號或身份的郵件中的簽名。"> - - - + - - - - - - - - - - - - - - - - - -公鑰 是 用來讓其他人 寄加密訊息給您的。您可以發給任何人。"> -私鑰 是 用來讓您自己 解開加密郵件或簽署郵件用的。 -不要洩漏給任何人。"> -私鑰 是 用來讓您自己 解開加密郵件或簽署郵件用的。 -不要洩漏給任何人。 -為了讓您的私鑰有多一層保護,您將在接下來兩個視窗被提示輸入密語。"> -密語 是用來保護您的私鑰的密碼,可防止您的私鑰被濫用。"> -不 建議您使用變音字母(例如 ä、é、ñ)或其他語言的特殊字元。"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -感謝使用Enigmail。"> - - - - - - - - - + + + + + + + + + + + @@ -796,70 +701,87 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + + - + - - + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/lang/zh-TW/enigmail.properties enigmail-2.1.3+ds1/lang/zh-TW/enigmail.properties --- enigmail-2.0.12+ds1/lang/zh-TW/enigmail.properties 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/lang/zh-TW/enigmail.properties 2019-10-29 17:09:36.000000000 +0000 @@ -7,7 +7,7 @@ enigAlert=Enigmail 警告 enigConfirm=Enigmail 確認 -# enigInfo=Enigmail Information +enigInfo=Enigmail 資訊 enigError=Enigmail 錯誤 enigPrompt=Enigmail 提示 @@ -20,12 +20,12 @@ dlg.button.close=關閉 (&C) dlg.button.continue=繼續 (&T) dlg.button.skip=略過 (&S) -# dlg.button.overwrite=&Overwrite +dlg.button.overwrite=&覆寫 dlg.button.view=檢視 (&V) dlg.button.retry=重試 (&R) dlg.button.ignore=忽略 (&I) -# dlg.button.install=&Install -# dlg.button.ok=&OK +dlg.button.install=&安裝 +dlg.button.ok=&OK repeatPrefix=\n\n該警告重複 %S。 repeatSuffixSingular=次 @@ -36,24 +36,24 @@ initErr.howToFixIt=必須要有 GnuPG 才能使用 Enigmail。若您還沒有安裝 GnuPG,最簡單的方式就是直接使用下方的「安裝精靈」。 initErr.setupWizard.button=安裝精靈 (&S) passphraseCleared=已清除密碼。 -# cannotClearPassphrase=You are using a non-standard tool (such as gnome-keyring) for passphrase handling. Clearing the passphrase is therefore not possible from within Enigmail. +cannotClearPassphrase=您正在使用非標準的密碼短語管理工具(例如:gnome-keyring),所以無法在Enigmail上使用密碼短語。 noPhotoAvailable=無可用照片 debugLog.title=Enigmail 除錯紀錄 error.photoPathNotReadable=無法讀取照片路徑「%S」。 -# generalError=Error: %S +generalError=錯誤:%S # Strings in configure.jsm enigmailCommon.versionSignificantlyChanged=這個新版的 Enigmail 在處理設定與選項上有大幅度的變更。我們已嘗試移轉舊版的設定到這個版本,但無法自動轉換所有設定。請再次檢查新的設定有沒有問題。 enigmailCommon.checkPreferences=檢查偏好設定… -# preferences.defaultToPgpMime=We have changed the default message encoding in Enigmail from Inline-PGP to PGP/MIME. We recommend you keep this as default.\n\nIf you still wish to use Inline-PGP by default, you can do so in the Account Settings under OpenPGP Security. +preferences.defaultToPgpMime=我們將Enigmail的預設訊息加密方法由Inline-PGP變更為PGP/MIME,我們建議您維持這個改變。\n若您想要以Inline-PGP為預設,您可以在OpenPGP安全性的帳號設定中變更。 ##################################################################### # Strings in enigmailAbout.js ##################################################################### usingVersion=使用 Enigmail 版本 %S -# enigmailPepVersion=Enigmail/p≡p version %S +enigmailPepVersion=Enigmail/p≡p 版本 %S usingAgent=使用 %1$S 執行檔 %2$S 來進行加解密 agentError=錯誤: 無法存取 Enigmime 服務! @@ -73,7 +73,7 @@ passNoMatch=密語不相同,請重新輸入。 passCheckBox=若不要為金鑰指定密語請勾選此欄位 passUserName=請指定此身份的使用者名稱。 -# keygen.missingUserName=There is no name specified for the selected account/identity. Please enter a value in the field "Your name" in the account settings. +keygen.missingUserName=所選擇的帳號/身分未指定名字,請在帳號設定下的「您的名字」中輸入一個值。 keygen.passCharProblem=您在密語中使用特殊字元,但可能會在其他應用程式中造成問題。我們建議您只使用下列字元:\na-z A-Z 0-9 /.;:-,!?(){}[]%* passSpaceProblem=由於技術問題,您的密語不能以空白開始或結束。 changePassFailed=密語更改失敗。 @@ -93,7 +93,7 @@ securityInfo=Enigmail 安全資訊\n\n\n enigHeader=Enigmail: -enigContentNote=Enigmail: * 此訊息附件尚未經簽署或加密 *\n\n\n +enigContentNote=Enigmail: * 此訊息附件尚未經簽署或加密 *\n possiblyPgpMime=可能是由 PGP/MIME 加密或簽署的訊息,請點擊「解密」按鈕以驗證。 saveAttachmentHeader=Enigmail: 儲存解密附件 @@ -113,16 +113,17 @@ attachment.noMatchFromSignature=附件中沒有與「%S」符合的簽章 fixBrokenExchangeMsg.failed=並未成功修復訊息。 enigmail.msgViewColumn.label=Enigmail -# enigmailPep.msgViewColumn.label=Enigmail/p≡p -# wksNoIdentity=This key is not linked to any of your email accounts. Please add an account for at least one of the following email addresse(s):\n\n%S -# wksConfirmSuccess=Confirmation email sent. -# wksConfirmFailure=Sending the confirmation email failed. -# autocrypt.importSetupKey.accountPreconfigured=Your account is already correctly configured for Autocrypt.\n\nDo you really want to overwrite your settings with this setup message? -# autocrypt.importSetupKey.selfCreated=This message was created by your currently running instance of Enigmail.\n\nPlease switch to the email client to which you want to transfer the settings, and click on the message on that email client to import the settings. -# autocrypt.importSetupKey.invalidMessage=Error - could not read setup message. The message seems to be corrupted. Please try to create a new setup message on your "other" device. -# autocrypt.importSetupKey.invalidKey=Error - the key could not be imported. The key is either not supported by your version of GnuPG, or it got corrupted. -# autocrypt.importSetupKey.wrongPasswd=The password you entered is wrong. Do you want to retry? -# autocrypt.importSetupKey.success=The Autocrypt setup message was processed successfully. Autocrypt is now available for your account '%S'. +enigmailPep.msgViewColumn.label=Enigmail/p≡p +detailsDlg.importKey=匯入金鑰 +wksNoIdentity=這個鑰匙未連結您任何一個email帳號,請新增一個帳號予至少一個來自以下的email地址:\n\n%S +wksConfirmSuccess=驗證email已送出 +wksConfirmFailure=驗證email送出失敗 +autocrypt.importSetupKey.accountPreconfigured=您的帳號已經正確配置給Autocrypt。\n\n您真的確定要覆寫您的設定嗎? +autocrypt.importSetupKey.selfCreated=這個訊息是透過正在運作的Enigmail範例所產生的。\n\n請轉至您希望傳送設定的email客戶,並點選那個email客戶的訊息以匯入設定。 +autocrypt.importSetupKey.invalidMessage=錯誤 - 無法讀取設定訊息。訊息似乎損毀了,請試著在您的其他裝置上建立新的設定訊息。 +autocrypt.importSetupKey.invalidKey=錯誤 - 鑰匙無法匯入。這支鑰匙可能不受您的GnuPG版本支援,或是已經損毀。 +autocrypt.importSetupKey.wrongPasswd=您輸入的密碼錯誤,是否重新輸入? +autocrypt.importSetupKey.success=已經成功處理Autocrypt設定訊息,您的帳號 %S 已經可以使用Autocrypt。 ##################################################################### # Strings in enigmailMsgComposeOverlay.js @@ -138,48 +139,46 @@ sendingHiddenRcpt=此訊息有密件副本收件人。若此訊息是加密訊息,您可以隱藏密件副本收件者,但某些產品使用者(例如 PGP)將無法解密該訊息。因此我們建議您不要加密有密件副本收件者的訊息。 sendWithHiddenBcc=隱藏密件副本收件者 sendWithShownBcc=正常加密 -sendingNews=加密傳送操作中止。\n\n因為有新聞群組收件者,無法加密此訊息。請取消加密後再發送。 +sendingNews=加密傳送操作中止。\n\n因為有新聞群組收件者,無法加密此訊息。請取消加密後再寄送。 sendToNewsWarning=警告:您正要向新聞群組傳送加密郵件。\n\n只有新聞群組的所有成員都能解密訊息的情况下才有意義(也就是說,訊息需要使用群組中所有成員的金鑰加密),因此不推薦這樣做。請確定您知道自己正在做什麼。\n\n要繼續嗎? hasHTML=HTML 郵件警告:\n此訊息包含 HTML,可能會使簽署或加密失敗。為避免這個情况,您應該在點擊「寫信/回覆」時按住 Shift 鍵來傳送經簽署的郵件。\n如果您預設要簽署郵件,您應該為此帳號取消選擇「用 HTML 格式撰寫郵件」來永久停用 HTML。 strippingHTML=訊息中的 HTML 格式將在轉換成純文字以進行簽署/加密消失。您要繼續嗎? msgCompose.button.sendAnyway=還是傳送訊息 (&S) -attachWarning=此訊息的附件不在本機,無法加密。若要加密附件,請先將它們儲存至本機後再新增為附件。您還是要發送訊息嗎? -quotedPrintableWarn=您為要傳送的訊息啟用了「quoted-printable」編碼。可能會在解密或驗證時出現錯誤。\n您是否要關閉以「quoted-printable」編碼發送訊息? +attachWarning=此訊息的附件不在本機,無法加密。若要加密附件,請先將它們儲存至本機後再新增為附件。您還是要傳送訊息嗎? +quotedPrintableWarn=您為要傳送的訊息啟用了「quoted-printable」編碼。可能會在解密或驗證時出現錯誤。\n您是否要關閉以「quoted-printable」編碼傳送訊息? minimalLineWrapping=您設定每行在 %S 字元後換行。為了正確加密和簽署,這個值應至少為 68。\n您現在是否想改成 68 字元後換行? warning=警告 signIconClicked=您已經手動修改簽章。所以當您撰寫郵件的時候,啟(停)用簽署不再跟隨啟(停)用加密。 -# 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.mimeMsg=The message you are replying to contained both unencrypted and encrypted parts. Some encrypted message parts are invisible to you.\n\nIf the sender was not able to decrypt the hidden message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nWe recommend that you don't reply to the message, but create a new message containing your answer. -# msgCompose.partiallyEncrypted.inlinePGP=The message you are replying to contained both unencrypted and encrypted parts. If the sender was not able to decrypt some message parts originally, you may be leaking confidential information that the sender was not able to originally decrypt themselves.\n\nPlease consider removing all quoted text from your reply to this sender. +errorOwnKeyUnusable=在現在的身分下所配置的鑰匙ID %S 無法產生可用的OpenPGP鑰匙。\n\n請確認您持有的鑰匙是有效且未過期的,且您的帳號設定中指定該鑰匙。如果您的鑰匙未過期,請檢查是否將擁有者的信任級別設定為「完全」或「最高」。 +msgCompose.cannotSaveDraft=儲存草稿時發生錯誤。 +msgCompose.partiallyEncrypted.short=堤防洩漏敏感訊息 - 部分加密郵件 +msgCompose.partiallyEncrypted.inlinePGP=您正在回覆的郵件含有加密及未加密的部分。如果寄送者原本無法解密已加密的部分,您可能會因此洩漏機密訊息給原本無法自行解密訊息的寄送者。\n\n請考慮回覆時移除所有引用郵件原文。 msgCompose.internalEncryptionError=內部錯誤: promised encryption disabled -# msgCompose.internalError=An internal error has occurred. +msgCompose.internalError=發生內部錯誤 msgCompose.toolbarTxt.signAndEncrypt=將簽署並加密此訊息 msgCompose.toolbarTxt.signOnly=將簽署此訊息 msgCompose.toolbarTxt.encryptOnly=將加密此訊息 msgCompose.toolbarTxt.noEncryption=將不會簽署並加密此訊息 msgCompose.toolbarTxt.disabled=已為所選擇的身分停用 Enigmail -# msgCompose.protectSubject.tooltip=Protect the message subject -# msgCompose.noSubjectProtection.tooltip=Do not protect the message subject -# msgCompose.encryptedSubjectStub=Encrypted Message -# msgCompose.protectSubject.dialogTitle=Enable Protection of Subject? -# msgCompose.protectSubject.question=Regular encrypted emails contain the unredacted subject.\n\nWe have established a standard to hide the original subject in the encrypted message\nand replace it with a dummy text, such that the subject is only visible after the email is decrypted.\n\nDo you want to protect the subject in encrypted messages? -# msgCompose.protectSubject.yesButton=&Protect subject -# msgCompose.protectSubject.noButton=&Leave subject unprotected +msgCompose.protectSubject.tooltip=保護郵件主旨 +msgCompose.noSubjectProtection.tooltip=不˙要保護郵件主旨 +msgCompose.protectSubject.dialogTitle=啟用主旨保護嗎? +msgCompose.protectSubject.question=標準加密郵件含有未編輯的主旨。\n\n我們啟用了一個標準來隱藏原來的加密郵件中的主旨,並更換成一段假替的文字,原本的主旨需要解密後才能看到。\n\n您想要保護加密郵件的主旨嗎? +msgCompose.protectSubject.yesButton=&保護主旨 +msgCompose.protectSubject.noButton=&不用保護主旨 -# msgCompose.detailsButton.label=Details ... +msgCompose.detailsButton.label=細節... msgCompose.detailsButton.accessKey=D -# msgCompose.pepSendUnknown=Unknown -# msgCompose.pepSendUnsecure=Unsecure -# msgCompose.pepSendSecure=Secure -# msgCompose.pepSendTrusted=Secure & Trusted +msgCompose.pepSendUnknown=未知 +msgCompose.pepSendUnsecure=不安全 +msgCompose.pepSendSecure=安全 +msgCompose.pepSendTrusted=安全且可信任 -# pep.alert.disabledForIdentity=p≡p is disabled for the current identity. Please enable p≡p via the Enigmail/p≡p preferences. -# pep.alert.weakReply=You’re about to forward or reply to a secure message as insecure. If you choose to proceed, confidential information might be leaked putting you and your communication partner at risk. Are you sure you want to continue? +pep.alert.disabledForIdentity=目前身分未啟用p≡p,請自Enigmail/p≡p偏好設定中啟用p≡p。 +pep.alert.weakReply=您即將轉寄或回覆一封安全的訊息,但您所送出的訊息並不安全。如果您選擇繼續,有可能會洩漏機密資訊,並危及您及您的通訊對象。您確定要繼續? # note: should end with double newline: @@ -192,7 +191,7 @@ keyExpired=金鑰「%S」已過期 statPGPMIME=PGP/MIME -# statSMIME=S/MIME +statSMIME=S/MIME statSigned=已簽署 statEncrypted=已加密 statPlain=未簽署或加密 @@ -210,9 +209,9 @@ configureNow=您尚未為這個身份設定 Enigmail 安全資訊,您要現在設定嗎? # encryption/signing status and associated reasons: -# encryptMessageAuto=Encrypt Message (auto) +encryptMessageAuto=加密郵件(自動) encryptMessageNorm=加密郵件 -# signMessageAuto=Sign Message (auto) +signMessageAuto=簽署郵件(自動) signMessageNorm=簽證郵件 encryptOff=加密: 關 @@ -240,21 +239,21 @@ # PGP/MIME status: -# pgpmimeNormal=Protocol: PGP/MIME -# inlinePGPNormal=Protocol: Inline PGP -# smimeNormal=Protocol: S/MIME -# pgpmimeAuto=Protocol: PGP/MIME (auto) -# inlinePGPAuto=Protocol: Inline PGP (auto) -# smimeAuto=Protocol: S/MIME (auto) +pgpmimeNormal=通訊協定:PGP/MIME +inlinePGPNormal=通訊協定:Inline PGP +smimeNormal=通訊協定:S/MIME +pgpmimeAuto=通訊協定:PGP/MIME(自動) +inlinePGPAuto=通訊協定:Inline PGP(自動) +smimeAuto=通訊協定:S/MIME(自動) # should not be used anymore pgpmimeYes=將使用 PGP/MIME pgpmimeNo=將使用行內 PGP # Attach own key status (tooltip strings): -# attachOwnKeyNo=Your own key will not be attached -# attachOwnKeyYes=Your own key will be attached -# attachOwnKeyDisabled=Your own key cannot be attached. You have to select a specific key\nin the OpenPGP section of the Account Settings to enable this feature. +attachOwnKeyNo=您自己的公鑰不會被夾帶 +attachOwnKeyYes=您自己的公鑰會被夾帶 +attachOwnKeyDisabled=您的公鑰無法夾帶,您必須選擇特定的鑰匙。可在帳號設定下的OpenPGP欄位開啟這個功能。 rulesConflict=偵測到收件者規則衝突。\n%S\n\n您是要仍然按照此設定傳送訊息嗎? msgCompose.button.configure=設定 (&C) @@ -269,6 +268,10 @@ clickDetailsButton=,點擊「詳細資訊」按鈕取得更多資訊 clickImportButton=,點擊「匯入金鑰」按鈕下載金鑰 keyTypeUnsupported=,您的版本的 GnuPG 不支援該類型金鑰 +decryptManually=;點擊「解密」按鈕以解密訊息。 +verifyManually=;點擊「驗證」按鈕以驗證簽署 +headerView.button.verify=驗證 +headerView.button.decrypt=解密 msgPart=郵件 %S 的片段 msgSigned=已簽署 msgSignedUnkownKey=已用未知金鑰簽署 @@ -280,55 +283,58 @@ needKey=錯誤 - 缺少用於解密訊息的私鑰 failedDecrypt=錯誤 - 解密失敗 badPhrase=錯誤 - 密語無效 +missingMdcError=錯誤 - 系統完整性保護(MDC)欠缺或損毀 failedDecryptVerify=錯誤 - 解密/驗證失敗 viewInfo=,請參考檢視 > 訊息安全性資訊 +brokenExchangeMessage=來自MS-Exchange的破損的PGP/MIME郵件 decryptedMsg=解密後的訊息 decryptedMsgWithFormatError=已解密的訊息(可能因舊版的 Exchange 伺服器毀損了 PGP 郵件,已恢復的內容可能不能正常閱讀) -# usedAlgorithms=Used Algorithms: %1$S and %2$S -# pepStatusInfo.text=p≡p Message Status. -# pepStatusInfo.title.m3=Under Attack -# pepStatusInfo.info.m3=This message is not secure and has been tampered with. -# pepStatusInfo.title.m1=Mistrusted -# pepStatusInfo.info.m1=This message has a communication partner that has previously been marked as mistrusted -# pepStatusInfo.title.r0=Unknown -# pepStatusInfo.info.r0=This message does not contain enough information to determine if it is secure. -# pepStatusInfo.title.r1=Cannot Decrypt -# pepStatusInfo.info.r1=This message cannot be decrypted because the key is not available. -# pepStatusInfo.title.r2=Cannot Decrypt -# pepStatusInfo.info.r2=This message cannot be decrypted because the key is not available. -# pepStatusInfo.title.r3=Unsecure -# pepStatusInfo.info.r3=This message is unsecure. -# pepStatusInfo.title.r4=Unsecure for Some -# pepStatusInfo.info.r4=This message is unsecure for some communication partners. -# pepStatusInfo.title.r5=Unreliable Security -# pepStatusInfo.info.r5=This message has unreliable protection. -# pepStatusInfo.title.r6=Secure... -# pepStatusInfo.info.r6=This message is secure but you still need to verify the identity of your communication partner. -# pepStatusInfo.title.r7=Secure & Trusted -# pepStatusInfo.info.r7=This message is secure and trusted. - -# pepStatusInfo.color.green=Green -# pepStatusInfo.color.yellow=Yellow -# pepStatusInfo.color.red=Red -# pepRevokeTrust.question=Do you really want to cancel the trust for %S? -# pepRevokeMistrust.question=Do you really want to re-trust the key for %S? -# pepRevokeTrust.doRevoke=Cancel &trust - -# wksConfirmationReq=Web Key Directory Confirmation Request -# wksConfirmationReq.message=This message has been sent by your email provider to confirm deployment of your OpenPGP public key\nin their Web Key Directory.\nProviding your public key helps others to discover your key and thus being able to encrypt messages to you.\n\nIf you want to deploy your key in the Web Key Directory now, please click on the button "Confirm Request" in the status bar.\nOtherwise, simply ignore this message. -# wksConfirmationReq.button.label=Confirm Request - -# autocryptSetupReq=Perform Autocrypt Setup -# autocryptSetupReq.button.label=Start Setup -# autocryptSetupReq.setupMsg.desc=This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. -# autocryptSetupReq.setupMsg.backup=You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. -# autocryptSetupReq.message.import=To import the settings and key(s) in Enigmail, please click on the "Start Setup" button in the status bar. -# autocryptSetupReq.message.sent=Please click on the message on your new device and follow the instuctions to import the settings. +usedAlgorithms=所使用的演算法:%1$S及%2$S +pepStatusInfo.text=p≡p 訊息狀態 +pepStatusInfo.title.m3=遭受攻擊 +pepStatusInfo.info.m3=這份訊息不安全且曾被動過手腳。 +pepStatusInfo.title.m1=無法信任的 +pepStatusInfo.info.m1=這份訊息包含一個曾被標記為不可信任的通訊對象。 +pepStatusInfo.title.r0=未知 +pepStatusInfo.info.r0=這份訊息含有的資訊不足以確定是否為安全。 +pepStatusInfo.title.r1=無法解密 +pepStatusInfo.info.r1=無法解密此訊息,因為無可用的鑰匙。 +pepStatusInfo.title.r2=無法解密 +pepStatusInfo.info.r2=無法解密此訊息,因為無可用的鑰匙。 +pepStatusInfo.title.r3=不安全 +pepStatusInfo.info.r3=此訊息不安全 +pepStatusInfo.title.r4=對部分人不安全 +pepStatusInfo.info.r4=此訊息對部分通訊對象不安全 +pepStatusInfo.title.r5=不可信賴的安全性 +pepStatusInfo.info.r5=此訊息含有不可信賴的保護 +pepStatusInfo.title.r6=安全... +pepStatusInfo.info.r6=此訊息安全,但您仍須驗證您的通訊對象。 +pepStatusInfo.title.r7=安全且可信任 +pepStatusInfo.info.r7=此訊息安全且可信任 + +pepStatusInfo.color.green=綠 +pepStatusInfo.color.yellow=黃 +pepStatusInfo.color.red=紅 +pepRevokeTrust.question=是否取消對%S的信任? +pepRevokeMistrust.question=是否重新信任%S的鑰匙? +pepRevokeTrust.doRevoke=取消 &信任 + +wksConfirmationReq=網路鑰匙路徑確認要求 +wksConfirmationReq.message=您的 email 提供者寄送此郵件,以確認您的 OpenPGP 公鑰布署在他們的網路鑰匙路徑中。\n提供您的公鑰給其他人,能讓他們藉此加密郵件給您。\n\n如果您希望將您的鑰匙布署在網路鑰匙路徑中的話,請點選狀態列中的「確認要求」按鈕。\n否則,請忽視此郵件。 +wksConfirmationReq.button.label=確認要求 + +autocryptSetupReq=執行Autocrypte設定 +autocryptSetupReq.button.label=進行設定 +autocryptSetupReq.setupMsg.desc=此郵件含有將您的Autocrypt設定及您的密鑰自您原有裝置安全地傳送所需的所有資訊。 +autocryptSetupReq.setupMsg.backup=您可以保留此郵件並當做您密鑰的備份。如果您想要這麼做,您需要寫下密碼並妥善保管。 +autocryptSetupReq.message.import=若要在Enigmail匯入設定及鑰時,請點選狀態列的「開始設定」 +autocryptSetupReq.message.sent=請在您的新裝置上點選郵件,並遵循指示匯入設定。 +postbox.cannotUseQuickReply.message=您正在回覆一則加密訊息。請使用文字方塊右上角的「展開」圖示打開回覆視窗,並用它傳送訊息。 # strings in pref-enigmail.js -# oldGpgVersion20=Enigmail initialization failed.\n\nYou are using GnuPG version %1$S, which is not supported anymore. Enigmail requires GnuPG version %2$S or newer. Please upgrade your GnuPG installation, or Enigmail will not work. +oldGpgVersion20=Enigmail初始化失敗。\n\n您正在使用GnuPG %1$S 版,該版本已不受支援。Enigmail需求GnupG %2$S 版或更新的版本。請升級您的GnuPG,否則Enigmail無法啟用。 locateGpg=尋找 GnuPG 程式 invalidGpgPath=無法執行指定路徑下的 GnuPG。在您重新啟動軟體或更改路徑前將無法使用 Enigmail。 warningsAreReset=已重設所有警告。 @@ -337,6 +343,8 @@ prefs.warnAskNever=警告: 啟用該選項會造成當您缺少任何收件者的公鑰時傳送未加密的郵件,且 Enigmail 將不會提醒您。 prefs.warnIdleTimeForUnknownAgent=無法連線至 gpg-agent。可能是您的系統使用了特別的工具來管理密語(例: gnome-keyring, seahorse-agent, KDE wallet manager 等等)。可惜的是 Enigmail 無法控制您使用的工具的密語逾時設定,所以 Enigmail 當中的逾時設定將被忽略。 prefEnigmail.oneKeyserverOnly=錯誤 - 您僅能指定一組金鑰伺服器來自動下載缺少的 OpenPGP 金鑰。 +acSetupMessage.desc=將您的鑰時傳送到另一個啟用Autocrypt的裝置 (What is Autocrypt) +aboutLicense.desc=Enigmail是根據 Mozilla Public License 2.0 授權的開源軟體。 # Strings used in core.jsm # (said file also re-uses some strings from above) @@ -353,12 +361,12 @@ noPassphrase=錯誤 - 未指定密語 noPGPblock=錯誤 - 找不到有效的 armored OpenPGP 資料區塊 unverifiedReply=訊息的縮排部分(引用文章)可能被修改過 -# keyInMessageBody=Key in message body found. Click 'Import Key' to import the key +keyInMessageBody=郵件內文找到一支鑰匙。點選「匯入鑰匙」以匯入鑰匙。 sigMismatch=錯誤 - 簽章不符 cantImport=匯入公鑰時發生錯誤\n\n -# doImportOne=Import %1$S (%2$S)? -# doImportMultiple=Import the following keys?\n\n%S -# previewFailed=Can't read public key file. +doImportOne=匯入 %1$S (%2$S) ? +doImportMultiple=匯入以下鑰匙嗎?\n\n%S +previewFailed=無法讀取公鑰文件。 # Strings used in errorHandling.jsm sc.wrongCardAvailable=讀卡機中的智慧卡 %S 無法用於處理訊息。\n請插入智慧卡 %S 後重試。 @@ -366,34 +374,34 @@ sc.removeCard=讀卡機中不能有智慧卡。\n請移除智慧卡後重試。 sc.noCardAvailable=讀卡機中找不到任何智慧卡。\n請插入智慧卡後重試。 sc.noReaderAvailable=無法存取您的智慧卡讀卡機\n請連結您的讀卡機並插入智慧卡後重試。 -# keyError.keySpecNotFound=The email address "%S" cannot be matched to a key on your keyring. -# keyError.keyIdNotFound=The configured key ID "%S" cannot be found on your keyring. -# keyError.resolutionAction=Please select a valid key in the OpenPGP section of your Account Settings. -# missingPassphrase=Missing passphrase -# errorHandling.gpgAgentInvalid=Your system is running a version of gpg-agent that is not suitable for your GnuPG version. -# errorHandling.gpgAgentError=GnuPG reported an error in the communication with gpg-agent (a component of GnuPG). -# errorHandling.dirmngrError=GnuPG reported an error in the communication with dirmngr (a component of GnuPG). -# errorHandling.pinentryError=GnuPG cannot query your passphrase via pinentry. -# errorHandling.readFaq=This is a system setup or configuration error that prevents Enigmail from working properly and cannot be fixed automatically.\n\nWe strongly recommend that you consult our support web site at https://enigmail.net/faq. +keyError.keySpecNotFound=信箱地址 %S 無法與您的鑰匙圈上的鑰匙配對。 +keyError.keyIdNotFound=無法在您的鑰匙圈上找到已配置的鑰匙ID %S +keyError.resolutionAction=請在帳號設定的OpenPGP版面中,選擇一支有效的鑰匙。 +missingPassphrase=缺少密碼短語 +errorHandling.gpgAgentInvalid=您的系統正在運作的gpg-agent版本與您的GnuPG版本不相容。 +errorHandling.gpgAgentError=GnuPG回報一個與gpg-agent(GnuPG的一個部件)聯絡時的錯誤。 +errorHandling.dirmngrError=GnuPG回報一個與dirmngr(GnuPG的一個部件)聯絡時的錯誤。 +errorHandling.pinentryError=GnuPG無法透過pinentry詢問您的密碼短語。 +errorHandling.pinentryCursesError=銀的GnuPG安裝已經配置成可使用pinentry。然而,當使用Enigmail時,您需要一個圖形版本的pinentry。 +errorHandling.readFaq=這是一個系統設定或配置上的錯誤,造成Enigmail無法順利運作或自動修復。\n\n我們強烈建議您向我們的支援部門網站求助:https://enigmail.net/faq gpgNotFound=找不到 GnuPG 程式「%S」。\n請確定你已經在 Enigmail 偏好設定中設定正確的 GnuPG 執行檔路徑。 gpgNotInPath=無法在 PATH 環境變數的路徑中找到 GnuPG。\n請確定你已經在 Enigmail 偏好設定中設定正確的 GnuPG 執行檔路徑。 -# enigmailNotAvailable=Enigmail core Service not available +enigmailNotAvailable=Enigmail核心服務不可用 prefGood=來自 %S 的有效簽章 prefBad=來自 %S 的無效簽章 failCancel=錯誤 - 使用者取消接收金鑰 -failNoServer=錯誤 - 未指定要從哪台金鑰伺服器取得金鑰 -failNoID=錯誤 - 未指定要下載的金鑰身分 failKeyExtract=錯誤 - 金鑰解壓縮指令失敗 +failKeyNoSubkey=無有效的鑰匙(子鑰) notFirstBlock=錯誤 -第一個 OpenPGP 區塊不是公鑰區塊 importKeyConfirm=要匯入訊息中嵌入的公鑰嗎? failKeyImport=錯誤 - 金鑰匯入失敗 fileWriteFailed=檔案 %S 寫入失敗 importKey=自下列金鑰伺服器匯入公鑰 %S: -uploadKey=傳送公鑰 %S 發送到金鑰伺服器: +uploadKey=傳送公鑰 %S 到金鑰伺服器: keyId=金鑰 ID keyAndSigDate=金鑰 ID:0x%1$S / 簽署於 %2$S keyFpr=金鑰指紋: %S @@ -416,22 +424,24 @@ sendLaterCmd.label=稍後再寄 # Strings used in enigmailAttachmentDialog.js -# pgpMimeNote=NOTE: PGP/MIME is not supported by all email clients. If you are unsure, select the %S option. +pgpMimeNote=注意:並非所有的email客戶都支援PGP/MIME,如果您不確定,請選擇%S選項。 first=第一 second=第二 # Strings used in am-enigprefs.js / enigmailEditIdentity.js encryptKeyHeader=選擇用來加密的 OpenPGP 金鑰 identityName=身份: %S -# switchPepMode=You are currently using the 'p≡p Junior' mode of Enigmail.\n\nBy enabling OpenPGP or S/MIME for an account, you are disabling p≡p and use the 'regular' mode of Enigmail without p≡p. -# enableEnigmail=&Disable p≡p +switchPepMode=您正在使用Enigmail的p≡p兒童模式\n\n當您為一個帳號啟用OpenPGP或S/MIME,您將關閉p≡p並使用正常模式的Enigmail。 +enableEnigmail=&關閉p≡p +amPrefAutocrypt.desc=Autocrypt是一個定義如何管理便利的終端對終端的email加密準則,它指定了email程式該如何透過一般的email協調加密能力。 + # Strings used in enigmailSingleRcptSettings.js -noEncryption=您已經啟用加密,但您沒有選擇所使用的金鑰。您需要從您的金鑰清單中指定有效的金鑰來發送加密郵件給 %1$S。您是否要為 %2$S 取消加密? +noEncryption=您已經啟用加密,但您沒有選擇所使用的金鑰。您需要從您的金鑰清單中指定有效的金鑰來寄送加密郵件給 %1$S。您是否要為 %2$S 取消加密? noKeyToUse=(無 — 不加密) noEmptyRule=規則不能為空!請在規則欄位中輸入電子郵件地址。 invalidAddress=您輸入的電子郵件地址無效。請不要輸入收件人的名字,只需要電子郵件地址即可。例如:\n無效:Some Name \n有效:some.name@address.net -# noCurlyBrackets=The curly brackets {} have a special meaning and should not be used in an email address. If you want to modify the matching behavior for this rule, use the 'Apply rule if recipient ...' option.\nMore information is available from the Help button. +noCurlyBrackets=大括號 { } 有特殊意義,不能用於電子郵件地址。如果您需要修改這個規則的符合行為,請使用「當收件人…,套用規則」選項。\n點擊「說明」按鈕檢視更多資訊。 # Strings used in enigmailRulesEditor.js never=從不 @@ -444,17 +454,10 @@ # Strings used in enigmailSearchKey.js needOnline=您選擇的功能在離線模式下無法使用。請連線後重試。 -protocolNotSupported=無法使用您選擇的通訊協定「%S://」來下載 OpenPGP 金鑰。 -gpgkeysDisabled=啟用「extensions.enigmail.useGpgKeysTool」選項可能會有幫助。 noKeyserverConn=無法連線至金鑰伺服器 %S。 -keyDownloadFailed=從金鑰伺服器下載金鑰失敗。錯誤資訊如下:\n%S internalError=發生內部錯誤。無法下載或匯入金鑰。 -noKeyFound=很抱歉,找不到符合搜尋條件的金鑰。\n請注意金鑰 ID 前需要加 0x 字樣(例如 0xABCDEF12)。 -# keyDownload.keyUnavailable=We are sorry, but the key with ID %S is not available on the keyserver. Most likely, the owner of the key did not upload their key to the keyserver.\n\nPlease ask the sender of the message to send you their key by email. - -# gpgkeys_%S is one of the gpg command line tools gpgkeys_hkp, gpgkeys_ldap, etc. -gpgKeysFailed=從金鑰伺服器搜尋或下載金鑰失敗: 無法執行 gpgkeys_%S。 - +noKeyFound=無法找不到符合搜尋條件的金鑰。 +keyDownload.keyUnavailable=鑰匙ID %S 在您的鑰匙伺服器上不可用。極有可能鑰匙的擁有者未將他們的鑰匙傳上鑰匙伺服器。\n\n請要求郵件的寄送者透過email,將他們的公鑰寄送給您。 # Strings in enigmailEditKeyTrustDlg.xul setKeyTrustFailed=設定所有人信任程度失敗 @@ -463,9 +466,9 @@ # Strings in enigmailSignKeyDlg.js signKeyFailed=金鑰簽署失敗 alreadySigned.label=註: 已使用指定的私鑰簽署金鑰 %S。 -# alreadySignedexportable.label=Note: the key %S is already signed exportable with the selected secret key. A local signature does not make sense. +alreadySignedexportable.label=注意:鑰匙%S已經被簽署為可與所選擇的密鑰匯出,本地簽署並無意義。 partlySigned.label=註: 已使用選擇的私鑰簽署金鑰 %S 的某些使用者身分。 -# noTrustedOwnKeys=No eligible key found for signing! You need at least one fully trusted secret key in order to sign keys. +noTrustedOwnKeys=沒有可以用來簽署的鑰匙!您需要至少一個完全信任的密鑰,才可以簽署鑰匙。 # Strings in enigmailKeyManager.js keyMan.loadingKeys=金鑰載入中,請稍候… @@ -490,9 +493,8 @@ asciiArmorFile=ASCII Armored 檔案(*.asc) importKeyFile=匯入 OpenPGP 金鑰檔案 gnupgFile=GnuPG 檔案 -# createKeyOK=Your Key has been generated saveRevokeCertAs=建立並儲存撤銷憑證 -# revokeCertOK=The revocation certificate has been successfully created. You can use it to invalidate your public key, e.g. in case you would lose your secret key. +revokeCertOK=已成功建立撤銷憑證。當您搞丟密鑰時,您可以使用它讓您的公鑰失效。 revokeCertFailed=無法建立撤銷憑證。 addUidOK=使用者 ID 新增成功 @@ -509,15 +511,15 @@ specificPubSecKeyFilename=%S (0x%S) 公鑰-私鑰 defaultPubKeyFilename=匯入公鑰 defaultPubSecKeyFilename=匯入公鑰和私鑰 -noSecretKeys=未找到私鑰。\n\n是否要立刻產生您自己的金鑰? sendKeysOk=金鑰傳送成功 sendKeysFailed=金鑰傳送失敗 receiveKeysOk=金鑰更新成功 receiveKeysFailed=金鑰下載失敗 +keyUpload.verifyEmails=密鑰伺服器會寄送一封 email 給您每一個上傳的密鑰的信箱地址。若要確認發佈您的密鑰,您需要點選每個您將收到的 email 的連結。 importFromClip=您想要從剪貼簿中匯入金鑰嗎? -# importFromUrl=Download public key from this URL: +importFromUrl=自以下URL下載公鑰: copyToClipbrdFailed=無法複製選擇的金鑰到剪貼簿。 copyToClipbrdOK=已複製金鑰至剪貼簿。 @@ -529,10 +531,10 @@ revokeKeyQuestion=您即將撤銷金鑰「%S」。\n\n您將不再能使用該金鑰進行簽署,且一旦公開後,其他人也將不再能使用該金鑰進行加密。您還是能使用該金鑰解開舊訊息。\n\n您要繼續嗎? revokeKeyOk=金鑰已被撤銷。如果您的金鑰在某金鑰伺服器上,建議您重新上傳一次,讓其它人可以得知撤銷消息。 revokeKeyFailed=無法撤銷金鑰。 -# revokeKeyNotPresent=You have no key (0x%S) which fits to this revocation certificate!\n\nIf you have lost your key, you must import it (e.g. from a keyserver) before the revocation certificate! -# revokeKeyAlreadyRevoked=The key 0x%S has already been revoked. +revokeKeyNotPresent=您沒有符合撤銷憑證的鑰匙(0x%S)!\n\n如果您失去了您的鑰匙,您必須先匯入鑰匙才能匯入撤銷憑證。 +revokeKeyAlreadyRevoked=鑰匙0x%S已經被撤銷。 refreshAllQuestion=您尚未選擇任何金鑰,您是否要重新整理所有金鑰? -# refreshKeyServiceOn.warn=Warning: Your keys are currently being refreshed in the background as safely as possible.\nRefreshing all your keys at once will unnecessarily reveal information about you.\nDo you really want to do this? +refreshKeyServiceOn.warn=警告:您的鑰匙正在背景中盡可能安全地被重新整理當中。\n一時間重新整理您所有的鑰匙會無必要地揭露關於您的訊息。\n您確定要這麼做嗎? refreshKey.warn=警告: 視金鑰數量與連線速度而定,重新整理金鑰可能要花上不少時間! downloadContactsKeys.warn=警告: 視聯絡人數量與連線速度而定,下載金鑰可能要花一點時間! downloadContactsKeys.importFrom=要從通訊錄「%S」匯入聯絡人嗎? @@ -541,23 +543,23 @@ keyMan.button.import=匯入 (&I) keyMan.button.refreshAll=重新載入所有金鑰 (&R) keyMan.button.revokeKey=撤銷金鑰 (&R) -keyMan.button.skip=略過金鑰 (&S) keylist.noOtherUids=無其它身份 keylist.hasOtherUids=別名 -keylist.noPhotos=無相片 +keylist.noPhotos=沒有可用的相片 keylist.hasPhotos=相片 keyMan.addphoto.filepicker.title=選擇要加入的相片 keyMan.addphoto.warnLargeFile=您選擇的檔案超過 25 kB。\n不推薦您加入大檔案,因為這樣會使您的金鑰也變大。 keyMan.addphoto.noJpegFile=選擇的檔案不是 JPEG 檔案,請重新選擇。 keyMan.addphoto.failed=無法新增相片。 -# noWksIdentity=The key %S does not have a WKS identity. +noWksIdentity=鑰匙%S並沒有WKS身分 +wksUpload.noKeySupported=上傳不成功 - 您的提供者似乎不支援WKS -# keyman.addBlacklistKey.msg=Do you really want p≡p to stop using the key "%1$S (%2$S)" for encrypting messages? -# keyman.removeBlacklistKey.msg=Do you want to allow p≡p to use key "%1$S (%2$S)" for future messages? -# keyman.addBlacklistKey.button=&Blacklist the key -# keyman.removeBlacklistKey.button=&Remove key from Blacklist +keyman.addBlacklistKey.msg=您真的希望p≡p停止用鑰匙 %1$S (%2$S) 加密訊息嗎? +keyman.removeBlacklistKey.msg=您希望允許p≡p使用鑰匙 %1$S (%2$S) 來加密未來的訊息嗎? +keyman.addBlacklistKey.button=&將鑰匙加入黑名單 +keyman.removeBlacklistKey.button=&將鑰匙自黑名單移除 # Strings in enigmailManageUidDlg.xul changePrimUidFailed=主要使用者 ID 變更失敗 @@ -567,12 +569,12 @@ revokeUidQuestion=您真的想要撤銷使用者 ID %S 嗎? # Strings in enigmailKeyImportInfo.xul -# importInfoTitle=SUCCESS! Keys imported -# importInfoBits=Bits +importInfoTitle=成功!已匯入鑰匙 +importInfoBits=位元 importInfoCreated=已建立 importInfoFpr=指紋 -# importInfoDetails=(Details) -# importInfoNoKeys=No keys imported. +importInfoDetails=(細節) +importInfoNoKeys=未匯入任何鑰匙 # Strings in enigmailKeyDetailsDlg.xul keyTypePublic=公鑰 @@ -588,7 +590,7 @@ keyAlgorithm_18=ECC keyAlgorithm_19=ECC keyAlgorithm_20=ELG -# keyAlgorithm_22=EDDSA +keyAlgorithm_22=EDDSA keyUsageEncrypt=加密 keyUsageSign=簽署 keyUsageCertify=確認 @@ -604,28 +606,34 @@ # Strings in enigmailSetCardPin.xul cardPin.processFailed=PIN 碼修改失敗 -# Strings in enigRetrieveProgres.xul +# Strings in enigRetrieveProgres.js keyserverProgress.refreshing=正在重新整理金鑰,請稍候… keyserverProgress.uploading=正在上傳金鑰,請稍候… -# keyserverProgress.wksUploadFailed=Could not upload your key to the Web Key Service -# keyserverProgress.wksUploadCompleted=Your public key was successfully submitted to your provider. You will receive an email to confirm that you initiated the upload. +keyserverProgress.wksUploadFailed=無法上船您的鑰匙到網路鑰匙服務 +keyserverProgress.wksUploadCompleted=您的公鑰已成功傳送給您的供應者,您將收到一封email向您確認。 keyserverTitle.refreshing=重新整理金鑰 keyserverTitle.uploading=上傳金鑰 +keyserver.result.download.none=未下載任何鑰匙。 +keyserver.result.download.1of1=成功下載鑰匙。 +keyserver.result.download.1ofN=成功下載1把%S鑰匙。 +keyserver.result.download.NofN=成功下載%2$S的%1$S鑰匙 +keyserver.result.uploadOne=成功上傳1把鑰匙。 +keyserver.result.uploadMany=成功上傳%S鑰匙。 # Strings in enigmailSetupWizard -passphrase.min8keys=最少應有 8 字元的密語! -setupWizard.reallyCancel=您確定要關閉 Enigmail 設定精靈嗎? setupWizard.invalidGpg=您指定的檔案不是 GnuPG 執行檔,請指定另一個檔案。 -setupWizard.specifyFile=您需要至少指定一個公鑰檔案才能繼續。 setupWizard.installFailed=看來安裝並未成功,請重試安裝程式,或手動安裝 GnuPG 並用瀏覽按鈕手動尋找該程式。 -# setupWizard.downloadForbidden=For your own security, we will not download GnuPG. Please visit https://gnupg.org/ in order to download GnuPG. -# setupWizard.downloadImpossible=We cannot download GnuPG currently. Please try later or visit https://gnupg.org/ in order to download GnuPG. +setupWizard.downloadForbidden=為了您的安全,我們不會下載 GnuPG。請前往前往 https://gnupg.org/ 下載 GnuPG。 +setupWizard.downloadImpossible=目前無法下載 GnuPG,請稍後再試或前往 https://gnupg.org/ 下載 GnuPG。 setupWizard.hashSumError=本精靈無法驗證已下載檔案的完整性,此檔案可能已損毀或被竄改。您還要繼續安裝嗎? -# setupWizard.importSettingsFile=Specify backup file to load from -# setupWizard.invalidSettingsFile=The specified file is not a correct Enigmail Settings backup file. -# setupWizard.gpgConfExists=The GnuPG config file already exists. Do you want to overwrite it with the one from your old installation? -# setupWizard.noGpgHomeDir=It appears that you configured %S to use for GnuPG. However, this is not a directory - you cannot use it. -# setupWizard.unmachtedIds=The following identities of your old setup could not be matched:\n%S\nThe settings for these identities were skipped. +setupWizard.importSettingsFile=指定匯入的備份檔 +setupWizard.invalidSettingsFile=指定的檔案並非可用的Enigmail設定備份檔 +setupWizard.gpgConfExists=GnuPG配置檔已存在,是否要以您舊的安裝檔覆寫它? +setupWizard.noGpgHomeDir=看來您將%S配置為與GnuPG使用。然而,這並非一個路徑,您將無法使用它。 +setupWizard.unmachtedIds=下列的您舊設定的身分無法配對:\n%S\n關於這些身分的設定將會被跳過。 +setupWizard.foundAcSetupMessage=找到 Autocrypt 設定訊息。若要開始Autocrypt設定程序,點選以下的 開始設定 按鈕。 +setupWizard.foundAcNoSetupMsg=我們判定您正在使用 Autocrypt兼容 email客戶,但我們無法找到任何Autocrypt設定訊息。我們建議您在既有的裝置上建立一個Autocrypt設定訊息,並再點選重新掃描收件夾。或者,您也可以將您的設定及鑰匙從既存的Enigmail安裝匯出,再於此處重置這些設定。 +setupWizard.setupComplete=Enigmail已經適當地配置並準備就緒。如需更多關於Enigmail操作上的資訊,請參閱我們的首頁。 # Strings in installGnuPG.jsm installGnuPG.downloadFailed=嘗試下載 GnuPG 時發生錯誤,若需更多資訊,請檢查主控台的記錄。 @@ -650,12 +658,12 @@ filter.decryptMove.label=永久解密(Enigmail) filter.decryptCopy.label=建立已解密的副本(Enigmail) filter.decryptMove.warnExperimental=警告:過濾器行為「永久解密」可能會毀損訊息。\n\n我們強烈建議您先使用「建立已解密的副本」過濾器,小心測試一下結果,確認結果滿意後再使用「永久解密」過濾器。 -# filter.tempPepFilterDesc=Temporary filter to store sent message unencrypted -# filter.term.pgpencrypted.label=OpenPGP Encrypted -# filter.encrypt.label=Encrypt to key (Enigmail) -# filter.keyRequired=You must select a recipient key. -# filter.keyNotFound=Could not find an encryption key for "%S". -# filter.warn.keyNotSecret=Warning - the filter action "Encrypt to key" replaces the recipients.\n\nIf you do not have the secret key for "%S" you will no longer be able to read the emails. +filter.tempPepFilterDesc=儲存已送出郵件的暫時性篩選未加密。 +filter.term.pgpencrypted.label=OpenPGP已加密 +filter.encrypt.label=加密成鑰匙(Enigmail) +filter.keyRequired=你必須選擇一個收件人鑰匙。 +filter.keyNotFound=無法找到加密鑰匙給%S +filter.warn.keyNotSecret=警告 - 篩選行為「加密成鑰匙」會取代收件者。\n\n如果您沒有%S的密鑰,您將永遠無法閱讀這些email。 # strings in enigmailConvert.jsm converter.decryptBody.failed=無法解密主旨為「%S」的訊息。\n\n您想要使用不同的密語再試一次,或是跳過該訊息? @@ -664,147 +672,186 @@ saveLogFile.title=儲存紀錄檔 # strings in gpg.jsm -# unknownSigningAlg=Unknown signing algorithm (ID: %S) -# unknownHashAlg=Unknown cryptographic hash (ID: %S) +unknownSigningAlg=未知的簽署演算法(ID:%S) +unknownHashAlg=未知的暗號(ID:%S) # strings in keyRing.jsm -# keyring.photo=Photo -# keyRing.pubKeyRevoked=The key %1$S (key ID %2$S) is revoked. -# keyRing.pubKeyExpired=The key %1$S (key ID %2$S) has expired. -# keyRing.pubKeyNotForSigning=The key %1$S (key ID %2$S) cannot be used for signing. -# keyRing.pubKeyNotForEncryption=The key %1$S (key ID %2$S) cannot be used for encryption. -# keyRing.keyDisabled=The key %1$S (key ID %2$S) is disabled; it cannot be used. -# keyRing.keyNotTrusted=The key %1$S (key ID %2$S) is not trusted enough. Please set the trust level of your key to "ultimate" to use it for signing. -# keyRing.keyInvalid=The key %1$S (key ID %2$S) is not valid. Please consider verifying it correctly. Alternatively use the Default encryption settings in the Enigmail preferences dialog. -# keyRing.signSubKeysRevoked=All signing-subkeys of key %1$S (key ID %2$S) are revoked. -# keyRing.signSubKeysExpired=All signing-subkeys of key %1$S (key ID %2$S) have expired. -# keyRing.signSubKeysUnusable=All signing-subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. -# keyRing.encSubKeysRevoked=All encryption subkeys of key %1$S (key ID %2$S) are revoked. -# keyRing.encSubKeysExpired=All encryption subkeys of key %1$S (key ID %2$S) have expired. -# keyRing.noSecretKey=You do not seem to have the secret key for %1$S (key ID %2$S) on your keyring; you cannot use the key for signing. -# keyRing.encSubKeysUnusable=All encryption subkeys of key %1$S (key ID %2$S) are revoked, expired or otherwise unusable. +keyring.photo=相片 +keyRing.pubKeyRevoked=鑰匙 %1$S (ID %2$S)已經被撤銷。 +keyRing.pubKeyExpired=鑰匙 %1$S (ID %2$S)已經過期。 +keyRing.pubKeyNotForSigning=鑰匙 %1$S (ID %2$S)無法用來簽署。 +keyRing.pubKeyNotForEncryption=鑰匙 %1$S (ID %2$S)無法用來加密。 +keyRing.keyDisabled=鑰匙 %1$S (ID %2$S)被關閉了,它無法被使用。 +keyRing.keyNotTrusted=鑰匙 %1$S (ID %2$S)信任程度不足。請將信任程度設定為「最高」以用來簽署。 +keyRing.keyInvalid=鑰匙 %1$S (ID %2$S)無效,請正確地驗證該鑰匙。或是使用Enigmail偏好設定對話中的預設加密設定。 +keyRing.signSubKeysRevoked=鑰匙 %1$S (ID %2$S)的所有簽署子鑰都已被撤銷。 +keyRing.signSubKeysExpired=鑰匙 %1$S (ID %2$S)的所有簽署子鑰都已過期。 +keyRing.signSubKeysUnusable=鑰匙 %1$S (ID %2$S)的所有簽署子鑰都已經被撤銷、已經過期或因其他原因無法使用。 +keyRing.encSubKeysRevoked=鑰匙 %1$S (ID %2$S)的所有加密子鑰已經被撤銷。 +keyRing.encSubKeysExpired=鑰匙 %1$S (ID %2$S)的所有加密子鑰都已過期。 +keyRing.noSecretKey=您的鑰匙圈上似乎沒有鑰匙 %1$S (ID %2$S)的私鑰;您無法用該鑰匙簽署。 +keyRing.encSubKeysUnusable=鑰匙 %1$S (ID %2$S)的所有加密子鑰都已經被撤銷、已經過期或因其他原因無法使用。 #strings in exportSettingsWizard.js -# cannotWriteToFile=Cannot save to file '%S'. Please select a different file. -# dataExportError=An error occurred during exporting your data. -# enigmailSettings=EnigmailSettings -# defaultBackupFileName=Enigmail-export -# specifyExportFile=Specify file name for exporting -# homedirParamNotSUpported=Additional params that configure paths such as --homedir and --keyring are not supported for exporting/restoring your settings. Please use alternative methods such as setting the environment variable GNUPGHOME. +cannotWriteToFile=無法儲存為%S,請選擇另一個檔案。 +dataExportError=匯出資料時發生錯誤。 +enigmailSettings=Enigmail設定 +defaultBackupFileName=Enigmail匯出 +specifyExportFile=指定匯出檔名 +homedirParamNotSUpported=用來配置例如--homedir和--keyring的路徑的額外參數不支援輸出/重置您的設定。請使用別的方式,例如設定環境參數為GNUPGHOME #strings in expiry.jsm -# expiry.keyExpiresSoon=Your key %1$S will expire in less than %2$S days.\n\nWe recommend that you create a new key pair and configure the corresponding accounts to use the new key. -# expiry.keysExpireSoon=The following of your keys will expire in less than %1$S days:\n%2$S We recommend that you create new keys and configure your accounts to use the new keys. -# expiry.keyMissingOwnerTrust=Your secret key %S has missing trust.\n\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -# expiry.keysMissingOwnerTrust=The following of your secret keys have missing trust.\n%S.\nWe recommend that you set "You rely on certifications" to ultimate in key properties. -# expiry.OpenKeyManager=Open Enigmail Key Management -# expiry.OpenKeyProperties=Open Key Properties +expiry.keyExpiresSoon=您的鑰匙%1$S將在%2$S天內過期。\n\n我們建議您建立新的一對鑰匙,並配置其對應的帳號以使用。 +expiry.keysExpireSoon=您的下列鑰匙將在%1$S天內過期:\n%2$S\n我們建議您建立新的鑰匙,並配置對應的帳號以使用。 +expiry.keyMissingOwnerTrust=您的密鑰%S欠缺信任程度。\n\n我們建議您將鑰匙內容設定從「依賴認證」改為「最高」。 +expiry.keysMissingOwnerTrust=下列密鑰欠缺信任程度。\n%S\n我們建議您將鑰匙內容設定從「依賴認證」改為「最高」。 +expiry.OpenKeyManager=打開Enigmail鑰匙管理 +expiry.OpenKeyProperties=打開鑰匙內容 #strings in pEpDecrypt.jsm -# pEpDecrypt.cannotDecrypt=This is an encrypted message. Unfortunately you don't have the secret key to decrypt the message. +pEpDecrypt.cannotDecrypt=這是一封加密郵件。不幸地,您並沒有解密郵件的鑰匙。 #strings in gpgAgent.jsm -# gpghomedir.notexists=The directory '%S' containing your OpenPGP keys does not exist and cannot be created. -# gpghomedir.notwritable=The directory '%S' containing your OpenPGP keys is not writable. -# gpghomedir.notdirectory=The directory '%S' containing your OpenPGP keys is a file instead of a directory. -# gpghomedir.notusable=Please fix the directory permissions or change the location of your GnuPG "home" directory. GnuPG cannot work correctly otherwise. +gpghomedir.notexists=含有您OpenPGP鑰匙的途徑%S並不存在,也無法被建立。 +gpghomedir.notwritable=含有您OpenPGP鑰匙的途徑%S無法被覆寫。 +gpghomedir.notdirectory=含有您OpenPGP鑰匙的途徑%S是一個檔案,而不是路徑。 +gpghomedir.notusable=請修復路徑許可或改變您GnuPG「主目錄」的位置。否則,GnuPG無法正確運作。 +gpgAgent.noAutostart=您正在使用GnuPG %S版,這個版本需要您在Thunderbird啟動前預先啟用gpg-agent,且需要預載環境變數「GPG_AGENT_INFO」。\n\n這些先決條件尚未達成前,您無法使用Enigmail。 #strings in pepTrustWords.js -# pepTrustWords.cannotVerifyOwnId=Cannot verify p≡p Trustwords for own account. -# pepTrustWords.cannotFindKey=Cannot find key for %S. -# pepTrustWords.cannotStoreChange=Could not change trust for %S. -# pepTrustWords.generalFailure=Cannot obtain trustwords for %S. -# pepTrustWords.partnerFingerprint=Fingerprint for %S: +pepTrustWords.cannotVerifyOwnId=無法驗證自己帳號的p≡p信任短語 +pepTrustWords.cannotFindKey=無法找到%S的鑰匙。 +pepTrustWords.cannotStoreChange=無法改變%S的信任程度。 +pepTrustWords.generalFailure=無法取得%S的信任短語。 +pepTrustWords.partnerFingerprint=%S的指紋: #strings in mimeWkdHandler.jsm -# wkdMessage.body.req=Your email provider processed your request to upload your public key to the OpenPGP Web Key Directory.\n\nPlease click the confirmation button in the Enigmail header to complete the publishing of your public key. -# wkdMessage.body.process=This is an email related to the automatic processing to upload your public key to the OpenPGP Web Key Directory.\n\nYou do not need to take any manual action at this point. +wkdMessage.body.req=您的email提供者已處理您上載您的公鑰至OpenPGP網路鑰匙途徑的要求。\n\n請點選Enigmail頁首的確認按鈕,以完成公布您的公鑰。 +wkdMessage.body.process=這是一封關於自動處理上載您的公鑰到OpenPGP網路鑰匙途徑的email。\n\n你目前不需要採取任何動作。 #strings in pepHandshake.js -# pepPrivacyStatus.RatingBrokenSuggestion=Either you or the sender should resend the message. -# pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=If you composed this message, your key is not available. -# pepPrivacyStatus.RatingMistrustSuggestion=Re-establish the connection with your communication partner and try to complete another handshake. -# pepPrivacyStatus.RatingReliableSuggestion=Complete a handshake with your communication partner by exchanging trustwords in person or over the phone. A handshake is needed only once per partner and will ensure secure and trusted communication. -# pepPrivacyStatus.RatingTrustedSuggestion=No action needed! -# pepPrivacyStatus.RatingUndefinedSuggestionIncoming=Be aware this message may not be secure. -# pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=Please add the necessary information. -# pepPrivacyStatus.RatingUnderAttackSuggestion=Separately verify the content of this message with your communication partner. -# pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=Make sure the privacy status for each communication partner listed is at least secure. -# pepPrivacyStatus.RatingUnencryptedSuggestion=Please ask your communication partner to use an encryption solution or install p≡p. -# pepPrivacyStatus.RatingUnreliableSuggestion=This message has no reliable encryption or no signature. Ask your communication partner to upgrade their encryption solution or install p≡p. - -# pepPrivacyStatus.RatingBrokenExplanation=This message has broken encryption or formatting. -# pepPrivacyStatus.RatingHaveNoKeyExplanation=This message cannot be decrypted because the key is not available. -# pepPrivacyStatus.RatingMistrustExplanation=This message has a communication partner that has previously been marked as mistrusted. -# pepPrivacyStatus.RatingReliableExplanation=This message is secure but you still need to verify the identity of your communication partner. -# pepPrivacyStatus.RatingTrustedExplanation=This message is secure and trusted. -# pepPrivacyStatus.RatingUndefinedExplanation=This message does not contain enough information to determine if it is secure. -# pepPrivacyStatus.RatingUnderAttackExplanation=This message is not secure and has been tampered with. -# pepPrivacyStatus.RatingUnencryptedExplanation=This message is unsecure. -# pepPrivacyStatus.RatingUnencryptedForSomeExplanation=This message is unsecure for some communication partners. -# pepPrivacyStatus.RatingUnreliableExplanation=This message has unreliable protection. - -# pepPrivacyStatus.RatingBrokenText=Broken -# pepPrivacyStatus.RatingHaveNoKeyText=Cannot Decrypt -# pepPrivacyStatus.RatingMistrustText=Mistrusted -# pepPrivacyStatus.RatingReliableText=Secure -# pepPrivacyStatus.RatingTrustedText=Secure & Trusted -# pepPrivacyStatus.RatingUndefinedText=Unknown -# pepPrivacyStatus.RatingUnderAttackText=Under Attack -# pepPrivacyStatus.RatingUnencryptedForSomeText=Unsecure for Some -# pepPrivacyStatus.RatingUnencryptedText=Unsecure -# pepPrivacyStatus.RatingUnreliableText=Unreliable Security - -# handshakeDlg.button.initHandshake=Handshake... -# handshakeDlg.button.stopTrust=Stop Trusting -# handshakeDlg.button.reTrust=Stop Mistrusting -# handshakeDlg.label.outgoingMessage=Outgoing message -# handshakeDlg.label.incomingMessage=Incoming message -# handshakeDlg.error.noPeers=Cannot handshake without any correspondents. -# handshakeDlg.error.noProtection=Please enable protection in order to use the Handshake function. +pepPrivacyStatus.RatingBrokenSuggestion=您或是寄件人需要重寄此訊息。 +pepPrivacyStatus.RatingHaveNoKeySuggestionOutgoing=若您撰寫了此封訊息,您的鑰匙不可用。 +pepPrivacyStatus.RatingMistrustSuggestion=重新建立與您的構通對象的連結,並試著完成另一次握手。 +pepPrivacyStatus.RatingReliableSuggestion=與您的通訊對象親自或透過電話交換密碼短語,以完成一次握手。您只需要與每個對象握一次手,就可以確保安全且可信賴的通訊。 +pepPrivacyStatus.RatingTrustedSuggestion=無需動作! +pepPrivacyStatus.RatingUndefinedSuggestionIncoming=小心此訊息可能不安全。 +pepPrivacyStatus.RatingUndefinedSuggestionOutgoing=請添加必要資訊。 +pepPrivacyStatus.RatingUnderAttackSuggestion=請使用別的管道與您的通訊對象驗證此訊息的內容。 +pepPrivacyStatus.RatingUnencryptedForSomeSuggestion=確保每一個通訊對象的隱私狀態都至少是「安全」。 +pepPrivacyStatus.RatingUnencryptedSuggestion=請要求您的通訊對象使用加密方案或安裝p≡p。 +pepPrivacyStatus.RatingUnreliableSuggestion=此訊息並無可信賴的加密或欠缺簽署。要求您的通訊對象升級他們的加密方案或安裝p≡p。 + +pepPrivacyStatus.RatingBrokenExplanation=此訊息含有破損的加密或格式。 +pepPrivacyStatus.RatingHaveNoKeyExplanation=無法解密此訊息,因為無可用的鑰匙。 +pepPrivacyStatus.RatingMistrustExplanation=這份訊息包含一個曾被標記為不可信任的通訊對象。 +pepPrivacyStatus.RatingReliableExplanation=此訊息安全,但您仍須驗證您的通訊對象。 +pepPrivacyStatus.RatingTrustedExplanation=此訊息安全且可信任 +pepPrivacyStatus.RatingUndefinedExplanation=這份訊息含有的資訊不足以確定是否為安全。 +pepPrivacyStatus.RatingUnderAttackExplanation=這份訊息不安全且曾被動過手腳。 +pepPrivacyStatus.RatingUnencryptedExplanation=此訊息不安全 +pepPrivacyStatus.RatingUnencryptedForSomeExplanation=此訊息對部分通訊對象不安全 +pepPrivacyStatus.RatingUnreliableExplanation=此訊息含有不可信賴的保護 + +pepPrivacyStatus.RatingBrokenText=破損 +pepPrivacyStatus.RatingHaveNoKeyText=無法解密 +pepPrivacyStatus.RatingMistrustText=無法信任的 +pepPrivacyStatus.RatingReliableText=安全 +pepPrivacyStatus.RatingTrustedText=安全且可信任 +pepPrivacyStatus.RatingUndefinedText=未知 +pepPrivacyStatus.RatingUnderAttackText=遭受攻擊 +pepPrivacyStatus.RatingUnencryptedForSomeText=對部分人不安全 +pepPrivacyStatus.RatingUnencryptedText=不安全 +pepPrivacyStatus.RatingUnreliableText=不可信賴的安全性 + +handshakeDlg.button.initHandshake=握手... +handshakeDlg.button.stopTrust=停止信任 +handshakeDlg.button.reTrust=停止不信任 +handshakeDlg.label.outgoingMessage=寄出的訊息 +handshakeDlg.label.incomingMessage=接收中的訊息 +handshakeDlg.error.noPeers=無法在沒有任何對象之下握手。 +handshakeDlg.error.noProtection=請啟用保護以使用「握手」功能。 -# enigmail.acSetupPasswd.descEnterPasswd=Please enter the setup code that is displayed on the other device -# enigmail.acSetupPasswd.descCopyPasswd=Please enter the setup code below on your other device to proceed with the setup +enigmail.acSetupPasswd.descEnterPasswd=請輸入在另一個裝置上出現的設置碼。 +enigmail.acSetupPasswd.descCopyPasswd=請在另一個裝置上輸入以下的設置碼以繼續設定。 #strings in autocrypt.jsm -# autocrypt.setupMsg.subject=Autocrypt Setup Message -# autocrypt.setupMsg.msgBody=To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. -# autocrypt.setupMsg.fileTxt=This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring. +autocrypt.setupMsg.subject=Autocrypt 設定訊息 +autocrypt.setupMsg.msgBody=若要替您的新裝置設定Autocrypt,請依照以下新裝置上的指示。 +autocrypt.setupMsg.fileTxt=這是用來在客戶間傳送設定及鑰匙的Autocrypt設定檔。您可以使用舊裝置上的設置碼來解密它,再將鑰匙匯入您的鑰匙圈上。 #strings in upgradeInfo.html -# upgradeInfo.doctitle=What's New in Enigmail v2.0? -# upgradeInfo.welcome1=Welcome to the new Enigmail version 2.0! -# upgradeInfo.welcome2=The release contains a lot of new and changed features. Please take a minute to find out what's new: -# upgradeInfo.encSubject.title=Encrypting the Message Subject -# upgradeInfo.encSubject.desc=We developed a new method that moves the email subject into the encrypted message, and replaces the visible subject with "Encrypted Message". Once such a message is decrypted, the original subject is replaced automatically. Hiding the subject is on by default; there is a preference to turn it off if you don't like it. (Note: this feature requires the message to be sent with PGP/MIME.) -# upgradeInfo.buttons.title=Changed behavior of Encrypt and Sign Buttons -# upgradeInfo.buttons.desc=The Encrypt and Sign buttons in the message composer window now work for both the OpenPGP and S/MIME protocols. If both algorithms are possible, then Enigmail will try to prefer the one for which all keys are available. -# upgradeInfo.autocrypt.title=Support for Autocrypt -# upgradeInfo.autocrypt.desc=Enigmail now supports Autocrypt, a new standard to distribute keys as part of sent messages. Enigmail automatically imports keys from Autocrypt-compliant messages, such that over time more and more emails can be encrypted. -# upgradeInfo.pEp.title=New p≡p Junior Mode (Pretty Easy Privacy) -# upgradeInfo.pEp.desc=Enigmail now contains a p≡p Junior Mode. You currently need to manually install p≡p for this purpose; this will change in a future release. The p≡p Junior Mode allows you to use OpenPGP encryption as transparently as possible; you don't need to care for key management and synchronization of keys between devices anymore. -# upgradeInfo.bottom.desc=Please visit our documentation for help on using Enigmail. - -# pep.missingGnuPG=In order to use Enigmail/p≡p, GnuPG is required. As we could not find it, we suggest to download and install it for you. +upgradeInfo.doctitle=Enigmail 2.0版有什麼新功能? +upgradeInfo.welcome1=歡迎來到新的Enigmail 2.0版! +upgradeInfo.welcome2=新版本有許多新功能,容我們耽誤一分鐘向您介紹: +upgradeInfo.encSubject.title=加密郵件主旨中 +upgradeInfo.encSubject.desc=我們開發了一種新方法,可將email主旨移至加密訊息中,並將原可見主旨以「加密訊息」取代。一旦訊息經過解密,原本的主旨會自動被替換回來。隱藏主旨的功能預設為開啟,但您可以在偏好設定中關閉。 (附註:此功能要求郵件透過PGP/MIME傳送。) +upgradeInfo.buttons.title=加密及簽署按鍵行為已改變 +upgradeInfo.buttons.desc=郵件編輯視窗中的加密 以及 簽署 按鍵適用於OpenPGP與S/MIME協定。若兩個演算法皆可用,Enigmail會盡量使用所有鑰匙都可用的演算法。 +upgradeInfo.autocrypt.title=支援Autocrypt +upgradeInfo.autocrypt.desc=Enigmail 現在支援 Autocrypt,一種將密鑰以送出訊息的一部分的形式發佈的新標準。Enigmail 會從與 Autocrypt 相容的訊息中自動匯入密鑰,所以越來越多的email 將可以被解密。 +upgradeInfo.pEp.title=新p≡p兒童模式(相當簡易隱私) +upgradeInfo.pEp.desc=Enigmail 現在有 p≡p兒童模式,該模式將使您可以盡可能地透明地使用OpenPGP加密。您再也不需要操心鑰匙管理或是多個裝置間的鑰匙同步。 +upgradeInfo.bottom.desc=使用Enigmail上如需幫助,請參考我們的文件。 + +#strings in pEpAdapter.jsm +pep.missingGnuPG=為了使用Enigmail/p≡p,將需要GnuPG。因為我們無法偵測到GnuPG,我們建議您讓我們幫您下載並安裝它。 +pep.updateAvailable=一個新版的Enigmail/p≡p 加密引擎現可使用,您希望下載並安裝更新檔嗎? #strings in enigmailAbout.html aboutEnigmail.tabName=關於Enigmail -# aboutEnigmail.title=OpenPGP support provided by Enigmail -# aboutEnigmail.team=Enigmail is developed by the Enigmail Team: -# aboutEnigmail.projectLeader=Lead Developer: -# aboutEnigmail.usability=Usability: -# aboutEnigmail.documentation=Documentation: -# aboutEnigmail.testing=Testing: -# aboutEnigmail.userSupport=User Support: -# aboutEnigmail.localization=Localization: See the Enigmail Language Packs page -# aboutEnigmail.Credits=Credits: -# aboutEnigmail.origAuthor=Original author of the Enigmail extension -# aboutEnigmail.icons=Icons: -# aboutEnigmail.formerMembers=Former team members: -# aboutEnigmail.projectHosting=Project hosting: -# aboutEnigmail.licenseSupportTitle=License & Support -# aboutEnigmail.license=Enigmail OpenPGP is open source and licensed under the %S -# aboutEnigmail.support=Support and download is available from www.enigmail.net. +aboutEnigmail.title=Enigmail提供的OpenPGP支援 +aboutEnigmail.team=Enigmail是由Enigmail團隊所開發: +aboutEnigmail.projectLeader=首席開發者: +aboutEnigmail.usability=好用度: +aboutEnigmail.documentation=文件: +aboutEnigmail.testing=測試: +aboutEnigmail.userSupport=用戶支援: +aboutEnigmail.userSupport.team=團隊及討論區成員 +aboutEnigmail.localization=翻譯:參見 Enigmail 語言包頁面 +aboutEnigmail.Credits=致謝: +aboutEnigmail.origAuthor=Enigmail追加內容的原作者 +aboutEnigmail.icons=圖型: +aboutEnigmail.formerMembers=前團隊成員: +aboutEnigmail.projectHosting=專案託管: +aboutEnigmail.licenseSupportTitle=授權 & 支援 +aboutEnigmail.license=Enigmail OpenPGP 是開源且根據%S所授權 +aboutEnigmail.support=支持並自 www.enigmail.net 下載。 + +#strings in updateGnuPG.html +updateGnuPG.tabName=GnuPG更新 +updateGnuPG.title=GnuPG更新 +updateGnuPG.introduction.desc=Enigmail需要GnuPG以執行加密功能,我們建議您時常更新GnuPG的版本。 +updateGnuPG.updateRequired=有新版本的 GnuPG,我們強烈建議您保持 GnuPG 最為更新的狀態。請點選 安裝更新 按鍵以下載並安裝更新。 +updateGnuPG.noUpdateRequired=GnuPG是最新版本。 +updateGnuPG.cannotUpdate.header=Enigmail僅支援更新以下組件包。 +updateGnuPG.cannotUpdate.footer=您似乎正使用別種的GnuGP。不幸地,Enigmail無法幫您更新您的GnuGP。 +updateGnuPG.installUpdate=安裝更新 +updateGnuPG.noMoreUpdates=不要檢查未來的更新 +updateGnuPG.checkUpdate=檢查GnuPG更新 + + +#strings in keyserver.jsm +keyserver.error.aborted=已放棄 +keyserver.error.unknown=發生未知錯誤 +keyserver.error.serverError=鑰匙伺服器出現一個錯誤。 +keyserver.error.importError=無法匯入已下載的鑰匙 +keyserver.error.unavailable=鑰匙伺服器不可使用。 +keyserver.error.securityError=鑰匙伺服器不支援加密連接。 +keyserver.error.certificateError=鑰匙伺服器的認證無效。 +keyserver.error.unsupported=Enigmail不支援該鑰匙伺服器。 + +#strings in mimeDecrypt.jsm +mimeDecrypt.encryptedPart.attachmentLabel=加密訊息部分 +mimeDecrypt.encryptedPart.concealedData=此部分為加密訊息,您需要點選附件並開啟新視窗才能瀏覽。 + +#strings in gnupg-key.jsm +import.secretKeyImportError=GnuPG在匯入密鑰時發生錯誤,匯入失敗。 + +#strings in importSettings.js +importSettings.errorNoFile=你指定檔案不是正規檔案! +importSettings.cancelWhileInProgress=正在回復中,確定要放棄回復嗎? +importSettings.button.abortImport=&放棄回復 diff -Nru enigmail-2.0.12+ds1/package/Makefile enigmail-2.1.3+ds1/package/Makefile --- enigmail-2.0.12+ds1/package/Makefile 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/Makefile 2019-10-29 17:09:36.000000000 +0000 @@ -7,8 +7,18 @@ include $(DEPTH)/config/autoconf.mk +GENDIR = $(DIST)/chrome/content/modules + +DIRS = cryptoAPI + PREFFILES = prefs/defaultPrefs.js +ifeq ($(ENABLE_POSTBOX),yes) +PEPJSM = pEp-nonfunc.jsm +else +PEPJSM = pEp.jsm +endif + MODFILES = \ addrbook.jsm \ amPrefsService.jsm \ @@ -16,6 +26,7 @@ armor.jsm \ attachment.jsm \ autocrypt.jsm \ + autoSetup.jsm \ card.jsm \ clipboard.jsm \ commandLine.jsm \ @@ -23,21 +34,24 @@ configure.jsm \ constants.jsm \ core.jsm \ + cryptoAPI.jsm \ data.jsm \ decryption.jsm \ persistentCrypto.jsm \ dialog.jsm \ encryption.jsm \ + enigmailOverlays.jsm \ errorHandling.jsm \ events.jsm \ execution.jsm \ + dns.jsm \ funcs.jsm \ files.jsm \ filters.jsm \ filtersWrapper.jsm \ fixExchangeMsg.jsm \ gpgAgent.jsm \ - glodaMime.jsm \ + gnupgUpdate.jsm \ glodaUtils.jsm \ gpg.jsm \ hash.jsm \ @@ -47,6 +61,7 @@ key.jsm \ keyEditor.jsm \ keyRing.jsm \ + keyObj.jsm \ keyUsability.jsm \ keyRefreshService.jsm \ keyserver.jsm \ @@ -59,14 +74,13 @@ mimeDecrypt.jsm \ mimeEncrypt.jsm \ mimeVerify.jsm \ - msgCompFields.jsm \ msgRead.jsm \ os.jsm \ openpgp.jsm \ overlays.jsm \ passwordCheck.jsm \ passwords.jsm \ - pEp.jsm \ + $(PEPJSM) \ pEpAdapter.jsm \ pEpDecrypt.jsm \ pEpFilter.jsm \ @@ -78,12 +92,15 @@ protocolHandler.jsm \ rng.jsm \ rules.jsm \ + searchCallback.jsm \ send.jsm \ singletons.jsm \ socks5Proxy.jsm \ + sqliteDb.jsm \ stdlib.jsm \ streams.jsm \ system.jsm \ + compat.jsm \ time.jsm \ timer.jsm \ tor.jsm \ @@ -95,6 +112,7 @@ wkdLookup.jsm \ windows.jsm \ wksMimeHandler.jsm \ + xhrUtils.jsm \ zbase32.jsm DATE_FMT = +%Y%m%d-%H%M @@ -106,17 +124,32 @@ TZ=UTC date -r "$(SOURCE_DATE_EPOCH)" $(DATE_FMT) || \ TZ=UTC date $(DATE_FMT) ) -all: deploy +GENFILES = $(addprefix $(GENDIR)/,$(MODFILES)) + +$(GENDIR)/%.jsm: %.jsm + $(DEPTH)/util/prepPostbox $(TARGET_TOOL) $< $@ -deploy: $(PREFFILES) $(MODFILES) - $(DEPTH)/util/install -m 644 $(DIST)/modules/preferences $(PREFFILES) - $(DEPTH)/util/install -m 644 $(DIST)/modules $(MODFILES) - echo '"use strict";' > $(DIST)/modules/buildDate.jsm - echo 'var EXPORTED_SYMBOLS = ["EnigmailBuildDate"];' >> $(DIST)/modules/buildDate.jsm - echo 'const EnigmailBuildDate = "$(ENIG_BUILD_DATE)";' >> $(DIST)/modules/buildDate.jsm +all: dirs build deploy + +build: $(GENFILES) + +deploy: $(PREFFILES) + $(DEPTH)/util/install -m 644 $(DIST)/chrome/content/preferences $(PREFFILES) + echo '"use strict";' > $(DIST)/chrome/content/modules/buildDate.jsm + echo 'var EXPORTED_SYMBOLS = ["EnigmailBuildDate"];' >> $(DIST)/chrome/content/modules/buildDate.jsm + echo 'var EnigmailBuildDate = { built: "$(ENIG_BUILD_DATE)" };' >> $(DIST)/chrome/content/modules/buildDate.jsm + $(DEPTH)/util/prepPostbox $(TARGET_TOOL) bootstrap.js $(DIST)/bootstrap.js + $(DEPTH)/util/prepPackage $(XPI_MODULE_VERS) $(DIST) clean: - $(DEPTH)/util/install -u $(DIST)/modules/preferences $(PREFFILES) - $(DEPTH)/util/install -u $(DIST)/modules $(MODFILES) + $(DEPTH)/util/install -u $(DIST)/chrome/content/preferences $(PREFFILES) + $(DEPTH)/util/install -u $(DIST)/chrome/content/modules $(MODFILES) + $(DEPTH)/util/install -u $(DIST) bootstrap.js manifest.json install.rdf chrome.manifest + +.PHONY: dirs $(DIRS) + +dirs: $(DIRS) +$(DIRS): + $(MAKE) -C $@ diff -Nru enigmail-2.0.12+ds1/package/addrbook.jsm enigmail-2.1.3+ds1/package/addrbook.jsm --- enigmail-2.0.12+ds1/package/addrbook.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/addrbook.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 @@ -15,9 +14,9 @@ * */ -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; + + + const ABMANAGER = "@mozilla.org/abmanager;1"; diff -Nru enigmail-2.0.12+ds1/package/amPrefsService.jsm enigmail-2.1.3+ds1/package/amPrefsService.jsm --- enigmail-2.0.12+ds1/package/amPrefsService.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/amPrefsService.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* 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/. */ @@ -7,16 +5,13 @@ "use strict"; const { - classes: Cc, - interfaces: Ci, manager: Cm, results: Cr, - utils: Cu, Constructor: CC } = Components; Cm.QueryInterface(Ci.nsIComponentRegistrar); -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; const CATEGORY = "mailnews-accountmanager-extensions"; const CATEGORY_ENTRY = "enigmail-account-manager-extension"; @@ -55,7 +50,7 @@ classID: Components.ID("{943b06a2-24d2-4d38-b0f0-a45f959e331a}"), classDescription: "Enigmail Account Manager Extension Service", contractID: PREF_SERVICE_NAME, - QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIMsgAccountManagerExtension]), + QueryInterface: EnigmailCompat.generateQI(["nsIMsgAccountManagerExtension"]), showPanel: function(server) { // show Enigmail panel for POP3, IMAP, NNTP and "movemail" (unix) account types diff -Nru enigmail-2.0.12+ds1/package/app.jsm enigmail-2.1.3+ds1/package/app.jsm --- enigmail-2.0.12+ds1/package/app.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/app.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -10,11 +8,7 @@ var EXPORTED_SYMBOLS = ["EnigmailApp"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; const getEnigmailLog = EnigmailLazy.loader("enigmail/log.jsm", "EnigmailLog"); const DIR_SERV_CONTRACTID = "@mozilla.org/file/directory_service;1"; diff -Nru enigmail-2.0.12+ds1/package/armor.jsm enigmail-2.1.3+ds1/package/armor.jsm --- enigmail-2.0.12+ds1/package/armor.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/armor.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -11,10 +9,9 @@ var EXPORTED_SYMBOLS = ["EnigmailArmor"]; -Components.utils.import("resource://enigmail/constants.jsm"); /* global EnigmailConstants: false */ -Components.utils.import("resource://enigmail/log.jsm"); /* global EnigmailLog: false */ +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; -const Ci = Components.interfaces; // Locates STRing in TEXT occurring only at the beginning of a line function indexOfArmorDelimiter(text, str, offset) { @@ -37,8 +34,7 @@ var offset = str.search(/\n\s*\r?\n/); if (offset === -1) { return ""; - } - else { + } else { return then(offset); } } @@ -47,8 +43,7 @@ var offset = str.indexOf("\n", off); if (offset === -1) { return ""; - } - else { + } else { return then(offset); } } @@ -202,8 +197,7 @@ if (part == EnigmailConstants.SIGNATURE_ARMOR) { return signBlock.substr(armorIndex, endIndex - armorIndex). replace(/\s*/g, ""); - } - else { + } else { return ""; } }); @@ -274,5 +268,26 @@ } return headers; + }, + + /** + * Split armored blocks into an array of strings + */ + splitArmoredBlocks: function(keyBlockStr) { + let myRe = /-----BEGIN PGP (PUBLIC|PRIVATE) KEY BLOCK-----/g; + let myArray; + let retArr = []; + let startIndex = -1; + while ((myArray = myRe.exec(keyBlockStr)) !== null) { + if (startIndex >= 0) { + let s = keyBlockStr.substring(startIndex, myArray.index); + retArr.push(s); + } + startIndex = myArray.index; + } + + retArr.push(keyBlockStr.substring(startIndex)); + + return retArr; } -}; +}; \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/attachment.jsm enigmail-2.1.3+ds1/package/attachment.jsm --- enigmail-2.0.12+ds1/package/attachment.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/attachment.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false, escape: false, unescape: false */ -/*jshint -W097 */ /* * 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 @@ -11,53 +9,11 @@ var EXPORTED_SYMBOLS = ["EnigmailAttachment"]; -const Cu = Components.utils; - -Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ -Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/passwords.jsm"); /*global EnigmailPassword: false */ -Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ -Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ - -const getGpgAgent = EnigmailLazy.loader("enigmail/gpgAgent.jsm", "EnigmailGpgAgent"); +const EnigmailCryptoAPI = ChromeUtils.import("chrome://enigmail/content/modules/cryptoAPI.jsm").EnigmailCryptoAPI; var EnigmailAttachment = { getFileName: function(parent, byteData) { - EnigmailLog.DEBUG("attachment.jsm: getFileName\n"); - - const args = EnigmailGpg.getStandardArgs(true). - concat(EnigmailPassword.command()). - concat(["--decrypt"]); - - const listener = EnigmailExecution.newSimpleListener( - function _stdin(pipe) { - EnigmailLog.DEBUG("attachment.jsm: getFileName: _stdin\n"); - pipe.write(byteData); - pipe.write("\n"); - pipe.close(); - }); - - listener.stdout = function(data) {}; - - const proc = EnigmailExecution.execStart(getGpgAgent().agentPath, args, false, parent, listener, {}); - - if (!proc) { - return null; - } - - proc.wait(); - - const matches = listener.stderrData.match(/^(\[GNUPG:\] PLAINTEXT [0-9]+ [0-9]+ )(.*)$/m); - if (matches && (matches.length > 2)) { - var filename = matches[2]; - if (filename.indexOf(" ") > 0) { - filename = filename.replace(/ .*$/, ""); - } - return EnigmailData.convertToUnicode(unescape(filename), "utf-8"); - } - else { - return null; - } + const cApi = EnigmailCryptoAPI(); + return cApi.sync(cApi.getFileName(parent, byteData)); } }; diff -Nru enigmail-2.0.12+ds1/package/autoSetup.jsm enigmail-2.1.3+ds1/package/autoSetup.jsm --- enigmail-2.0.12+ds1/package/autoSetup.jsm 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/autoSetup.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,658 @@ +/* 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"; + +/*eslint no-loop-func: 0 no-async-promise-executor: 0*/ + +/** + * Module to determine the type of setup of the user, based on existing emails + * found in the inbox + */ + +var EXPORTED_SYMBOLS = ["EnigmailAutoSetup"]; + +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailAutocrypt = ChromeUtils.import("chrome://enigmail/content/modules/autocrypt.jsm").EnigmailAutocrypt; +const EnigmailFuncs = ChromeUtils.import("chrome://enigmail/content/modules/funcs.jsm").EnigmailFuncs; +const EnigmailWindows = ChromeUtils.import("chrome://enigmail/content/modules/windows.jsm").EnigmailWindows; +const EnigmailDialog = ChromeUtils.import("chrome://enigmail/content/modules/dialog.jsm").EnigmailDialog; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; +const EnigmailKeyRing = ChromeUtils.import("chrome://enigmail/content/modules/keyRing.jsm").EnigmailKeyRing; +const EnigmailMime = ChromeUtils.import("chrome://enigmail/content/modules/mime.jsm").EnigmailMime; +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; +const jsmime = ChromeUtils.import("resource:///modules/jsmime.jsm").jsmime; +const EnigmailWks = ChromeUtils.import("chrome://enigmail/content/modules/webKey.jsm").EnigmailWks; +const EnigmailTimer = ChromeUtils.import("chrome://enigmail/content/modules/timer.jsm").EnigmailTimer; +const EnigmailStreams = ChromeUtils.import("chrome://enigmail/content/modules/streams.jsm").EnigmailStreams; +const EnigmailGpg = ChromeUtils.import("chrome://enigmail/content/modules/gpg.jsm").EnigmailGpg; + +// Interfaces +const nsIFolderLookupService = Ci.nsIFolderLookupService; +const nsIMsgAccountManager = Ci.nsIMsgAccountManager; +const nsIMsgAccount = Ci.nsIMsgAccount; +const nsIMsgDBHdr = Ci.nsIMsgDBHdr; +const nsIMessenger = Ci.nsIMessenger; +const nsIMsgMessageService = Ci.nsIMsgMessageService; +const nsIMsgFolder = Ci.nsIMsgFolder; + +/** + * the determined setup type + */ +var gDeterminedSetupType = { + value: EnigmailConstants.AUTOSETUP_NOT_INITIALIZED +}; + +var EnigmailAutoSetup = { + + getDeterminedSetupType: async function() { + if (gDeterminedSetupType.value === EnigmailConstants.AUTOSETUP_NOT_INITIALIZED) { + return await this.determinePreviousInstallType(); + } + else + return gDeterminedSetupType; + }, + + /** + * Identify which type of setup the user had before Enigmail was (re-)installed + * + * @return Promise with: + * - value : For each case assigned value, see EnigmailConstants.AUTOSETUP_xxx values + * - acSetupMessage {nsIMsgDBHdr} in case value === 1 + * - msgHeaders {Object} in case value === 2 + */ + determinePreviousInstallType: function() { + let self = this; + gDeterminedSetupType = { + value: EnigmailConstants.AUTOSETUP_NOT_INITIALIZED + }; + + return new Promise(async (resolve, reject) => { + EnigmailLog.DEBUG("autoSetup.jsm: determinePreviousInstallType()\n"); + + try { + let msgAccountManager = Cc["@mozilla.org/messenger/account-manager;1"].getService(nsIMsgAccountManager); + let folderService = Cc["@mozilla.org/mail/folder-lookup;1"].getService(nsIFolderLookupService); + let returnMsgValue = { + value: EnigmailConstants.AUTOSETUP_NO_HEADER + }; + + var accounts = msgAccountManager.accounts; + + let msgHeaders = []; + let autocryptSetupMessage = {}; + + // If no account, except Local Folders is configured + if (accounts.length <= 1) { + gDeterminedSetupType.value = EnigmailConstants.AUTOSETUP_NO_ACCOUNT; + resolve(gDeterminedSetupType); + return; + } + + // Iterate through each account + + for (var i = 0; i < accounts.length; i++) { + var account = accounts.queryElementAt(i, Ci.nsIMsgAccount); + var accountMsgServer = account.incomingServer; + EnigmailLog.DEBUG(`autoSetup.jsm: determinePreviousInstallType: scanning account "${accountMsgServer.prettyName}"\n`); + + let msgFolderArr = []; + + try { + getMsgFolders(account.incomingServer.rootFolder, msgFolderArr); + } + catch (e) { + EnigmailLog.DEBUG("autoSetup.jsm: determinePreviousInstallType: Error: " + e + "\n"); + } + + if (account.incomingServer.type.search(/^(none|nntp)$/) === 0) { + // ignore NNTP accounts and "Local Folders" accounts + continue; + } + + // Iterating through each non empty Folder Database in the Account + + for (var k = 0; k < msgFolderArr.length; k++) { + let msgFolder = msgFolderArr[k]; + let msgDatabase = msgFolderArr[k].msgDatabase; + + if ((msgFolder.flags & Ci.nsMsgFolderFlags.Junk) || + (msgFolder.flags & Ci.nsMsgFolderFlags.Trash) || + (!account.defaultIdentity)) { + continue; + } + + EnigmailLog.DEBUG(`autoSetup.jsm: determinePreviousInstallType: scanning folder "${msgFolder.name}"\n`); + + let msgEnumerator = msgDatabase.ReverseEnumerateMessages(); + + // Iterating through each message in the Folder + while (msgEnumerator.hasMoreElements()) { + let msgHeader = msgEnumerator.getNext().QueryInterface(nsIMsgDBHdr); + let msgURI = msgFolder.getUriForMsg(msgHeader); + + let msgAuthor = ""; + try { + msgAuthor = EnigmailFuncs.stripEmail(msgHeader.author); + } + catch (x) {} + + // Listing all the headers in the message + + let messenger = Components.classes["@mozilla.org/messenger;1"].createInstance(nsIMessenger); + 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); + + msgHeaders = checkHeaderValues.msgHeaders; + returnMsgValue = checkHeaderValues.returnMsgValue; + + const currDateInSeconds = getCurrentTime(); + const diffSecond = currDateInSeconds - msgHeader.dateInSeconds; + + /** + 2592000 = No. of Seconds in a Month. + This is to ignore 1 month old messages. + */ + if (diffSecond > 2592000.0) { + break; + } + } + + } + + } + if (returnMsgValue.acSetupMessage) { + EnigmailLog.DEBUG(`autoSetup.jsm: determinePreviousInstallType: found AC-Setup message\n`); + gDeterminedSetupType = returnMsgValue; + resolve(gDeterminedSetupType); + } + else { + EnigmailLog.DEBUG(`msgHeaders.length: ${msgHeaders.length}\n`); + + // find newest message to know the protocol + let latestMsg = null; + for (let i = 0; i < msgHeaders.length; i++) { + if (!latestMsg) { + latestMsg = msgHeaders[i]; + } + + if (msgHeaders[i].dateTime > latestMsg.dateTime) { + latestMsg = msgHeaders[i]; + } + } + + if (latestMsg) { + if (latestMsg.msgType === "Autocrypt") { + returnMsgValue.value = EnigmailConstants.AUTOSETUP_AC_HEADER; + returnMsgValue.msgHeaders = msgHeaders; + } + else if (latestMsg.msgType === "pEp") { + returnMsgValue.value = EnigmailConstants.AUTOSETUP_PEP_HEADER; + returnMsgValue.msgHeaders = msgHeaders; + } + else { + returnMsgValue.value = EnigmailConstants.AUTOSETUP_ENCRYPTED_MSG; + returnMsgValue.msgHeaders = msgHeaders; + } + } + + let defId = EnigmailFuncs.getDefaultIdentity(); + if (defId) { + returnMsgValue.userName = defId.fullName; + returnMsgValue.userEmail = defId.email; + } + else { + returnMsgValue.userName = undefined; + returnMsgValue.userEmail = undefined; + } + + gDeterminedSetupType = returnMsgValue; + EnigmailLog.DEBUG(`autoSetup.jsm: determinePreviousInstallType: found type: ${returnMsgValue.value}\n`); + resolve(returnMsgValue); + } + } + catch (x) { + reject(x); + } + }); + + }, + + /** + * Process the Autocrypt Setup Message + * + * @param {Object} headerValue: contains header and attachment of an Autocrypt Setup Message + * @param {nsIWindow} passwordWindow: parent window for password dialog + * @param {nsIWindow} confirmWindow: parent window for confirmation dialog + * (note: split into 2 parent windows for unit tests) + * + * @return {Promise}: Import result. + * 1: imported OK + * 0: no Autocrypt setup message + * -1: import not OK (wrong password, canceled etc.) + */ + + performAutocryptSetup: async function(headerValue, passwordWindow = null, confirmWindow = null) { + EnigmailLog.DEBUG("autoSetup.jsm: performAutocryptSetup()\n"); + + let imported = 0; + if (headerValue.attachment.contentType.search(/^application\/autocrypt-setup$/i) === 0) { + try { + let res = await EnigmailAutocrypt.getSetupMessageData(headerValue.attachment.url); + let passwd = EnigmailWindows.autocryptSetupPasswd(passwordWindow, "input", res.passphraseFormat, res.passphraseHint); + + if ((!passwd) || passwd == "") { + throw "noPasswd"; + } + + await EnigmailAutocrypt.handleBackupMessage(passwd, res.attachmentData, headerValue.acSetupMessage.author); + EnigmailDialog.info(confirmWindow, EnigmailLocale.getString("autocrypt.importSetupKey.success", headerValue.acSetupMessage.author)); + imported = 1; + } + catch (err) { + EnigmailLog.DEBUG("autoSetup.jsm: performAutocryptSetup got cancel status=" + err + "\n"); + imported = -1; + + switch (err) { + case "getSetupMessageData": + EnigmailDialog.alert(confirmWindow, EnigmailLocale.getString("autocrypt.importSetupKey.invalidMessage")); + break; + case "wrongPasswd": + if (EnigmailDialog.confirmDlg(confirmWindow, EnigmailLocale.getString("autocrypt.importSetupKey.wrongPasswd"), EnigmailLocale.getString("dlg.button.retry"), + EnigmailLocale.getString("dlg.button.cancel"))) { + EnigmailAutoSetup.performAutocryptSetup(headerValue); + } + break; + case "keyImportFailed": + EnigmailDialog.alert(confirmWindow, EnigmailLocale.getString("autocrypt.importSetupKey.invalidKey")); + break; + default: + EnigmailDialog.alert(confirmWindow, EnigmailLocale.getString("keyserver.error.unknown")); + } + } + } + + return imported; + }, + + /** + * Process accounts with Autocrypt headers + * + * @param {Object} setupType: containing Autocrypt headers from accounts + * + * @return {Promise}: Result: 0: OK / 1: failure + */ + + processAutocryptHeader: function(setupType) { + EnigmailLog.DEBUG("autoSetup.jsm: processAutocryptHeader()\n"); + + return new Promise(async (resolve, reject) => { + + // find newest message to know the protocol + let latestMsg = null; + for (let i = 0; i < setupType.msgHeaders.length; i++) { + if (!latestMsg) { + latestMsg = setupType.msgHeaders[i]; + } + + if (setupType.msgHeaders[i].dateTime > latestMsg) { + latestMsg = setupType.msgHeaders[i]; + } + } + + let sysType = latestMsg.msgType; + EnigmailLog.DEBUG(`autoSetup.jsm: processAutocryptHeader: got type: ${sysType}\n`); + + + for (let i = 0; i < setupType.msgHeaders.length; i++) { + if (setupType.msgHeaders[i].msgType === "Autocrypt") { + // FIXME + let success = await EnigmailAutocrypt.processAutocryptHeader(setupType.msgHeaders[i].fromAddr, [setupType.msgHeaders[i].msgData], + setupType.msgHeaders[i].date); + if (success !== 0) { + resolve(1); + } + } + } + resolve(0); + }); + }, + + /** + * Create a new autocrypt key for every configured account and configure the account + * to use that key. The keys are not protected by a password. + * + * The creation is done in the background after waiting timeoutValue ms + * @param {Number} timeoutValue: number of miliseconds to wait before starting + * the process + */ + createKeyForAllAccounts: function(timeoutValue = 1000) { + EnigmailLog.DEBUG("autoSetup.jsm: createKeyForAllAccounts()\n"); + let self = this; + + EnigmailTimer.setTimeout(async function _f() { + let msgAccountManager = Cc["@mozilla.org/messenger/account-manager;1"].getService(nsIMsgAccountManager); + let accounts = msgAccountManager.accounts; + let createdKeys = []; + + for (let i = 0; i < accounts.length; i++) { + let account = accounts.queryElementAt(i, Ci.nsIMsgAccount); + let id = account.defaultIdentity; + + if (id && id.email) { + let keyId = await self.createAutocryptKey(id.fullName, id.email); + EnigmailLog.DEBUG(`autoSetup.jsm: createKeyForAllAccounts: created key ${keyId}\n`); + if (keyId) { + let keyObj = EnigmailKeyRing.getKeyById(keyId); + if (keyObj) createdKeys.push(keyObj); + id.setBoolAttribute("enablePgp", true); + id.setCharAttribute("pgpkeyId", keyId); + id.setIntAttribute("pgpKeyMode", 1); + id.setBoolAttribute("pgpMimeMode", true); + id.setBoolAttribute("pgpSignEncrypted", true); + } + } + } + + // upload created keys to WKD (if possible) + EnigmailWks.wksUpload(createdKeys, null); + }, timeoutValue); + }, + + /** + * Create a new autocrypt-complinant key + * The keys will not be protected by passwords. + * + * @param {String} userName: Display name + * @param {String} userEmail: Email address + * + * @return {Promise}: Success (true = successful) + */ + createAutocryptKey: function(userName, userEmail) { + return new Promise((resolve, reject) => { + EnigmailLog.DEBUG("autoSetup.jsm: createAutocryptKey()\n"); + + let keyType = "ECC", + keyLength = 0; + + if (!EnigmailGpg.getGpgFeature("supports-ecc-keys")) { + // fallback for gpg < 2.1 + keyLength = 4096; + keyType = "RSA"; + } + + let expiry = 1825, // 5 years + passphrase = "", + generateObserver = { + keyId: null, + backupLocation: null, + _state: 0, + + onDataAvailable: function(data) {}, + onStopRequest: function(exitCode) { + EnigmailLog.DEBUG("autoSetup.jsm: createAutocryptKey(): key generation complete\n"); + resolve(generateObserver.keyId); + } + }; + + try { + let keygenRequest = EnigmailKeyRing.generateKey(userName, "", userEmail, expiry, keyLength, keyType, passphrase, generateObserver); + } + catch (ex) { + EnigmailLog.DEBUG("autoSetup.jsm: createAutocryptKey: error: " + ex.message); + resolve(null); + } + }); + }, + + /** + * Configure Enigmail to use existing keys + */ + applyExistingKeys: function() { + let msgAccountManager = Cc["@mozilla.org/messenger/account-manager;1"].getService(nsIMsgAccountManager); + let identities = msgAccountManager.allIdentities; + + for (let i = 0; i < identities.length; i++) { + let id = identities.queryElementAt(i, Ci.nsIMsgIdentity); + + if (id && id.email) { + let keyObj = EnigmailKeyRing.getSecretKeyByEmail(id.email); + if (keyObj) { + EnigmailLog.DEBUG(`autoSetup.jsm: applyExistingKeys: found key ${keyObj.keyId}\n`); + id.setBoolAttribute("enablePgp", true); + id.setCharAttribute("pgpkeyId", "0x" + keyObj.fpr); + id.setIntAttribute("pgpKeyMode", 1); + id.setBoolAttribute("pgpMimeMode", true); + id.setBoolAttribute("pgpSignEncrypted", true); + } + } + } + } +}; + + +/** + * Recusrively go through all folders to get a flat array of all sub-folders + * starting with a parent folder. + * + * @param {nsIMsgFolder} folder: the folder to scan + * @param {nsIMsgFolder} msgFolderArr: An array to be filled with all folders that contain messages + */ + +function getMsgFolders(folder, msgFolderArr) { + if (folder.getTotalMessages(false) > 0) { + msgFolderArr.push(folder); + } + + // add all subfolders + if (folder.hasSubFolders) { + let subFolders = folder.subFolders; + while (subFolders.hasMoreElements()) { + getMsgFolders(subFolders.getNext().QueryInterface(nsIMsgFolder), msgFolderArr); + } + } +} + +// Util Function for Extracting manually added Headers +function streamListener(callback) { + let streamListener = { + mAttachments: [], + mHeaders: [], + mBusy: true, + + onStartRequest: function(aRequest) { + this.mAttachments = []; + this.mHeaders = []; + this.mBusy = true; + + var channel = aRequest.QueryInterface(Components.interfaces.nsIChannel); + channel.URI.QueryInterface(Components.interfaces.nsIMsgMailNewsUrl); + channel.URI.msgHeaderSink = this; // adds this header sink interface to the channel + }, + onStopRequest: function(aRequest, aStatusCode) { + callback(); + this.mBusy = false; // if needed, you can poll this var to see if we are done collecting attachment details + }, + onDataAvailable: function(aRequest, aInputStream, aOffset, aCount) {}, + onStartHeaders: function() {}, + onEndHeaders: function() {}, + processHeaders: function(aHeaderNameEnumerator, aHeaderValueEnumerator, aDontCollectAddress) { + while (aHeaderNameEnumerator.hasMore()) { + this.mHeaders.push({ + name: aHeaderNameEnumerator.getNext().toLowerCase(), + value: aHeaderValueEnumerator.getNext() + }); + } + }, + handleAttachment: function(aContentType, aUrl, aDisplayName, aUri, aIsExternalAttachment) { + if (aContentType == "text/html") { + return; + } + this.mAttachments.push({ + contentType: aContentType, + url: aUrl, + displayName: aDisplayName, + uri: aUri, + isExternal: aIsExternalAttachment + }); + }, + onEndAllAttachments: function() {}, + onEndMsgDownload: function(aUrl) {}, + onEndMsgHeaders: function(aUrl) {}, + onMsgHasRemoteContent: function(aMsgHdr) {}, + getSecurityInfo: function() {}, + setSecurityInfo: function(aSecurityInfo) {}, + getDummyMsgHeader: function() {}, + + QueryInterface: function(aIID) { + if (aIID.equals(Components.interfaces.nsIStreamListener) || + aIID.equals(Components.interfaces.nsIMsgHeaderSink) || + aIID.equals(Components.interfaces.nsISupports)) { + return this; + } + + throw Components.results.NS_NOINTERFACE; + } + }; + + return streamListener; +} + +function getStreamedMessage(msgFolder, msgHeader) { + return new Promise((resolve, reject) => { + let msgURI = msgFolder.getUriForMsg(msgHeader); + var listener = streamListener(() => { + resolve(listener.mAttachments[0]); + }); + let messenger = Components.classes["@mozilla.org/messenger;1"].createInstance(nsIMessenger); + let mms = messenger.messageServiceFromURI(msgURI).QueryInterface(nsIMsgMessageService); + mms.streamMessage(msgURI, listener, null, null, true, "filter"); + }); +} + +function checkHeaders(headerObj, msgHeader, msgAuthor, accountEmail, msgFolder, returnMsgValue, msgHeaders) { + return new Promise(async (resolve, reject) => { + if (headerObj['autocrypt-setup-message'] && msgHeader.author == msgHeader.recipients) { + + // To extract Attachement for Autocrypt Setup Message + + returnMsgValue.attachment = await getStreamedMessage(msgFolder, msgHeader); + + if (!returnMsgValue.acSetupMessage) { + returnMsgValue.value = 1; + returnMsgValue.acSetupMessage = msgHeader; + } + else if (returnMsgValue.acSetupMessage.date < msgHeader.date) { + returnMsgValue.acSetupMessage = msgHeader; + } + + } + else if (msgAuthor == accountEmail && + (("autocrypt" in headerObj) || + ("x-pep-version" in headerObj))) { + + let msgType = ("x-pep-version" in headerObj) ? "pEp" : "Autocrypt"; + + let fromHeaderExist = null; + for (let j = 0; j < msgHeaders.length; j++) { + if (msgHeaders[j].fromAddr == msgAuthor) { + fromHeaderExist = msgHeaders[j]; + break; + } + } + + if (fromHeaderExist === null) { + let dateTime = new Date(0); + try { + dateTime = jsmime.headerparser.parseDateHeader(headerObj.date); + } + catch (x) {} + + let addHeader = { + fromAddr: msgAuthor, + msgType: msgType, + msgData: headerObj.autocrypt, + date: headerObj.date, + dateTime: dateTime + }; + msgHeaders.push(addHeader); + } + else { + let dateTime = new Date(0); + try { + dateTime = jsmime.headerparser.parseDateHeader(headerObj.date); + } + catch (x) {} + if (dateTime > fromHeaderExist.dateTime) { + fromHeaderExist.msgData = headerObj.autocrypt; + fromHeaderExist.date = headerObj.date; + fromHeaderExist.msgType = msgType; + fromHeaderExist.dateTime = dateTime; + } + } + } + + resolve({ + 'returnMsgValue': returnMsgValue, + 'msgHeaders': msgHeaders + }); + }); +} + +function getStreamedHeaders(msgURI, mms) { + + return new Promise((resolve, reject) => { + let headers = Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders); + let headerObj = {}; + try { + mms.streamHeaders(msgURI, EnigmailStreams.newStringStreamListener(aRawString => { + try { + //EnigmailLog.DEBUG(`getStreamedHeaders: ${aRawString}\n`); + headers.initialize(aRawString); + + let i = headers.headerNames; + while (i.hasMore()) { + let hdrName = i.getNext().toLowerCase(); + + let hdrValue = headers.extractHeader(hdrName, true); + headerObj[hdrName] = hdrValue; + } + + if ("autocrypt" in headerObj) { + let acHeader = headers.extractHeader("autocrypt", false); + acHeader = acHeader.replace(/keydata=/i, 'keydata="') + '"'; + + let paramArr = EnigmailMime.getAllParameters(acHeader); + paramArr.keydata = paramArr.keydata.replace(/[\r\n\t ]/g, ""); + + headerObj.autocrypt = ""; + for (i in paramArr) { + if (headerObj.autocrypt.length > 0) { + headerObj.autocrypt += "; "; + } + headerObj.autocrypt += `${i}="${paramArr[i]}"`; + } + } + } + catch (e) { + reject({}); + EnigmailLog.DEBUG("autoSetup.jsm: getStreamedHeaders: Error: " + e + "\n"); + } + resolve(headerObj); + }), null, false); + } + catch (e) { + reject({}); + EnigmailLog.DEBUG("autoSetup.jsm: getStreamedHeaders: Error: " + e + "\n"); + } + }); +} + + +function getCurrentTime() { + return new Date().getTime() / 1000; +} diff -Nru enigmail-2.0.12+ds1/package/autocrypt.jsm enigmail-2.1.3+ds1/package/autocrypt.jsm --- enigmail-2.0.12+ds1/package/autocrypt.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/autocrypt.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 https://mozilla.org/MPL/2.0/. */ @@ -12,34 +11,33 @@ var EXPORTED_SYMBOLS = ["EnigmailAutocrypt"]; -const Cc = Components.classes; -const Ci = Components.interfaces; const Cr = Components.results; -const Cu = Components.utils; -Cu.import("resource://gre/modules/Sqlite.jsm"); /* global Sqlite: false */ -Cu.import("resource:///modules/jsmime.jsm"); /*global jsmime: false*/ -Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ -Cu.import("resource://enigmail/log.jsm"); /* global EnigmailLog: false*/ -Cu.import("resource://enigmail/locale.jsm"); /* global EnigmailLocale: false*/ -Cu.import("resource://enigmail/funcs.jsm"); /* global EnigmailFuncs: false*/ -Cu.import("resource://enigmail/mime.jsm"); /* global EnigmailMime: false*/ -Cu.import("resource://gre/modules/PromiseUtils.jsm"); /* global PromiseUtils: false */ -Cu.import("resource://enigmail/timer.jsm"); /*global EnigmailTimer: false */ -Cu.import("resource://enigmail/key.jsm"); /*global EnigmailKey: false */ -Cu.import("resource://enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ -Cu.import("resource://enigmail/openpgp.jsm"); /*global EnigmailOpenPGP: false */ -Cu.import("resource://enigmail/mime.jsm"); /*global EnigmailMime: false */ -Cu.import("resource://enigmail/rng.jsm"); /*global EnigmailRNG: false */ -Cu.import("resource://enigmail/send.jsm"); /*global EnigmailSend: false */ -Cu.import("resource://enigmail/streams.jsm"); /*global EnigmailStreams: false */ -Cu.import("resource://enigmail/armor.jsm"); /*global EnigmailArmor: false */ -Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ -Cu.import("resource://enigmail/rules.jsm"); /*global EnigmailRules: false */ -Cu.import("resource://enigmail/keyEditor.jsm"); /*global EnigmailKeyEditor: false */ -Cu.import("resource://enigmail/stdlib.jsm"); /*global EnigmailStdlib: false */ -Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ +Components.utils.importGlobalProperties(["crypto"]); + +const jsmime = ChromeUtils.import("resource:///modules/jsmime.jsm").jsmime; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailFuncs = ChromeUtils.import("chrome://enigmail/content/modules/funcs.jsm").EnigmailFuncs; +const EnigmailMime = ChromeUtils.import("chrome://enigmail/content/modules/mime.jsm").EnigmailMime; +const EnigmailSqliteDb = ChromeUtils.import("chrome://enigmail/content/modules/sqliteDb.jsm").EnigmailSqliteDb; +const PromiseUtils = ChromeUtils.import("resource://gre/modules/PromiseUtils.jsm").PromiseUtils; +const EnigmailTimer = ChromeUtils.import("chrome://enigmail/content/modules/timer.jsm").EnigmailTimer; +const EnigmailKey = ChromeUtils.import("chrome://enigmail/content/modules/key.jsm").EnigmailKey; +const EnigmailKeyRing = ChromeUtils.import("chrome://enigmail/content/modules/keyRing.jsm").EnigmailKeyRing; +const EnigmailOpenPGP = ChromeUtils.import("chrome://enigmail/content/modules/openpgp.jsm").EnigmailOpenPGP; +const EnigmailRNG = ChromeUtils.import("chrome://enigmail/content/modules/rng.jsm").EnigmailRNG; +const EnigmailSend = ChromeUtils.import("chrome://enigmail/content/modules/send.jsm").EnigmailSend; +const EnigmailStreams = ChromeUtils.import("chrome://enigmail/content/modules/streams.jsm").EnigmailStreams; +const EnigmailArmor = ChromeUtils.import("chrome://enigmail/content/modules/armor.jsm").EnigmailArmor; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailRules = ChromeUtils.import("chrome://enigmail/content/modules/rules.jsm").EnigmailRules; +const EnigmailKeyEditor = ChromeUtils.import("chrome://enigmail/content/modules/keyEditor.jsm").EnigmailKeyEditor; +const EnigmailStdlib = ChromeUtils.import("chrome://enigmail/content/modules/stdlib.jsm").EnigmailStdlib; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; +const EnigmailCryptoAPI = ChromeUtils.import("chrome://enigmail/content/modules/cryptoAPI.jsm").EnigmailCryptoAPI; var gCreatedSetupIds = []; @@ -47,17 +45,18 @@ /** * Process the "Autocrypt:" header and if successful store the update in the database * - * @param fromAddr: String - Address of sender (From: header) - * @param headerDataArr: Array of String: all instances of the Autocrypt: header found in the message - * @param dateSent: String - Date: field of the message - * @param autoCryptEnabled: Boolean - if true, autocrypt is enabled for the context of the message + * @param {String} fromAddr: Address of sender (From: header) + * @param {Array of String} headerDataArr: all instances of the Autocrypt: header found in the message + * @param {String or Number} dateSent: "Date:" field of the message as readable string or in seconds after 1970-01-01 + * @param {Boolean} autoCryptEnabled: if true, autocrypt is enabled for the context of the message * - * @return Promise (success) - success: Number (0 = success, 1+ = failure) + * @return {Promise}: success: 0 = success, 1+ = failure */ - processAutocryptHeader: function(fromAddr, headerDataArr, dateSent, autoCryptEnabled = false) { + processAutocryptHeader: async function(fromAddr, headerDataArr, dateSent, autoCryptEnabled = false, isGossip = false) { EnigmailLog.DEBUG("autocrypt.jsm: processAutocryptHeader(): from=" + fromAddr + "\n"); + let conn; - return new Promise((resolve, reject) => { + try { // critical parameters: {param: mandatory} const CRITICAL = { addr: true, @@ -70,8 +69,7 @@ fromAddr = EnigmailFuncs.stripEmail(fromAddr).toLowerCase(); } catch (ex) { - reject("processAutocryptHeader error " + ex); - return; + throw "processAutocryptHeader error " + ex; } let foundTypes = {}; let paramArr = []; @@ -94,8 +92,7 @@ // found mandatory parameter if (!(i in paramArr)) { EnigmailLog.DEBUG("autocrypt.jsm: processAutocryptHeader: cannot find param '" + i + "'\n"); - resolve(1); - return; // do nothing if not all mandatory parts are present + return 1; // do nothing if not all mandatory parts are present } } } @@ -104,8 +101,7 @@ if (i.substr(0, 1) !== "_") { if (!(i in CRITICAL)) { EnigmailLog.DEBUG("autocrypt.jsm: processAutocryptHeader: unknown critical param " + i + "\n"); - resolve(2); - return; // do nothing if an unknown critical parameter is found + return 2; // do nothing if an unknown critical parameter is found } } } @@ -115,19 +111,17 @@ if (fromAddr !== paramArr.addr) { EnigmailLog.DEBUG("autocrypt.jsm: processAutocryptHeader: from Addr " + fromAddr + " != " + paramArr.addr.toLowerCase() + "\n"); - resolve(3); - return; + return 3; } if (!("type" in paramArr)) { - paramArr.type = "1"; + paramArr.type = (isGossip ? "1g" : "1"); } else { paramArr.type = paramArr.type.toLowerCase(); if (paramArr.type !== "1") { EnigmailLog.DEBUG("autocrypt.jsm: processAutocryptHeader: unknown type " + paramArr.type + "\n"); - resolve(4); - return; // we currently only support 1 (=OpenPGP) + return 4; // we currently only support 1 (=OpenPGP) } } @@ -136,24 +130,32 @@ } catch (ex) { EnigmailLog.DEBUG("autocrypt.jsm: processAutocryptHeader: key is not base64-encoded\n"); - resolve(5); - return; + return 5; } if (paramArr.type in foundTypes) { EnigmailLog.DEBUG("autocrypt.jsm: processAutocryptHeader: duplicate header for type=" + paramArr.type + "\n"); - resolve(6); - return; // do not process anything if more than one Autocrypt header for the same type is found + return 6; // do not process anything if more than one Autocrypt header for the same type is found } foundTypes[paramArr.type] = 1; } + if (isGossip) { + paramArr["prefer-encrypt"] = "nopreference"; + } + if (!("prefer-encrypt" in paramArr)) { paramArr["prefer-encrypt"] = "nopreference"; } - let lastDate = jsmime.headerparser.parseDateHeader(dateSent); + let lastDate; + if (typeof dateSent === "string") { + lastDate = jsmime.headerparser.parseDateHeader(dateSent); + } + else { + lastDate = new Date(dateSent * 1000); + } let now = new Date(); if (lastDate > now) { lastDate = now; @@ -172,115 +174,197 @@ paramArr.autocryptDate = lastDate; } + try { + conn = await EnigmailSqliteDb.openDatabase(); + } + catch (ex) { + EnigmailLog.DEBUG("autocrypt.jsm: processAutocryptHeader: could not open database\n"); + return 7; + } - let conn; + let resultObj = await findUserRecord(conn, [fromAddr], paramArr.type); + EnigmailLog.DEBUG("autocrypt.jsm: got " + resultObj.numRows + " rows\n"); + if (resultObj.data.length === 0) { + await appendUser(conn, paramArr); + } + else { + await updateUser(conn, paramArr, resultObj.data, autoCryptEnabled); + } - openAutocryptDb().then( - function onConnection(connection) { - conn = connection; - return checkDatabaseStructure(conn); - }, - function onError(error) { - EnigmailLog.DEBUG("autocrypt.jsm: processAutocryptHeader: could not open database\n"); - resolve(7); - } - ).then( - function _f() { - return findUserRecord(conn, [fromAddr], paramArr.type); - } - ).then( - function gotData(resultObj) { - EnigmailLog.DEBUG("autocrypt.jsm: got " + resultObj.numRows + " rows\n"); - if (resultObj.data.length === 0) { - return appendUser(conn, paramArr); - } - else { - return updateUser(conn, paramArr, resultObj.data, autoCryptEnabled); + EnigmailLog.DEBUG("autocrypt.jsm: OK - closing connection\n"); + conn.close(); + return 0; + } + catch (err) { + EnigmailLog.DEBUG("autocrypt.jsm: error - closing connection: " + err + "\n"); + conn.close(); + return 8; + } + }, + + /** + * Import autocrypt OpenPGP keys into regular keyring for a given list of email addresses + * @param {Array of String} emailAddr: email addresses + * @param {Boolean} acceptGossipKeys: import keys received via gossip + * + * @return {Promise} + */ + importAutocryptKeys: async function(emailAddr, acceptGossipKeys = false) { + EnigmailLog.DEBUG("autocrypt.jsm: importAutocryptKeys()\n"); + + let keyArr = await this.getOpenPGPKeyForEmail(emailAddr); + if (!keyArr) return []; + + let importedKeys = []; + let now = new Date(); + let prev = null; + + for (let i = 0; i < keyArr.length; i++) { + if (prev && prev.email === keyArr[i].email && prev.type === "1" && keyArr[i].type === "1g") { + // skip if we have "gossip" key preceeded by a "regular" key + continue; + } + if (!acceptGossipKeys && keyArr[i].type === "1g") { + EnigmailLog.DEBUG(`autocrypt.jsm: importAutocryptKeys: skipping gossip key for ${keyArr[i].email}\n`); + continue; + } + + prev = keyArr[i]; + if ((now - keyArr[i].lastAutocrypt) / (1000 * 60 * 60 * 24) < 366) { + // only import keys received less than 12 months ago + try { + let keyData = atob(keyArr[i].keyData); + if (keyData.length > 1) { + importedKeys = await this.applyKeyFromKeydata(keyData, keyArr[i].email, keyArr[i].state, keyArr[i].type); } } - ).then( - function _done() { - EnigmailLog.DEBUG("autocrypt.jsm: OK - closing connection\n"); - conn.close(); - resolve(0); - } - ).catch( - function _err(reason) { - EnigmailLog.DEBUG("autocrypt.jsm: error - closing connection: " + reason + "\n"); - conn.close(); - resolve(8); + catch (ex) { + EnigmailLog.DEBUG("autocrypt.jsm importAutocryptKeys: exception " + ex.toString() + "\n"); } - ); - }); + } + } + + return importedKeys; }, /** - * Import autocrypt OpenPGP keys for a given list of email addresses - * @param emailAddr: Array of String - emai addresses + * Import given key data and set the per-recipient rule accordingly * - * @return Promise().resolve { } + * @param {String} keyData - String key data (BLOB, binary form) + * @param {String} email - email address associated with key + * @param {String} autocryptState - mutual or nopreference + * @param {String} type - autocrypt header type (1 / 1g) + * + * @return {Promise} list of imported keys */ - importAutocryptKeys: function(emailAddr) { - EnigmailLog.DEBUG("autocrypt.jsm importAutocryptKeys()\n"); + applyKeyFromKeydata: async function(keyData, email, autocryptState, type) { + let keysObj = {}; + let importedKeys = []; + + let pubkey = EnigmailOpenPGP.enigmailFuncs.bytesToArmor(EnigmailOpenPGP.openpgp.enums.armor.public_key, keyData); + await EnigmailKeyRing.importKeyAsync(null, false, pubkey, "", {}, keysObj); + + if (keysObj.value) { + importedKeys = importedKeys.concat(keysObj.value); + + if (keysObj.value.length > 0) { + let key = EnigmailKeyRing.getKeyById(keysObj.value[0]); + + // enable encryption if state (prefer-encrypt) is "mutual"; + // otherwise, disable it explicitely + let signEncrypt = (autocryptState === "mutual" ? 1 : 0); + + if (key && key.fpr) { + let ruleObj = { + email: `{${EnigmailConstants.AC_RULE_PREFIX}${email}}`, + keyList: `0x${key.fpr}`, + sign: signEncrypt, + encrypt: signEncrypt, + pgpMime: 2, + flags: 0 + }; - return new Promise((resolve, reject) => { - this.getOpenPGPKeyForEmail(emailAddr). - then(keyArr => { - let importedKeys = []; - let now = new Date(); + EnigmailRules.insertOrUpdateRule(ruleObj); + await this.setKeyImported(null, email); + } + } + } - for (let i in keyArr) { - if ((now - keyArr[i].lastAutocrypt) / (1000 * 60 * 60 * 24) < 366) { - // only import keys received less than 12 months ago - try { - let keyData = atob(keyArr[i].keyData); - if (keyData.length > 1) { - let keysObj = {}; - - let pubkey = EnigmailOpenPGP.enigmailFuncs.bytesToArmor(EnigmailOpenPGP.openpgp.enums.armor.public_key, keyData); - EnigmailKeyRing.importKey(null, false, pubkey, keyArr[i].fpr, {}, keysObj); - - if (keysObj.value) { - importedKeys = importedKeys.concat(keysObj.value); - if (keysObj.value.length > 0) { - let key = EnigmailKeyRing.getKeyById(keysObj.value[0]); - - // enable encryption if state (prefer-encrypt) is "mutual"; - // otherwise, disable it explicitely - let signEncrypt = (keyArr[i].state === "mutual" ? 1 : 0); - - if (key && key.fpr) { - let ruleObj = { - email: "{" + EnigmailConstants.AC_RULE_PREFIX + keyArr[i].email + "}", - keyList: "0x" + key.fpr, - sign: signEncrypt, - encrypt: signEncrypt, - pgpMime: 2, - flags: 0 - }; - - EnigmailRules.insertOrUpdateRule(ruleObj); - } - } - } - } - } - catch (ex) { - EnigmailLog.DEBUG("autocrypt.jsm importAutocryptKeys: exception " + ex.toString() + "\n"); - } - } + return importedKeys; + }, + + /** + * Update key in the Autocrypt database to mark it "imported in keyring" + */ + setKeyImported: async function(connection, email) { + EnigmailLog.DEBUG(`autocrypt.jsm: setKeyImported(${email})\n`); + try { + let conn = connection; + if (!conn) { + conn = await EnigmailSqliteDb.openDatabase(); + } + let updateStr = "update autocrypt_keydata set keyring_inserted = '1' where email = :email;"; + + let updateObj = { + email: email.toLowerCase() + }; + + await new Promise((resolve, reject) => + conn.executeTransaction(function _trx() { + conn.execute(updateStr, updateObj).then(r => { + resolve(r); + }).catch(err => { + EnigmailLog.DEBUG(`autocrypt.jsm: setKeyImported: error ${err}\n`); + reject(err); + }); + })); + + if (!connection) conn.close(); + } + catch (err) { + EnigmailLog.DEBUG(`autocrypt.jsm: setKeyImported: error ${err}\n`); + throw err; + } + }, + + /** + * Go through all emails in the autocrypt store and determine which keys already + * have a per-recipient rule + */ + updateAllImportedKeys: async function() { + EnigmailLog.DEBUG(`autocrypt.jsm: updateAllImportedKeys()\n`); + try { + let conn = await EnigmailSqliteDb.openDatabase(); + + let rows = []; + await conn.execute("select email, type from autocrypt_keydata where type = '1';", {}, + function _onRow(record) { + rows.push(record.getResultByName("email")); + }); + + for (let i in rows) { + let r = EnigmailRules.getRuleByEmail(`${EnigmailConstants.AC_RULE_PREFIX}${rows[i]}`); + if (r) { + await this.setKeyImported(conn, rows[i], "1"); } - resolve(importedKeys); - }); - }); + } + EnigmailLog.DEBUG(`autocrypt.jsm: updateAllImportedKeys done\n`); + + conn.close(); + } + catch (err) { + EnigmailLog.DEBUG(`autocrypt.jsm: updateAllImportedKeys: error ${err}\n`); + throw err; + } }, /** * Find an autocrypt OpenPGP key for a given list of email addresses - * @param emailAddr: Array of String - emai addresses + * @param emailAddr: Array of String - email addresses * - * @return Promise().resolve { fpr, keyData, lastAutocrypt} + * @return Promise() + * Object: {fpr, keyData, lastAutocrypt} */ getOpenPGPKeyForEmail: function(emailAddr) { EnigmailLog.DEBUG("autocrypt.jsm: getOpenPGPKeyForEmail(" + emailAddr.join(",") + ")\n"); @@ -288,19 +372,14 @@ let conn; return new Promise((resolve, reject) => { - openAutocryptDb().then( + EnigmailSqliteDb.openDatabase().then( function onConnection(connection) { conn = connection; - return checkDatabaseStructure(conn); + return findUserRecord(conn, emailAddr, "1,1g"); }, function onError(error) { - EnigmailLog.DEBUG("autocrypt.jsm: getOpenPGPKeyForEmail: could not open database [" + error + "]\n"); + EnigmailLog.DEBUG("autocrypt.jsm: getOpenPGPKeyForEmail: could not open database\n"); reject("getOpenPGPKeyForEmail1 error " + error); - return; - } - ).then( - function _f() { - return findUserRecord(conn, emailAddr, "1"); } ).then( function gotData(resultObj) { @@ -309,7 +388,6 @@ if (resultObj.data.length === 0) { resolve(null); - return; } else { let retArr = []; @@ -320,19 +398,18 @@ fpr: record.getResultByName("fpr"), keyData: record.getResultByName("keydata"), state: record.getResultByName("state"), + type: record.getResultByName("type"), lastAutocrypt: new Date(record.getResultByName("last_seen_autocrypt")) }); } resolve(retArr); - return; } } ). catch((err) => { conn.close(); - reject("getOpenPGPKeyForEmail2 error " + err); - return; + reject("getOpenPGPKeyForEmail: error " + err); }); }); }, @@ -352,74 +429,73 @@ return new Promise((resolve, reject) => { let keyId = ""; let key; + try { - if (!EnigmailCore.getService(null, false)) { - reject(0); - return; - } - - if (identity.getIntAttribute("pgpKeyMode") === 1) { - keyId = identity.getCharAttribute("pgpkeyId"); - } - - if (keyId.length > 0) { - key = EnigmailKeyRing.getKeyById(keyId); - } - else { - key = EnigmailKeyRing.getSecretKeyByUserId(identity.email); - } + if (!EnigmailCore.getService(null, false)) { + reject(0); + return; + } - if (!key) { - EnigmailLog.DEBUG("autocrypt.jsm: createSetupMessage: no key found for " + identity.email + "\n"); - reject(1); - return; - } + if (identity.getIntAttribute("pgpKeyMode") === 1) { + keyId = identity.getCharAttribute("pgpkeyId"); + } - let keyData = EnigmailKeyRing.extractSecretKey(true, "0x" + key.fpr, {}, {}); + if (keyId.length > 0) { + key = EnigmailKeyRing.getKeyById(keyId); + } + else { + key = EnigmailKeyRing.getSecretKeyByUserId(identity.email); + } - if (!keyData || keyData.length === 0) { - EnigmailLog.DEBUG("autocrypt.jsm: createSetupMessage: no key found for " + identity.email + "\n"); - reject(1); - return; - } + if (!key) { + EnigmailLog.DEBUG("autocrypt.jsm: createSetupMessage: no key found for " + identity.email + "\n"); + reject(1); + return; + } - let ac = EnigmailFuncs.getAccountForIdentity(identity); - let preferEncrypt = ac.incomingServer.getIntValue("acPreferEncrypt") > 0 ? "mutual" : "nopreference"; + let keyData = key.getSecretKey(true).keyData; - let innerMsg = EnigmailArmor.replaceArmorHeaders(keyData, { - 'Autocrypt-Prefer-Encrypt': preferEncrypt - }) + '\r\n'; + if (!keyData || keyData.length === 0) { + EnigmailLog.DEBUG("autocrypt.jsm: createSetupMessage: no key found for " + identity.email + "\n"); + reject(1); + return; + } - if (!innerMsg || innerMsg.length === 0) { - EnigmailLog.DEBUG("autocrypt.jsm: createSetupMessage: empty key data after replaceArmorHeaders\n"); - reject(1); - return; - } + let ac = EnigmailFuncs.getAccountForIdentity(identity); + let preferEncrypt = ac.incomingServer.getIntValue("acPreferEncrypt") > 0 ? "mutual" : "nopreference"; - let bkpCode = createBackupCode(); - let enc = { - data: innerMsg, - passwords: bkpCode, - armor: true - }; + let innerMsg = EnigmailArmor.replaceArmorHeaders(keyData, { + 'Autocrypt-Prefer-Encrypt': preferEncrypt + }) + '\r\n'; + + let bkpCode = createBackupCode(); + let enc = { + message: EnigmailOpenPGP.openpgp.message.fromText(innerMsg), + passwords: bkpCode, + armor: true + }; + + // create symmetrically encrypted message + EnigmailOpenPGP.openpgp.encrypt(enc).then(msg => { + let msgData = EnigmailArmor.replaceArmorHeaders(msg.data, { + 'Passphrase-Format': 'numeric9x4', + 'Passphrase-Begin': bkpCode.substr(0, 2) + }).replace(/\n/g, "\r\n"); - // create symmetrically encrypted message - EnigmailOpenPGP.openpgp.encrypt(enc).then(msg => { - let msgData = EnigmailArmor.replaceArmorHeaders(msg.data, { - 'Passphrase-Format': 'numeric9x4', - 'Passphrase-Begin': bkpCode.substr(0, 2) - }).replace(/\n/g, "\r\n"); - - let m = createBackupOuterMsg(identity.email, msgData); - resolve({ - msg: m, - passwd: bkpCode + let m = createBackupOuterMsg(identity.email, msgData); + resolve({ + msg: m, + passwd: bkpCode + }); + }).catch(e => { + EnigmailLog.DEBUG("autocrypt.jsm: createSetupMessage: error " + e + "\n"); + reject(2); }); - }).catch(e => { - EnigmailLog.DEBUG("autocrypt.jsm: createSetupMessage: error " + e + "\n"); - reject(2); - return; - }); + } + catch (ex) { + EnigmailLog.DEBUG("autocrypt.jsm: createSetupMessage: error " + ex.toString() + "\n"); + reject(4); + } }); }, @@ -455,7 +531,6 @@ } else { reject(99); - return; } }); }); @@ -502,7 +577,6 @@ } else { reject("getSetupMessageData"); - return; } }); @@ -524,47 +598,45 @@ end = {}; let msgType = EnigmailArmor.locateArmoredBlock(attachmentData, 0, "", start, end, {}); - let encMessage = EnigmailOpenPGP.openpgp.message.readArmored(attachmentData.substring(start.value, end.value)); - - let enc = { - message: encMessage, - password: passwd, - format: 'utf8' - }; - - EnigmailOpenPGP.openpgp.decrypt(enc).then(msg => { - EnigmailLog.DEBUG("autocrypt.jsm: handleBackupMessage: data: " + msg.data.length + "\n"); - - let setupData = importSetupKey(msg.data); - if (setupData) { - EnigmailKeyEditor.setKeyTrust(null, "0x" + setupData.fpr, "5", function(returnCode) { - if (returnCode === 0) { - let id = EnigmailStdlib.getIdentityForEmail(EnigmailFuncs.stripEmail(fromAddr).toLowerCase()); - let ac = EnigmailFuncs.getAccountForIdentity(id.identity); - ac.incomingServer.setBoolValue("enableAutocrypt", true); - ac.incomingServer.setIntValue("acPreferEncrypt", (setupData.preferEncrypt === "mutual" ? 1 : 0)); - id.identity.setCharAttribute("pgpkeyId", "0x" + setupData.fpr); - id.identity.setBoolAttribute("enablePgp", true); - id.identity.setBoolAttribute("pgpSignEncrypted", true); - id.identity.setBoolAttribute("pgpMimeMode", true); - id.identity.setIntAttribute("pgpKeyMode", 1); - EnigmailPrefs.setPref("juniorMode", 1); - resolve(setupData); - } - else { - reject("keyImportFailed"); - return; - } - }); - } - else { - reject("keyImportFailed"); - return; - } - }). + EnigmailOpenPGP.openpgp.message.readArmored(attachmentData.substring(start.value, end.value)).then(encMessage => { + let enc = { + message: encMessage, + passwords: [passwd], + format: 'utf8' + }; + + return EnigmailOpenPGP.openpgp.decrypt(enc); + }) + .then(msg => { + EnigmailLog.DEBUG("autocrypt.jsm: handleBackupMessage: data: " + msg.data.length + "\n"); + + let setupData = importSetupKey(msg.data); + if (setupData) { + EnigmailKeyEditor.setKeyTrust(null, "0x" + setupData.fpr, "5", function(returnCode) { + if (returnCode === 0) { + let id = EnigmailStdlib.getIdentityForEmail(EnigmailFuncs.stripEmail(fromAddr).toLowerCase()); + let ac = EnigmailFuncs.getAccountForIdentity(id.identity); + ac.incomingServer.setBoolValue("enableAutocrypt", true); + ac.incomingServer.setIntValue("acPreferEncrypt", (setupData.preferEncrypt === "mutual" ? 1 : 0)); + id.identity.setCharAttribute("pgpkeyId", "0x" + setupData.fpr); + id.identity.setBoolAttribute("enablePgp", true); + id.identity.setBoolAttribute("pgpSignEncrypted", true); + id.identity.setBoolAttribute("pgpMimeMode", true); + id.identity.setIntAttribute("pgpKeyMode", 1); + EnigmailPrefs.setPref("juniorMode", 1); + resolve(setupData); + } + else { + reject("keyImportFailed"); + } + }); + } + else { + reject("keyImportFailed"); + } + }). catch(err => { reject("wrongPasswd"); - return; }); }); }, @@ -606,131 +678,60 @@ if (!o.keyValid) return false; return true; - } -}; - -/** - * use a promise to open the autocrypt database. - * - * it's possible that there will be an NS_ERROR_STORAGE_BUSY - * so we're willing to retry for a little while. - * - * @param resolve: function to call when promise succeeds - * @param reject: function to call when promise fails - * @param waitms: Integer - number of milliseconds to wait before trying again in case of NS_ERROR_STORAGE_BUSY - * @param maxtime: Integer - unix epoch (in milliseconds) of the point at which we should give up. - */ -function _openAutocryptDb_inner(resolve, reject, waitms, maxtime) { - EnigmailLog.DEBUG("autocrypt.jsm: _openAutocryptDb_inner()\n"); - Sqlite.openConnection({ - path: "enigmail.sqlite", - sharedMemoryCache: false - }). - then(connection => { - resolve(connection); - }). - catch(error => { - let now = Date.now(); - if (now > maxtime) { - reject(error); - return; - } - EnigmailTimer.setTimeout(function() { - _openAutocryptDb_inner(resolve, reject, waitms, maxtime); - }, waitms); - }); -} - -/** - * Provide an sqlite conection object asynchronously, retrying if needed - * - * @return Promise (connection) - the Sqlite database object - */ -function openAutocryptDb() { - EnigmailLog.DEBUG("autocrypt.jsm: openAutocryptDb()\n"); - return new Promise((resolve, reject) => { - _openAutocryptDb_inner(resolve, reject, 100, Date.now() + 10000); - }); -} - - -/** - * Ensure that the database structure matches the latest version - * (table is available) - * - * @param connection: Object - SQLite connection - * - * @return Promise - */ -function checkDatabaseStructure(connection) { - EnigmailLog.DEBUG("autocrypt.jsm: checkDatabaseStructure\n"); - - let deferred = PromiseUtils.defer(); + }, - connection.tableExists("autocrypt_keydata").then( - function onSuccess(exists) { - EnigmailLog.DEBUG("autocrypt.jsm: checkDatabaseStructure - success\n"); - if (!exists) { - createAutocryptTable(connection, deferred); - } - else { - deferred.resolve(); - } - }, - function onError(error) { - EnigmailLog.DEBUG("autocrypt.jsm: checkDatabaseStructure - error\n"); - deferred.reject(error); - } - ); + /** + * Delete the record for a user from the autocrypt keystore + * The record with the highest precedence is deleted (i.e. type=1 before type=1g) + */ + deleteUser: async function(email, type) { + EnigmailLog.DEBUG(`autocrypt.jsm: deleteUser(${email})\n`); + let conn = await EnigmailSqliteDb.openDatabase(); + + let updateStr = "delete from autocrypt_keydata where email = :email and type = :type"; + let updateObj = { + email: email, + type: type + }; - return deferred.promise; -} + await new Promise((resolve, reject) => { + conn.executeTransaction(function _trx() { + conn.execute(updateStr, updateObj).then( + function _ok() { + resolve(); + } + ).catch(function _err() { + reject("update failed"); + }); + }); + }); + EnigmailLog.DEBUG(" deletion complete\n"); -/** - * Create the "autocrypt_keydata" table and the corresponding index - * - * @param connection: Object - SQLite connection - * @param deferred: Promise - */ -function createAutocryptTable(connection, deferred) { - EnigmailLog.DEBUG("autocrypt.jsm: createAutocryptTable\n"); + conn.close(); + } - connection.execute("create table autocrypt_keydata (" + - "email text not null, " + // email address of correspondent - "keydata text not null, " + // base64-encoded key as received - "fpr text, " + // fingerprint of key - "type text not null, " + // key type (currently only 1==OpenPGP) - "last_seen_autocrypt text, " + - "last_seen text not null, " + - "state text not null);"). // timestamp of last mail received for the email/type combination - then( - function _ok() { - EnigmailLog.DEBUG("autocrypt.jsm: createAutocryptTable - index\n"); - connection.execute("create unique index autocrypt_keydata_i1 on autocrypt_keydata(email, type)"). - then(function _f() { - deferred.resolve(); - }); - } - ); -} +}; /** * Find the database record for a given email address and type * * @param connection: Object - SQLite connection * @param emails Array of String - Email addresses to search - * @param type: String - type to search (in lowercase) + * @param type: String - types to search (in lowercase), separated by comma * - * @return Promise + * @return {Promise}: + * numRows: number of results + * data: array of RowObject. Query columns using data[i].getResultByName(columnName); */ -function findUserRecord(connection, emails, type) { +async function findUserRecord(connection, emails, type) { EnigmailLog.DEBUG("autocrypt.jsm: findUserRecord\n"); - let deferred = PromiseUtils.defer(); let data = []; + let t = type.split(/[ ,]+/); + let queryParam = { - type: type, - e0: emails[0] + e0: emails[0], + t0: t[0] }; let numRows = 0; @@ -741,21 +742,30 @@ queryParam["e" + i] = emails[i].toLowerCase(); } - connection.execute( - "select * from autocrypt_keydata where email in (" + search + ") and type = :type", queryParam, - function _onRow(row) { - EnigmailLog.DEBUG("autocrypt.jsm: findUserRecord - got row\n"); - data.push(row); - ++numRows; - } - ).then(function _f() { - deferred.resolve({ - data: data, - numRows: numRows - }); - }); + let typeParam = ":t0"; + for (let i = 1; i < t.length; i++) { + typeParam += ", :t" + i; + queryParam["t" + i] = t[i]; + } + + try { + await connection.execute( + "select * from autocrypt_keydata where email in (" + search + ") and type in (" + typeParam + ") order by email, type", queryParam, + function _onRow(row) { + EnigmailLog.DEBUG("autocrypt.jsm: findUserRecord - got row\n"); + data.push(row); + ++numRows; + }); + } + catch (x) { + EnigmailLog.DEBUG(`autocrypt.jsm: findUserRecord: error ${x}\n`); + throw x; + } - return deferred.promise; + return { + data: data, + numRows: numRows + }; } /** @@ -766,42 +776,41 @@ * * @return Promise */ -function appendUser(connection, paramsArr) { +async function appendUser(connection, paramsArr) { EnigmailLog.DEBUG("autocrypt.jsm: appendUser(" + paramsArr.addr + ")\n"); - let deferred = PromiseUtils.defer(); - if (!("fpr" in paramsArr)) { - getFprForKey(paramsArr); + await getFprForKey(paramsArr); } - if (paramsArr.autocryptDate == 0) { - // do not insert record for non-autocrypt mail - deferred.resolve(); - return deferred.promise; - } - - connection.executeTransaction(function _trx() { - connection.execute("insert into autocrypt_keydata (email, keydata, fpr, type, last_seen_autocrypt, last_seen, state) values " + - "(:email, :keyData, :fpr, :type, :lastAutocrypt, :lastSeen, :state)", { - email: paramsArr.addr.toLowerCase(), - keyData: paramsArr.keydata, - fpr: ("fpr" in paramsArr ? paramsArr.fpr : ""), - type: paramsArr.type, - lastAutocrypt: paramsArr.dateSent.toJSON(), - lastSeen: paramsArr.dateSent.toJSON(), - state: paramsArr["prefer-encrypt"] - }).then( - function _ok() { - EnigmailLog.DEBUG("autocrypt.jsm: appendUser - OK\n"); - deferred.resolve(); - } - ).catch(function _err() { - deferred.reject("appendUser"); + return new Promise((resolve, reject) => { + + if (paramsArr.autocryptDate == 0) { + // do not insert record for non-autocrypt mail + resolve(); + return; + } + + connection.executeTransaction(function _trx() { + connection.execute("insert into autocrypt_keydata (email, keydata, fpr, type, last_seen_autocrypt, last_seen, state) values " + + "(:email, :keyData, :fpr, :type, :lastAutocrypt, :lastSeen, :state)", { + email: paramsArr.addr.toLowerCase(), + keyData: paramsArr.keydata, + fpr: ("fpr" in paramsArr ? paramsArr.fpr : ""), + type: paramsArr.type, + lastAutocrypt: paramsArr.dateSent.toJSON(), + lastSeen: paramsArr.dateSent.toJSON(), + state: paramsArr["prefer-encrypt"] + }).then( + function _ok() { + EnigmailLog.DEBUG("autocrypt.jsm: appendUser - OK\n"); + resolve(); + } + ).catch(function _err() { + reject("appendUser"); + }); }); }); - - return deferred.promise; } /** @@ -815,7 +824,7 @@ * * @return Promise */ -function updateUser(connection, paramsArr, resultRows, autoCryptEnabled) { +async function updateUser(connection, paramsArr, resultRows, autoCryptEnabled) { EnigmailLog.DEBUG("autocrypt.jsm: updateUser\n"); let currData = resultRows[0]; @@ -823,14 +832,15 @@ let lastSeen = new Date(currData.getResultByName("last_seen")); let lastAutocrypt = new Date(currData.getResultByName("last_seen_autocrypt")); + let notGossip = (currData.getResultByName("state") !== "gossip"); + let currentKeyData = currData.getResultByName("keydata"); + let isKeyInKeyring = (currData.getResultByName("keyring_inserted") === "1"); + + if (lastSeen >= paramsArr.dateSent || + (paramsArr["prefer-encrypt"] === "gossip" && notGossip)) { + EnigmailLog.DEBUG("autocrypt.jsm: updateUser: not a relevant new latest message\n"); - if (lastSeen >= paramsArr.dateSent) { - EnigmailLog.DEBUG("autocrypt.jsm: updateUser: not a new latest message\n"); - - EnigmailTimer.setTimeout(function _f() { - deferred.resolve(); - }, 0); - return deferred.promise; + return; } EnigmailLog.DEBUG("autocrypt.jsm: updateUser: updating latest message\n"); @@ -841,11 +851,7 @@ if (paramsArr.autocryptDate > 0) { lastAutocrypt = paramsArr.autocryptDate; if (!("fpr" in paramsArr)) { - getFprForKey(paramsArr); - } - - if (autoCryptEnabled) { - updateRuleForEmail(paramsArr.addr, paramsArr["prefer-encrypt"]); + await getFprForKey(paramsArr); } updateStr = "update autocrypt_keydata set state = :state, keydata = :keyData, last_seen_autocrypt = :lastAutocrypt, " + @@ -871,32 +877,87 @@ } if (!("fpr" in paramsArr)) { - getFprForKey(paramsArr); + await getFprForKey(paramsArr); } - connection.executeTransaction(function _trx() { - connection.execute(updateStr, updateObj).then( - function _ok() { - deferred.resolve(); - } - ).catch(function _err() { - deferred.reject("update failed"); + await new Promise((resolve, reject) => { + connection.executeTransaction(function _trx() { + connection.execute(updateStr, updateObj).then( + function _ok() { + resolve(); + } + ).catch(function _err() { + reject("update failed"); + }); }); }); - return deferred.promise; + if (autoCryptEnabled && isKeyInKeyring && (currentKeyData !== paramsArr.keydata)) { + await updateKeyIfNeeded(paramsArr.addr.toLowerCase(), paramsArr.keydata, paramsArr.fpr, paramsArr.type, paramsArr["prefer-encrypt"]); + } + + return; +} + + +/** + * Determine if a key in the keyring should be replaced by a new (or updated) key + * @param {String} email - Email address + * @param {String} keydata - new keydata to import + * @param {String} fpr - fingerprint of new key + * @param {String} keyType - key type (1 / 1g) + * @param {String} autocryptState - mutual or nopreference + * + * @return {Promise} - key updated + */ +async function updateKeyIfNeeded(email, keydata, fpr, keyType, autocryptState) { + let ruleNode = EnigmailRules.getRuleByEmail(EnigmailConstants.AC_RULE_PREFIX + email); + if (!ruleNode) return false; + + let doImport = false; + + let currentKeyId = ruleNode.getAttribute("keyList"); + if (`0x${fpr}` === currentKeyId || keyType === "1") { + doImport = true; + } + else { + // Gossip keys + let keyObj = EnigmailKeyRing.getKeyById(currentKeyId); + let encOk = keyObj.getEncryptionValidity().keyValid; + + if (!encOk) { + // current key is not valid anymore + doImport = true; + } + } + + if (doImport) { + await EnigmailAutocrypt.applyKeyFromKeydata(atob(keydata), email, autocryptState, keyType); + } + + return doImport; } /** * Set the fpr attribute for a given key parameter object */ -function getFprForKey(paramsArr) { +async function getFprForKey(paramsArr) { + let keyData = atob(paramsArr.keydata); + + const cApi = EnigmailCryptoAPI(); + try { - let keyData = atob(paramsArr.keydata); - let err = {}; - let keyInfo = EnigmailKey.getKeyListFromKeyBlock(keyData, err, false); - if (keyInfo.length === 1) { - paramsArr.fpr = keyInfo[0].fpr; + let keyInfo = await cApi.getKeyListFromKeyBlock(keyData); + + // keyInfo is an object, not an array => convert to array 1st + let keyArr = []; + + for (let k in keyInfo) { + keyArr.push(keyInfo[k]); + } + + if (keyArr.length === 1) { + paramsArr.fpr = keyArr[0].fpr; } } catch (x) {} @@ -911,7 +972,6 @@ function createBackupCode() { let bkpCode = ""; - let crypto = EnigmailOpenPGP.enigmailFuncs.getCrypto(); for (let i = 0; i < 9; i++) { if (i > 0) bkpCode += "-"; @@ -990,7 +1050,7 @@ } -function updateRuleForEmail(email, preferEncrypt) { +function updateRuleForEmail(email, preferEncrypt, fpr = null) { let node = EnigmailRules.getRuleByEmail(EnigmailConstants.AC_RULE_PREFIX + email); if (node) { @@ -1001,6 +1061,9 @@ node.setAttribute("sign", signEncrypt); node.setAttribute("encrypt", signEncrypt); + if (fpr) { + node.setAttribute("keyList", `0x${fpr}`); + } EnigmailRules.saveRulesFile(); } } diff -Nru enigmail-2.0.12+ds1/package/bootstrap.js enigmail-2.1.3+ds1/package/bootstrap.js --- enigmail-2.0.12+ds1/package/bootstrap.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/bootstrap.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 https://mozilla.org/MPL/2.0/. */ @@ -7,11 +6,8 @@ /* global APP_SHUTDOWN: false */ -const Cu = Components.utils; -const Cc = Components.classes; -const Ci = Components.interfaces; -Cu.importGlobalProperties(["XMLHttpRequest"]); +Components.utils.importGlobalProperties(["XMLHttpRequest"]); var gAllModules = []; @@ -21,18 +17,11 @@ function startup(data, reason) { try { - const { - EnigmailApp - } = Cu.import("resource://enigmail/app.jsm", {}); - const { - EnigmailCore - } = Cu.import("resource://enigmail/core.jsm", {}); - const { - EnigmailAmPrefsService - } = Cu.import("resource://enigmail/amPrefsService.jsm", {}); - const { - EnigmailPgpmimeHander - } = Cu.import("resource://enigmail/pgpmimeHandler.jsm", {}); + const EnigmailApp = ChromeUtils.import("chrome://enigmail/content/modules/app.jsm").EnigmailApp; + const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; + const EnigmailAmPrefsService = ChromeUtils.import("chrome://enigmail/content/modules/amPrefsService.jsm").EnigmailAmPrefsService; + const EnigmailPgpmimeHander = ChromeUtils.import("chrome://enigmail/content/modules/pgpmimeHandler.jsm").EnigmailPgpmimeHander; + const Services = ChromeUtils.import("resource://gre/modules/Services.jsm").Services; loadListOfModules(); @@ -40,45 +29,26 @@ EnigmailAmPrefsService.startup(reason); EnigmailCore.startup(reason); EnigmailPgpmimeHander.startup(reason); - } - catch (ex) { + + Services.console.logStringMessage("Enigmail bootstrap completed"); + } catch (ex) { logException(ex); } } function shutdown(data, reason) { try { - const { - EnigmailMsgRead - } = Cu.import("resource://enigmail/msgRead.jsm", {}); - EnigmailMsgRead.onShutdown(reason); - - const { - subprocess - } = Cu.import("resource://enigmail/subprocess.jsm", {}); + const subprocess = ChromeUtils.import("chrome://enigmail/content/modules/subprocess.jsm").subprocess; subprocess.onShutdown(); if (reason === APP_SHUTDOWN) return; - const { - EnigmailCore - } = Cu.import("resource://enigmail/core.jsm", {}); - const { - EnigmailAmPrefsService - } = Cu.import("resource://enigmail/amPrefsService.jsm", {}); - const { - EnigmailPgpmimeHander - } = Cu.import("resource://enigmail/pgpmimeHandler.jsm", {}); - const { - EnigmailOverlays - } = Cu.import("resource://enigmail/overlays.jsm", {}); - const { - EnigmailWindows - } = Cu.import("resource://enigmail/windows.jsm", {}); - - const { - Services - } = Components.utils.import("resource://gre/modules/Services.jsm", {}); + const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; + const EnigmailAmPrefsService = ChromeUtils.import("chrome://enigmail/content/modules/amPrefsService.jsm").EnigmailAmPrefsService; + const EnigmailPgpmimeHander = ChromeUtils.import("chrome://enigmail/content/modules/pgpmimeHandler.jsm").EnigmailPgpmimeHander; + const EnigmailOverlays = ChromeUtils.import("chrome://enigmail/content/modules/enigmailOverlays.jsm").EnigmailOverlays; + const EnigmailWindows = ChromeUtils.import("chrome://enigmail/content/modules/windows.jsm").EnigmailWindows; + const Services = ChromeUtils.import("resource://gre/modules/Services.jsm").Services; shutdownModule(EnigmailWindows, reason); shutdownModule(EnigmailOverlays, reason); @@ -90,8 +60,8 @@ // HACK WARNING: The Addon Manager does not properly clear all addon related caches on update; // in order to fully update images and locales, their caches need clearing here Services.obs.notifyObservers(null, "chrome-flush-caches", null); - } - catch (ex) { + + } catch (ex) { logException(ex); } } @@ -102,8 +72,7 @@ function shutdownModule(module, reason) { try { module.shutdown(reason); - } - catch (ex) {} + } catch (ex) {} } /** @@ -111,7 +80,7 @@ */ function loadListOfModules() { let request = new XMLHttpRequest(); - request.open("GET", "resource://enigmail/all-modules.txt", true); // async=true + request.open("GET", "chrome://enigmail/content/modules/all-modules.txt", true); // async=true request.responseType = "text"; request.onerror = function(event) {}; request.onload = function(event) { @@ -119,11 +88,10 @@ gAllModules = []; let modules = request.response.split(/[\r\n]/); for (let mod of modules) { - mod = mod.replace(/^modules/, ""); + mod = mod.replace(/^chrome/, ""); gAllModules.push(mod); } - } - else + } else request.onerror(event); }; request.send(); @@ -137,11 +105,12 @@ for (let mod of gAllModules) { try { // cannot unload filtersWrapper as you can't unregister filters in TB - if (mod !== "filtersWrapper.jsm") { - Cu.unload("resource://enigmail" + mod); + if (mod.search(/filtersWrapper\.jsm$/) < 0) { + Components.utils.unload("chrome://enigmail" + mod); } + } catch (ex) { + logException(ex); } - catch (ex) {} } } @@ -149,8 +118,7 @@ try { const { Services - } = Cu.import("resource://gre/modules/Services.jsm"); + } = ChromeUtils.import("resource://gre/modules/Services.jsm"); Services.console.logStringMessage(exc.toString() + "\n" + exc.stack); - } - catch (x) {} + } catch (x) {} } diff -Nru enigmail-2.0.12+ds1/package/card.jsm enigmail-2.1.3+ds1/package/card.jsm --- enigmail-2.0.12+ds1/package/card.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/card.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -11,17 +9,15 @@ var EXPORTED_SYMBOLS = ["EnigmailCard"]; -const Cu = Components.utils; - -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ -Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailExecution = ChromeUtils.import("chrome://enigmail/content/modules/execution.jsm").EnigmailExecution; +const EnigmailGpg = ChromeUtils.import("chrome://enigmail/content/modules/gpg.jsm").EnigmailGpg; var EnigmailCard = { getCardStatus: function(exitCodeObj, errorMsgObj) { EnigmailLog.DEBUG("card.jsm: EnigmailCard.getCardStatus\n"); - const args = EnigmailGpg.getStandardArgs(false). - concat(["--no-verbose", "--status-fd", "2", "--fixed-list-mode", "--with-colons", "--card-status"]); + const GPG_ADDITIONAL_OPTIONS=["--no-verbose", "--status-fd", "2", "--fixed-list-mode", "--with-colons", "--card-status"]; + const args = EnigmailGpg.getStandardArgs(false).concat(GPG_ADDITIONAL_OPTIONS); const statusMsgObj = {}; const statusFlagsObj = {}; diff -Nru enigmail-2.0.12+ds1/package/chrome.manifest enigmail-2.1.3+ds1/package/chrome.manifest --- enigmail-2.0.12+ds1/package/chrome.manifest 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/chrome.manifest 2019-10-29 17:09:36.000000000 +0000 @@ -23,4 +23,4 @@ # Resource module registration -resource enigmail modules/ +# resource enigmail modules/ diff -Nru enigmail-2.0.12+ds1/package/clipboard.jsm enigmail-2.1.3+ds1/package/clipboard.jsm --- enigmail-2.0.12+ds1/package/clipboard.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/clipboard.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 @@ -11,10 +10,8 @@ // Import the Services module for future use, if we're not in // a browser window where it's already loaded. -Components.utils.import('resource://gre/modules/Services.jsm'); +const Services = ChromeUtils.import('resource://gre/modules/Services.jsm').Services; -const Ci = Components.interfaces; -const Cc = Components.classes; // Create a constructor for the built-in supports-string class. const nsSupportsString = Components.Constructor("@mozilla.org/supports-string;1", "nsISupportsString"); diff -Nru enigmail-2.0.12+ds1/package/commandLine.jsm enigmail-2.1.3+ds1/package/commandLine.jsm --- enigmail-2.0.12+ds1/package/commandLine.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/commandLine.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -11,25 +9,18 @@ var EXPORTED_SYMBOLS = ["EnigmailCommandLine"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; const NS_ENIGCLINE_SERVICE_CID = Components.ID("{847b3ab1-7ab1-11d4-8f02-006008948af5}"); const NS_CLINE_SERVICE_CONTRACTID = "@mozilla.org/enigmail/cline-handler;1"; -const nsICommandLineHandler = Ci.nsICommandLineHandler; -const nsIFactory = Ci.nsIFactory; - function Handler() {} Handler.prototype = { classDescription: "Enigmail Key Management CommandLine Service", classID: NS_ENIGCLINE_SERVICE_CID, contractID: NS_CLINE_SERVICE_CONTRACTID, - QueryInterface: XPCOMUtils.generateQI([nsICommandLineHandler, nsIFactory]), + QueryInterface: EnigmailCompat.generateQI(["nsICommandLineHandler", "nsIFactory"]), // nsICommandLineHandler handle: function(cmdLine) { @@ -37,7 +28,7 @@ cmdLine.preventDefault = true; // do not open main app window const wwatch = Cc["@mozilla.org/embedcomp/window-watcher;1"].getService(Ci.nsIWindowWatcher); - wwatch.openWindow(null, "chrome://enigmail/content/enigmailKeyManager.xul", "_blank", "chrome,dialog=no,all", cmdLine); + wwatch.openWindow(null, "chrome://enigmail/content/ui/enigmailKeyManager.xul", "_blank", "chrome,dialog=no,all", cmdLine); } }, diff -Nru enigmail-2.0.12+ds1/package/compat.jsm enigmail-2.1.3+ds1/package/compat.jsm --- enigmail-2.0.12+ds1/package/compat.jsm 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/compat.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,216 @@ +/* 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"; + +/** + * TB / Postbox compatibility Module + */ + +var EXPORTED_SYMBOLS = ["EnigmailCompat"]; + +const POSTBOX_ID = "postbox@postbox-inc.com"; +const XPCOM_APPINFO = "@mozilla.org/xre/app-info;1"; + +var gIsPostbox = null, + gTb68OrNewer = null; +var MailUtils; + +try { + // Postbox / TB < 60 + MailUtils = ChromeUtils.import("resource:///modules/MailUtils.js").MailUtils; +} +catch (x) { + // Thunderbird + MailUtils = ChromeUtils.import("resource:///modules/MailUtils.jsm").MailUtils; +} + +var gCompFields, gPgpMimeObj; + +var EnigmailCompat = { + generateQI: function(aCid) { + if (this.isAtLeastTb68()) { + // TB > 60 + return ChromeUtils.generateQI(aCid); + } + else { + let XPCOMUtils = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm").XPCOMUtils; + return XPCOMUtils.generateQI(aCid); + } + }, + + getSecurityField: function() { + if (!gCompFields) { + gCompFields = Cc["@mozilla.org/messengercompose/composefields;1"].createInstance(Ci.nsIMsgCompFields); + } + return ("securityInfo" in gCompFields ? /* TB < 64 */ "securityInfo" : "composeSecure"); + }, + + getExistingFolder: function(folderUri) { + if ("getExistingFolder" in MailUtils) { + // TB >= 65 + return MailUtils.getExistingFolder(folderUri); + } + else { + return MailUtils.getFolderForURI(folderUri, false); + } + }, + + isMessageUriInPgpMime: function() { + if (!gPgpMimeObj) { + gPgpMimeObj = Cc["@mozilla.org/mime/pgp-mime-js-decrypt;1"].createInstance(Ci.nsIPgpMimeProxy); + } + + return ("messageURI" in gPgpMimeObj); + }, + + /** + * return true, if platform is newer than or equal a given version + */ + isPlatformNewerThan: function(requestedVersion) { + let vc = Cc["@mozilla.org/xpcom/version-comparator;1"].getService(Ci.nsIVersionComparator); + let appVer = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo).platformVersion; + + return vc.compare(appVer, requestedVersion) >= 0; + }, + + /** + * 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 = Cc["@mozilla.org/messenger;1"].getService(Ci.nsIMessenger); + let msgService = messenger.messageServiceFromURI(uriSpec); + + let url; + if (isPostbox()) { + // Postbox + url = msgService.GetUrlForUri(uriSpec, null); + } + else { + // TB + let urlObj = {}; + msgService.GetUrlForUri(uriSpec, urlObj, null); + + url = urlObj.value; + } + + if (url.scheme == "file") { + return url; + } + else { + return url.QueryInterface(Ci.nsIMsgMailNewsUrl); + } + + } + catch (ex) { + return null; + } + }, + /** + * Copy a file to a mail folder. + * in nsIFile aFile, + * in nsIMsgFolder dstFolder, + * in unsigned long aMsgFlags, + * in ACString aMsgKeywords, + * in nsIMsgCopyServiceListener listener, + * in nsIMsgWindow msgWindow + */ + copyFileToMailFolder: function(file, destFolder, msgFlags, msgKeywords, listener, msgWindow) { + let copySvc = Cc["@mozilla.org/messenger/messagecopyservice;1"].getService(Ci.nsIMsgCopyService); + + if (isPostbox()) { + // Postbox + return copySvc.CopyFileMessage(file, destFolder, msgFlags, msgKeywords, listener, msgWindow); + } + else { + // TB + return copySvc.CopyFileMessage(file, destFolder, null, false, msgFlags, msgKeywords, listener, msgWindow); + } + }, + + /** + * Determine if Platform is at version 68 or newer + * + * @return {Boolean}: true if at TB 68.0a1 or newer found + */ + isAtLeastTb68: function() { + if (gTb68OrNewer === null) { + gTb68OrNewer = this.isPlatformNewerThan("68.0a1"); + } + + return gTb68OrNewer; + }, + + /** + * Get functions that wrap the changes on nsITreeView between TB 60 and TB 68 + * + * @param treeObj + * @param listViewHolder + * + * @return {Object} + */ + getTreeCompatibleFuncs: function(treeObj, listViewHolder) { + + if (this.isAtLeastTb68()) { + return { + getCellAt: function(x,y) { + return treeObj.getCellAt(x, y); + }, + rowCountChanged: function(a, b) { + return treeObj.rowCountChanged(a, b); + }, + invalidate: function() { + return treeObj.invalidate(); + }, + invalidateRow: function(r) { + return treeObj.invalidateRow(r); + } + }; + } + else { + return { + getCellAt: function(x, y) { + let row = {}; + let col = {}; + let elt = {}; + treeObj.treeBoxObject.getCellAt(x, y, row, col, elt); + + return { + row: row.value, + col: col.value + }; + }, + rowCountChanged: function(a, b) { + return listViewHolder.treebox.rowCountChanged(a, b); + }, + invalidate: function() { + return listViewHolder.treebox.invalidate(); + }, + invalidateRow: function(r) { + return listViewHolder.treebox.invalidateRow(r); + } + }; + } + }, + + isPostbox: isPostbox +}; + +function isPostbox() { + // return true if Postbox, false otherwise + + if (gIsPostbox === null) { + gIsPostbox = Cc[XPCOM_APPINFO].getService(Ci.nsIXULAppInfo).ID == POSTBOX_ID; + } + + return gIsPostbox; +} diff -Nru enigmail-2.0.12+ds1/package/configBackup.jsm enigmail-2.1.3+ds1/package/configBackup.jsm --- enigmail-2.0.12+ds1/package/configBackup.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/configBackup.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* 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/. */ @@ -9,14 +7,14 @@ var EXPORTED_SYMBOLS = ["EnigmailConfigBackup"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/log.jsm"); /* global EnigmailLog: false */ -Cu.import("resource://enigmail/rules.jsm"); /* global EnigmailRules: false */ -Cu.import("resource://enigmail/files.jsm"); /* global EnigmailFiles: false */ -Cu.import("resource://enigmail/prefs.jsm"); /* global EnigmailPrefs: false */ + + + + +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailRules = ChromeUtils.import("chrome://enigmail/content/modules/rules.jsm").EnigmailRules; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; const TYPE_BOOL = 1; const TYPE_CHAR = 2; @@ -30,7 +28,6 @@ pgpSignEncrypted: TYPE_BOOL, defaultSigningPolicy: TYPE_INT, defaultEncryptionPolicy: TYPE_INT, - openPgpHeaderMode: TYPE_INT, openPgpUrlName: TYPE_CHAR, pgpMimeMode: TYPE_BOOL, attachPgpKey: TYPE_BOOL, diff -Nru enigmail-2.0.12+ds1/package/configure.jsm enigmail-2.1.3+ds1/package/configure.jsm --- enigmail-2.0.12+ds1/package/configure.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/configure.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -4,31 +4,27 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -/*global Components: false */ - "use strict"; var EXPORTED_SYMBOLS = ["EnigmailConfigure"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - - -/*global EnigmailLog: false, EnigmailPrefs: false, EnigmailTimer: false, EnigmailApp: false, EnigmailLocale: false, EnigmailDialog: false, EnigmailWindows: false */ - -Cu.import("resource://enigmail/log.jsm"); -Cu.import("resource://enigmail/prefs.jsm"); -Cu.import("resource://enigmail/timer.jsm"); -Cu.import("resource://enigmail/app.jsm"); -Cu.import("resource://enigmail/locale.jsm"); -Cu.import("resource://enigmail/dialog.jsm"); -Cu.import("resource://enigmail/windows.jsm"); -Cu.import("resource://enigmail/core.jsm"); /* global EnigmailCore: false */ -Cu.import("resource://enigmail/pEpAdapter.jsm"); /* global EnigmailPEPAdapter: false */ -Cu.import("resource://enigmail/installPep.jsm"); /* global EnigmailInstallPep: false */ -Cu.import("resource://enigmail/stdlib.jsm"); /* global EnigmailStdlib: false */ -Cu.import("resource://enigmail/lazy.jsm"); /* global EnigmailLazy: false */ +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailTimer = ChromeUtils.import("chrome://enigmail/content/modules/timer.jsm").EnigmailTimer; +const EnigmailApp = ChromeUtils.import("chrome://enigmail/content/modules/app.jsm").EnigmailApp; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailDialog = ChromeUtils.import("chrome://enigmail/content/modules/dialog.jsm").EnigmailDialog; +const EnigmailWindows = ChromeUtils.import("chrome://enigmail/content/modules/windows.jsm").EnigmailWindows; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailStdlib = ChromeUtils.import("chrome://enigmail/content/modules/stdlib.jsm").EnigmailStdlib; +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; +const EnigmailAutoSetup = ChromeUtils.import("chrome://enigmail/content/modules/autoSetup.jsm").EnigmailAutoSetup; +const EnigmailSqliteDb = ChromeUtils.import("chrome://enigmail/content/modules/sqliteDb.jsm").EnigmailSqliteDb; + +// Interfaces +const nsIFolderLookupService = Ci.nsIFolderLookupService; +const nsIMsgAccountManager = Ci.nsIMsgAccountManager; /** * Upgrade sending prefs @@ -159,43 +155,43 @@ catch (ex) {} } +function setDefaultKeyServer() { + EnigmailLog.DEBUG("configure.jsm: setDefaultKeyServer()\n"); -/** - * Determine if pEp is avaliable, and if it is not available, - * whether it can be downaloaded and installed. This does not - * trigger installation. - */ + let ks = EnigmailPrefs.getPref("keyserver"); -function isPepInstallable() { - if (EnigmailPEPAdapter.isPepAvailable(false)) { - return true; + if (ks.search(/^ldaps?:\/\//) < 0) { + ks = "vks://keys.openpgp.org, " + ks; } - return EnigmailInstallPep.isPepInstallerAvailable(); + ks = ks.replace(/hkps:\/\/keys.openpgp.org/g, "vks://keys.openpgp.org"); + EnigmailPrefs.setPref("keyserver", ks); } + + function displayUpgradeInfo() { EnigmailLog.DEBUG("configure.jsm: displayUpgradeInfo()\n"); try { - EnigmailWindows.openMailTab("chrome://enigmail/content/upgradeInfo.html"); + EnigmailWindows.openMailTab("chrome://enigmail/content/ui/upgradeInfo.html"); } catch (ex) {} } -function setDefaultKeyServer() { - EnigmailLog.DEBUG("configure.jsm: setDefaultKeyServer()\n"); - - let ks = EnigmailPrefs.getPref("keyserver"); - - if (ks.search(/^ldaps?:\/\//) < 0) { - ks = "hkps://keys.openpgp.org, " + ks; - EnigmailPrefs.setPref("keyserver", ks); - } -} - var EnigmailConfigure = { - configureEnigmail: function(win, startingPreferences) { + /** + * configureEnigmail: main function for configuring Enigmail during the first run + * this method is called from core.jsm if Enigmail has not been set up before + * (determined via checking the configuredVersion in the preferences) + * + * @param {nsIWindow} win: The parent window. Null if no parent window available + * @param {Boolean} startingPreferences: if true, called while switching to new preferences + * (to avoid re-check for preferences) + * + * @return {Promise} + */ + configureEnigmail: async function(win, startingPreferences) { EnigmailLog.DEBUG("configure.jsm: configureEnigmail()\n"); if (!EnigmailStdlib.hasConfiguredAccounts()) { @@ -215,12 +211,20 @@ let vc = Cc["@mozilla.org/xpcom/version-comparator;1"].getService(Ci.nsIVersionComparator); if (oldVer === "") { - EnigmailPrefs.setPref("configuredVersion", EnigmailApp.getVersion()); + try { + let setupResult = await EnigmailAutoSetup.determinePreviousInstallType(); - if (EnigmailPrefs.getPref("juniorMode") === 0 || (!isPepInstallable())) { - // start wizard if pEp Junior Mode is forced off or if pep cannot - // be installed/used - EnigmailWindows.openSetupWizard(win, false); + switch (EnigmailAutoSetup.value) { + case EnigmailConstants.AUTOSETUP_NOT_INITIALIZED: + case EnigmailConstants.AUTOSETUP_NO_ACCOUNT: + break; + default: + EnigmailPrefs.setPref("configuredVersion", EnigmailApp.getVersion()); + EnigmailWindows.openSetupWizard(win); + } + } + catch(x) { + // ignore exceptions and proceed without setup wizard } } else { @@ -253,7 +257,7 @@ // but // - without starting the service again because we do that right now // - and modal (waiting for its end) - win.openDialog("chrome://enigmail/content/pref-enigmail.xul", + win.openDialog("chrome://enigmail/content/ui/pref-enigmail.xul", "_blank", "chrome,resizable=yes,modal", { 'showBasic': true, 'clientType': 'thunderbird', @@ -272,9 +276,10 @@ if (vc.compare(oldVer, "2.0.1a2pre") < 0) { this.upgradeTo201(); } - if (vc.compare(oldVer, "2.0.12") < 0) { - this.upgradeTo_2_0_12(); + if (vc.compare(oldVer, "2.1b2") < 0) { + this.upgradeTo21(); } + } EnigmailPrefs.setPref("configuredVersion", EnigmailApp.getVersion()); @@ -291,7 +296,7 @@ setAutocryptForOldAccounts(); }, - upgradeTo_2_0_12: function() { + upgradeTo21: function() { setDefaultKeyServer(); } }; diff -Nru enigmail-2.0.12+ds1/package/constants.jsm enigmail-2.1.3+ds1/package/constants.jsm --- enigmail-2.0.12+ds1/package/constants.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/constants.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -121,11 +119,13 @@ EXTRACT_SECRET_KEY: 0x01, /* Keyserver Action Flags */ - SEARCH_KEY: 0x01, - DOWNLOAD_KEY: 0x02, - UPLOAD_KEY: 0x04, - REFRESH_KEY: 0x08, - UPLOAD_WKD: 0x10, + SEARCH_KEY: 1, + DOWNLOAD_KEY: 2, + UPLOAD_KEY: 3, + REFRESH_KEY: 4, + GET_SKS_CACERT: 5, + UPLOAD_WKD: 6, + GET_CONFIRMATION_LINK: 7, /* attachment handling */ @@ -136,6 +136,24 @@ CARD_PIN_UNBLOCK: 2, CARD_ADMIN_PIN_CHANGE: 3, + /* Keyserver error codes (in keyserver.jsm) */ + KEYSERVER_ERR_ABORTED: 1, + KEYSERVER_ERR_SERVER_ERROR: 2, + KEYSERVER_ERR_SECURITY_ERROR: 3, + KEYSERVER_ERR_CERTIFICATE_ERROR: 4, + KEYSERVER_ERR_SERVER_UNAVAILABLE: 5, + KEYSERVER_ERR_IMPORT_ERROR: 6, + KEYSERVER_ERR_UNKNOWN: 7, + + /* AutocryptSeup Setup Type */ + AUTOSETUP_NOT_INITIALIZED: 0, + AUTOSETUP_AC_SETUP_MSG: 1, + AUTOSETUP_AC_HEADER: 2, + AUTOSETUP_PEP_HEADER: 3, + AUTOSETUP_ENCRYPTED_MSG: 4, + AUTOSETUP_NO_HEADER: 5, + AUTOSETUP_NO_ACCOUNT: 6, + /* Bootstrapped Addon constants */ APP_STARTUP: 1, // The application is starting up. APP_SHUTDOWN: 2, // The application is shutting down. diff -Nru enigmail-2.0.12+ds1/package/core.jsm enigmail-2.1.3+ds1/package/core.jsm --- enigmail-2.0.12+ds1/package/core.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/core.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 @@ -9,17 +8,14 @@ "use strict"; const { - classes: Cc, - interfaces: Ci, manager: Cm, - results: Cr, - utils: Cu, Constructor: CC } = Components; Cm.QueryInterface(Ci.nsIComponentRegistrar); -Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ -Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ +const subprocess = ChromeUtils.import("chrome://enigmail/content/modules/subprocess.jsm").subprocess; +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; // load all modules lazily to avoid possible cross-reference errors const getEnigmailConsole = EnigmailLazy.loader("enigmail/pipeConsole.jsm", "EnigmailConsole"); @@ -41,11 +37,14 @@ const getEnigmailKeyServer = EnigmailLazy.loader("enigmail/keyserver.jsm", "EnigmailKeyServer"); const getEnigmailWksMimeHandler = EnigmailLazy.loader("enigmail/wksMimeHandler.jsm", "EnigmailWksMimeHandler"); const getEnigmailPEPAdapter = EnigmailLazy.loader("enigmail/pEpAdapter.jsm", "EnigmailPEPAdapter"); -const getEnigmailOverlays = EnigmailLazy.loader("enigmail/overlays.jsm", "EnigmailOverlays"); +const getEnigmailOverlays = EnigmailLazy.loader("enigmail/enigmailOverlays.jsm", "EnigmailOverlays"); +const getEnigmailSqlite = EnigmailLazy.loader("enigmail/sqliteDb.jsm", "EnigmailSqliteDb"); +const getEnigmailGnuPGUpdate = EnigmailLazy.loader("enigmail/gnupgUpdate.jsm", "EnigmailGnuPGUpdate"); +const getEnigmailTimer = EnigmailLazy.loader("enigmail/timer.jsm", "EnigmailTimer"); +const Services = ChromeUtils.import("resource://gre/modules/Services.jsm").Services; var EXPORTED_SYMBOLS = ["EnigmailCore"]; - // Interfaces const nsIEnvironment = Ci.nsIEnvironment; @@ -55,8 +54,6 @@ var gEnvList = null; // currently filled from enigmail.js - - var EnigmailCore = { /** * Create a new instance of Enigmail, or return the already existing one @@ -70,43 +67,43 @@ }, startup: function(reason) { + let self = this; + let env = getEnvironment(); initializeLogDirectory(); initializeLogging(env); - getEnigmailLog().DEBUG("core.jsm: startup()\n"); + const logger = getEnigmailLog(); + + logger.DEBUG("core.jsm: startup()\n"); + + getEnigmailSqlite().checkDatabaseStructure(); getEnigmailPrefs().startup(reason); - let self = this; this.factories = []; - function continueStartup() { - getEnigmailLog().DEBUG("core.jsm: startup.continueStartup()\n"); + function continueStartup(type) { + logger.DEBUG(`core.jsm: startup.continueStartup(${type})\n`); try { let mimeEncrypt = getEnigmailMimeEncrypt(); mimeEncrypt.startup(reason); - getEnigmailOverlays().startup(reason); - let cLineReg = getEnigmailCommandLine().categoryRegistry; - let catMan = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager); - catMan.addCategoryEntry(cLineReg.category, - cLineReg.entry, - cLineReg.serviceName, - false, true); + getEnigmailOverlays().startup(); self.factories.push(new Factory(getEnigmailProtocolHandler())); - self.factories.push(new Factory(getEnigmailCommandLine().Handler)); self.factories.push(new Factory(mimeEncrypt.Handler)); + } catch (ex) { + logger.DEBUG("core.jsm: startup.continueStartup: error " + ex.message + "\n" + ex.stack + "\n"); } - catch (ex) { - getEnigmailLog().DEBUG("core.jsm: startup.continueStartup: error " + ex.message + "\n" + ex.stack + "\n"); - } - } getEnigmailVerify().registerContentTypeHandler(); getEnigmailWksMimeHandler().registerContentTypeHandler(); getEnigmailFiltersWrapper().onStartup(); - getEnigmailPEPAdapter().initialize().then(continueStartup).catch(continueStartup); + getEnigmailPEPAdapter().initialize().then(r => { + continueStartup(0); + }).catch(r => { + continueStartup(1); + }); }, shutdown: function(reason) { @@ -158,8 +155,7 @@ try { this.createInstance(); return gEnigmailService.getService(win, startingPreferences); - } - catch (ex) { + } catch (ex) { return null; } @@ -204,8 +200,7 @@ function getLogDirectoryPrefix() { try { return getEnigmailPrefs().getPrefBranch().getCharPref("logDirectory") || ""; - } - catch (ex) { + } catch (ex) { return ""; } } @@ -260,8 +255,7 @@ function getEnvironment(status) { try { return Cc["@mozilla.org/process/environment;1"].getService(nsIEnvironment); - } - catch (ex) { + } catch (ex) { failureOn(ex, status); } return null; @@ -276,7 +270,7 @@ "GTK_IM_MODULE", "HOME", "HOMEDRIVE", "HOMEPATH", "LOCPATH", "LOGNAME", "LD_LIBRARY_PATH", "MOZILLA_FIVE_HOME", - "NLSPATH", "PATH", "PATHEXT", "PROGRAMFILES", "PWD", + "NLSPATH", "PATH", "PATHEXT", "PINENTRY_USER_DATA", "PROGRAMFILES", "PWD", "QT_IM_MODULE", "SHELL", "SYSTEMDRIVE", "SYSTEMROOT", "TEMP", "TMP", "TMPDIR", "TZ", "TZDIR", "UNIXROOT", @@ -315,8 +309,7 @@ if (envName in gOverwriteEnvVar) { envValue = gOverwriteEnvVar[envName]; - } - else { + } else { envValue = env.get(envName); } if (envValue) { @@ -351,8 +344,7 @@ try { getEnigmailConsole().write("Initializing Enigmail service ...\n"); - } - catch (ex) { + } catch (ex) { failureOn(ex, this); } @@ -366,6 +358,7 @@ this.initialized = true; getEnigmailLog().DEBUG("core.jsm: Enigmail.initialize: END\n"); + getEnigmailGnuPGUpdate().runUpdateCheck(); }, reinitialize: function() { @@ -414,10 +407,8 @@ try { // Reset alert count to default value getEnigmailPrefs().getPrefBranch().clearUserPref("initAlert"); - } - catch (ex) {} - } - catch (ex) { + } catch (ex) {} + } catch (ex) { if (firstInitialization) { // Display initialization error alert const errMsg = (this.initializationError ? this.initializationError : getEnigmailLocale().getString("accessError")) + @@ -492,4 +483,4 @@ unregister() { Cm.unregisterFactory(this.component.prototype.classID, this); } -} +} \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/cryptoAPI/Makefile enigmail-2.1.3+ds1/package/cryptoAPI/Makefile --- enigmail-2.0.12+ds1/package/cryptoAPI/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/cryptoAPI/Makefile 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,33 @@ +# 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/. + + +DEPTH = ../.. + +include $(DEPTH)/config/autoconf.mk + +GENDIR = $(DIST)/chrome/content/modules/cryptoAPI + +MODFILES = \ + gnupg.js \ + gnupg-decryption.jsm \ + gnupg-keylist.jsm \ + gnupg-key.jsm \ + openpgp-js.js \ + interface.js + +GENFILES = $(addprefix $(GENDIR)/,$(MODFILES)) + +$(GENDIR)/%.jsm: %.jsm + $(DEPTH)/util/prepPostbox $(TARGET_TOOL) $< $@ + +$(GENDIR)/%.js: %.js + $(DEPTH)/util/prepPostbox $(TARGET_TOOL) $< $@ + +build: $(GENFILES) + +all: build + +clean: + $(DEPTH)/util/install -u $(DIST)/chrome/content/modules/cryptoAPI $(MODFILES) diff -Nru enigmail-2.0.12+ds1/package/cryptoAPI/README.txt enigmail-2.1.3+ds1/package/cryptoAPI/README.txt --- enigmail-2.0.12+ds1/package/cryptoAPI/README.txt 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/cryptoAPI/README.txt 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,38 @@ +API Overview +============ + +CryptoAPI is the API that contains all functionality related to cryptographic +operations and generic function that are related to OpenPGP. The goal is that +there is no call to GnuPG, openpgp.js or any other crypto-library outside this +structure. + +The API should be accessed via CryptoAPI.jsm, which will (in the future) +determine which API the user selected or is appropriate. Currently only the +GnuPGCryptoAPI will be returned and is directly accessible. + + +Class Hierarchy +--------------- + +CryptoAPI (interface.js) + | + |----- OpenPGPjsCryptoAPI (openpgp-js.js) + | | + | |-- GnuPGCryptoAPI (gnupg.js) + | + |----- [SequoiaCryptoAPI (tbd)] + + +CryptoAPI is the generic API that does not contain any functionality, except +for sync(). + +- OpenPGPjsCryptoAPI holds the implementation for OpenPGP.js (https://openpgpjs.org/). +- GnuPGCryptoAPI holds the implementation for GnuPG (https://gnupg.org/). Some of its functionality + bases on OpenPGP.js. +- SequoiaCryptoAPI will maybe hold in the future the implementation for Sequoia (https://sequoia-pgp.org/). + + +Implementation Details +---------------------- + +All methods and properties are public, unless they start with an underscore _. diff -Nru enigmail-2.0.12+ds1/package/cryptoAPI/gnupg-decryption.jsm enigmail-2.1.3+ds1/package/cryptoAPI/gnupg-decryption.jsm --- enigmail-2.0.12+ds1/package/cryptoAPI/gnupg-decryption.jsm 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/cryptoAPI/gnupg-decryption.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,376 @@ +/* + * 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"; + +var EXPORTED_SYMBOLS = ["GnuPGDecryption"]; + +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailDialog = ChromeUtils.import("chrome://enigmail/content/modules/dialog.jsm").EnigmailDialog; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; +const EnigmailExecution = ChromeUtils.import("chrome://enigmail/content/modules/execution.jsm").EnigmailExecution; +const EnigmailErrorHandling = ChromeUtils.import("chrome://enigmail/content/modules/errorHandling.jsm").EnigmailErrorHandling; +const EnigmailKey = ChromeUtils.import("chrome://enigmail/content/modules/key.jsm").EnigmailKey; +const EnigmailKeyRing = ChromeUtils.import("chrome://enigmail/content/modules/keyRing.jsm").EnigmailKeyRing; +const EnigmailGpg = ChromeUtils.import("chrome://enigmail/content/modules/gpg.jsm").EnigmailGpg; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; + +const STATUS_ERROR = EnigmailConstants.BAD_SIGNATURE | EnigmailConstants.DECRYPTION_FAILED; +const STATUS_DECRYPTION_OK = EnigmailConstants.DECRYPTION_OKAY; +const STATUS_GOODSIG = EnigmailConstants.GOOD_SIGNATURE; + +var GnuPGDecryption = { + + /* + * options: + * - logFile (the actual file) + * - keyserver + * - keyserverProxy + * - fromAddr + * - noOutput + * - verifyOnly + * - mimeSignatureFile + * - maxOutputLength + * + */ + getDecryptionArgs: function(options) { + var args = EnigmailGpg.getStandardArgs(true); + + args.push("--log-file"); + args.push(EnigmailFiles.getEscapedFilename(EnigmailFiles.getFilePath(options.logFile))); + + if (options.keyserver && options.keyserver !== "") { + var keyserver = options.keyserver.trim(); + args.push("--keyserver-options"); + var keySrvArgs = "auto-key-retrieve"; + var srvProxy = options.keyserverProxy; + if (srvProxy) { + keySrvArgs += ",http-proxy=" + srvProxy; + } + args.push(keySrvArgs); + args.push("--keyserver"); + args.push(keyserver); + } + + if (EnigmailGpg.getGpgFeature("supports-sender") && options.fromAddr) { + args.push("--sender"); + args.push(options.fromAddr.toLowerCase()); + } + + if (options.noOutput) { + args.push("--verify"); + if (options.mimeSignatureFile) { + args.push(options.mimeSignatureFile); + args.push("-"); + } + } + else { + if (options.maxOutputLength) { + args.push("--max-output"); + args.push(String(options.maxOutputLength)); + } + + args.push("--decrypt"); + } + + return args; + }, + decryptMessageEnd: function(stderrStr, exitCode, outputLen, verifyOnly, noOutput, uiFlags, retStatusObj) { + EnigmailLog.DEBUG("gnupg-decryption.jsm: decryptMessageEnd: uiFlags=" + uiFlags + ", verifyOnly=" + verifyOnly + ", noOutput=" + noOutput + "\n"); + + stderrStr = stderrStr.replace(/\r\n/g, "\n"); + EnigmailLog.DEBUG("gnupg-decryption.jsm: decryptMessageEnd: stderrStr=\n" + stderrStr + "\n"); + + + var interactive = uiFlags & EnigmailConstants.UI_INTERACTIVE; + var pgpMime = uiFlags & EnigmailConstants.UI_PGP_MIME; + var allowImport = uiFlags & EnigmailConstants.UI_ALLOW_KEY_IMPORT; + var unverifiedEncryptedOK = uiFlags & EnigmailConstants.UI_UNVERIFIED_ENC_OK; + var j; + + retStatusObj.statusFlags = 0; + retStatusObj.errorMsg = ""; + retStatusObj.blockSeparation = ""; + + var errorMsg = EnigmailErrorHandling.parseErrorOutput(stderrStr, retStatusObj); + if (retStatusObj.statusFlags & STATUS_ERROR) { + retStatusObj.errorMsg = errorMsg; + } + else { + retStatusObj.errorMsg = ""; + } + + if (pgpMime) { + retStatusObj.statusFlags |= verifyOnly ? EnigmailConstants.PGP_MIME_SIGNED : EnigmailConstants.PGP_MIME_ENCRYPTED; + } + + var statusMsg = retStatusObj.statusMsg; + exitCode = EnigmailExecution.fixExitCode(exitCode, retStatusObj); + if ((exitCode === 0) && !noOutput && !outputLen && + ((retStatusObj.statusFlags & (STATUS_DECRYPTION_OK | STATUS_GOODSIG)) === 0)) { + exitCode = -1; + } + + if (retStatusObj.statusFlags & EnigmailConstants.DISPLAY_MESSAGE && retStatusObj.extendedStatus.search(/\bdisp:/) >= 0) { + EnigmailDialog.alert(null, statusMsg); + return -1; + } + + var errLines; + if (statusMsg) { + errLines = statusMsg.split(/\r?\n/); + } + else { + // should not really happen ... + errLines = stderrStr.split(/\r?\n/); + } + + // possible STATUS Patterns (see GPG dod DETAILS.txt): + // one of these should be set for a signature: + var newsigPat = /^NEWSIG ?.*$/i; + var trustedsigPat = /^TRUST_(FULLY|ULTIMATE) ?.*$/i; + var goodsigPat = /^GOODSIG (\w{16}) (.*)$/i; + var badsigPat = /^BADSIG (\w{16}) (.*)$/i; + var expsigPat = /^EXPSIG (\w{16}) (.*)$/i; + var expkeysigPat = /^EXPKEYSIG (\w{16}) (.*)$/i; + var revkeysigPat = /^REVKEYSIG (\w{16}) (.*)$/i; + var errsigPat = /^ERRSIG (\w{16}) (.*)$/i; + // additional infos for good signatures: + var validSigPat = /^VALIDSIG (\w+) (.*) (\d+) (.*)/i; + // hint for a certain key id: + var userIdHintPat = /^USERID_HINT (\w{16}) (.*)$/i; + // to find out for which recipients the email was encrypted: + var encToPat = /^ENC_TO (\w{16}) (.*)$/i; + + var matches; + + var signed = false; + var goodOrExpOrRevSignature = false; + var sigKeyId = ""; // key of sender + var sigUserId = ""; // user ID of sender + var sigDetails = ""; + var sigTrusted = false; + var encToDetails = ""; + var encToArray = []; // collect ENC_TO lines here + + for (j = 0; j < errLines.length; j++) { + EnigmailLog.DEBUG("gnupg-decryption.jsm: decryptMessageEnd: process: " + errLines[j] + "\n"); + + // ENC_TO entry + // - collect them for later processing to print details + matches = errLines[j].match(encToPat); + if (matches && (matches.length > 2)) { + encToArray.push("0x" + matches[1]); + } + + // USERID_HINT entry + // - NOTE: NO END of loop + // ERROR: wrong to set userId because ecom is NOT the sender: + //matches = errLines[j].match(userIdHintPat); + //if (matches && (matches.length > 2)) { + // sigKeyId = matches[1]; + // sigUserId = matches[2]; + //} + + // check for one of the possible SIG entries: + + matches = errLines[j].match(newsigPat); + if (matches) { + if (signed) { + EnigmailLog.DEBUG("gnupg-decryption.jsm: decryptMessageEnd: multiple SIGN entries - ignoring previous signature\n"); + } + signed = true; + goodOrExpOrRevSignature = false; + sigKeyId = ""; + sigUserId = ""; + sigDetails = ""; + sigTrusted = false; + continue; + } + + matches = errLines[j].match(trustedsigPat); + if (matches) { + sigTrusted = true; + continue; + } + + matches = errLines[j].match(validSigPat); + if (matches && (matches.length > 4)) { + if (matches[4].length == 40) { + // in case of several subkeys refer to the main key ID. + // Only works with PGP V4 keys (Fingerprint length ==40) + sigKeyId = matches[4]; + } + if (matches && (matches.length > 2)) { + sigDetails = errLines[j].substr(9); + } + continue; + } + + // GOODSIG entry + matches = errLines[j].match(goodsigPat); + if (matches && (matches.length > 2)) { + if (signed) { + EnigmailLog.DEBUG("gnupg-decryption.jsm: decryptMessageEnd: OOPS: multiple SIGN entries\n"); + } + signed = true; + goodOrExpOrRevSignature = true; + sigKeyId = matches[1]; + sigUserId = matches[2]; + } + else { + // BADSIG entry => signature found but bad + matches = errLines[j].match(badsigPat); + if (matches && (matches.length > 2)) { + if (signed) { + EnigmailLog.DEBUG("gnupg-decryption.jsm: decryptMessageEnd: OOPS: multiple SIGN entries\n"); + } + signed = true; + goodOrExpOrRevSignature = false; + sigKeyId = matches[1]; + sigUserId = matches[2]; + } + else { + // EXPSIG entry => expired signature found + matches = errLines[j].match(expsigPat); + if (matches && (matches.length > 2)) { + if (signed) { + EnigmailLog.DEBUG("gnupg-decryption.jsm: decryptMessageEnd: OOPS: multiple SIGN entries\n"); + } + signed = true; + goodOrExpOrRevSignature = true; + sigKeyId = matches[1]; + sigUserId = matches[2]; + } + else { + // EXPKEYSIG entry => signature found but key expired + matches = errLines[j].match(expkeysigPat); + if (matches && (matches.length > 2)) { + if (signed) { + EnigmailLog.DEBUG("gnupg-decryption.jsm: decryptMessageEnd: OOPS: multiple SIGN entries\n"); + } + signed = true; + goodOrExpOrRevSignature = true; + sigKeyId = matches[1]; + sigUserId = matches[2]; + } + else { + // REVKEYSIG entry => signature found but key revoked + matches = errLines[j].match(revkeysigPat); + if (matches && (matches.length > 2)) { + if (signed) { + EnigmailLog.DEBUG("gnupg-decryption.jsm: decryptMessageEnd: OOPS: multiple SIGN entries\n"); + } + signed = true; + goodOrExpOrRevSignature = true; + sigKeyId = matches[1]; + sigUserId = matches[2]; + } + else { + // ERRSIG entry => signature found but key not usable or unavailable + matches = errLines[j].match(errsigPat); + if (matches && (matches.length > 2)) { + if (signed) { + EnigmailLog.DEBUG("gnupg-decryption.jsm: decryptMessageEnd: OOPS: multiple SIGN entries\n"); + } + signed = true; + goodOrExpOrRevSignature = false; + sigKeyId = matches[1]; + // no user id with ecom istatus entry + } + } + } + } + } + } + + } // end loop of processing errLines + + if (sigTrusted) { + retStatusObj.statusFlags |= EnigmailConstants.TRUSTED_IDENTITY; + } + + if (sigUserId && sigKeyId && EnigmailPrefs.getPref("displaySecondaryUid")) { + let keyObj = EnigmailKeyRing.getKeyById(sigKeyId); + if (keyObj) { + if (keyObj.photoAvailable) { + retStatusObj.statusFlags |= EnigmailConstants.PHOTO_AVAILABLE; + } + sigUserId = EnigmailKeyRing.getValidUids(sigKeyId).join("\n"); + } + } + else if (sigUserId) { + sigUserId = EnigmailData.convertToUnicode(sigUserId, "UTF-8"); + } + + // add list of keys used for encryption if known (and their user IDs) if known + // Parsed status messages are something like (here the German version): + // [GNUPG:] ENC_TO AAAAAAAAAAAAAAAA 1 0 + // [GNUPG:] ENC_TO 5B820D2D4553884F 16 0 + // [GNUPG:] ENC_TO 37904DF2E631552F 1 0 + // [GNUPG:] ENC_TO BBBBBBBBBBBBBBBB 1 0 + // gpg: verschlüsselt mit 3072-Bit RSA Schlüssel, ID BBBBBBBB, erzeugt 2009-11-28 + // "Joe Doo " + // [GNUPG:] NO_SECKEY E71712DF47BBCC40 + // gpg: verschlüsselt mit RSA Schlüssel, ID AAAAAAAA + // [GNUPG:] NO_SECKEY AAAAAAAAAAAAAAAA + if (encToArray.length > 0) { + // for each key also show an associated user ID if known: + for (var encIdx = 0; encIdx < encToArray.length; ++encIdx) { + var localKeyId = encToArray[encIdx]; + // except for ID 00000000, which signals hidden keys + if (localKeyId != "0x0000000000000000") { + let localKey = EnigmailKeyRing.getKeyById(localKeyId); + if (localKey) { + encToArray[encIdx] += " (" + localKey.userId + ")"; + } + } + else { + encToArray[encIdx] = EnigmailLocale.getString("hiddenKey"); + } + } + encToDetails = "\n " + encToArray.join(",\n ") + "\n"; + } + + retStatusObj.userId = sigUserId; + retStatusObj.keyId = sigKeyId; + retStatusObj.sigDetails = sigDetails; + retStatusObj.encToDetails = encToDetails; + + if (signed) { + if (goodOrExpOrRevSignature) { + retStatusObj.errorMsg = EnigmailLocale.getString("prefGood", [sigUserId]); + /* + ", " + EnigmailLocale.getString("keyId") + " 0x" + sigKeyId.substring(8,16); */ + } + else { + if (sigUserId.length > 0) { + retStatusObj.errorMsg = EnigmailLocale.getString("prefBad", [sigUserId]); + } + if (!exitCode) + exitCode = 1; + } + } + + if (retStatusObj.statusFlags & EnigmailConstants.UNVERIFIED_SIGNATURE) { + retStatusObj.keyId = EnigmailKey.extractPubkey(statusMsg); + + if (retStatusObj.statusFlags & EnigmailConstants.DECRYPTION_OKAY) { + exitCode = 0; + } + } + + if (exitCode !== 0) { + // Error processing + EnigmailLog.DEBUG("gnupg-decryption.jsm: decryptMessageEnd: command execution exit code: " + exitCode + "\n"); + } + + return exitCode; + } +}; diff -Nru enigmail-2.0.12+ds1/package/cryptoAPI/gnupg-key.jsm enigmail-2.1.3+ds1/package/cryptoAPI/gnupg-key.jsm --- enigmail-2.0.12+ds1/package/cryptoAPI/gnupg-key.jsm 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/cryptoAPI/gnupg-key.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,121 @@ +/* + * 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/. + */ + +/**** + Private sub-module to gnupg.js for handling key import/export + ****/ + +"use strict"; + +var EXPORTED_SYMBOLS = ["GnuPG_importKeyFromFile", "GnuPG_extractSecretKey"]; + +const EnigmailExecution = ChromeUtils.import("chrome://enigmail/content/modules/execution.jsm").EnigmailExecution; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailGpg = ChromeUtils.import("chrome://enigmail/content/modules/gpg.jsm").EnigmailGpg; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailLocale; + + +async function GnuPG_importKeyFromFile(inputFile) { + EnigmailLog.DEBUG("gnupg-key.jsm: importKeysFromFile: fileName=" + inputFile.path + "\n"); + var command = EnigmailGpg.agentPath; + var args = EnigmailGpg.getStandardArgs(false).concat(["--no-tty", "--batch", "--no-verbose", "--status-fd", "2", "--no-auto-check-trustdb", "--import"]); + + var fileName = EnigmailFiles.getEscapedFilename((inputFile.QueryInterface(Ci.nsIFile)).path); + + args.push(fileName); + + let res = await EnigmailExecution.execAsync(command, args, ""); + let statusMsg = res.statusMsg; + + var keyList = []; + let importedKeys = []; + let importSum = 0; + let importUnchanged = 0; + + // IMPORT_RES 0 + // + if (statusMsg) { + let import_res = statusMsg.match(/^IMPORT_RES ([0-9]+) ([0-9]+) ([0-9]+) 0 ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)/m); + + if (import_res !== null) { + let secCount = parseInt(import_res[9], 10); // number of secret keys found + let secImported = parseInt(import_res[10], 10); // number of secret keys imported + let secDups = parseInt(import_res[11], 10); // number of secret keys already on the keyring + + if (secCount !== secImported + secDups) { + res.errorMsg = EnigmailLocale.getString("import.secretKeyImportError"); + res.exitCode = 1; + } + else { + importSum = parseInt(import_res[1], 10); + importUnchanged = parseInt(import_res[4], 10); + res.exitCode = 0; + var statusLines = statusMsg.split(/\r?\n/); + + for (let j = 0; j < statusLines.length; j++) { + var matches = statusLines[j].match(/IMPORT_OK ([0-9]+) (\w+)/); + if (matches && (matches.length > 2)) { + if (typeof (keyList[matches[2]]) != "undefined") { + keyList[matches[2]] |= Number(matches[1]); + } + else + keyList[matches[2]] = Number(matches[1]); + + importedKeys.push(matches[2]); + EnigmailLog.DEBUG("gnupg-key.jsm: importKeysFromFile: imported " + matches[2] + ":" + matches[1] + "\n"); + } + } + } + } + } + + return { + exitCode: res.exitCode, + errorMsg: res.errorMsg, + importedKeys: importedKeys, + importSum: importSum, + importUnchanged: importUnchanged + }; +} + + +async function GnuPG_extractSecretKey(userId, minimalKey) { + let args = EnigmailGpg.getStandardArgs(true); + let exitCode = -1, + errorMsg = ""; + + if (minimalKey) { + args.push("--export-options"); + args.push("export-minimal,no-export-attributes"); + } + + args.push("-a"); + args.push("--export-secret-keys"); + + if (userId) { + args = args.concat(userId.split(/[ ,\t]+/)); + } + + let res = await EnigmailExecution.execAsync(EnigmailGpg.agentPath, args, ""); + + if (res.stdoutData) { + exitCode = 0; + } + + if (exitCode !== 0) { + if (res.errorMsg) { + errorMsg = EnigmailFiles.formatCmdLine(EnigmailGpg.agentPath, args); + errorMsg += "\n" + res.errorMsg; + } + } + + return { + keyData: res.stdoutData, + exitCode: exitCode, + errorMsg: errorMsg + }; +} diff -Nru enigmail-2.0.12+ds1/package/cryptoAPI/gnupg-keylist.jsm enigmail-2.1.3+ds1/package/cryptoAPI/gnupg-keylist.jsm --- enigmail-2.0.12+ds1/package/cryptoAPI/gnupg-keylist.jsm 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/cryptoAPI/gnupg-keylist.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,503 @@ +/* + * 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/. + */ + +/**** + Private sub-module to gnupg.js for handling key lists from GnuPG + ****/ + +"use strict"; + +var EXPORTED_SYMBOLS = ["obtainKeyList", "createKeyObj", + "getPhotoFileFromGnuPG", "extractSignatures", "getGpgKeyData" +]; + +const EnigmailTime = ChromeUtils.import("chrome://enigmail/content/modules/time.jsm").EnigmailTime; +const EnigmailGpg = ChromeUtils.import("chrome://enigmail/content/modules/gpg.jsm").EnigmailGpg; +const EnigmailExecution = ChromeUtils.import("chrome://enigmail/content/modules/execution.jsm").EnigmailExecution; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailTrust = ChromeUtils.import("chrome://enigmail/content/modules/trust.jsm").EnigmailTrust; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailOS = ChromeUtils.import("chrome://enigmail/content/modules/os.jsm").EnigmailOS; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; + +// field ID's of key list (as described in the doc/DETAILS file in the GnuPG distribution) +const ENTRY_ID = 0; +const KEY_TRUST_ID = 1; +const KEY_SIZE_ID = 2; +const KEY_ALGO_ID = 3; +const KEY_ID = 4; +const CREATED_ID = 5; +const EXPIRY_ID = 6; +const UID_ID = 7; +const OWNERTRUST_ID = 8; +const USERID_ID = 9; +const SIG_TYPE_ID = 10; +const KEY_USE_FOR_ID = 11; + +const ALGO_SYMBOL = { + 1: "RSA", + 2: "RSA", + 3: "RSA", + 16: "ELG", + 17: "DSA", + 18: "ECDH", + 19: "ECDSA", + 20: "ELG", + 22: "EDDSA" +}; + +const UNKNOWN_SIGNATURE = "[User ID not found]"; + +const NS_RDONLY = 0x01; +const NS_WRONLY = 0x02; +const NS_CREATE_FILE = 0x08; +const NS_TRUNCATE = 0x20; +const STANDARD_FILE_PERMS = 0o600; + +const NS_LOCALFILEOUTPUTSTREAM_CONTRACTID = "@mozilla.org/network/file-output-stream;1"; + +/** + * Get key list from GnuPG. + * + * @param {Array of String} onlyKeys: only load data for specified key IDs + * + * @return {Promise}: + * key objects as specified in EnigmailKeyObj.constructor + */ +async function obtainKeyList(onlyKeys = null) { + EnigmailLog.DEBUG("gnupg-keylist.jsm: obtainKeyList()\n"); + + let secKeyList = [], + pubKeyList = []; + let commonArgs = EnigmailGpg.getStandardArgs(true); + commonArgs = commonArgs.concat(["--with-fingerprint", "--fixed-list-mode", "--with-colons"]); + + let args = commonArgs.concat(["--list-keys"]); + if (onlyKeys) { + args = args.concat(onlyKeys); + } + + let res = await EnigmailExecution.execAsync(EnigmailGpg.agentPath, args, ""); + pubKeyList = res.stdoutData.split(/\n/); + + let keyList = { + keys: [], + index: [] + }; + + EnigmailLog.DEBUG(`gnupg-keylist.jsm: obtainKeyList: #lines: ${pubKeyList.length}\n`); + if (pubKeyList.length > 0) { + appendKeyItems(pubKeyList, keyList); + + args = commonArgs.concat(["--list-secret-keys"]); + if (onlyKeys) { + args = args.concat(onlyKeys); + } + + res = await EnigmailExecution.execAsync(EnigmailGpg.agentPath, args, ""); + secKeyList = res.stdoutData.split(/\n/); + appendKeyItems(secKeyList, keyList); + } + + return keyList; +} + + +/** + * Append key objects to a given key cache + * + * @param keyListString: array of |string| formatted output from GnuPG for key listing + * @param keyList: |object| holding the resulting key list + * obj.keyList: Array holding key objects + * obj.keySortList: Array holding values to make sorting easier + * + * no return value + */ +function appendKeyItems(keyListString, keyList) { + EnigmailLog.DEBUG("gnupg-keylist.jsm: appendKeyItems()\n"); + let keyObj = {}; + let uatNum = 0; // counter for photos (counts per key) + + const TRUSTLEVELS_SORTED = EnigmailTrust.trustLevelsSorted(); + + for (let i = 0; i < keyListString.length; i++) { + let listRow = keyListString[i].split(/:/); + if (listRow.length === 0) continue; + + switch (listRow[ENTRY_ID]) { + case "pub": + keyObj = createKeyObj(listRow); + uatNum = 0; + keyList.keys.push(keyObj); + keyList.index[keyObj.keyId] = keyObj; + break; + case "sec": + keyObj = keyList.index[listRow[KEY_ID]]; + if (keyObj) { + keyObj.secretAvailable = true; + // create a dummy object that is not added to the list since we already have the key + keyObj = createKeyObj(listRow); + } else { + appendUnkownSecretKey(listRow[KEY_ID], keyListString, i, keyList); + keyObj = keyList.index[listRow[KEY_ID]]; + keyObj.secretAvailable = true; + } + break; + case "fpr": + // only take first fpr line, this is the fingerprint of the primary key and what we want + if (keyObj.fpr === "") { + keyObj.fpr = listRow[USERID_ID]; + } + break; + case "uid": + if (listRow[USERID_ID].length === 0) { + listRow[USERID_ID] = "-"; + } + if (typeof(keyObj.userId) !== "string") { + keyObj.userId = EnigmailData.convertGpgToUnicode(listRow[USERID_ID]); + if (TRUSTLEVELS_SORTED.indexOf(listRow[KEY_TRUST_ID]) < TRUSTLEVELS_SORTED.indexOf(keyObj.keyTrust)) { + // reduce key trust if primary UID is less trusted than public key + keyObj.keyTrust = listRow[KEY_TRUST_ID]; + } + } + + keyObj.userIds.push({ + userId: EnigmailData.convertGpgToUnicode(listRow[USERID_ID]), + keyTrust: listRow[KEY_TRUST_ID], + uidFpr: listRow[UID_ID], + type: "uid" + }); + + break; + case "sub": + keyObj.subKeys.push({ + keyId: listRow[KEY_ID], + expiry: EnigmailTime.getDateTime(listRow[EXPIRY_ID], true, false), + expiryTime: Number(listRow[EXPIRY_ID]), + keyTrust: listRow[KEY_TRUST_ID], + keyUseFor: listRow[KEY_USE_FOR_ID], + keySize: listRow[KEY_SIZE_ID], + algoSym: ALGO_SYMBOL[listRow[KEY_ALGO_ID]], + created: EnigmailTime.getDateTime(listRow[CREATED_ID], true, false), + keyCreated: Number(listRow[CREATED_ID]), + type: "sub" + }); + break; + case "uat": + if (listRow[USERID_ID].indexOf("1 ") === 0) { + const userId = EnigmailLocale.getString("userAtt.photo"); + keyObj.userIds.push({ + userId: userId, + keyTrust: listRow[KEY_TRUST_ID], + uidFpr: listRow[UID_ID], + type: "uat", + uatNum: uatNum + }); + keyObj.photoAvailable = true; + ++uatNum; + } + break; + } + } +} + +function createKeyObj(lineArr) { + let keyObj = {}; + if (lineArr[ENTRY_ID] === "pub" || lineArr[ENTRY_ID] === "sec") { + keyObj.keyId = lineArr[KEY_ID]; + keyObj.expiryTime = Number(lineArr[EXPIRY_ID]); + keyObj.created = EnigmailTime.getDateTime(lineArr[CREATED_ID], true, false); + keyObj.keyCreated = Number(lineArr[CREATED_ID]); + keyObj.keyTrust = lineArr[KEY_TRUST_ID]; + keyObj.keyUseFor = lineArr[KEY_USE_FOR_ID]; + keyObj.ownerTrust = lineArr[OWNERTRUST_ID]; + keyObj.algoSym = ALGO_SYMBOL[lineArr[KEY_ALGO_ID]]; + keyObj.keySize = lineArr[KEY_SIZE_ID]; + keyObj.userIds = []; + keyObj.subKeys = []; + keyObj.fpr = ""; + keyObj.userId = null; + keyObj.photoAvailable = false; + } else if (lineArr[ENTRY_ID] === "grp") { + keyObj.keyUseFor = "G"; + keyObj.userIds = []; + keyObj.subKeys = []; + } + keyObj.type = lineArr[ENTRY_ID]; + + return keyObj; +} + + +/** + * Handle secret keys for which gpg 2.0 does not create a public key record + */ +function appendUnkownSecretKey(keyId, aKeyList, startIndex, keyList) { + EnigmailLog.DEBUG(`gnupg-keylist.jsm: appendUnkownSecretKey: keyId: ${keyId}\n`); + + let keyListStr = []; + + for (let j = startIndex; j < aKeyList.length && (j === startIndex || aKeyList[j].substr(0, 4) !== "sec:"); j++) { + keyListStr.push(aKeyList[j]); + } + + // make the listing a "public" key + keyListStr[0] = keyListStr[0].replace(/^sec:/, "pub:"); + + appendKeyItems(keyListStr, keyList); +} + + +/** + * Extract a photo ID from a key, store it as file and return the file object. + + * @param {String} keyId: Key ID / fingerprint + * @param {Number} photoNumber: number of the photo on the key, starting with 0 + * + * @return {Promise} object or null in case no data / error. + */ +async function getPhotoFileFromGnuPG(keyId, photoNumber) { + EnigmailLog.DEBUG(`gnupg-keylist.jsm: getPhotoFileFromGnuPG, keyId=${keyId} photoNumber=${photoNumber}\n`); + + const GPG_ADDITIONAL_OPTIONS = ["--no-secmem-warning", "--no-verbose", "--no-auto-check-trustdb", + "--batch", "--no-tty", "--no-verbose", "--status-fd", "1", "--attribute-fd", "2", + "--fixed-list-mode", "--list-keys", keyId + ]; + const args = EnigmailGpg.getStandardArgs(false).concat(GPG_ADDITIONAL_OPTIONS); + + let res = await EnigmailExecution.execAsync(EnigmailGpg.agentPath, args); + let photoData = res.stderrData; + let outputTxt = res.stdoutData; + + if (!outputTxt || !photoData) { + return null; + } + + if (EnigmailOS.isDosLike && EnigmailGpg.getGpgFeature("windows-photoid-bug")) { + // workaround for error in gpg + photoData = photoData.replace(/\r\n/g, "\n"); + } + + // [GNUPG:] ATTRIBUTE A053069284158FC1E6770BDB57C9EB602B0717E2 2985 + let foundPicture = -1; + let skipData = 0; + let imgSize = -1; + const statusLines = outputTxt.split(/[\n\r+]/); + + for (let i = 0; i < statusLines.length; i++) { + const matches = statusLines[i].match(/\[GNUPG:\] ATTRIBUTE ([A-F\d]+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+)/); + if (matches && matches[3] == "1") { + // attribute is an image + foundPicture++; + if (foundPicture === photoNumber) { + imgSize = Number(matches[2]); + break; + } else { + skipData += Number(matches[2]); + } + } + } + + if (foundPicture >= 0 && foundPicture === photoNumber) { + if (photoData.search(/^gpg: /) === 0) { + // skip disturbing gpg output + let i = photoData.search(/\n/) + 1; + skipData += i; + } + + const pictureData = photoData.substr(16 + skipData, imgSize); + if (!pictureData.length) { + return null; + } + + try { + const flags = NS_WRONLY | NS_CREATE_FILE | NS_TRUNCATE; + const picFile = EnigmailFiles.getTempDirObj(); + + picFile.append(keyId + ".jpg"); + picFile.createUnique(picFile.NORMAL_FILE_TYPE, STANDARD_FILE_PERMS); + + const fileStream = Cc[NS_LOCALFILEOUTPUTSTREAM_CONTRACTID].createInstance(Ci.nsIFileOutputStream); + fileStream.init(picFile, flags, STANDARD_FILE_PERMS, 0); + if (fileStream.write(pictureData, pictureData.length) !== pictureData.length) { + fileStream.close(); + throw Components.results.NS_ERROR_FAILURE; + } + + fileStream.flush(); + fileStream.close(); + + // delete picFile upon exit + let extAppLauncher = Cc["@mozilla.org/mime;1"].getService(Ci.nsPIExternalAppLauncher); + extAppLauncher.deleteTemporaryFileOnExit(picFile); + return picFile; + } catch (ex) {} + } + return null; +} + + +/** + * Return signatures for a given key list + * + * @param {String} gpgKeyList Output from gpg such as produced by getKeySig() + * Only the first public key is processed! + * @param {Boolean} ignoreUnknownUid true if unknown signer's UIDs should be filtered out + * + * @return {Array of Object}: + * - uid + * - uidLabel + * - creationDate + * - sigList: [uid, creationDate, signerKeyId, sigType ] + */ + +function extractSignatures(gpgKeyList, ignoreUnknownUid) { + EnigmailLog.DEBUG("gnupg.js: extractSignatures\n"); + + var listObj = {}; + + let havePub = false; + let currUid = "", + keyId = "", + fpr = ""; + + const lineArr = gpgKeyList.split(/\n/); + for (let i = 0; i < lineArr.length; i++) { + // process lines such as: + // tru::1:1395895453:1442881280:3:1:5 + // pub:f:4096:1:C1B875ED336XX959:2299509307:1546189300::f:::scaESCA: + // fpr:::::::::102A1C8CC524A966849C33D7C8B157EA336XX959: + // uid:f::::1388511201::67D5B96DC564598D4D4D9E0E89F5B83C9931A154::Joe Fox : + // sig:::1:C8B157EA336XX959:2299509307::::Joe Fox :13x:::::2: + // sub:e:2048:1:B214734F0F5C7041:1316219469:1199912694:::::e: + // sub:f:2048:1:70E7A471DABE08B0:1316221524:1546189300:::::s: + const lineTokens = lineArr[i].split(/:/); + switch (lineTokens[ENTRY_ID]) { + case "pub": + if (havePub) { + return listObj; + } + havePub = true; + keyId = lineTokens[KEY_ID]; + break; + case "fpr": + if (fpr === "") + fpr = lineTokens[USERID_ID]; + break; + case "uid": + case "uat": + currUid = lineTokens[UID_ID]; + listObj[currUid] = { + userId: lineTokens[ENTRY_ID] == "uat" ? EnigmailLocale.getString("keyring.photo") : EnigmailData.convertGpgToUnicode(lineTokens[USERID_ID]), + rawUserId: lineTokens[USERID_ID], + keyId: keyId, + fpr: fpr, + created: EnigmailTime.getDateTime(lineTokens[CREATED_ID], true, false), + sigList: [] + }; + break; + case "sig": + if (lineTokens[SIG_TYPE_ID].substr(0, 2).toLowerCase() !== "1f") { + // ignrore revoked signature + + let sig = { + userId: EnigmailData.convertGpgToUnicode(lineTokens[USERID_ID]), + created: EnigmailTime.getDateTime(lineTokens[CREATED_ID], true, false), + signerKeyId: lineTokens[KEY_ID], + sigType: lineTokens[SIG_TYPE_ID], + sigKnown: lineTokens[USERID_ID] != UNKNOWN_SIGNATURE + }; + + if (!ignoreUnknownUid || sig.userId != UNKNOWN_SIGNATURE) { + listObj[currUid].sigList.push(sig); + } + } + break; + } + } + + return listObj; +} + + +async function getGpgKeyData(armorKeyString) { + EnigmailLog.DEBUG("gnupg.js: getGpgKeyData()\n"); + + if (!EnigmailGpg.getGpgFeature("supports-show-only")) { + throw "unsupported"; + } + + let args = EnigmailGpg.getStandardArgs(false).concat(["--no-tty", "--batch", "--no-verbose", "--with-fingerprint", "--with-colons", "--import-options", "import-show", "--dry-run", "--import"]); + + let res = await EnigmailExecution.execAsync(EnigmailGpg.agentPath, args, armorKeyString); + let lines = res.stdoutData.split(/\n/); + + let key = {}; + let keyId = ""; + let keyList = []; + /* + pub:u:256:22:84F83BE88C892606:1525969855:1683649855::u:::scESC:::::ed25519:::0: + fpr:::::::::AFE1B65C5F39ACA7960B22CD84F83BE88C892606: + uid:u::::1525969914::22DB32406212400B52CDC74DA2B33418637430F1::Patrick (ECC) ::::::::::0: + uid:u::::1525969855::F70B7A77F085AA7BA003D6AFAB6FF0DB1FC901B0::enigmail ::::::::::0: + sub:u:256:18:329DAB3350400C40:1525969855:1683649855:::::e:::::cv25519:: + fpr:::::::::3B154538D4DFAA19BDADAAD0329DAB3350400C40: + */ + + for (let i = 0; i < lines.length; i++) { + const lineTokens = lines[i].split(/:/); + + switch (lineTokens[ENTRY_ID]) { + case "pub": + case "sec": + key = { + id: lineTokens[KEY_ID], + fpr: null, + name: null, + isSecret: false, + created: EnigmailTime.getDateTime(lineTokens[CREATED_ID], true, false), + uids: [] + }; + + if (!(key.id in keyList)) { + keyList[key.id] = key; + } + + if (lineTokens[ENTRY_ID] === "sec") { + keyList[key.id].isSecret = true; + } + break; + case "fpr": + if (!key.fpr) { + key.fpr = lineTokens[USERID_ID]; + } + break; + case "uid": + if (!key.name) { + key.name = lineTokens[USERID_ID]; + } + else { + key.uids.push(lineTokens[USERID_ID]); + } + break; + case "rvs": + case "rvk": + keyId = lineTokens[KEY_ID]; + if (keyId in keyList) { + keyList[keyId].revoke = true; + } else { + keyList[keyId] = { + revoke: true, + id: keyId + }; + } + break; + } + } + + return keyList; +} \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/cryptoAPI/gnupg.js enigmail-2.1.3+ds1/package/cryptoAPI/gnupg.js --- enigmail-2.0.12+ds1/package/cryptoAPI/gnupg.js 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/cryptoAPI/gnupg.js 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,450 @@ +/* + * 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"; + +var EXPORTED_SYMBOLS = ["getGnuPGAPI"]; + +var Services = Components.utils.import("resource://gre/modules/Services.jsm").Services; + +// Load OpenPGP.js (including generic) API +Services.scriptloader.loadSubScript("chrome://enigmail/content/modules/cryptoAPI/openpgp-js.js", + null, "UTF-8"); /* global OpenPGPjsCryptoAPI: false */ + +/* Globals loaded from openpgp-js.js: */ +/* global getOpenPGP: false, EnigmailLog: false */ + +const EnigmailGpg = ChromeUtils.import("chrome://enigmail/content/modules/gpg.jsm").EnigmailGpg; +const EnigmailExecution = ChromeUtils.import("chrome://enigmail/content/modules/execution.jsm").EnigmailExecution; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; +const EnigmailTime = ChromeUtils.import("chrome://enigmail/content/modules/time.jsm").EnigmailTime; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailPassword = ChromeUtils.import("chrome://enigmail/content/modules/passwords.jsm").EnigmailPassword; +const EnigmailErrorHandling = ChromeUtils.import("chrome://enigmail/content/modules/errorHandling.jsm").EnigmailErrorHandling; +const GnuPGDecryption = ChromeUtils.import("chrome://enigmail/content/modules/cryptoAPI/gnupg-decryption.jsm").GnuPGDecryption; + +const { + obtainKeyList, + createKeyObj, + getPhotoFileFromGnuPG, + extractSignatures, + getGpgKeyData +} = ChromeUtils.import("chrome://enigmail/content/modules/cryptoAPI/gnupg-keylist.jsm"); + +const { + GnuPG_importKeyFromFile, + GnuPG_extractSecretKey +} = ChromeUtils.import("chrome://enigmail/content/modules/cryptoAPI/gnupg-key.jsm"); + +/** + * GnuPG implementation of CryptoAPI + */ + +class GnuPGCryptoAPI extends OpenPGPjsCryptoAPI { + constructor() { + super(); + this.api_name = "GnuPG"; + } + + /** + * Get the list of all knwn keys (including their secret keys) + * @param {Array of String} onlyKeys: [optional] only load data for specified key IDs + * + * @return {Promise} + */ + async getKeys(onlyKeys = null) { + let keyList = await obtainKeyList(onlyKeys); + return keyList.keys; + } + + /** + * Get groups defined in gpg.conf in the same structure as KeyObject + * + * @return {Array of KeyObject} with type = "grp" + */ + getGroups() { + let groups = EnigmailGpg.getGpgGroups(); + + let r = []; + for (var i = 0; i < groups.length; i++) { + + let keyObj = createKeyObj(["grp"]); + keyObj.keyTrust = "g"; + keyObj.userId = EnigmailData.convertGpgToUnicode(groups[i].alias).replace(/\\e3A/g, ":"); + keyObj.keyId = keyObj.userId; + var grpMembers = EnigmailData.convertGpgToUnicode(groups[i].keylist).replace(/\\e3A/g, ":").split(/[,;]/); + for (var grpIdx = 0; grpIdx < grpMembers.length; grpIdx++) { + keyObj.userIds.push({ + userId: grpMembers[grpIdx], + keyTrust: "q" + }); + } + r.push(keyObj); + } + + return r; + } + + + /** + * Obtain signatures for a given set of key IDs. + * + * @param {String} keyId: space-separated list of key IDs + * @param {Boolean} ignoreUnknownUid: if true, filter out unknown signer's UIDs + * + * @return {Promise} - see extractSignatures() + */ + async getKeySignatures(keyId, ignoreUnknownUid = false) { + EnigmailLog.DEBUG(`gnupg.js: getKeySignatures: ${keyId}\n`); + + const args = EnigmailGpg.getStandardArgs(true).concat(["--with-fingerprint", "--fixed-list-mode", "--with-colons", "--list-sig"]).concat(keyId.split(" ")); + + let res = await EnigmailExecution.execAsync(EnigmailGpg.agentPath, args, ""); + + if (!(res.statusFlags & EnigmailConstants.BAD_SIGNATURE)) { + // ignore exit code as recommended by GnuPG authors + res.exitCode = 0; + } + + if (res.exitCode !== 0) { + if (res.errorMsg) { + res.errorMsg += "\n" + EnigmailFiles.formatCmdLine(EnigmailGpg.agentPath, args); + res.errorMsg += "\n" + res.errorMsg; + } + return ""; + } + + if (res.stdoutData.length > 0) { + return extractSignatures(res.stdoutData, ignoreUnknownUid); + } + return null; + } + + + /** + * Export the minimum key for the public key object: + * public key, primary user ID, newest encryption subkey + * + * @param {String} fpr: a single FPR + * @param {String} email: [optional] the email address of the desired user ID. + * If the desired user ID cannot be found or is not valid, use the primary UID instead + * @param {Array} subkeyDates: [optional] remove subkeys with sepcific creation Dates + * + * @return {Promise}: + * - exitCode (0 = success) + * - errorMsg (if exitCode != 0) + * - keyData: BASE64-encded string of key data + */ + async getMinimalPubKey(fpr, email, subkeyDates) { + EnigmailLog.DEBUG(`gnupg.js: getMinimalPubKey: ${fpr}\n`); + + let retObj = { + exitCode: 0, + errorMsg: "", + keyData: "" + }; + let minimalKeyBlock = null; + + let args = EnigmailGpg.getStandardArgs(true); + + if (EnigmailGpg.getGpgFeature("export-specific-uid")) { + // Use GnuPG filters if possible + let dropSubkeyFilter = "usage!~e && usage!~s"; + + if (subkeyDates && subkeyDates.length > 0) { + dropSubkeyFilter = subkeyDates.map(x => `key_created!=${x}`).join(" && "); + } + args = args.concat(["--export-options", "export-minimal,no-export-attributes", + "--export-filter", "keep-uid=" + (email ? "mbox=" + email : "primary=1"), + "--export-filter", "drop-subkey=" + dropSubkeyFilter, + "--export", fpr + ]); + } else { + args = args.concat(["--export-options", "export-minimal,no-export-attributes", "-a", "--export", fpr]); + } + + const statusObj = {}; + const exitCodeObj = {}; + let res = await EnigmailExecution.execAsync(EnigmailGpg.agentPath, args); + let exportOK = true; + let keyBlock = res.stdoutData; + + if (EnigmailGpg.getGpgFeature("export-result")) { + // GnuPG 2.1.10+ + let r = new RegExp("^\\[GNUPG:\\] EXPORTED " + fpr, "m"); + if (res.stderrData.search(r) < 0) { + retObj.exitCode = 2; + retObj.errorMsg = EnigmailLocale.getString("failKeyExtract"); + exportOK = false; + } + } else { + // GnuPG older than 2.1.10 + if (keyBlock.length < 50) { + retObj.exitCode = 2; + retObj.errorMsg = EnigmailLocale.getString("failKeyExtract"); + exportOK = false; + } + } + + if (EnigmailGpg.getGpgFeature("export-specific-uid")) { + // GnuPG 2.2.9+ + retObj.keyData = btoa(keyBlock); + return retObj; + } + + // GnuPG < 2.2.9 + if (exportOK) { + let minKey = await this.getStrippedKey(keyBlock, email); + if (minKey) { + minimalKeyBlock = btoa(String.fromCharCode.apply(null, minKey)); + } + + if (!minimalKeyBlock) { + retObj.exitCode = 1; + retObj.errorMsg = EnigmailLocale.getString("failKeyNoSubkey"); + } + } + + retObj.keyData = minimalKeyBlock; + return retObj; + } + + /** + * Extract a photo ID from a key, store it as file and return the file object. + * + * @param {String} keyId: Key ID / fingerprint + * @param {Number} photoNumber: number of the photo on the key, starting with 0 + * + * @return {nsIFile} object or null in case no data / error. + */ + async getPhotoFile(keyId, photoNumber) { + let file = await getPhotoFileFromGnuPG(keyId, photoNumber); + return file; + } + + /** + * Import key(s) from a file + * + * @param {nsIFile} inputFile: the file holding the keys + * + * @return {Object} or null in case no data / error: + * - {Number} exitCode: result code (0: OK) + * - {Array of String) importedKeys: imported fingerprints + * - {String} errorMsg: human readable error message + * - {Number} importSum: total number of processed keys + * - {Number} importUnchanged: number of unchanged keys + */ + async importKeyFromFile(inputFile) { + let keys = await GnuPG_importKeyFromFile(inputFile); + return keys; + } + + /** + * Export secret key(s) to a file + * + * @param {String} keyId Specification by fingerprint or keyID + * @param {Boolean} minimalKey if true, reduce key to minimum required + * + * @return {Object}: + * - {Number} exitCode: result code (0: OK) + * - {String} keyData: ASCII armored key data material + * - {String} errorMsg: error message in case exitCode !== 0 + */ + + async extractSecretKey(keyId, minimalKey) { + let ret = await GnuPG_extractSecretKey(keyId, minimalKey); + + if (ret.exitCode !== 0) { + ret.errorMsg = EnigmailLocale.getString("failKeyExtract") + "\n" + ret.errorMsg; + } + return ret; + } + + /** + * + * @param {byte} byteData The encrypted data + * + * @return {String or null} - the name of the attached file + */ + + async getFileName(byteData) { + EnigmailLog.DEBUG(`gnupg.js: getFileName()\n`); + const args = EnigmailGpg.getStandardArgs(true).concat(EnigmailPassword.command()).concat(["--decrypt"]); + + let res = await EnigmailExecution.execAsync(EnigmailGpg.agentPath, args, byteData + "\n"); + + const matches = res.stderrData.match(/^(\[GNUPG:\] PLAINTEXT [0-9]+ [0-9]+ )(.*)$/m); + if (matches && (matches.length > 2)) { + var filename = matches[2]; + if (filename.indexOf(" ") > 0) { + filename = filename.replace(/ .*$/, ""); + } + return EnigmailData.convertToUnicode(unescape(filename), "utf-8"); + } else { + return null; + } + } + + /** + * + * @param {Path} filePath The signed file + * @param {Path} sigPath The signature to verify + * + * @return {Promise} - A message from the verification. + * + * Use Promise.catch to handle failed verifications. + * The message will be an error message in this case. + */ + + async verifyAttachment(filePath, sigPath) { + EnigmailLog.DEBUG(`gnupg.js: verifyAttachment()\n`); + const args = EnigmailGpg.getStandardArgs(true).concat(["--verify", sigPath, filePath]); + let result = await EnigmailExecution.execAsync(EnigmailGpg.agentPath, args); + const decrypted = {}; + GnuPGDecryption.decryptMessageEnd(result.stderrData, result.exitCode, 1, true, true, EnigmailConstants.UI_INTERACTIVE, decrypted); + if (result.exitCode === 0) { + const detailArr = decrypted.sigDetails.split(/ /); + const dateTime = EnigmailTime.getDateTime(detailArr[2], true, true); + const msg1 = decrypted.errorMsg.split(/\n/)[0]; + const msg2 = EnigmailLocale.getString("keyAndSigDate", ["0x" + decrypted.keyId, dateTime]); + const message = msg1 + "\n" + msg2; + return (message); + } else { + throw (decrypted.errorMsg); + } + } + + + /** + * + * @param {Bytes} encrypted The encrypted data + * + * @return {Promise} - Return object with decryptedData and + * status information + * + * Use Promise.catch to handle failed decryption. + * retObj.errorMsg will be an error message in this case. + */ + + async decryptAttachment(encrypted) { + EnigmailLog.DEBUG(`gnupg.js: decryptAttachment()\n`); + + let args = EnigmailGpg.getStandardArgs(true); + args.push("--yes"); + args = args.concat(EnigmailPassword.command()); + args.push("-d"); + + let res = await EnigmailExecution.execAsync(EnigmailGpg.agentPath, args, encrypted); + return res; + } + + + /** + * + * @param {String} encrypted The encrypted data + * @param {Object} options Decryption options + * + * @return {Promise} - Return object with decryptedData and + * status information + * + * Use Promise.catch to handle failed decryption. + * retObj.errorMsg will be an error message in this case. + */ + + async decrypt(encrypted, options) { + EnigmailLog.DEBUG(`gnupg.js: decrypt()\n`); + + options.logFile = EnigmailErrorHandling.getTempLogFile(); + const args = GnuPGDecryption.getDecryptionArgs(options); + let res = await EnigmailExecution.execAsync(EnigmailGpg.agentPath, args, encrypted); + EnigmailErrorHandling.appendLogFileToDebug(options.logFile); + + if (res.statusFlags & EnigmailConstants.MISSING_PASSPHRASE) { + EnigmailLog.ERROR("decryption.jsm: decryptMessageStart: Error - no passphrase supplied\n"); + throw { + errorMsg: EnigmailLocale.getString("noPassphrase") + }; + } + + const result = { + exitCode: res.exitCode, + decryptedData: res.stdoutData + }; + GnuPGDecryption.decryptMessageEnd(res.stderrData, res.exitCode, res.stdoutData.length, options.verifyOnly, options.noOutput, options.uiFlags, result); + + return result; + } + + /** + * + * @param {String} encrypted The encrypted data + * @param {Object} options Decryption options + * + * @return {Promise} - Return object with decryptedData and + * status information + * + * Use Promise.catch to handle failed decryption. + * retObj.errorMsg will be an error message in this case. + */ + + async decryptMime(encrypted, options) { + EnigmailLog.DEBUG(`gnupg.js: decryptMime()\n`); + + // write something to gpg such that the process doesn't get stuck + if (encrypted.length === 0) { + encrypted = "NO DATA\n"; + } + + options.noOutput = false; + options.verifyOnly = false; + options.uiFlags = EnigmailConstants.UI_PGP_MIME; + + return this.decrypt(encrypted, options); + } + + /** + * + * @param {String} signed The signed data + * @param {Object} options Decryption options + * + * @return {Promise} - Return object with decryptedData and + * status information + * + * Use Promise.catch to handle failed decryption. + * retObj.errorMsg will be an error message in this case. + */ + + async verifyMime(signed, options) { + EnigmailLog.DEBUG(`gnupg.js: verifyMime()\n`); + + options.noOutput = true; + options.verifyOnly = true; + options.uiFlags = EnigmailConstants.UI_PGP_MIME; + + return this.decrypt(signed, options); + } + + async getKeyListFromKeyBlock(keyBlockStr) { + + let res; + try { + res = await getGpgKeyData(keyBlockStr); + } catch (ex) { + if (ex === "unsupported") { + res = await this.OPENPGPjs_getKeyListFromKeyBlock(keyBlockStr); + } else throw ex; + } + return res; + } + +} + +function getGnuPGAPI() { + return new GnuPGCryptoAPI(); +} \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/cryptoAPI/interface.js enigmail-2.1.3+ds1/package/cryptoAPI/interface.js --- enigmail-2.0.12+ds1/package/cryptoAPI/interface.js 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/cryptoAPI/interface.js 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,273 @@ +/* + * 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"; + +/** + * CryptoAPI - abstract interface + */ + +var inspector; + +class CryptoAPI { + constructor() { + this.api_name = "null"; + } + + get apiName() { + return this.api_name; + } + + /** + * Synchronize a promise: wait synchonously until a promise has completed and return + * the value that the promise returned. + * + * @param {Promise} promise: the promise to wait for + * + * @return {Variant} whatever the promise returns + */ + sync(promise) { + if (!inspector) { + inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + } + + let res = null; + let p = promise.then(gotResult => { + res = gotResult; + inspector.exitNestedEventLoop(); + }).catch(gotResult => { + res = gotResult; + inspector.exitNestedEventLoop(); + }); + + inspector.enterNestedEventLoop(0); + + return res; + } + + /** + * Obtain signatures for a given set of key IDs. + * + * @param {String} keyId: space-separated list of key IDs + * @param {Boolean} ignoreUnknownUid: if true, filter out unknown signer's UIDs + * + * @return {Promise} - see extractSignatures() + */ + async getKeySignatures(keyId, ignoreUnknownUid = false) { + return null; + } + + /** + * Export the minimum key for the public key object: + * public key, user ID, newest encryption subkey + * + * @param {String} fpr : a single FPR + * @param {String} email: [optional] the email address of the desired user ID. + * If the desired user ID cannot be found or is not valid, use the primary UID instead + * + * @return {Promise}: + * - exitCode (0 = success) + * - errorMsg (if exitCode != 0) + * - keyData: BASE64-encded string of key data + */ + async getMinimalPubKey(fpr, email) { + return { + exitCode: -1, + errorMsg: "", + keyData: "" + }; + } + + /** + * Get a minimal stripped key containing only: + * - The public key + * - the primary UID + its self-signature + * - the newest valild encryption key + its signature packet + * + * @param {String} armoredKey: Key data (in OpenPGP armored format) + * + * @return {Promise} + */ + + async getStrippedKey(armoredKey) { + return null; + } + + /** + * Get the list of all konwn keys (including their secret keys) + * @param {Array of String} onlyKeys: [optional] only load data for specified key IDs + * + * @return {Promise} + */ + async getKeys(onlyKeys = null) { + return []; + } + + /** + * Get groups defined in gpg.conf in the same structure as KeyObject + * [synchronous] + * + * @return {Array of KeyObject} with type = "grp" + */ + getGroups() { + return []; + } + + /** + * Extract a photo ID from a key, store it as file and return the file object. + * + * @param {String} keyId: Key ID / fingerprint + * @param {Number} photoNumber: number of the photo on the key, starting with 0 + * + * @return {nsIFile} object or null in case no data / error. + */ + async getPhotoFile(keyId, photoNumber) { + return null; + } + + /** + * Import key(s) from a file + * + * @param {nsIFile} inputFile: the file holding the keys + * + * @return {Object} or null in case no data / error: + * - {Number} exitCode: result code (0: OK) + * - {Array of String) importedKeys: imported fingerprints + * - {Number} importSum: total number of processed keys + * - {Number} importUnchanged: number of unchanged keys + */ + + async importKeyFromFile(inputFile) { + return null; + } + + /** + * Export secret key(s) to a file + * + * @param {String} keyId Specification by fingerprint or keyID + * @param {Boolean} minimalKey if true, reduce key to minimum required + * + * @return {Object}: + * - {Number} exitCode: result code (0: OK) + * - {String} keyData: ASCII armored key data material + * - {String} errorMsg: error message in case exitCode !== 0 + */ + + async extractSecretKey(keyId, minimalKey) { + return null; + } + + /** + * Determine the file name from OpenPGP data. + * + * @param {byte} byteData The encrypted data + * + * @return {String} - the name of the attached file + */ + + async getFileName(byteData) { + return null; + } + + /** + * Verify the detached signature of an attachment (or in other words, + * check the signature of a file, given the file and the signature). + * + * @param {Path} filePath The signed file + * @param {Path} sigPath The signature to verify + * + * @return {Promise} - A message from the verification. + * + * Use Promise.catch to handle failed verifications. + * The message will be an error message in this case. + */ + + async verifyAttachment(filePath, sigPath) { + return null; + } + + /** + * Decrypt an attachment. + * + * @param {Bytes} encrypted The encrypted data + * + * @return {Promise} - Return object with decryptedData and + * status information + * + * Use Promise.catch to handle failed decryption. + * retObj.errorMsg will be an error message in this case. + */ + + async decryptAttachment(encrypted) { + return null; + } + + /** + * Generic function to decrypt and/or verify an OpenPGP message. + * + * @param {String} encrypted The encrypted data + * @param {Object} options Decryption options + * + * @return {Promise} - Return object with decryptedData and + * status information + * + * Use Promise.catch to handle failed decryption. + * retObj.errorMsg will be an error message in this case. + */ + + async decrypt(encrypted, options) { + return null; + } + + /** + * Decrypt a PGP/MIME-encrypted message + * + * @param {String} encrypted The encrypted data + * @param {Object} options Decryption options + * + * @return {Promise} - Return object with decryptedData and + * status information + * + * Use Promise.catch to handle failed decryption. + * retObj.errorMsg will be an error message in this case. + */ + + async decryptMime(encrypted, options) { + return null; + } + + /** + * Verify a PGP/MIME-signed message + * + * @param {String} signed The signed data + * @param {Object} options Decryption options + * + * @return {Promise} - Return object with decryptedData and + * status information + * + * Use Promise.catch to handle failed decryption. + * retObj.errorMsg will be an error message in this case. + */ + + async verifyMime(signed, options) { + return null; + } + + /** + * Get details (key ID, UID) of the data contained in a OpenPGP key block + * + * @param {String} keyBlockStr String: the contents of one or more public keys + * + * @return {Promise}: array of objects with the following structure: + * - id (key ID) + * - fpr + * - name (the UID of the key) + */ + + async getKeyListFromKeyBlock(keyBlockStr) { + return null; + } +} \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/cryptoAPI/openpgp-js.js enigmail-2.1.3+ds1/package/cryptoAPI/openpgp-js.js --- enigmail-2.0.12+ds1/package/cryptoAPI/openpgp-js.js 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/cryptoAPI/openpgp-js.js 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,183 @@ +/* + * 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"; + +//var EXPORTED_SYMBOLS = ["getOpenPGPjsAPI"]; + + +var Services = ChromeUtils.import("resource://gre/modules/Services.jsm").Services; +const EnigmailLog = Cu.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailLazy = Cu.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; + +const getOpenPGP = EnigmailLazy.loader("enigmail/openpgp.jsm", "EnigmailOpenPGP"); +const getArmor = EnigmailLazy.loader("enigmail/armor.jsm", "EnigmailArmor"); + +// Load generic API +Services.scriptloader.loadSubScript("chrome://enigmail/content/modules/cryptoAPI/interface.js", + null, "UTF-8"); /* global CryptoAPI */ + + +/** + * OpenPGP.js implementation of CryptoAPI + */ + +class OpenPGPjsCryptoAPI extends CryptoAPI { + constructor() { + super(); + this.api_name = "OpenPGP.js"; + } + + async getStrippedKey(armoredKey, emailAddr) { + EnigmailLog.DEBUG("openpgp-js.js: getStrippedKey()\n"); + + let searchUid = undefined; + if (emailAddr) { + if (emailAddr.search(/^<.{1,500}>$/) < 0) { + searchUid = `<${emailAddr}>`; + } else searchUid = emailAddr; + } + + try { + const openpgp = getOpenPGP().openpgp; + let msg = await openpgp.key.readArmored(armoredKey); + + if (!msg || msg.keys.length === 0) { + if (msg.err) { + EnigmailLog.writeException("openpgp-js.js", msg.err[0]); + } + return null; + } + + let key = msg.keys[0]; + let uid = await key.getPrimaryUser(null, searchUid); + if (!uid || !uid.user) return null; + + let signSubkey = await key.getSigningKey(); + let encSubkey = await key.getEncryptionKey(); + /* + let encSubkey = null, + signSubkey = null; + + for (let i = 0; i < key.subKeys.length; i++) { + if (key.subKeys[i].subKey === encSubkeyPacket) { + encSubkey = key.subKeys[i]; + break; + } + } + if (!encSubkey) return null; + + if (!signSubkeyPacket.keyid) { + for (let i = 0; i < key.subKeys.length; i++) { + if (key.subKeys[i].subKey === signSubkeyPacket) { + signSubkey = key.subKeys[i]; + break; + } + } + if (!signSubkey) return null; + } + */ + + let p = new openpgp.packet.List(); + p.push(key.primaryKey); + p.concat(uid.user.toPacketlist()); + if (key !== signSubkey) { + p.concat(signSubkey.toPacketlist()); + } + if (key !== encSubkey) { + p.concat(encSubkey.toPacketlist()); + } + + return p.write(); + } catch (ex) { + EnigmailLog.DEBUG("openpgp-js.js: getStrippedKey: ERROR " + ex.message + "\n" + ex.stack + "\n"); + } + return null; + } + + async getKeyListFromKeyBlock(keyBlockStr) { + return await this.OPENPGPjs_getKeyListFromKeyBlockkeyBlockStr(keyBlockStr); + } + + async OPENPGPjs_getKeyListFromKeyBlock(keyBlockStr) { + EnigmailLog.DEBUG("openpgp-js.js: getKeyListFromKeyBlock()\n"); + const EnigmailTime = ChromeUtils.import("chrome://enigmail/content/modules/time.jsm").EnigmailTime; + + const SIG_TYPE_REVOCATION = 0x20; + + let keyList = []; + let key = {}; + let blocks; + let isBinary = false; + const EOpenpgp = getOpenPGP(); + + if (keyBlockStr.search(/-----BEGIN PGP (PUBLIC|PRIVATE) KEY BLOCK-----/) >= 0) { + blocks = getArmor().splitArmoredBlocks(keyBlockStr); + } else { + isBinary = true; + blocks = [EOpenpgp.enigmailFuncs.bytesToArmor(EOpenpgp.openpgp.enums.armor.public_key, keyBlockStr)]; + } + + for (let b of blocks) { + let m = await EOpenpgp.openpgp.message.readArmored(b); + + for (let i = 0; i < m.packets.length; i++) { + let packetType = EOpenpgp.openpgp.enums.read(EOpenpgp.openpgp.enums.packet, m.packets[i].tag); + switch (packetType) { + case "publicKey": + case "secretKey": + key = { + id: m.packets[i].getKeyId().toHex().toUpperCase(), + fpr: m.packets[i].getFingerprint().toUpperCase(), + uids: [], + created: EnigmailTime.getDateTime(m.packets[i].getCreationTime().getTime()/1000, true, false), + name: null, + isSecret: false, + revoke: false + }; + + if (!(key.id in keyList)) { + keyList[key.id] = key; + } + + if (packetType === "secretKey") { + keyList[key.id].isSecret = true; + } + break; + case "userid": + if (!key.name) { + key.name = m.packets[i].userid.replace(/[\r\n]+/g, " "); + } + else { + key.uids.push(m.packets[i].userid.replace(/[\r\n]+/g, " ")); + } + break; + case "signature": + if (m.packets[i].signatureType === SIG_TYPE_REVOCATION) { + let keyId = m.packets[i].issuerKeyId.toHex().toUpperCase(); + if (keyId in keyList) { + keyList[keyId].revoke = true; + } else { + keyList[keyId] = { + revoke: true, + id: keyId + }; + } + } + break; + } + } + } + + return keyList; + } +} + + +function getOpenPGPjsAPI() { + return new OpenPGPjsCryptoAPI(); +} \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/cryptoAPI.jsm enigmail-2.1.3+ds1/package/cryptoAPI.jsm --- enigmail-2.0.12+ds1/package/cryptoAPI.jsm 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/cryptoAPI.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,26 @@ +/* + * 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"; + +var EXPORTED_SYMBOLS = ["EnigmailCryptoAPI"]; + +var gCurrentApi = null; +var Services = ChromeUtils.import("resource://gre/modules/Services.jsm").Services; + + +function EnigmailCryptoAPI() { + if (!gCurrentApi) { + const { + getGnuPGAPI + } = ChromeUtils.import("chrome://enigmail/content/modules/cryptoAPI/gnupg.js"); + + gCurrentApi = getGnuPGAPI(); + } + + return gCurrentApi; +} diff -Nru enigmail-2.0.12+ds1/package/data.jsm enigmail-2.1.3+ds1/package/data.jsm --- enigmail-2.0.12+ds1/package/data.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/data.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false, EnigmailLog: false, unescape: false, atob: false, btoa: false */ -/*jshint -W097 */ /* * 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 @@ -11,9 +9,6 @@ var EXPORTED_SYMBOLS = ["EnigmailData"]; -const Cc = Components.classes; -const Ci = Components.interfaces; - const SCRIPTABLEUNICODECONVERTER_CONTRACTID = "@mozilla.org/intl/scriptableunicodeconverter"; const HEX_TABLE = "0123456789abcdef"; diff -Nru enigmail-2.0.12+ds1/package/decryption.jsm enigmail-2.1.3+ds1/package/decryption.jsm --- enigmail-2.0.12+ds1/package/decryption.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/decryption.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,38 +1,31 @@ -/*global Components: false, EnigmailData: false, EnigmailLog: false, EnigmailPrefs: false, EnigmailLocale: false, EnigmailArmor: false, EnigmailExecution: false, EnigmailDialog: false */ -/*jshint -W097 */ /* * 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"; var EXPORTED_SYMBOLS = ["EnigmailDecryption"]; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ -Cu.import("resource://enigmail/data.jsm"); -Cu.import("resource://enigmail/log.jsm"); -Cu.import("resource://enigmail/prefs.jsm"); -Cu.import("resource://enigmail/armor.jsm"); -Cu.import("resource://enigmail/locale.jsm"); -Cu.import("resource://enigmail/data.jsm"); -Cu.import("resource://enigmail/execution.jsm"); -Cu.import("resource://enigmail/dialog.jsm"); -Cu.import("resource://enigmail/httpProxy.jsm"); /*global EnigmailHttpProxy: false */ -Cu.import("resource://enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ -Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ -Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ -Cu.import("resource://enigmail/errorHandling.jsm"); /*global EnigmailErrorHandling: false */ -Cu.import("resource://enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ -Cu.import("resource://enigmail/key.jsm"); /*global EnigmailKey: false */ -Cu.import("resource://enigmail/passwords.jsm"); /*global EnigmailPassword: false */ -Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ -Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailArmor = ChromeUtils.import("chrome://enigmail/content/modules/armor.jsm").EnigmailArmor; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailDialog = ChromeUtils.import("chrome://enigmail/content/modules/dialog.jsm").EnigmailDialog; +const EnigmailHttpProxy = ChromeUtils.import("chrome://enigmail/content/modules/httpProxy.jsm").EnigmailHttpProxy; +const EnigmailGpgAgent = ChromeUtils.import("chrome://enigmail/content/modules/gpgAgent.jsm").EnigmailGpgAgent; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailGpg = ChromeUtils.import("chrome://enigmail/content/modules/gpg.jsm").EnigmailGpg; +const EnigmailErrorHandling = ChromeUtils.import("chrome://enigmail/content/modules/errorHandling.jsm").EnigmailErrorHandling; +const EnigmailKeyRing = ChromeUtils.import("chrome://enigmail/content/modules/keyRing.jsm").EnigmailKeyRing; +const EnigmailKey = ChromeUtils.import("chrome://enigmail/content/modules/key.jsm").EnigmailKey; +const EnigmailPassword = ChromeUtils.import("chrome://enigmail/content/modules/passwords.jsm").EnigmailPassword; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; +const EnigmailFuncs = ChromeUtils.import("chrome://enigmail/content/modules/funcs.jsm").EnigmailFuncs; +const EnigmailCryptoAPI = ChromeUtils.import("chrome://enigmail/content/modules/cryptoAPI.jsm").EnigmailCryptoAPI; const STATUS_ERROR = EnigmailConstants.BAD_SIGNATURE | EnigmailConstants.DECRYPTION_FAILED; const STATUS_DECRYPTION_OK = EnigmailConstants.DECRYPTION_OKAY; @@ -61,45 +54,14 @@ } var EnigmailDecryption = { - decryptMessageStart: function(win, verifyOnly, noOutput, listener, - statusFlagsObj, errorMsgObj, mimeSignatureFile, - maxOutputLength) { - EnigmailLog.DEBUG("decryption.jsm: decryptMessageStart: verifyOnly=" + verifyOnly + "\n"); - - if (!EnigmailCore.getService(win)) { - EnigmailLog.ERROR("decryption.jsm: decryptMessageStart: not yet initialized\n"); - errorMsgObj.value = EnigmailLocale.getString("notInit"); - return null; - } - - if (EnigmailKeyRing.isGeneratingKey()) { - errorMsgObj.value = EnigmailLocale.getString("notComplete"); - return null; - } - - var args = EnigmailGpg.getStandardArgs(true); - - let logFile = EnigmailErrorHandling.getTempLogFile(); - args.push("--log-file"); - args.push(EnigmailFiles.getEscapedFilename(EnigmailFiles.getFilePath(logFile))); - - var keyserver = EnigmailPrefs.getPref("autoKeyRetrieve"); - if (keyserver && keyserver !== "") { - keyserver = keyserver.trim(); - args.push("--keyserver-options"); - var keySrvArgs = "auto-key-retrieve"; - var srvProxy = EnigmailHttpProxy.getHttpProxy(keyserver); - if (srvProxy) { - keySrvArgs += ",http-proxy=" + srvProxy; - } - args.push(keySrvArgs); - args.push("--keyserver"); - args.push(keyserver); - } + isReady: function(win) { + return (EnigmailCore.getService(win)) && (!EnigmailKeyRing.isGeneratingKey()); + }, - if (EnigmailGpg.getGpgFeature("supports-sender") && - win && win.gFolderDisplay && win.gFolderDisplay.selectedMessage) { - var fromAddr = win.gFolderDisplay.selectedMessage.author; + getFromAddr: function(win) { + var fromAddr; + if (win && win.gFolderDisplay && win.gFolderDisplay.selectedMessage) { + fromAddr = win.gFolderDisplay.selectedMessage.author; try { fromAddr = EnigmailFuncs.stripEmail(fromAddr); if (fromAddr.search(/[a-zA-Z0-9]@.*[\(\)]/) >= 0) { @@ -109,347 +71,8 @@ catch (ex) { fromAddr = false; } - if (fromAddr) { - args.push("--sender"); - args.push(fromAddr.toLowerCase()); - } - } - - if (noOutput) { - args.push("--verify"); - - if (mimeSignatureFile) { - args.push(mimeSignatureFile); - args.push("-"); - } - - } - else { - if (maxOutputLength) { - args.push("--max-output"); - args.push(String(maxOutputLength)); - } - - args.push("--decrypt"); - } - - if (!listener) { - listener = {}; - } - if ("done" in listener) { - listener.outerDone = listener.done; - } - - listener.done = function(exitCode) { - EnigmailErrorHandling.appendLogFileToDebug(logFile); - if (this.outerDone) { - this.outerDone(exitCode); - } - }; - - let proc = EnigmailExecution.execStart(EnigmailGpgAgent.agentPath, - args, !verifyOnly, win, - listener, statusFlagsObj); - - if (statusFlagsObj.value & EnigmailConstants.MISSING_PASSPHRASE) { - EnigmailLog.ERROR("decryption.jsm: decryptMessageStart: Error - no passphrase supplied\n"); - - errorMsgObj.value = EnigmailLocale.getString("noPassphrase"); - return null; } - - return proc; - }, - - - decryptMessageEnd: function(stderrStr, exitCode, outputLen, verifyOnly, noOutput, uiFlags, retStatusObj) { - EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: uiFlags=" + uiFlags + ", verifyOnly=" + verifyOnly + ", noOutput=" + noOutput + "\n"); - - stderrStr = stderrStr.replace(/\r\n/g, "\n"); - EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: stderrStr=\n" + stderrStr + "\n"); - var interactive = uiFlags & EnigmailConstants.UI_INTERACTIVE; - var pgpMime = uiFlags & EnigmailConstants.UI_PGP_MIME; - var allowImport = uiFlags & EnigmailConstants.UI_ALLOW_KEY_IMPORT; - var unverifiedEncryptedOK = uiFlags & EnigmailConstants.UI_UNVERIFIED_ENC_OK; - var j; - - retStatusObj.statusFlags = 0; - retStatusObj.errorMsg = ""; - retStatusObj.blockSeparation = ""; - - var errorMsg = EnigmailErrorHandling.parseErrorOutput(stderrStr, retStatusObj); - if (retStatusObj.statusFlags & STATUS_ERROR) { - retStatusObj.errorMsg = errorMsg; - } - else { - retStatusObj.errorMsg = ""; - } - - if (pgpMime) { - retStatusObj.statusFlags |= verifyOnly ? EnigmailConstants.PGP_MIME_SIGNED : EnigmailConstants.PGP_MIME_ENCRYPTED; - } - - var statusMsg = retStatusObj.statusMsg; - exitCode = EnigmailExecution.fixExitCode(exitCode, retStatusObj); - if ((exitCode === 0) && !noOutput && !outputLen && - ((retStatusObj.statusFlags & (STATUS_DECRYPTION_OK | STATUS_GOODSIG)) === 0)) { - exitCode = -1; - } - - if (retStatusObj.statusFlags & EnigmailConstants.DISPLAY_MESSAGE && retStatusObj.extendedStatus.search(/\bdisp:/) >= 0) { - EnigmailDialog.alert(null, statusMsg); - return -1; - } - - var errLines; - if (statusMsg) { - errLines = statusMsg.split(/\r?\n/); - } - else { - // should not really happen ... - errLines = stderrStr.split(/\r?\n/); - } - - // possible STATUS Patterns (see GPG dod DETAILS.txt): - // one of these should be set for a signature: - var newsigPat = /^NEWSIG ?.*$/i; - var trustedsigPat = /^TRUST_(FULLY|ULTIMATE) ?.*$/i; - var goodsigPat = /^GOODSIG (\w{16}) (.*)$/i; - var badsigPat = /^BADSIG (\w{16}) (.*)$/i; - var expsigPat = /^EXPSIG (\w{16}) (.*)$/i; - var expkeysigPat = /^EXPKEYSIG (\w{16}) (.*)$/i; - var revkeysigPat = /^REVKEYSIG (\w{16}) (.*)$/i; - var errsigPat = /^ERRSIG (\w{16}) (.*)$/i; - // additional infos for good signatures: - var validSigPat = /^VALIDSIG (\w+) (.*) (\d+) (.*)/i; - // hint for a certain key id: - var userIdHintPat = /^USERID_HINT (\w{16}) (.*)$/i; - // to find out for which recipients the email was encrypted: - var encToPat = /^ENC_TO (\w{16}) (.*)$/i; - - var matches; - - var signed = false; - var goodOrExpOrRevSignature = false; - var sigKeyId = ""; // key of sender - var sigUserId = ""; // user ID of sender - var sigDetails = ""; - var sigTrusted = false; - var encToDetails = ""; - var encToArray = []; // collect ENC_TO lines here - - for (j = 0; j < errLines.length; j++) { - EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: process: " + errLines[j] + "\n"); - - // ENC_TO entry - // - collect them for later processing to print details - matches = errLines[j].match(encToPat); - if (matches && (matches.length > 2)) { - encToArray.push("0x" + matches[1]); - } - - // USERID_HINT entry - // - NOTE: NO END of loop - // ERROR: wrong to set userId because ecom is NOT the sender: - //matches = errLines[j].match(userIdHintPat); - //if (matches && (matches.length > 2)) { - // sigKeyId = matches[1]; - // sigUserId = matches[2]; - //} - - // check for one of the possible SIG entries: - - matches = errLines[j].match(newsigPat); - if (matches) { - if (signed) { - EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: multiple SIGN entries - ignoring previous signature\n"); - } - signed = true; - goodOrExpOrRevSignature = false; - sigKeyId = ""; - sigUserId = ""; - sigDetails = ""; - sigTrusted = false; - continue; - } - - matches = errLines[j].match(trustedsigPat); - if (matches) { - sigTrusted = true; - continue; - } - - matches = errLines[j].match(validSigPat); - if (matches && (matches.length > 4)) { - if (matches[4].length == 40) { - // in case of several subkeys refer to the main key ID. - // Only works with PGP V4 keys (Fingerprint length ==40) - sigKeyId = matches[4]; - } - if (matches && (matches.length > 2)) { - sigDetails = errLines[j].substr(9); - } - continue; - } - - // GOODSIG entry - matches = errLines[j].match(goodsigPat); - if (matches && (matches.length > 2)) { - if (signed) { - EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: OOPS: multiple SIGN entries\n"); - } - signed = true; - goodOrExpOrRevSignature = true; - sigKeyId = matches[1]; - sigUserId = matches[2]; - } - else { - // BADSIG entry => signature found but bad - matches = errLines[j].match(badsigPat); - if (matches && (matches.length > 2)) { - if (signed) { - EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: OOPS: multiple SIGN entries\n"); - } - signed = true; - goodOrExpOrRevSignature = false; - sigKeyId = matches[1]; - sigUserId = matches[2]; - } - else { - // EXPSIG entry => expired signature found - matches = errLines[j].match(expsigPat); - if (matches && (matches.length > 2)) { - if (signed) { - EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: OOPS: multiple SIGN entries\n"); - } - signed = true; - goodOrExpOrRevSignature = true; - sigKeyId = matches[1]; - sigUserId = matches[2]; - } - else { - // EXPKEYSIG entry => signature found but key expired - matches = errLines[j].match(expkeysigPat); - if (matches && (matches.length > 2)) { - if (signed) { - EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: OOPS: multiple SIGN entries\n"); - } - signed = true; - goodOrExpOrRevSignature = true; - sigKeyId = matches[1]; - sigUserId = matches[2]; - } - else { - // REVKEYSIG entry => signature found but key revoked - matches = errLines[j].match(revkeysigPat); - if (matches && (matches.length > 2)) { - if (signed) { - EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: OOPS: multiple SIGN entries\n"); - } - signed = true; - goodOrExpOrRevSignature = true; - sigKeyId = matches[1]; - sigUserId = matches[2]; - } - else { - // ERRSIG entry => signature found but key not usable or unavailable - matches = errLines[j].match(errsigPat); - if (matches && (matches.length > 2)) { - if (signed) { - EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: OOPS: multiple SIGN entries\n"); - } - signed = true; - goodOrExpOrRevSignature = false; - sigKeyId = matches[1]; - // no user id with ecom istatus entry - } - } - } - } - } - } - - } // end loop of processing errLines - - if (sigTrusted) { - retStatusObj.statusFlags |= EnigmailConstants.TRUSTED_IDENTITY; - } - - if (sigUserId && sigKeyId && EnigmailPrefs.getPref("displaySecondaryUid")) { - let keyObj = EnigmailKeyRing.getKeyById(sigKeyId); - if (keyObj) { - if (keyObj.photoAvailable) { - retStatusObj.statusFlags |= EnigmailConstants.PHOTO_AVAILABLE; - } - sigUserId = EnigmailKeyRing.getValidUids(sigKeyId).join("\n"); - } - } - else if (sigUserId) { - sigUserId = EnigmailData.convertToUnicode(sigUserId, "UTF-8"); - } - - // add list of keys used for encryption if known (and their user IDs) if known - // Parsed status messages are something like (here the German version): - // [GNUPG:] ENC_TO AAAAAAAAAAAAAAAA 1 0 - // [GNUPG:] ENC_TO 5B820D2D4553884F 16 0 - // [GNUPG:] ENC_TO 37904DF2E631552F 1 0 - // [GNUPG:] ENC_TO BBBBBBBBBBBBBBBB 1 0 - // gpg: verschlüsselt mit 3072-Bit RSA Schlüssel, ID BBBBBBBB, erzeugt 2009-11-28 - // "Joe Doo " - // [GNUPG:] NO_SECKEY E71712DF47BBCC40 - // gpg: verschlüsselt mit RSA Schlüssel, ID AAAAAAAA - // [GNUPG:] NO_SECKEY AAAAAAAAAAAAAAAA - if (encToArray.length > 0) { - // for each key also show an associated user ID if known: - for (var encIdx = 0; encIdx < encToArray.length; ++encIdx) { - var localKeyId = encToArray[encIdx]; - // except for ID 00000000, which signals hidden keys - if (localKeyId != "0x0000000000000000") { - let localKey = EnigmailKeyRing.getKeyById(localKeyId); - if (localKey) { - encToArray[encIdx] += " (" + localKey.userId + ")"; - } - } - else { - encToArray[encIdx] = EnigmailLocale.getString("hiddenKey"); - } - } - encToDetails = "\n " + encToArray.join(",\n ") + "\n"; - } - - retStatusObj.userId = sigUserId; - retStatusObj.keyId = sigKeyId; - retStatusObj.sigDetails = sigDetails; - retStatusObj.encToDetails = encToDetails; - - if (signed) { - if (goodOrExpOrRevSignature) { - retStatusObj.errorMsg = EnigmailLocale.getString("prefGood", [sigUserId]); - /* + ", " + EnigmailLocale.getString("keyId") + " 0x" + sigKeyId.substring(8,16); */ - } - else { - if (sigUserId.length > 0) { - retStatusObj.errorMsg = EnigmailLocale.getString("prefBad", [sigUserId]); - } - if (!exitCode) - exitCode = 1; - } - } - - if (retStatusObj.statusFlags & EnigmailConstants.UNVERIFIED_SIGNATURE) { - retStatusObj.keyId = EnigmailKey.extractPubkey(statusMsg); - - if (retStatusObj.statusFlags & EnigmailConstants.DECRYPTION_OKAY) { - exitCode = 0; - } - } - - if (exitCode !== 0) { - // Error processing - EnigmailLog.DEBUG("decryption.jsm: decryptMessageEnd: command execution exit code: " + exitCode + "\n"); - } - - return exitCode; + return fromAddr; }, /** @@ -477,7 +100,7 @@ blockSeparationObj, encToDetailsObj) { const esvc = EnigmailCore.getEnigmailService(); - EnigmailLog.DEBUG("enigmail.js: Enigmail.decryptMessage: " + cipherText.length + " bytes, " + uiFlags + "\n"); + EnigmailLog.DEBUG("decryption.jsm: decryptMessage(" + cipherText.length + " bytes, " + uiFlags + ")\n"); if (!cipherText) return ""; @@ -487,7 +110,7 @@ var unverifiedEncryptedOK = uiFlags & EnigmailConstants.UI_UNVERIFIED_ENC_OK; var oldSignature = signatureObj.value; - EnigmailLog.DEBUG("enigmail.js: Enigmail.decryptMessage: oldSignature=" + oldSignature + "\n"); + EnigmailLog.DEBUG("decryption.jsm: decryptMessage: oldSignature=" + oldSignature + "\n"); signatureObj.value = ""; exitCodeObj.value = -1; @@ -524,7 +147,7 @@ // HACK to better support messages from Outlook: if there are empty lines, drop them if (pgpBlock.search(/MESSAGE-----\r?\n\r?\nVersion/) >= 0) { - EnigmailLog.DEBUG("enigmail.js: Enigmail.decryptMessage: apply Outlook empty line workaround\n"); + EnigmailLog.DEBUG("decryption.jsm: decryptMessage: apply Outlook empty line workaround\n"); pgpBlock = pgpBlock.replace(/\r?\n\r?\n/g, "\n"); } @@ -563,58 +186,60 @@ } } - var startErrorMsgObj = {}; - var noOutput = false; - - var listener = EnigmailExecution.newSimpleListener( - function _stdin(pipe) { - pipe.write(pgpBlock); - pipe.close(); - }); - - var maxOutput = pgpBlock.length * 100; // limit output to 100 times message size - // to avoid DoS attack - var proc = EnigmailDecryption.decryptMessageStart(parent, verifyOnly, noOutput, listener, - statusFlagsObj, startErrorMsgObj, - null, maxOutput); - - if (!proc) { - errorMsgObj.value = startErrorMsgObj.value; + if (!EnigmailCore.getService(parent)) { + EnigmailLog.ERROR("decryption.jsm: decryptMessage: not yet initialized\n"); + errorMsgObj.value = EnigmailLocale.getString("notInit"); statusFlagsObj.value |= EnigmailConstants.DISPLAY_MESSAGE; - return ""; } - // Wait for child to close - proc.wait(); + if (EnigmailKeyRing.isGeneratingKey()) { + errorMsgObj.value = EnigmailLocale.getString("notComplete"); + statusFlagsObj.value |= EnigmailConstants.DISPLAY_MESSAGE; + return ""; + } - var plainText = EnigmailData.getUnicodeData(listener.stdoutData); + // limit output to 100 times message size to avoid DoS attack + var maxOutput = pgpBlock.length * 100; + let keyserver = EnigmailPrefs.getPref("autoKeyRetrieve"); + let options = { + keyserver: keyserver, + keyserverProxy: EnigmailHttpProxy.getHttpProxy(keyserver), + fromAddr: EnigmailDecryption.getFromAddr(parent), + verifyOnly: verifyOnly, + noOutput: false, + maxOutputLength: maxOutput, + uiFlags: uiFlags + }; + const cApi = EnigmailCryptoAPI(); + let result = cApi.sync(cApi.decrypt(pgpBlock, options)); + EnigmailLog.DEBUG("decryption.jsm: decryptMessage: decryption finished\n"); + if (! result) { + return ""; + } - var retStatusObj = {}; - var exitCode = EnigmailDecryption.decryptMessageEnd(EnigmailData.getUnicodeData(listener.stderrData), listener.exitCode, - plainText.length, verifyOnly, noOutput, - uiFlags, retStatusObj); - exitCodeObj.value = exitCode; - statusFlagsObj.value = retStatusObj.statusFlags; - errorMsgObj.value = retStatusObj.errorMsg; + var plainText = EnigmailData.getUnicodeData(result.decryptedData); + exitCodeObj.value = result.exitCode; + statusFlagsObj.value = result.statusFlags; + errorMsgObj.value = result.errorMsg; // do not return anything if gpg signales DECRYPTION_FAILED // (which could be possible in case of MDC errors) if ((uiFlags & EnigmailConstants.UI_IGNORE_MDC_ERROR) && - (retStatusObj.statusFlags & EnigmailConstants.MISSING_MDC)) { - EnigmailLog.DEBUG("enigmail.js: Enigmail.decryptMessage: ignoring MDC error\n"); + (result.statusFlags & EnigmailConstants.MISSING_MDC)) { + EnigmailLog.DEBUG("decryption.jsm: decryptMessage: ignoring MDC error\n"); } - else if (retStatusObj.statusFlags & EnigmailConstants.DECRYPTION_FAILED) { + else if (result.statusFlags & EnigmailConstants.DECRYPTION_FAILED) { plainText = ""; } - userIdObj.value = retStatusObj.userId; - keyIdObj.value = retStatusObj.keyId; - sigDetailsObj.value = retStatusObj.sigDetails; + userIdObj.value = result.userId; + keyIdObj.value = result.keyId; + sigDetailsObj.value = result.sigDetails; if (encToDetailsObj) { - encToDetailsObj.value = retStatusObj.encToDetails; + encToDetailsObj.value = result.encToDetails; } - blockSeparationObj.value = retStatusObj.blockSeparation; + blockSeparationObj.value = result.blockSeparation; if (tail.search(/\S/) >= 0) { statusFlagsObj.value |= EnigmailConstants.PARTIALLY_PGP; @@ -674,7 +299,7 @@ innerKeyBlock = innerKeyBlock.replace(/- -----/g, "-----"); statusFlagsObj.value |= EnigmailConstants.INLINE_KEY; - EnigmailLog.DEBUG("enigmail.js: Enigmail.decryptMessage: innerKeyBlock found\n"); + EnigmailLog.DEBUG("decryption.jsm: decryptMessage: innerKeyBlock found\n"); } } @@ -718,7 +343,7 @@ }, inlineInnerVerification: function(parent, uiFlags, text, statusObject) { - EnigmailLog.DEBUG("enigmail.js: Enigmail.inlineInnerVerification\n"); + EnigmailLog.DEBUG("decryption.jsm: inlineInnerVerification()\n"); if (text && text.indexOf("-----BEGIN PGP SIGNED MESSAGE-----") === 0) { var status = newStatusObject(); @@ -744,7 +369,7 @@ exitCodeObj, statusFlagsObj, errorMsgObj) { const esvc = EnigmailCore.getEnigmailService(); - EnigmailLog.DEBUG("enigmail.js: Enigmail.decryptAttachment: parent=" + parent + ", outFileName=" + outFile.path + "\n"); + EnigmailLog.DEBUG("decryption.jsm: decryptAttachment(parent=" + parent + ", outFileName=" + outFile.path + ")\n"); let attachmentHead = byteData.substr(0, 200); if (attachmentHead.match(/-----BEGIN PGP \w{5,10} KEY BLOCK-----/)) { @@ -792,38 +417,13 @@ //var outFileName = EnigmailFiles.getEscapedFilename(EnigmailFiles.getFilePathReadonly(outFile.QueryInterface(Ci.nsIFile), NS_WRONLY)); - let args = EnigmailGpg.getStandardArgs(true); - args.push("--yes"); - args = args.concat(EnigmailPassword.command()); - args.push("-d"); - - - statusFlagsObj.value = 0; - - let listener = EnigmailExecution.newSimpleListener( - function _stdin(pipe) { - pipe.write(byteData); - pipe.close(); - }); - - - let proc = EnigmailExecution.execStart(EnigmailGpgAgent.agentPath, args, false, parent, - listener, statusFlagsObj); - - if (!proc) { - return false; - } - - // Wait for child STDOUT to close - proc.wait(); - - let statusMsgObj = {}; - let cmdLineObj = {}; - - exitCodeObj.value = EnigmailExecution.execEnd(listener, statusFlagsObj, statusMsgObj, cmdLineObj, errorMsgObj); + const cApi = EnigmailCryptoAPI(); + let result = cApi.sync(cApi.decryptAttachment(byteData)); - if (listener.stdoutData.length > 0) { - return EnigmailFiles.writeFileContents(outFile, listener.stdoutData); + exitCodeObj.value = result.exitCode; + statusFlagsObj.value = result.statusFlags; + if (result.stdoutData.length > 0) { + return EnigmailFiles.writeFileContents(outFile, result.stdoutData); } return false; diff -Nru enigmail-2.0.12+ds1/package/dialog.jsm enigmail-2.1.3+ds1/package/dialog.jsm --- enigmail-2.0.12+ds1/package/dialog.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/dialog.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false, EnigmailLocale: false, EnigmailLog: false, EnigmailWindows: false, EnigmailPrefs: false */ -/*jshint -W097 */ /* * 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 @@ -11,15 +9,11 @@ var EXPORTED_SYMBOLS = ["EnigmailDialog"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/locale.jsm"); -Cu.import("resource://enigmail/log.jsm"); -Cu.import("resource://enigmail/windows.jsm"); -Cu.import("resource://enigmail/prefs.jsm"); -Cu.import("resource://enigmail/constants.jsm"); /* global EnigmailConstants: false */ +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailWindows = ChromeUtils.import("chrome://enigmail/content/modules/windows.jsm").EnigmailWindows; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; const BUTTON_POS_0 = 1; const BUTTON_POS_1 = 1 << 8; @@ -117,7 +111,7 @@ win = EnigmailWindows.getBestParentWin(); } - win.openDialog("chrome://enigmail/content/enigmailMsgBox.xul", "_blank", + win.openDialog("chrome://enigmail/content/ui/enigmailMsgBox.xul", "_blank", "chrome,dialog,modal,centerscreen,resizable,titlebar", { msgtext: mesg, checkboxLabel: checkboxLabel, @@ -168,7 +162,7 @@ win = EnigmailWindows.getBestParentWin(); } - win.openDialog("chrome://enigmail/content/enigmailMsgBox.xul", "", + win.openDialog("chrome://enigmail/content/ui/enigmailMsgBox.xul", "", "chrome,dialog,modal,centerscreen,resizable", argsObj, result); if (argsObj.checkboxLabel) { @@ -435,7 +429,7 @@ win = EnigmailWindows.getBestParentWin(); } - win.openDialog("chrome://enigmail/content/enigmailKeyImportInfo.xul", "", + win.openDialog("chrome://enigmail/content/ui/enigmailKeyImportInfo.xul", "", "chrome,dialog,modal,centerscreen,resizable", { keyList: keyList }, diff -Nru enigmail-2.0.12+ds1/package/dns.jsm enigmail-2.1.3+ds1/package/dns.jsm --- enigmail-2.0.12+ds1/package/dns.jsm 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/dns.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,345 @@ +/* + * 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/. + */ + +/** + * This module provides DNS query functionality via subprocesses. + * Supported record types: MX, SRV + * + * The following tools are currently supported: + * Windows: nslookup + * Unix/Linux: dig, kdig, host, nslookup + */ + +"use strict"; + +var EXPORTED_SYMBOLS = ["EnigmailDns"]; + +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailOS = ChromeUtils.import("chrome://enigmail/content/modules/os.jsm").EnigmailOS; +const subprocess = ChromeUtils.import("chrome://enigmail/content/modules/subprocess.jsm").subprocess; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; + +const RESTYPE_WIN_NLSOOKUP = 1; +const RESTYPE_UNIX_NLSOOKUP = 2; +const RESTYPE_DIG = 3; +const RESTYPE_HOST = 4; +const RESTYPE_NOT_AVAILABLE = 99; + +var gHandler = null, + gResolverExecutable = null; + +var EnigmailDns = { + /** + * Perform a DNS lookup + * + * @param {String} recordType: The resource record type to query. MX and SRV are currently supported. + * @param {String} queryName: The name to search for, e.g. "enigmail.net" + * + * @return {Promise}: array of server(s) handling + * + */ + lookup: async function(recordType, queryName) { + EnigmailLog.DEBUG(`dns.jsm: lookup(${recordType}, ${queryName})\n`); + if (!determineResolver()) return null; + + switch (recordType.toUpperCase()) { + case "MX": + case "SRV": + break; + default: + throw Components.results.NS_ERROR_NOT_IMPLEMENTED; + } + let dnsHandler = new gHandler(gResolverExecutable); + return dnsHandler.execute(recordType, queryName); + } +}; + +/** + * Determine the DNS resolver tool to use (e.g. dig, nslookup) + * + * @return {Boolean}: true: tool found / false: no tool found + */ + +function determineResolver() { + if (!gHandler) { + gHandler = GenericHandler; + if (EnigmailOS.isWin32) { + gResolverExecutable = EnigmailFiles.resolvePathWithEnv("nslookup"); + if (gResolverExecutable) { + EnigmailLog.DEBUG(`dns.jsm: determineResolver: executable = ${gResolverExecutable.path}\n`); + gHandler = NsLookupHandler_Windows; + } + } + else { + determineLinuxResolver(); + } + + if (!gResolverExecutable) EnigmailLog.DEBUG(`dns.jsm: determineResolver: no executable found\n`); + + } + + return gHandler !== GenericHandler; +} + + +function determineLinuxResolver() { + EnigmailLog.DEBUG(`dns.jsm: determineLinuxResolver()\n`); + const services = [{ + exe: "dig", + class: DigHandler + }, { + exe: "kdig", + class: DigHandler + }, { + exe: "host", + class: HostHandler + }, { + exe: "nslookup", + class: NsLookupHandler + }]; + + for (let i of services) { + gResolverExecutable = EnigmailFiles.resolvePathWithEnv(i.exe); + if (gResolverExecutable) { + EnigmailLog.DEBUG(`dns.jsm: determineLinuxResolver: found ${i.class.handlerType}\n`); + + gHandler = i.class; + return; + } + } +} + +/** + * Base class for executing DNS requests + */ +class GenericHandler { + constructor(handlerFile) { + this._handlerFile = handlerFile; + this.recordType = ""; + this.hostName = ""; + } + + getCmdArgs() { + return []; + } + + execute(recordType, hostName) { + return new Promise((resolve, reject) => { + + this.recordType = recordType.toUpperCase(); + this.hostName = hostName; + let args = this.getCmdArgs(); + + if (args.length === 0) { + resolve([]); + return; + } + + let stdoutData = "", + stderrData = ""; + let self = this; + + EnigmailLog.DEBUG(`dns.jsm: execute(): launching ${EnigmailFiles.formatCmdLine(this._handlerFile, args)}\n`); + + subprocess.call({ + command: this._handlerFile, + arguments: args, + environment: EnigmailCore.getEnvList(), + charset: null, + stdout: function(data) { + //EnigmailLog.DEBUG(`dns.jsm: execute.stdout: got data ${data}\n`); + stdoutData += data; + }, + stderr: function(data) { + //EnigmailLog.DEBUG(`dns.jsm: execute.stderr: got data ${data}\n`); + stderrData += data; + }, + done: function(result) { + EnigmailLog.DEBUG(`dns.jsm: execute.done(${result.exitCode})\n`); + try { + if (result.exitCode === 0) { + resolve(self.parseResult(stdoutData)); + } + else { + resolve([]); + } + } + catch (ex) { + reject(ex); + } + }, + mergeStderr: false + }); + }); + } + + parseResult() { + return []; + } +} + +/** + * Handler class for "dig" and "kdig" + */ +class DigHandler extends GenericHandler { + constructor(handlerFile) { + super(handlerFile); + this.handlerType = "dig"; + } + + getCmdArgs() { + return ["-t", this.recordType, "+short", this.hostName]; + } + + parseResult(stdoutData) { + let hosts = []; + let lines = stdoutData.split(/[\r\n]+/); + + if (this.recordType === "MX") { + for (let i = 0; i < lines.length; i++) { + let m = lines[i].match(/^(\d+ )(.*)\./); + + if (m && m.length >= 3) hosts.push(m[2]); + } + } + else if (this.recordType === "SRV") { + for (let i = 0; i < lines.length; i++) { + let m = lines[i].match(/^(\d+) (\d+) (\d+) ([^ ]+)\.$/); + + if (m && m.length >= 5) hosts.push(m[4] + ":" + m[3]); + } + } + + return hosts; + } +} + +/** + * Handler class for "host" + */ + +class HostHandler extends GenericHandler { + constructor(handlerFile) { + super(handlerFile); + this.handlerType = "host"; + } + + getCmdArgs() { + return ["-t", this.recordType, this.hostName]; + } + + parseResult(stdoutData) { + if (stdoutData.search(/3\(NXDOMAIN\)/) >= 0) return []; + + let hosts = []; + let lines = stdoutData.split(/[\r\n]+/); + + if (this.recordType === "MX") { + for (let i = 0; i < lines.length; i++) { + let m = lines[i].match(/^(.* )([^ ]+)\.$/); + + if (m && m.length >= 3) hosts.push(m[2]); + } + } + else if (this.recordType === "SRV") { + for (let i = 0; i < lines.length; i++) { + let m = lines[i].match(/^(.*) (\d+) ([^ ]+)\.$/); + + if (m && m.length >= 4) hosts.push(m[3] + ":" + m[2]); + } + } + + return hosts; + } +} + +/** + * Handler class for "nslookup" (on Linux/Unix) + */ + +class NsLookupHandler extends GenericHandler { + constructor(handlerFile) { + super(handlerFile); + this.handlerType = "nslookup"; + } + + getCmdArgs() { + return ["-type=" + this.recordType, this.hostName]; + } + + parseResult(stdoutData) { + let hosts = []; + let lines = stdoutData.split(/[\r\n]+/); + + if (lines.length > 3 && lines[3].search(/: NXDOMAIN/) > 0) return []; + + if (this.recordType === "MX") { + let reg = new RegExp("^" + this.hostName.toLowerCase() + "(.* )([^ \t]+.*[^\.])\\.?$"); + for (let i = 2; i < lines.length; i++) { + let m = lines[i].match(reg); + + if (m && m.length >= 3) hosts.push(m[2]); + if (lines[i].length < 5) break; + } + } + else if (this.recordType === "SRV") { + for (let i = 2; i < lines.length; i++) { + let m = lines[i].match(/^(.*) (\d+) ([^ ]+)\.$/); + + if (m && m.length >= 3) hosts.push(m[3] + ":" + m[2]); + if (lines[i].length < 5) break; + } + } + + return hosts; + } +} + +/** + * Handler class for "nslookup" on Windows + */ + +class NsLookupHandler_Windows extends NsLookupHandler { + + parseResult(stdoutData) { + let hosts = []; + let lines = stdoutData.split(/[\r\n]+/); + + if (this.recordType === "MX") { + let reg = new RegExp("^" + this.hostName.toLowerCase() + "(.* )([^ \t]+.*[^\.])\\.?$"); + for (let i = 2; i < lines.length; i++) { + let m = lines[i].match(reg); + + if (m && m.length >= 3) hosts.push(m[2]); + if (lines[i].length < 5) break; + } + } + else if (this.recordType === "SRV") { + let svc = null; + for (let i = 2; i < lines.length; i++) { + if (lines[i].search(/SRV service location:$/) > 0) { + svc = null; + continue; + } + + let m = lines[i].match(/^[\t ]+(port|svr hostname)([\t =]+)([^ \t]+)$/); + + if (m && m.length >= 4) { + if (m[1] === "port" && svc === null) { + svc = m[3]; + } + else if (m[1] === "svr hostname" && svc) { + hosts.push(m[3] + ":" + svc); + } + } + if (lines[i].length < 5) break; + } + } + + return hosts; + } +} diff -Nru enigmail-2.0.12+ds1/package/encryption.jsm enigmail-2.1.3+ds1/package/encryption.jsm --- enigmail-2.0.12+ds1/package/encryption.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/encryption.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false, EnigmailCore: false, EnigmailLog: false, EnigmailPrefs: false, EnigmailApp: false, EnigmailLocale: false, EnigmailDialog: false */ -/*jshint -W097 */ /* * 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 @@ -11,26 +9,22 @@ var EXPORTED_SYMBOLS = ["EnigmailEncryption"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/core.jsm"); -Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ -Cu.import("resource://enigmail/log.jsm"); -Cu.import("resource://enigmail/prefs.jsm"); -Cu.import("resource://enigmail/app.jsm"); -Cu.import("resource://enigmail/locale.jsm"); -Cu.import("resource://enigmail/dialog.jsm"); -Cu.import("resource://enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ -Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ -Cu.import("resource://enigmail/errorHandling.jsm"); /*global EnigmailErrorHandling: false */ -Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ -Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ -Cu.import("resource://enigmail/passwords.jsm"); /*global EnigmailPassword: false */ -Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ -Cu.import("resource://enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ -Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailApp = ChromeUtils.import("chrome://enigmail/content/modules/app.jsm").EnigmailApp; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailDialog = ChromeUtils.import("chrome://enigmail/content/modules/dialog.jsm").EnigmailDialog; +const EnigmailGpgAgent = ChromeUtils.import("chrome://enigmail/content/modules/gpgAgent.jsm").EnigmailGpgAgent; +const EnigmailGpg = ChromeUtils.import("chrome://enigmail/content/modules/gpg.jsm").EnigmailGpg; +const EnigmailErrorHandling = ChromeUtils.import("chrome://enigmail/content/modules/errorHandling.jsm").EnigmailErrorHandling; +const EnigmailExecution = ChromeUtils.import("chrome://enigmail/content/modules/execution.jsm").EnigmailExecution; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailPassword = ChromeUtils.import("chrome://enigmail/content/modules/passwords.jsm").EnigmailPassword; +const EnigmailFuncs = ChromeUtils.import("chrome://enigmail/content/modules/funcs.jsm").EnigmailFuncs; +const EnigmailKeyRing = ChromeUtils.import("chrome://enigmail/content/modules/keyRing.jsm").EnigmailKeyRing; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; const gMimeHashAlgorithms = [null, "sha1", "ripemd160", "sha256", "sha384", "sha512", "sha224", "md5"]; diff -Nru enigmail-2.0.12+ds1/package/enigmailOverlays.jsm enigmail-2.1.3+ds1/package/enigmailOverlays.jsm --- enigmail-2.0.12+ds1/package/enigmailOverlays.jsm 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/enigmailOverlays.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,314 @@ +/* + * 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/. + */ + +/** + * Load overlays in a similar way as XUL did for non-bootstrapped addons + * Unlike "real" XUL, overlays are only loaded over window URLs, and no longer + * over any xul file that is loaded somewhere. + * + * + * Prepare the XUL files: + * + * 1. Elements can be referenced by ID, or by CSS selector (document.querySelector()). + * To use the a CSS Selector query, define the attribute "overlay_target" + * e.g. + * + * 3. inline scripts are not supported + * + * 4. if you add buttons to a toolbar using in your XUL, add the + * following attributes to the toolbarpalette: + * targetToolbox="some_id" --> the ID of the *toolbox* where the buttons are added + * targetToolbar="some_id" --> the ID of the *toolbar* where the buttons are added + * + * Prepare the JavaScript: + * 1. Event listeners registering for "load" now need to listen to "load-"+MY_ADDON_ID + */ + +"use strict"; + +var EXPORTED_SYMBOLS = ["EnigmailOverlays"]; + +const APP_STARTUP = 1; +const APP_SHUTDOWN = 2; + +const { + Services +} = ChromeUtils.import("resource://gre/modules/Services.jsm", {}); + +Components.utils.importGlobalProperties(["XMLHttpRequest"]); + +// the following constants need to be customized for each addon +const BASE_PATH = "chrome://enigmail/content/ui/"; +const MY_ADDON_ID = "enigmail"; + +var gMailStartupDone = false; +var gCoreStartup = false; + +const overlays = { + // main mail reading window + "chrome://messenger/content/messenger.xul": [ + "columnOverlay.xul", { + // Overlay for Thunderbird + url: "messengerOverlay-tbird.xul", + application: "!postbox@postbox-inc.com" + }, { + // Overlay for Postbox + url: "messengerOverlay-pbx.xul", + application: "postbox@postbox-inc.com" + }, + "enigmailMessengerOverlay.xul", + "enigmailMsgHdrViewOverlay.xul" + ], + + // single message reader window + "chrome://messenger/content/messageWindow.xul": [{ + // Overlay for Thunderbird + url: "messengerOverlay-tbird.xul", + application: "!postbox@postbox-inc.com" + }, { + // Overlay for Postbox + url: "messengerOverlay-pbx.xul", + application: "postbox@postbox-inc.com" + }, + "enigmailMessengerOverlay.xul", + "enigmailMsgHdrViewOverlay.xul" + ], + + "chrome://messenger/content/messengercompose/messengercompose.xul": [{ + // Overlay for Thunderbird + url: "enigmailMsgComposeOverlay.xul", + application: "!postbox@postbox-inc.com" + }, { + // Overlay for Postbox + url: "enigmailMsgComposeOverlay-pbx.xul", + application: "postbox@postbox-inc.com" + }], + + "chrome://messenger/content/FilterEditor.xul": [{ + // Overlay for TB 67+ + url: "enigmailFilterEditorOverlay.xul", + minGeckoVersion: "67.0a1" + }, { + // Overlay for TB <= 66 + url: "tb60FilterEditorOverlay.xul", + maxGeckoVersion: "66.0" + }], + "chrome://messenger/content/FilterListDialog.xul": ["enigmailFilterListOverlay.xul"], + "chrome://messenger/content/am-identity-edit.xul": [ + "enigmailAmIdEditOverlay.xul", + "enigmailEditIdentity.xul" + ], + "chrome://messenger/content/addressbook/addressbook.xul": ["enigmailAbCardViewOverlay.xul"], + "chrome://enigmail/content/ui/editSingleAccount.xul": ["enigmailEditIdentity.xul"], + + // Overlay for privacy preferences in Thunderbird + "chrome://messenger/content/preferences/preferences.xul": [{ + url: "enigmailPrivacyOverlay.xul", + application: "!postbox@postbox-inc.com" + }], + + // Overlay for Customize Toolbar (Windows, Linux) + "chrome://messenger/content/customizeToolbar.xul": ["enigmailCustToolOverlay.xul"], // TB 60+ + "chrome://global/content/customizeToolbar.xul": ["enigmailCustToolOverlay.xul"], // TB <= 52.x + + // Overlay for Account Manager + "chrome://messenger/content/AccountManager.xul": ["accountManagerOverlay.xul"] +}; + +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const Overlays = ChromeUtils.import("chrome://enigmail/content/modules/overlays.jsm").Overlays; + +function DEBUG_LOG(str) { + EnigmailLog.DEBUG(str); +} + +function ERROR_LOG(str) { + EnigmailLog.ERROR(str); +} + +var WindowListener = { + setupUI: function(window, overlayDefs) { + DEBUG_LOG("enigmailOverlays.jsm: setupUI(" + window.document.location.href + ")\n"); + let ovl = []; + + for (let index = 0; index < overlayDefs.length; index++) { + let overlayDef = overlayDefs[index]; + let url = overlayDef; + + if (typeof(overlayDef) !== "string") { + url = overlayDef.url; + if ("application" in overlayDef) { + if (overlayDef.application.substr(0, 1) === "!") { + if (overlayDef.application.indexOf(getAppId()) > 0) { + continue; + } + } + else if (overlayDef.application.indexOf(getAppId()) < 0) { + continue; + } + } + + if ("minGeckoVersion" in overlayDef) { + if (!isPlatformMinVersion(overlayDef.minGeckoVersion)) { + continue; + } + } + + if ("maxGeckoVersion" in overlayDef) { + if (!isPlatformMaxVersion(overlayDef.maxGeckoVersion)) { + continue; + } + } + } + + ovl.push(BASE_PATH + url); + } + + Overlays.loadOverlays(MY_ADDON_ID, window, ovl); + }, + + tearDownUI: function(window) { + DEBUG_LOG("enigmailOverlays.jsm: tearDownUI(" + window.document.location.href + ")\n"); + Overlays.unloadOverlays(MY_ADDON_ID, window); + }, + + // nsIWindowMediatorListener functions + onOpenWindow: function(xulWindow) { + // A new window has opened + let domWindow = xulWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindow); + + // Wait for it to finish loading + domWindow.addEventListener("load", function listener() { + domWindow.removeEventListener("load", listener, false); + + for (let w in overlays) { + // If this is a relevant window then setup its UI + if (domWindow.document.location.href.startsWith(w)) + WindowListener.setupUI(domWindow, overlays[w]); + } + }, false); + }, + + onCloseWindow: function(xulWindow) {}, + + onWindowTitleChange: function(xulWindow, newTitle) {} +}; + +/** + * Determine if an overlay exists for a window, and if so + * load it + */ + +function loadUiForWindow(domWindow) { + for (let w in overlays) { + // If this is a relevant window then setup its UI + if (domWindow.document.location.href.startsWith(w)) + WindowListener.setupUI(domWindow, overlays[w]); + } +} + + +var EnigmailOverlays = { + /** + * Called by bootstrap.js upon startup of the addon + * (e.g. enabling, instalation, update, application startup) + * + */ + startup: function() { + DEBUG_LOG("enigmailOverlays.jsm: startup()\n"); + + let wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator); + + // Wait for any new windows to open + wm.addListener(WindowListener); + + let windows = wm.getEnumerator(null); + while (windows.hasMoreElements()) { + try { + let domWindow = windows.getNext(); + try { + domWindow = domWindow.QueryInterface(Ci.nsIDOMWindow); + } + catch (x) {} + + DEBUG_LOG("enigmailOverlays.jsm: startup: found window: " + domWindow.document.location.href + "\n"); + + if (domWindow.document.location.href === "about:blank" || + domWindow.document.readyState !== "complete") { + // a window is available, but it's not yet fully loaded + // ==> add an event listener to fire when the window is completely loaded + + domWindow.addEventListener("load", function loadUi() { + domWindow.removeEventListener("load", loadUi, false); + loadUiForWindow(domWindow); + }, false); + } + else { + loadUiForWindow(domWindow); + } + } + catch (ex) { + DEBUG_LOG("enigmailOverlays.jsm: startup: error " + ex.message + "\n"); + } + } + }, + + + /** + * Called by bootstrap.js upon shutdown of the addon + * (e.g. disabling, uninstalling, update, application shutdown) + * + * @param reason: Number - bootstrap "reason" constant + */ + shutdown: function(reason) { + DEBUG_LOG("overlay.jsm: initiating shutdown\n"); + // When the application is shutting down we normally don't have to clean + // up any UI changes made + if (reason == APP_SHUTDOWN) + return; + + let wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator); + + // Stop listening for any new windows to open + wm.removeListener(WindowListener); + + // Get the list of windows already open + let windows = wm.getEnumerator(null); + while (windows.hasMoreElements()) { + let domWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow); + + WindowListener.tearDownUI(domWindow); + + // If this is a window opened by the addon, then close it + if (domWindow.document.location.href.startsWith(BASE_PATH)) + domWindow.close(); + } + + DEBUG_LOG("overlay.jsm: shutdown complete\n"); + } + +}; + +function getAppId() { + return Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo).ID; +} + +function isPlatformMinVersion(requestedVersion) { + let vc = Cc["@mozilla.org/xpcom/version-comparator;1"].getService(Ci.nsIVersionComparator); + let appVer = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo).platformVersion; + + return vc.compare(appVer, requestedVersion) >= 0; +} + +function isPlatformMaxVersion(requestedVersion) { + let vc = Cc["@mozilla.org/xpcom/version-comparator;1"].getService(Ci.nsIVersionComparator); + let appVer = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo).platformVersion; + + return vc.compare(appVer, requestedVersion) <= 0; +} diff -Nru enigmail-2.0.12+ds1/package/errorHandling.jsm enigmail-2.1.3+ds1/package/errorHandling.jsm --- enigmail-2.0.12+ds1/package/errorHandling.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/errorHandling.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false, EnigmailLog: false, EnigmailLocale: false, EnigmailData: false, EnigmailCore: false */ -/*jshint -W097 */ /* * 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 @@ -10,22 +8,20 @@ var EXPORTED_SYMBOLS = ["EnigmailErrorHandling"]; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/log.jsm"); -Cu.import("resource://enigmail/locale.jsm"); -Cu.import("resource://enigmail/data.jsm"); -Cu.import("resource://enigmail/core.jsm"); -Cu.import("resource://enigmail/system.jsm"); /* global EnigmailSystem: false */ -Cu.import("resource://enigmail/constants.jsm"); /* global EnigmailConstants: false */ -Cu.import("resource://enigmail/lazy.jsm"); /* global EnigmailLazy: false */ +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailSystem = ChromeUtils.import("chrome://enigmail/content/modules/system.jsm").EnigmailSystem; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; const getEnigmailKeyRing = EnigmailLazy.loader("enigmail/keyRing.jsm", "EnigmailKeyRing"); const getEnigmailGpg = EnigmailLazy.loader("enigmail/gpg.jsm", "EnigmailGpg"); const getEnigmailFiles = EnigmailLazy.loader("enigmail/files.jsm", "EnigmailFiles"); const getEnigmailRNG = EnigmailLazy.loader("enigmail/rng.jsm", "EnigmailRNG"); + const gStatusFlags = { GOODSIG: EnigmailConstants.GOOD_SIGNATURE, BADSIG: EnigmailConstants.BAD_SIGNATURE, @@ -92,6 +88,14 @@ let errorCode = errNum & 0xFFFFFF; switch (errorCode) { + case 32870: // error no tty + if (sourceSystem === GPG_SOURCE_SYSTEM.GPG_ERR_SOURCE_PINENTRY) { + c.statusFlags |= EnigmailConstants.DISPLAY_MESSAGE; + c.retStatusObj.extendedStatus += "disp:get_passphrase "; + c.retStatusObj.statusMsg = EnigmailLocale.getString("errorHandling.pinentryCursesError") + "\n\n" + EnigmailLocale.getString("errorHandling.readFaq"); + c.isError = true; + } + break; case 11: // bad Passphrase case 87: // bad PIN badPassphrase(c); @@ -114,14 +118,6 @@ c.retStatusObj.statusMsg = EnigmailLocale.getString("errorHandling.gpgAgentError") + "\n\n" + EnigmailLocale.getString("errorHandling.readFaq"); c.isError = true; break; - case 32870: // error: no tty - if (sourceSystem === GPG_SOURCE_SYSTEM.GPG_ERR_SOURCE_PINENTRY) { - c.statusFlags |= EnigmailConstants.DISPLAY_MESSAGE; - c.retStatusObj.extendedStatus += "disp:get_passphrase "; - c.retStatusObj.statusMsg = EnigmailLocale.getString("errorHandling.pinentryError") + "\n\n" + EnigmailLocale.getString("errorHandling.readFaq"); - c.isError = true; - } - break; case 85: // no pinentry case 86: // pinentry error c.statusFlags |= EnigmailConstants.DISPLAY_MESSAGE; @@ -217,8 +213,7 @@ return false; } return true; - } - else { + } else { return false; } } @@ -284,8 +279,7 @@ var lineSplit = c.statusLine.split(/ +/); if (lineSplit.length > 1) { EnigmailLog.DEBUG("errorHandling.jsm: importOk: key imported: " + lineSplit[2] + "\n"); - } - else { + } else { EnigmailLog.DEBUG("errorHandling.jsm: importOk: key without FPR imported\n"); } } @@ -317,11 +311,12 @@ c.statusFlags |= EnigmailConstants.DECRYPTION_FAILED; // be sure to fail c.flag = EnigmailConstants.MISSING_MDC; EnigmailLog.DEBUG("errorHandling.jsm: missing MDC!\n"); - c.retStatusObj.statusMsg += EnigmailLocale.getString("mdcError") + "\n"; + c.retStatusObj.statusMsg += EnigmailLocale.getString("missingMdcError") + "\n"; } } } + function decryptionFailed(c) { c.inDecryptionFailed = true; } @@ -330,8 +325,7 @@ var lineSplit = c.statusLine.split(/ +/); if (lineSplit[1] == "3") { c.detectedCard = lineSplit[2]; - } - else { + } else { c.errCode = Number(lineSplit[1]); if (c.errCode == 1) c.requestedCard = lineSplit[2]; } @@ -373,6 +367,7 @@ retStatusObj.errorMsg = ""; retStatusObj.extendedStatus = ""; retStatusObj.blockSeparation = ""; + retStatusObj.encryptedFileName = null; return { errOutput: errOutput, @@ -418,17 +413,16 @@ let isError = (matches[1] == "ERROR"); (isError ? handleError : handleFailure)(c, matches[1]); } - } - else { + } else { // non-status line (details of previous status command) if (!getEnigmailGpg().getGpgFeature("decryption-info")) { if (errLine == "gpg: WARNING: message was not integrity protected") { - // workaround for Gpg < 2.0.8 that don't fail on missing MDC for old - // algorithms like CAST5 + // workaround for Gpg < 2.0.19 that don't print DECRYPTION_INFO c.statusFlags |= EnigmailConstants.DECRYPTION_FAILED; c.inDecryptionFailed = true; } } + c.errArray.push(errLine); // save details of DECRYPTION_FAILED message ass error message if (c.inDecryptionFailed) { @@ -445,11 +439,9 @@ if (c.statusArray[j].search(c.cryptoStartPat) === 0) { c.withinCryptoMsg = true; hasEncryptedPart = true; - } - else if (c.withinCryptoMsg && c.statusArray[j].search(c.cryptoEndPat) === 0) { + } else if (c.withinCryptoMsg && c.statusArray[j].search(c.cryptoEndPat) === 0) { c.withinCryptoMsg = false; - } - else if (c.statusArray[j].search(c.plaintextPat) === 0) { + } else if (c.statusArray[j].search(c.plaintextPat) === 0) { if (!c.withinCryptoMsg) hasUnencryptedText = true; ++c.plaintextCount; @@ -458,8 +450,7 @@ if (matches.length >= 3) { c.retStatusObj.blockSeparation += (c.withinCryptoMsg ? "1" : "0") + ":" + matches[2] + " "; } - } - else { + } else { // strange: we got PLAINTEXT XX, but not PLAINTEXT_LENGTH XX c.retStatusObj.blockSeparation += (c.withinCryptoMsg ? "1" : "0") + ":0 "; } @@ -476,8 +467,7 @@ case 1: if (detectedCard) { errorMsg = EnigmailLocale.getString("sc.wrongCardAvailable", [c.detectedCard, c.requestedCard]); - } - else { + } else { errorMsg = EnigmailLocale.getString("sc.insertCard", [c.requestedCard]); } break; @@ -508,9 +498,6 @@ if (c.isError) break; } - if ((c.statusFlags & EnigmailConstants.DECRYPTION_OKAY) && (c.statusFlags & EnigmailConstants.DECRYPTION_FAILED)) { - c.statusFlags &= ~EnigmailConstants.DECRYPTION_OKAY; - } detectForgedInsets(c); c.retStatusObj.blockSeparation = c.retStatusObj.blockSeparation.replace(/ $/, ""); @@ -520,8 +507,7 @@ c.errorMsg = c.errArray.map(function f(str, idx) { return EnigmailSystem.convertNativeToUnicode(str); }, EnigmailSystem).join("\n"); - } - else { + } else { c.errorMsg = EnigmailSystem.convertNativeToUnicode(c.errorMsg); } @@ -530,6 +516,19 @@ c.statusFlags |= EnigmailConstants.DISPLAY_MESSAGE; } + let inDecryption = 0; + let m; + for (let i in c.statusArray) { + if (c.statusArray[i].search(/^BEGIN_DECRYPTION( .*)?$/) === 0) { + inDecryption = 1; + } else if (c.statusArray[i].search(/^END_DECRYPTION( .*)?$/) === 0) { + inDecryption = 0; + } else if (inDecryption >0) { + m = c.statusArray[i].match(/^(PLAINTEXT [0-9]+ [0-9]+ )(.*)$/); + if (m && m.length >= 3) c.retStatusObj.encryptedFileName = m[2]; + } + } + EnigmailLog.DEBUG("errorHandling.jsm: parseErrorOutputWith: statusFlags = " + EnigmailData.bytesToHex(EnigmailData.pack(c.statusFlags, 4)) + "\n"); EnigmailLog.DEBUG("errorHandling.jsm: parseErrorOutputWith: return with c.errorMsg = " + c.errorMsg + "\n"); return c.errorMsg; @@ -558,18 +557,15 @@ let key = getEnigmailKeyRing().getKeyById(keySpec); if (!key) { reasonMsg = EnigmailLocale.getString("keyError.keyIdNotFound", keySpec); - } - else { + } else { let r = key.getSigningValidity(); if (!r.keyValid) reasonMsg = r.reason; } - } - else { + } else { let keys = getEnigmailKeyRing().getKeysByUserId(keySpec); if (!keys || keys.length === 0) { reasonMsg = EnigmailLocale.getString("keyError.keySpecNotFound", keySpec); - } - else { + } else { for (let i in keys) { let r = keys[i].getSigningValidity(); if (!r.keyValid) reasonMsg += r.reason + "\n"; @@ -597,18 +593,15 @@ let key = getEnigmailKeyRing().getKeyById(keySpec); if (!key) { reasonMsg = EnigmailLocale.getString("keyError.keyIdNotFound", keySpec); - } - else { + } else { let r = key.getEncryptionValidity(); if (!r.keyValid) reasonMsg = r.reason; } - } - else { + } else { let keys = getEnigmailKeyRing().getKeysByUserId(keySpec); if (!keys || keys.length === 0) { reasonMsg = EnigmailLocale.getString("keyError.keySpecNotFound", keySpec); - } - else { + } else { for (let i in keys) { let r = keys[i].getEncryptionValidity(); if (!r.keyValid) reasonMsg += r.reason + "\n"; @@ -643,8 +636,7 @@ EnigmailLog.DEBUG(`errorHandling.jsm: Process terminated. Human-readable output from gpg:\n-----\n${logData}-----\n`); try { logFile.remove(false); - } - catch (ex) {} + } catch (ex) {} } } -}; +}; \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/events.jsm enigmail-2.1.3+ds1/package/events.jsm --- enigmail-2.0.12+ds1/package/events.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/events.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -11,12 +9,8 @@ var EXPORTED_SYMBOLS = ["EnigmailEvents"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/timer.jsm"); /*global EnigmailTimer: false */ +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailTimer = ChromeUtils.import("chrome://enigmail/content/modules/timer.jsm").EnigmailTimer; /**** DEPRECATED - use EnigmailTimer instead *****/ diff -Nru enigmail-2.0.12+ds1/package/execution.jsm enigmail-2.1.3+ds1/package/execution.jsm --- enigmail-2.0.12+ds1/package/execution.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/execution.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false, EnigmailData: false, EnigmailFiles: false, EnigmailLog: false, subprocess: false, EnigmailErrorHandling: false, EnigmailCore: false */ -/*jshint -W097 */ /* * 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 @@ -11,18 +9,14 @@ const EXPORTED_SYMBOLS = ["EnigmailExecution"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/data.jsm"); -Cu.import("resource://enigmail/files.jsm"); -Cu.import("resource://enigmail/log.jsm"); -Cu.import("resource://enigmail/subprocess.jsm"); -Cu.import("resource://enigmail/errorHandling.jsm"); -Cu.import("resource://enigmail/core.jsm"); -Cu.import("resource://enigmail/lazy.jsm"); /* global EnigmailLazy: false */ -Cu.import("resource://enigmail/constants.jsm"); /* global EnigmailConstants: false */ +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const subprocess = ChromeUtils.import("chrome://enigmail/content/modules/subprocess.jsm").subprocess; +const EnigmailErrorHandling = ChromeUtils.import("chrome://enigmail/content/modules/errorHandling.jsm").EnigmailErrorHandling; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; const loadOS = EnigmailLazy.loader("enigmail/os.jsm", "EnigmailOS"); @@ -43,17 +37,16 @@ /** * start a subprocess (usually gpg) that gets and/or receives data via stdin/stdout/stderr. * - * @command: either: String - full path to executable - * or: nsIFile object referencing executable - * @args: Array of Strings: command line parameters for executable - * @needPassphrase: Boolean - is a passphrase required for the action? - * if true, the password may be promted using a dialog - * (unless alreday cached or gpg-agent is used) - * @domWindow: nsIWindow - window on top of which password dialog is shown - * @listener: Object - Listener to interact with subprocess; see spec. above - * @statusflagsObj: Object - .value will hold status Flags + * @param {String/nsIFile} command: either full path to executable + * or: object referencing executable + * @param {Array of Strings} args: command line parameters for executable + * @param {Boolean} needPassphrase: is a passphrase required for the action? + * (this is currently a no-op) + * @param {nsIWindow} domWindow: window on top of which password dialog is shown + * @param {Object} listener: Listener to interact with subprocess; see spec. above + * @param {Object} statusflagsObj: .value will hold status Flags * - * @return: handle to subprocess + * @return {Object}: handle to subprocess */ execStart: function(command, args, needPassphrase, domWindow, listener, statusFlagsObj) { EnigmailLog.WRITE("execution.jsm: execStart: " + @@ -123,12 +116,13 @@ const errOutput = listener.stderrData; EnigmailLog.DEBUG("execution.jsm: execEnd: exitCode = " + exitCode + "\n"); - EnigmailLog.DEBUG("execution.jsm: execEnd: errOutput = " + errOutput + "\n"); + EnigmailLog.DEBUG("execution.jsm: execEnd: errOutput = " + errOutput.substr(0, 500) + "\n"); const retObj = {}; errorMsgObj.value = EnigmailErrorHandling.parseErrorOutput(errOutput, retObj); statusFlagsObj.value = retObj.statusFlags; statusMsgObj.value = retObj.statusMsg; + statusFlagsObj.encryptedFileName = retObj.encryptedFileName; if (!blockSeparationObj) blockSeparationObj = {}; blockSeparationObj.value = retObj.blockSeparation; @@ -196,7 +190,7 @@ } EnigmailLog.DEBUG("execution.jsm: EnigmailExecution.simpleExecCmd: exitCode = " + exitCodeObj.value + "\n"); - EnigmailLog.DEBUG("execution.jsm: EnigmailExecution.simpleExecCmd: errOutput = " + errOutput + "\n"); + EnigmailLog.DEBUG("execution.jsm: EnigmailExecution.simpleExecCmd: errOutput = " + errOutput.substr(0, 500) + "\n"); return outputData; }, @@ -259,7 +253,7 @@ if (proc.errorData) errOutput = proc.errorData; EnigmailLog.DEBUG("execution.jsm: EnigmailExecution.execCmd: exitCode = " + exitCodeObj.value + "\n"); - EnigmailLog.DEBUG("execution.jsm: EnigmailExecution.execCmd: errOutput = " + errOutput + "\n"); + EnigmailLog.DEBUG("execution.jsm: EnigmailExecution.execCmd: errOutput = " + errOutput.substr(0, 500) + "\n"); if (!retStatusObj) { @@ -284,6 +278,123 @@ }, /** + * Execute a command and asynchronously, and return a Promise + * Accepts input and returns error message and statusFlags. + * + * @param {String/nsIFile} command: either full path to executable + * or: object referencing executable + * @param {Array of Strings} args: command line parameters for executable + * @param {String} input: data to pass to subprocess via stdin + * @param {Object} subprocessHandle: handle to subprocess. The subprocess may be + * killed via subprocessHandle.value.killProcess(); + * + * @return {Promise}: Object with: + * - {Number} exitCode + * - {String} stdoutData - unmodified data from stdout + * - {String} stderrData - unmodified data from stderr + * - {String} errorMsg - error message from parseErrorOutput() + * - {Number} statusFlags + * - {String} statusMsg - pre-processed status messages (without [GNUPG:]) + * - blockSeparation + * - isKilled: 0 + */ + + execAsync: function(command, args, input, subprocessHandle = null) { + EnigmailLog.WRITE("execution.jsm: execAsync: command = '" + command.path + "'\n"); + return new Promise((resolve, reject) => { + + if ((typeof input) != "string") input = ""; + + let outputData = ""; + let errOutput = ""; + let returnObj = { + exitCode: -1, + stdoutData: "", + stderrData: "", + errorMsg: "", + statusFlags: 0, + statusMsg: "", + blockSeparation: "", + isKilled: 0 + }; + + EnigmailLog.CONSOLE("enigmail> " + EnigmailFiles.formatCmdLine(command, args) + "\n"); + + const procBuilder = new EnigmailExecution.processBuilder(); + procBuilder.setCommand(command); + procBuilder.setArguments(args); + procBuilder.setEnvironment(EnigmailCore.getEnvList()); + procBuilder.setStdin( + function(pipe) { + if (input.length > 0) { + pipe.write(input); + } + pipe.close(); + } + ); + procBuilder.setStdout( + function(data) { + outputData += data; + } + ); + procBuilder.setStderr( + function(data) { + errOutput += data; + } + ); + + procBuilder.setDone( + function(result) { + let exitCode = result.exitCode; + EnigmailLog.DEBUG(" enigmail> DONE\n"); + EnigmailLog.DEBUG("execution.jsm: execAsync: exitCode = " + exitCode + "\n"); + EnigmailLog.DEBUG("execution.jsm: execAsync: errOutput = " + errOutput.substr(0, 500) + "\n"); + + let retStatusObj = {}; + let errorMsg = EnigmailErrorHandling.parseErrorOutput(errOutput, retStatusObj); + + let statusFlagsObj = { + value: retStatusObj.statusFlags + }; + + exitCode = EnigmailExecution.fixExitCode(exitCode, statusFlagsObj); + + if (retStatusObj.blockSeparation.indexOf(" ") > 0) { + exitCode = 2; + } + + EnigmailLog.CONSOLE(errorMsg + "\n"); + returnObj.exitCode = exitCode; + returnObj.stdoutData = outputData; + returnObj.stderrData = errOutput; + returnObj.errorMsg = errorMsg; + returnObj.statusFlags = statusFlagsObj.value; + returnObj.statusMsg = retStatusObj.statusMsg; + returnObj.blockSeparation = retStatusObj.blockSeparation; + + resolve(returnObj); + } + ); + const proc = procBuilder.build(); + try { + let p = subprocess.call(proc); + if (subprocessHandle) { + p.killProcess = function(hardKill) { + returnObj.isKilled = 1; + this.kill(hardKill); + }; + subprocessHandle.value = p; + } + } + catch (ex) { + EnigmailLog.ERROR("execution.jsm: execAsync: subprocess.call failed with '" + ex.toString() + "'\n"); + EnigmailLog.DEBUG(" enigmail> DONE with FAILURE\n"); + reject(returnObj); + } + }); + }, + + /** * Fix the exit code of GnuPG (which may be wrong in some circumstances) * * @exitCode: Number - the exitCode obtained from GnuPG diff -Nru enigmail-2.0.12+ds1/package/files.jsm enigmail-2.1.3+ds1/package/files.jsm --- enigmail-2.0.12+ds1/package/files.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/files.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false, EnigmailLog: false */ -/*jshint -W097 */ /* * 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 @@ -11,19 +9,15 @@ const EXPORTED_SYMBOLS = ["EnigmailFiles"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/data.jsm"); /* global EnigmailData: false */ -Cu.import("resource://enigmail/os.jsm"); /* global EnigmailOS: false */ -Cu.import("resource://enigmail/core.jsm"); /* global EnigmailCore: false */ -Cu.import("resource://enigmail/lazy.jsm"); /* global EnigmailLazy: false */ -Cu.importGlobalProperties(["TextDecoder"]); +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailOS = ChromeUtils.import("chrome://enigmail/content/modules/os.jsm").EnigmailOS; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; +Components.utils.importGlobalProperties(["TextDecoder"]); const { OS -} = Cu.import("resource://gre/modules/osfile.jsm", {}); +} = ChromeUtils.import("resource://gre/modules/osfile.jsm", {}); const lazyStream = EnigmailLazy.loader("enigmail/streams.jsm", "EnigmailStreams"); const lazyLog = EnigmailLazy.loader("enigmail/log.jsm", "EnigmailLog"); @@ -38,7 +32,7 @@ const NS_WRONLY = 0x02; const NS_CREATE_FILE = 0x08; const NS_TRUNCATE = 0x20; -const DEFAULT_FILE_PERMS = 0x180; // equals 0600 +const DEFAULT_FILE_PERMS = 0o600; function potentialWindowsExecutable(file) { if (EnigmailOS.isDosLike) { @@ -420,7 +414,7 @@ var ioServ = Cc[NS_IOSERVICE_CONTRACTID].getService(Ci.nsIIOService); var msgUri = ioServ.newURI(srcUrl, null, null); - var channel = lazyStream().createChannelFromURI(msgUri); + var channel = lazyStream().createChannel(msgUri); var istream = channel.open(); var fstream = Cc["@mozilla.org/network/safe-file-output-stream;1"].createInstance(Ci.nsIFileOutputStream); @@ -513,6 +507,7 @@ t.initWithPath(t.path + "/" + i); } else { + i = i.replace(/\//g, "\\"); t.initWithPath(t.path + "\\" + i); } diff -Nru enigmail-2.0.12+ds1/package/filters.jsm enigmail-2.1.3+ds1/package/filters.jsm --- enigmail-2.0.12+ds1/package/filters.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/filters.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,34 +1,27 @@ -/*global Components: false, EnigmailPersistentCrypto: false, EnigmailCore: false, EnigmailLog: false, EnigmailLocale: false, EnigmailLazy: false */ -/*jshint -W097 */ /* * 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"; var EXPORTED_SYMBOLS = ["EnigmailFilters"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/lazy.jsm"); -Cu.import("resource://enigmail/locale.jsm"); -Cu.import("resource://enigmail/core.jsm"); -Cu.import("resource://enigmail/persistentCrypto.jsm"); -Cu.import("resource://enigmail/log.jsm"); -Cu.import("resource://enigmail/funcs.jsm"); /* global EnigmailFuncs: false */ -Cu.import("resource://enigmail/keyRing.jsm"); /* global EnigmailKeyRing: false */ -Cu.import("resource://enigmail/streams.jsm"); /* global EnigmailStreams: false */ -Cu.import("resource://enigmail/constants.jsm"); /* global EnigmailConstants: false */ -Cu.import("resource://enigmail/data.jsm"); /* global EnigmailData: false */ -Cu.import("resource:///modules/jsmime.jsm"); /*global jsmime: false*/ -Cu.import("resource://gre/modules/NetUtil.jsm"); /*global NetUtil: false*/ -Cu.import("resource://enigmail/mime.jsm"); /* global EnigmailMime: false */ - +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailPersistentCrypto = ChromeUtils.import("chrome://enigmail/content/modules/persistentCrypto.jsm").EnigmailPersistentCrypto; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailFuncs = ChromeUtils.import("chrome://enigmail/content/modules/funcs.jsm").EnigmailFuncs; +const EnigmailKeyRing = ChromeUtils.import("chrome://enigmail/content/modules/keyRing.jsm").EnigmailKeyRing; +const EnigmailStreams = ChromeUtils.import("chrome://enigmail/content/modules/streams.jsm").EnigmailStreams; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const jsmime = ChromeUtils.import("resource:///modules/jsmime.jsm").jsmime; +const NetUtil = ChromeUtils.import("resource://gre/modules/NetUtil.jsm").NetUtil; +const EnigmailMime = ChromeUtils.import("chrome://enigmail/content/modules/mime.jsm").EnigmailMime; +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; const getDialog = EnigmailLazy.loader("enigmail/dialog.jsm", "EnigmailDialog"); @@ -88,7 +81,8 @@ isValidForType: function(type, scope) { EnigmailLog.DEBUG("filters.jsm: filterActionCopyDecrypt.isValidForType(" + type + ")\n"); - return true; + let r = true; + return r; }, validateActionValue: function(value, folder, type) { @@ -481,13 +475,14 @@ EnigmailLog.DEBUG("filters.jsm: getRequireMessageProcessing: author: " + aMsgHdr.author + "\n"); - let messenger = Cc["@mozilla.org/messenger;1"].getService(Ci.nsIMessenger); - let msgSvc = messenger.messageServiceFromURI(aMsgHdr.folder.getUriForMsg(aMsgHdr)); - let u = {}; - msgSvc.GetUrlForUri(aMsgHdr.folder.getUriForMsg(aMsgHdr), u, null); + let u = EnigmailCompat.getUrlFromUriSpec(aMsgHdr.folder.getUriForMsg(aMsgHdr)); - let op = (u.value.spec.indexOf("?") > 0 ? "&" : "?"); - let url = u.value.spec + op + "header=enigmailFilter"; + if (! u) { + return null; + } + + let op = (u.spec.indexOf("?") > 0 ? "&" : "?"); + let url = u.spec + op + "header=enigmailFilter"; return { url: url, @@ -521,7 +516,9 @@ onStartup: function() { let filterService = Cc["@mozilla.org/messenger/services/filters;1"].getService(Ci.nsIMsgFilterService); filterService.addCustomTerm(filterTermPGPEncrypted); - initNewMailListener(); + if (!EnigmailCompat.isPostbox()) { + initNewMailListener(); + } }, onShutdown: function() { diff -Nru enigmail-2.0.12+ds1/package/filtersWrapper.jsm enigmail-2.1.3+ds1/package/filtersWrapper.jsm --- enigmail-2.0.12+ds1/package/filtersWrapper.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/filtersWrapper.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 @@ -10,19 +9,19 @@ var EXPORTED_SYMBOLS = ["EnigmailFiltersWrapper"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; + + + var gNewMailListenerInitiated = false; var gEnigmailFilters = null; let { EnigmailConstants -} = Cu.import("resource://enigmail/constants.jsm"); +} = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm"); let { EnigmailLocale -} = Cu.import("resource://enigmail/locale.jsm"); +} = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm"); /** * filter action for creating a decrypted version of the mail and @@ -79,7 +78,7 @@ }, isValidForType: function(type, scope) { - return gEnigmailFilters ? gEnigmailFilters.copyDecrypt.isValidForType() : false; + return gEnigmailFilters ? gEnigmailFilters.copyDecrypt.isValidForType(type, scope) : false; }, validateActionValue: function(value, folder, type) { @@ -153,7 +152,7 @@ onStartup: function() { let { EnigmailFilters - } = Cu.import("resource://enigmail/filters.jsm"); + } = ChromeUtils.import("chrome://enigmail/content/modules/filters.jsm"); gEnigmailFilters = EnigmailFilters; addFilterIfNotExists(filterActionMoveDecrypt); diff -Nru enigmail-2.0.12+ds1/package/fixExchangeMsg.jsm enigmail-2.1.3+ds1/package/fixExchangeMsg.jsm --- enigmail-2.0.12+ds1/package/fixExchangeMsg.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/fixExchangeMsg.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -11,17 +9,12 @@ var EXPORTED_SYMBOLS = ["EnigmailFixExchangeMsg"]; -const Cu = Components.utils; - -Cu.import("resource:///modules/MailUtils.js"); /*global MailUtils: false */ -Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ -Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/streams.jsm"); /*global EnigmailStreams: false */ -Cu.import("resource://enigmail/mime.jsm"); /* global EnigmailMime: false */ - -const Cc = Components.classes; -const Ci = Components.interfaces; +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailFuncs = ChromeUtils.import("chrome://enigmail/content/modules/funcs.jsm").EnigmailFuncs; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailStreams = ChromeUtils.import("chrome://enigmail/content/modules/streams.jsm").EnigmailStreams; +const EnigmailMime = ChromeUtils.import("chrome://enigmail/content/modules/mime.jsm").EnigmailMime; const IOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1"; @@ -51,7 +44,7 @@ self.brokenByApp = brokenByApp; if (destFolderUri) { - self.destFolder = MailUtils.getFolderForURI(destFolderUri, false); + self.destFolder = EnigmailCompat.getExistingFolder(destFolderUri); } @@ -85,11 +78,7 @@ return new Promise( function(resolve, reject) { - let u = {}; - self.msgSvc.GetUrlForUri(self.hdr.folder.getUriForMsg(self.hdr), u, null); - - let op = (u.value.spec.indexOf("?") > 0 ? "&" : "?"); - let url = u.value.spec; // + op + 'part=' + part+"&header=enigmailConvert"; + let url = EnigmailCompat.getUrlFromUriSpec(self.hdr.folder.getUriForMsg(self.hdr)); EnigmailLog.DEBUG("fixExchangeMsg.jsm: getting data from URL " + url + "\n"); @@ -101,44 +90,17 @@ EnigmailLog.DEBUG("*** start data ***\n'" + data + "'\n***end data***\n"); } - let hdrEnd = data.search(/\r?\n\r?\n/); + try { + let msg = self.getRepairedMessage(data); - if (hdrEnd <= 0) { - // cannot find end of header data - reject(0); + if (msg) { + resolve(msg); + } else + reject(2); return; - } - - let hdrLines = data.substr(0, hdrEnd).split(/\r?\n/); - let hdrObj = self.getFixedHeaderData(hdrLines); - if (hdrObj.headers.length === 0 || hdrObj.boundary.length === 0) { - reject(1); - return; - } - - let boundary = hdrObj.boundary; - let body; - - switch (self.brokenByApp) { - case "exchange": - body = self.getCorrectedExchangeBodyData(data.substr(hdrEnd + 2), boundary); - break; - case "iPGMail": - body = self.getCorrectediPGMailBodyData(data.substr(hdrEnd + 2), boundary); - break; - default: - EnigmailLog.ERROR("fixExchangeMsg.jsm: getMessageBody: unknown appType " + self.brokenByApp + "\n"); - reject(99); - return; - } - - if (body) { - resolve(hdrObj.headers + "\r\n" + body); - return; - } else { - reject(2); - return; + } catch (ex) { + reject(ex); } } ); @@ -154,6 +116,64 @@ ); }, + getRepairedMessage: function(data) { + this.determineCreatorApp(data); + + let hdrEnd = data.search(/\r?\n\r?\n/); + + if (hdrEnd <= 0) { + // cannot find end of header data + throw 0; + } + + let hdrLines = data.substr(0, hdrEnd).split(/\r?\n/); + let hdrObj = this.getFixedHeaderData(hdrLines); + + if (hdrObj.headers.length === 0 || hdrObj.boundary.length === 0) { + throw 1; + } + + let boundary = hdrObj.boundary; + let body; + + switch (this.brokenByApp) { + case "exchange": + body = this.getCorrectedExchangeBodyData(data.substr(hdrEnd + 2), boundary); + break; + case "iPGMail": + body = this.getCorrectediPGMailBodyData(data.substr(hdrEnd + 2), boundary); + break; + default: + EnigmailLog.ERROR("fixExchangeMsg.jsm: getRepairedMessage: unknown appType " + self.brokenByApp + "\n"); + throw 99; + } + + if (body) { + return hdrObj.headers + "\r\n" + body; + } else { + throw 2; + } + }, + + determineCreatorApp: function(msgData) { + // perform extra testing if iPGMail is assumed + if (this.brokenByApp === "exchange") return; + + let msgTree = EnigmailMime.getMimeTree(msgData, false); + + try { + let isIPGMail = + msgTree.subParts.length === 3 && + msgTree.subParts[0].headers.get("content-type").type.toLowerCase() === "text/plain" && + msgTree.subParts[1].headers.get("content-type").type.toLowerCase() === "application/pgp-encrypted" && + msgTree.subParts[2].headers.get("content-type").type.toLowerCase() === "text/plain"; + + if (!isIPGMail) { + this.brokenByApp = "exchange"; + } + } catch (x) {} + }, + /** * repair header data, such that they are working for PGP/MIME * @@ -304,8 +324,7 @@ "Content-Type: application/pgp-encrypted\r\n" + "Content-Description: PGP/MIME version identification\r\n\r\n" + "Version: 1\r\n\r\n" + - bodyData.substring(encData, match.index). - replace(/^Content-Type: +application\/pgp-encrypted/im, + bodyData.substring(encData, match.index).replace(/^Content-Type: +application\/pgp-encrypted/im, "Content-Type: application/octet-stream") + "--" + boundary + "--\r\n"; }, @@ -330,7 +349,7 @@ let p0 = body.search(/^-----BEGIN PGP MESSAGE-----$/m); let p1 = body.search(/^-----END PGP MESSAGE-----$/m); - ok = (p0 >= 0 && p1 > p0 + 4); + ok = (p0 >= 0 && p1 > p0 + 32); } return ok; } catch (x) {} @@ -341,7 +360,7 @@ var self = this; var tempFile = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("TmpD", Ci.nsIFile); tempFile.append("message.eml"); - tempFile.createUnique(0, 384); // octal 0600 - since octal is deprected in JS + tempFile.createUnique(0, 0o600); // ensure that file gets deleted on exit, if something goes wrong ... var extAppLauncher = Cc["@mozilla.org/mime;1"].getService(Ci.nsPIExternalAppLauncher); @@ -377,7 +396,11 @@ OnStopCopy: function(statusCode) { if (statusCode !== 0) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: error copying message: " + statusCode + "\n"); - tempFile.remove(false); + try { + tempFile.remove(false); + } catch (ex) { + EnigmailLog.DEBUG("persistentCrypto.jsm: Could not delete temp file\n"); + } self.reject(3); return; } @@ -390,14 +413,16 @@ self.hdr.folder.deleteMessages(msgArray, null, true, false, null, false); EnigmailLog.DEBUG("fixExchangeMsg.jsm: deleted original message\n"); - tempFile.remove(false); + try { + tempFile.remove(false); + } catch (ex) { + EnigmailLog.DEBUG("persistentCrypto.jsm: Could not delete temp file\n"); + } self.resolve(this.msgKey); return; } }; - let copySvc = Cc["@mozilla.org/messenger/messagecopyservice;1"].getService(Ci.nsIMsgCopyService); - copySvc.CopyFileMessage(fileSpec, this.destFolder, null, false, this.hdr.flags, null, copyListener, null); - + EnigmailCompat.copyFileToMailFolder(fileSpec, this.destFolder, 0, this.hdr.flags, copyListener, null); } -}; \ No newline at end of file +}; diff -Nru enigmail-2.0.12+ds1/package/funcs.jsm enigmail-2.1.3+ds1/package/funcs.jsm --- enigmail-2.0.12+ds1/package/funcs.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/funcs.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false, btoa: false */ -/*jshint -W097 */ /* * 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 @@ -16,14 +14,10 @@ * */ -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ -Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; var gTxtConverter = null; @@ -85,7 +79,7 @@ * @param mailAddrs |string| - address-list as specified in RFC 2822, 3.4 * separated by ","; encoded according to RFC 2047 * - * @return |array| of object + * @return |array| of msgIAddressObject */ parseEmails: function(mailAddrs, encoded = true) { @@ -145,14 +139,6 @@ }, /** - * kept for compatibility - */ - getSignMsg: function() { - // do nothing - }, - - - /** * this function tries to mimic the Thunderbird plaintext viewer * * @plainTxt - |string| containing the plain text data @@ -364,6 +350,7 @@ return 0; }, + /** * Determine the total number of certificates in the X.509 certificates store * @@ -373,13 +360,16 @@ let certDb = Cc["@mozilla.org/security/x509certdb;1"].getService(Ci.nsIX509CertDB); let certs = certDb.getCerts(); - - let e = certs.getEnumerator(); let nCerts = 0; - while (e.hasMoreElements()) { - nCerts++; - e.getNext(); + if (certs) { + // FIXME: API Change: what should happen for TB 70 and newer? + let e = certs.getEnumerator(); + + while (e.hasMoreElements()) { + nCerts++; + e.getNext(); + } } return nCerts; @@ -401,8 +391,115 @@ } } } - return null; - } + }, + + /** + * Get the default identity of the default account + */ + getDefaultIdentity: function() { + let accountManager = Cc["@mozilla.org/messenger/account-manager;1"].getService(Ci.nsIMsgAccountManager); + try { + let ac; + if (accountManager.defaultAccount) { + ac = accountManager.defaultAccount; + } + else { + for (let i = 0; i < accountManager.accounts.length; i++) { + ac = accountManager.accounts.queryElementAt(i, Ci.nsIMsgAccount); + if (ac.incomingServer.type === "imap" || ac.incomingServer.type === "pop3") break; + } + } + + if (ac.defaultIdentity) { + return ac.defaultIdentity; + } + return ac.identities.queryElementAt(0, Ci.nsIMsgIdentity); + } + catch (x) { + return null; + } + }, + + /** + * Strip extended email parts such as "+xyz" from "abc+xyz@gmail.com" for known domains + * Currently supported domains: gmail.com, googlemail.com + */ + getBaseEmail: function(emailAddr) { + return emailAddr.replace(/\+.{1,999}@(gmail|googlemail).com$/i, ""); + }, + + /** + * Get a list of all own email addresses, taken from all identities + * and all reply-to addresses + */ + getOwnEmailAddresses: function() { + let ownEmails = {}; + + let am = Cc["@mozilla.org/messenger/account-manager;1"].getService(Ci.nsIMsgAccountManager); + + // Determine all sorts of own email addresses + for (let i = 0; i < am.allIdentities.length; i++) { + let id = am.allIdentities.queryElementAt(i, Ci.nsIMsgIdentity); + if (id.email && id.email.length > 0) ownEmails[this.getBaseEmail(id.email.toLowerCase())] = 1; + if (id.replyTo && id.replyTo.length > 0) { + try { + let replyEmails = this.stripEmail(id.replyTo).toLowerCase().split(/,/); + for (let j in replyEmails) { + ownEmails[this.getBaseEmail(replyEmails[j])] = 1; + } + } + catch (ex) {} + } + } + + return ownEmails; + }, + + /** + * Determine the distinct number of non-self recipients of a message. + * Only To: and Cc: fields are considered. + */ + getNumberOfRecipients: function(msgCompField) { + let recipients = {}, + ownEmails = this.getOwnEmailAddresses(); + + let allAddr = (this.stripEmail(msgCompField.to) + "," + this.stripEmail(msgCompField.cc)).toLowerCase(); + let emails = allAddr.split(/,+/); + + for (let i = 0; i < emails.length; i++) { + let r = this.getBaseEmail(emails[i]); + if (r.length > 0 && !(r in ownEmails)) { + recipients[r] = 1; + } + } + + let numRecipients = 0; + for (let i in recipients) { + ++numRecipients; + } + + return numRecipients; + }, + + /** + * Synchronize a promise + */ + syncPromise: function(promise) { + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + + let res = null; + let p = promise.then(gotResult => { + res = gotResult; + inspector.exitNestedEventLoop(); + }).catch(gotResult => { + res = gotResult; + inspector.exitNestedEventLoop(); + }); + + inspector.enterNestedEventLoop(0); + + return res; + } }; diff -Nru enigmail-2.0.12+ds1/package/glodaMime.jsm enigmail-2.1.3+ds1/package/glodaMime.jsm --- enigmail-2.0.12+ds1/package/glodaMime.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/glodaMime.jsm 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -/*global Components: false */ -/*jshint -W097 */ -/* - * 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/. - */ - -/* - This module is a shim module to make it easier to load - the Gloda EnigmailMime utilities from the various potential sources -*/ - -"use strict"; - -var EXPORTED_SYMBOLS = ["msgHdrToMimeMessage", - "MimeMessage", "MimeContainer", - "MimeBody", "MimeUnknown", - "MimeMessageAttachment" -]; - -const Cu = Components.utils; - -/*global MsgHdrToMimeMessage: false */ -try { - // TB with omnijar - Cu.import("resource:///modules/gloda/mimemsg.js"); -} -catch (ex) { - // "old style" TB - Cu.import("resource://app/modules/gloda/mimemsg.js"); -} - -// The original naming is inconsistent with JS standards for classes vs functions -// Thus we rename it here. -const msgHdrToMimeMessage = MsgHdrToMimeMessage; - -// We don't need to explicitly create the other variables, since they will be -// imported into the current namespace anyway diff -Nru enigmail-2.0.12+ds1/package/glodaUtils.jsm enigmail-2.1.3+ds1/package/glodaUtils.jsm --- enigmail-2.0.12+ds1/package/glodaUtils.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/glodaUtils.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -15,15 +13,15 @@ var EXPORTED_SYMBOLS = ["GlodaUtils"]; -const Cu = Components.utils; +var GlodaUtils = null; try { // TB with omnijar - Cu.import("resource:///modules/gloda/utils.js"); + GlodaUtils = ChromeUtils.import("resource:///modules/gloda/utils.js").GlodaUtils; } catch (ex) { // "old style" TB - Cu.import("resource://app/modules/gloda/utils.js"); + GlodaUtils = ChromeUtils.import("resource://app/modules/gloda/utils.js").GlodaUtils; } // We don't define the exported symbol here - that is on purpose diff -Nru enigmail-2.0.12+ds1/package/gnupgUpdate.jsm enigmail-2.1.3+ds1/package/gnupgUpdate.jsm --- enigmail-2.0.12+ds1/package/gnupgUpdate.jsm 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/gnupgUpdate.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,122 @@ +/* + * 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"; + +var EXPORTED_SYMBOLS = ["EnigmailGnuPGUpdate"]; + +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +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 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; + +var EnigmailGnuPGUpdate = { + isUpdateAvailable: async function() { + EnigmailLog.DEBUG(`gnupgUpdate.jsm: isUpdateAvailable()\n`); + + if (!this.isGnuPGUpdatable()) return false; + + let now = Math.floor(Date.now() / 1000); + let lastCheck = Number(EnigmailPrefs.getPref("gpgLastUpdate")); + if (now > lastCheck) { + EnigmailPrefs.setPref("gpgLastUpdate", String(now)); + } + + let newVer = await InstallGnuPG.getAvailableInstaller(); + + if (newVer && EnigmailVersioning.greaterThan(newVer.gpgVersion, EnigmailGpg.agentVersion)) { + // new version is available + return true; + } + + return false; + }, + + isUpdateCheckNeeded: function() { + // check once a week + let now = Math.floor(Date.now() / 1000); + return (now < Number(EnigmailPrefs.getPref("gpgLastUpdate")) + 604800); + }, + + stopCheckingForUpdate: function() { + // set the last check date to Dec 31, 2299 + EnigmailPrefs.setPref("gpgLastUpdate", String(Math.floor(Date.parse('31 Dec 2299') / 1000))); + }, + + enableCheckingForUpdate: function() { + // set the last check date "now" + let now = Math.floor(Date.now() / 1000); + EnigmailPrefs.setPref("gpgLastUpdate", String(now)); + }, + + isAutoCheckEnabled: function() { + let farAway = Math.floor(Date.parse('31 Dec 2299') / 1000); + return Number(EnigmailPrefs.getPref("gpgLastUpdate")) < farAway; + }, + + + isGnuPGUpdatable: function() { + try { + switch (EnigmailOS.getOS()) { + case "Darwin": + return isGpgOsxInstalled(); + case "WINNT": + return isGpg4WinInstalled(); + } + } catch (x) {} + + return false; + }, + + runUpdateCheck: function() { + EnigmailLog.DEBUG(`gnupgUpdate.jsm: runUpdateCheck()\n`); + if (!this.isGnuPGUpdatable() || !this.isUpdateCheckNeeded()) { + EnigmailLog.DEBUG(`gnupgUpdate.jsm: runUpdateCheck: no action required\n`); + return; + } + + let self = this; + let timeoutSec = 3600 + Math.floor(Math.random() * 1800) - 900; + + EnigmailLog.DEBUG(`gnupgUpdate.jsm: runUpdateCheck: check needed; waiting for ${timeoutSec} seconds\n`); + + EnigmailTimer.setTimeout(async function f() { + if (await self.isUpdateAvailable()) { + EnigmailLog.DEBUG(`gnupgUpdate.jsm: runUpdateCheck: check available\n`); + let w = ChromeUtils.import("chrome://enigmail/content/modules/windows.jsm").EnigmailWindows; + w.openGnuPGUpdate(); + } + }, timeoutSec * 1000); + } +}; + +function isGpg4WinInstalled() { + const reg = ["Software\\Gpg4win", "Software\\GNU\\Gpg4win"]; + + for (let i in reg) { + let s = EnigmailOS.getWinRegistryString(reg[i], "Installer Language", Ci.nsIWindowsRegKey.ROOT_KEY_LOCAL_MACHINE); + if (s.length > 0) return true; + } + + return false; +} + +function isGpgOsxInstalled() { + // check the installation path of GnuPG + return (EnigmailGpg.agentPath.path.search(/^\/usr\/local\/gnupg-2.[12]\//) === 0); +} + + +function performUpdate() { + EnigmailDialog.info(null, "GnuPG will be downloaded in the background. Once complete, the setup process will start automatically"); + + InstallGnuPG.startInstaller(null); +} \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/gpg.jsm enigmail-2.1.3+ds1/package/gpg.jsm --- enigmail-2.0.12+ds1/package/gpg.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/gpg.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -11,21 +9,20 @@ const EXPORTED_SYMBOLS = ["EnigmailGpg"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ -Cu.import("resource://enigmail/dialog.jsm"); /*global EnigmailDialog: false */ -Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ -Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ -Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ -Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ -Cu.import("resource://enigmail/versioning.jsm"); /*global EnigmailVersioning: false */ -Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ + + + + +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailExecution = ChromeUtils.import("chrome://enigmail/content/modules/execution.jsm").EnigmailExecution; +const subprocess = ChromeUtils.import("chrome://enigmail/content/modules/subprocess.jsm").subprocess; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailOS = ChromeUtils.import("chrome://enigmail/content/modules/os.jsm").EnigmailOS; +const EnigmailVersioning = ChromeUtils.import("chrome://enigmail/content/modules/versioning.jsm").EnigmailVersioning; +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; const getGpgAgent = EnigmailLazy.loader("enigmail/gpgAgent.jsm", "EnigmailGpgAgent"); const getDialog = EnigmailLazy.loader("enigmail/dialog.jsm", "EnigmailDialog"); @@ -42,8 +39,7 @@ for (let i = 0; i < tmpArr.length; i++) { arr.push(tmpArr[i]); } - } - else { + } else { arr.push(str); } } @@ -76,8 +72,7 @@ stdout += data; } }).wait(); - } - catch (ex) { + } catch (ex) { exitCodeObj.value = -1; EnigmailLog.DEBUG("enigmail> DONE with FAILURE\n"); } @@ -135,7 +130,9 @@ supports-wkd - does gpg support wkd (web key directory) (true for gpg >= 2.1.19) export-result - does gpg print EXPORTED when exporting keys (true for gpg >= 2.1.10) decryption-info - does gpg print DECRYPTION_INFO (true for gpg >= 2.0.19) + export-specific-uid - does gpg support exporting a key with a specific UID (true for gpg >= 2.2.8) supports-show-only - does gpg support --import-options show-only (true for gpg >= 2.1.14) + handles-huge-keys - can gpg deal with huge keys without aborting (true for gpg >= 2.2.17) @return: depending on featureName - Boolean unless specified differently: (true if feature is available / false otherwise) @@ -175,8 +172,7 @@ // returns a string if (EnigmailVersioning.greaterThan(gpgVersion, "2.1")) { return "save"; - } - else + } else return "quit"; case "supports-sender": return EnigmailVersioning.greaterThanOrEqual(gpgVersion, "2.1.15"); @@ -186,8 +182,12 @@ return EnigmailVersioning.greaterThanOrEqual(gpgVersion, "2.0.19"); case "supports-wkd": return EnigmailVersioning.greaterThanOrEqual(gpgVersion, "2.1.19"); + case "export-specific-uid": + return EnigmailVersioning.greaterThanOrEqual(gpgVersion, "2.2.9"); case "supports-show-only": return EnigmailVersioning.greaterThanOrEqual(gpgVersion, "2.1.14"); + case "handles-huge-keys": + return EnigmailVersioning.greaterThanOrEqual(gpgVersion, "2.2.17"); } return undefined; @@ -218,8 +218,7 @@ startQuote = i; foundSign = p.substr(last).charAt(i); last = i + 1; - } - else if (p.substr(last).charAt(i) == foundSign) { + } else if (p.substr(last).charAt(i) == foundSign) { // found enquoted part if (startQuote > 1) pushTrimmedStr(r, p.substr(0, startQuote), true); @@ -228,15 +227,13 @@ last = 0; startQuote = -1; foundSign = ""; - } - else { + } else { last = last + i + 1; } } pushTrimmedStr(r, p, true); - } - catch (ex) {} + } catch (ex) {} if (withBatchOpts) { @@ -333,8 +330,7 @@ mergeStderr: false }); proc.wait(); - } - catch (ex) { + } catch (ex) { EnigmailLog.ERROR("enigmailCommon.jsm: recalcTrustDb: subprocess.call failed with '" + ex.toString() + "'\n"); throw ex; } @@ -392,4 +388,4 @@ * @return Boolean - True if dirmngr is configured with Tor. False otherwise */ dirmngrConfiguredWithTor: dirmngrConfiguredWithTor -}; +}; \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/gpgAgent.jsm enigmail-2.1.3+ds1/package/gpgAgent.jsm --- enigmail-2.0.12+ds1/package/gpgAgent.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/gpgAgent.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false, unescape: false */ -/*jshint -W097 */ /* * 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 @@ -11,35 +9,35 @@ var EXPORTED_SYMBOLS = ["EnigmailGpgAgent"]; -const Cu = Components.utils; -Cu.import("resource://gre/modules/ctypes.jsm"); /*global ctypes: false */ -Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ -Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ -Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ -Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ -Cu.import("resource://enigmail/windows.jsm"); /*global EnigmailWindows: false */ -Cu.import("resource://enigmail/app.jsm"); /*global EnigmailApp: false */ -Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ -Cu.import("resource://enigmail/passwords.jsm"); /*global EnigmailPassword: false */ -Cu.import("resource://enigmail/system.jsm"); /*global EnigmailSystem: false */ -Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ -Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ + +const ctypes = ChromeUtils.import("resource://gre/modules/ctypes.jsm").ctypes; +const subprocess = ChromeUtils.import("chrome://enigmail/content/modules/subprocess.jsm").subprocess; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailOS = ChromeUtils.import("chrome://enigmail/content/modules/os.jsm").EnigmailOS; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailWindows = ChromeUtils.import("chrome://enigmail/content/modules/windows.jsm").EnigmailWindows; +const EnigmailApp = ChromeUtils.import("chrome://enigmail/content/modules/app.jsm").EnigmailApp; +const EnigmailExecution = ChromeUtils.import("chrome://enigmail/content/modules/execution.jsm").EnigmailExecution; +const EnigmailPassword = ChromeUtils.import("chrome://enigmail/content/modules/passwords.jsm").EnigmailPassword; +const EnigmailSystem = ChromeUtils.import("chrome://enigmail/content/modules/system.jsm").EnigmailSystem; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; const getEnigmailGpg = EnigmailLazy.loader("enigmail/gpg.jsm", "EnigmailGpg"); const getDialog = EnigmailLazy.loader("enigmail/dialog.jsm", "EnigmailDialog"); -const Cc = Components.classes; -const Ci = Components.interfaces; + + const NS_LOCAL_FILE_CONTRACTID = "@mozilla.org/file/local;1"; const DIR_SERV_CONTRACTID = "@mozilla.org/file/directory_service;1"; const NS_LOCALFILEOUTPUTSTREAM_CONTRACTID = "@mozilla.org/network/file-output-stream;1"; -const DEFAULT_FILE_PERMS = 0x180; // equals 0600 +const DEFAULT_FILE_PERMS = 0o600; // Making this a var makes it possible to test windows things on linux var nsIWindowsRegKey = Ci.nsIWindowsRegKey; @@ -421,7 +419,9 @@ pathDir.append(dirs[i]); } } - pathDir.normalize(); + if (pathDir.exists()) { + pathDir.normalize(); + } } else { // absolute path diff -Nru enigmail-2.0.12+ds1/package/hash.jsm enigmail-2.1.3+ds1/package/hash.jsm --- enigmail-2.0.12+ds1/package/hash.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/hash.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -11,17 +9,17 @@ var EXPORTED_SYMBOLS = ["EnigmailHash"]; -const Cu = Components.utils; -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/windows.jsm"); /*global EnigmailWindows: false */ -Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ -Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -Cu.import("resource://enigmail/encryption.jsm"); /*global EnigmailEncryption: false */ -Cu.import("resource://enigmail/dialog.jsm"); /*global EnigmailDialog: false */ -Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ -const Ci = Components.interfaces; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailWindows = ChromeUtils.import("chrome://enigmail/content/modules/windows.jsm").EnigmailWindows; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailEncryption = ChromeUtils.import("chrome://enigmail/content/modules/encryption.jsm").EnigmailEncryption; +const EnigmailDialog = ChromeUtils.import("chrome://enigmail/content/modules/dialog.jsm").EnigmailDialog; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; + + const keyAlgorithms = []; const mimeHashAlgorithms = [null, "sha1", "ripemd160", "sha256", "sha384", "sha512", "sha224", "md5"]; diff -Nru enigmail-2.0.12+ds1/package/httpProxy.jsm enigmail-2.1.3+ds1/package/httpProxy.jsm --- enigmail-2.0.12+ds1/package/httpProxy.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/httpProxy.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -10,11 +8,11 @@ var EXPORTED_SYMBOLS = ["EnigmailHttpProxy"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; -Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ + + + +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; const NS_PREFS_SERVICE_CID = "@mozilla.org/preferences-service;1"; diff -Nru enigmail-2.0.12+ds1/package/install.rdf enigmail-2.1.3+ds1/package/install.rdf --- enigmail-2.0.12+ds1/package/install.rdf 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/install.rdf 2019-10-29 17:09:36.000000000 +0000 @@ -3,30 +3,27 @@ + + {847b3a00-7ab1-11d4-8f02-006008948af5} - 2.0.12 + ${EnigmailVersion} 2 true + - + - {3550f703-e582-4d05-9a08-453d09bdfdc6} - 60.0 - 60.* + postbox@postbox-inc.com + 6.1 + 7.* - + + https://enigmail.net/service/getEnigmailUpdate.svc?appId=%APP_ID%&appVersion=%APP_VERSION%&itemVersion=%ITEM_VERSION% Enigmail diff -Nru enigmail-2.0.12+ds1/package/installGnuPG.jsm enigmail-2.1.3+ds1/package/installGnuPG.jsm --- enigmail-2.0.12+ds1/package/installGnuPG.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/installGnuPG.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*global Components: false, escape: false, unescape: false, Uint8Array: false */ /* eslint no-invalid-this: 0 */ /* * This Source Code Form is subject to the terms of the Mozilla Public @@ -30,22 +29,21 @@ var Cu = Components.utils; -Cu.importGlobalProperties(["XMLHttpRequest"]); -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ -Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ -Cu.import("resource://enigmail/app.jsm"); /*global EnigmailApp: false */ -Cu.import("resource://gre/modules/PromiseUtils.jsm"); /* global PromiseUtils: false */ -Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ - -const Cc = Components.classes; -const Ci = Components.interfaces; +Components.utils.importGlobalProperties(["XMLHttpRequest"]); +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; +const subprocess = ChromeUtils.import("chrome://enigmail/content/modules/subprocess.jsm").subprocess; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailOS = ChromeUtils.import("chrome://enigmail/content/modules/os.jsm").EnigmailOS; +const EnigmailApp = ChromeUtils.import("chrome://enigmail/content/modules/app.jsm").EnigmailApp; +const PromiseUtils = ChromeUtils.import("resource://gre/modules/PromiseUtils.jsm").PromiseUtils; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailXhrUtils = ChromeUtils.import("chrome://enigmail/content/modules/xhrUtils.jsm").EnigmailXhrUtils; const EXEC_FILE_PERMS = 0x1C0; // 0700 -const NS_LOCALFILEOUTPUTSTREAM_CONTRACTID = "@mozilla.org/network/file-output-stream;1"; +const NS_LOCALFILEOUTPUTSTREAM_CONTRACTID = + "@mozilla.org/network/file-output-stream;1"; const DIR_SERV_CONTRACTID = "@mozilla.org/file/directory_service;1"; const NS_LOCAL_FILE_CONTRACTID = "@mozilla.org/file/local;1"; const XPCOM_APPINFO = "@mozilla.org/xre/app-info;1"; @@ -65,119 +63,6 @@ return str.replace(/[^a-hA-H0-9]/g, ""); } -// Adapted from the patch for mozTCPSocket error reporting (bug 861196). - -function createTCPErrorFromFailedXHR(xhr) { - let status = xhr.channel.QueryInterface(Ci.nsIRequest).status; - - let errType; - let errName; - - if ((status & 0xff0000) === 0x5a0000) { // Security module - const nsINSSErrorsService = Ci.nsINSSErrorsService; - let nssErrorsService = Cc['@mozilla.org/nss_errors_service;1'].getService(nsINSSErrorsService); - let errorClass; - // getErrorClass will throw a generic NS_ERROR_FAILURE if the error code is - // somehow not in the set of covered errors. - try { - errorClass = nssErrorsService.getErrorClass(status); - } catch (ex) { - errorClass = 'SecurityProtocol'; - } - if (errorClass == nsINSSErrorsService.ERROR_CLASS_BAD_CERT) { - errType = 'SecurityCertificate'; - } - else { - errType = 'SecurityProtocol'; - } - - // NSS_SEC errors (happen below the base value because of negative vals) - if ((status & 0xffff) < Math.abs(nsINSSErrorsService.NSS_SEC_ERROR_BASE)) { - // The bases are actually negative, so in our positive numeric space, we - // need to subtract the base off our value. - let nssErr = Math.abs(nsINSSErrorsService.NSS_SEC_ERROR_BASE) - - (status & 0xffff); - switch (nssErr) { - case 11: // SEC_ERROR_EXPIRED_CERTIFICATE, sec(11) - errName = 'SecurityExpiredCertificateError'; - break; - case 12: // SEC_ERROR_REVOKED_CERTIFICATE, sec(12) - errName = 'SecurityRevokedCertificateError'; - break; - - // per bsmith, we will be unable to tell these errors apart very soon, - // so it makes sense to just folder them all together already. - case 13: // SEC_ERROR_UNKNOWN_ISSUER, sec(13) - case 20: // SEC_ERROR_UNTRUSTED_ISSUER, sec(20) - case 21: // SEC_ERROR_UNTRUSTED_CERT, sec(21) - case 36: // SEC_ERROR_CA_CERT_INVALID, sec(36) - errName = 'SecurityUntrustedCertificateIssuerError'; - break; - case 90: // SEC_ERROR_INADEQUATE_KEY_USAGE, sec(90) - errName = 'SecurityInadequateKeyUsageError'; - break; - case 176: // SEC_ERROR_CERT_SIGNATURE_ALGORITHM_DISABLED, sec(176) - errName = 'SecurityCertificateSignatureAlgorithmDisabledError'; - break; - default: - errName = 'SecurityError'; - break; - } - } - else { - let sslErr = Math.abs(nsINSSErrorsService.NSS_SSL_ERROR_BASE) - - (status & 0xffff); - switch (sslErr) { - case 3: // SSL_ERROR_NO_CERTIFICATE, ssl(3) - errName = 'SecurityNoCertificateError'; - break; - case 4: // SSL_ERROR_BAD_CERTIFICATE, ssl(4) - errName = 'SecurityBadCertificateError'; - break; - case 8: // SSL_ERROR_UNSUPPORTED_CERTIFICATE_TYPE, ssl(8) - errName = 'SecurityUnsupportedCertificateTypeError'; - break; - case 9: // SSL_ERROR_UNSUPPORTED_VERSION, ssl(9) - errName = 'SecurityUnsupportedTLSVersionError'; - break; - case 12: // SSL_ERROR_BAD_CERT_DOMAIN, ssl(12) - errName = 'SecurityCertificateDomainMismatchError'; - break; - default: - errName = 'SecurityError'; - break; - } - } - } - else { - errType = 'Network'; - switch (status) { - // connect to host:port failed - case 0x804B000C: // NS_ERROR_CONNECTION_REFUSED, network(13) - errName = 'ConnectionRefusedError'; - break; - // network timeout error - case 0x804B000E: // NS_ERROR_NET_TIMEOUT, network(14) - errName = 'NetworkTimeoutError'; - break; - // hostname lookup failed - case 0x804B001E: // NS_ERROR_UNKNOWN_HOST, network(30) - errName = 'DomainNotFoundError'; - break; - case 0x804B0047: // NS_ERROR_NET_INTERRUPT, network(71) - errName = 'NetworkInterruptError'; - break; - default: - errName = 'NetworkError'; - break; - } - } - - return { - name: errName, - type: errType - }; -} function Installer(progressListener) { this.progressListener = progressListener; @@ -223,9 +108,9 @@ try { subprocess.call(proc).wait(); - if (exitCode) - throw "Installer failed with exit code " + exitCode; - } catch (ex) { + if (exitCode) throw "Installer failed with exit code " + exitCode; + } + catch (ex) { EnigmailLog.ERROR("installGnuPG.jsm: installMacOs: subprocess.call failed with '" + ex.toString() + "'\n"); throw ex; } @@ -249,7 +134,8 @@ try { subprocess.call(proc); - } catch (ex) { + } + catch (ex) { EnigmailLog.ERROR("installGnuPG.jsm: installMacOs: subprocess.call failed with '" + ex.toString() + "'\n"); throw ex; } @@ -272,7 +158,8 @@ try { subprocess.call(proc).wait(); - } catch (ex) { + } + catch (ex) { EnigmailLog.ERROR("installGnuPG.jsm.cleanupMacOs: subprocess.call failed with '" + ex.toString() + "'\n"); } @@ -325,7 +212,7 @@ // use runwAsync in order to get UAC approval on Windows 7 / 8 if required var obs = { - QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]), + QueryInterface: EnigmailCompat.generateQI(["nsIObserver"]), observe: function(proc, aTopic, aData) { EnigmailLog.DEBUG("installGnuPG.jsm: installWindows.observe: topic='" + aTopic + "' \n"); @@ -346,8 +233,7 @@ let params = []; if (cfgFile) { - if (cfgFile.indexOf('"') >= 0) - cfgFile = '"' + cfgFile + '"'; + if (cfgFile.indexOf('"') >= 0) cfgFile = '"' + cfgFile + '"'; params.push('/C=' + cfgFile); } @@ -355,7 +241,8 @@ var proc = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); proc.init(this.installerFile); proc.runwAsync(params, params.length, obs, false); - } catch (ex) { + } + catch (ex) { deferred.reject("Installer could not be started"); } @@ -377,7 +264,7 @@ var istream = Components.classes["@mozilla.org/network/file-input-stream;1"] .createInstance(Components.interfaces.nsIFileInputStream); // open for reading - istream.init(this.installerFile, 0x01, 292, 0); // octal 0444 - octal literals are deprecated + istream.init(this.installerFile, 0x01, 0o444, 0); var ch = Components.classes["@mozilla.org/security/hash;1"] .createInstance(Components.interfaces.nsICryptoHash); @@ -408,7 +295,7 @@ function reqListener() { // "this" is set by the calling XMLHttpRequest - if (typeof (this.responseXML) == "object") { + if (typeof(this.responseXML) == "object") { EnigmailLog.DEBUG("installGnuPG.jsm: getDownloadUrl.reqListener: got: " + this.responseText + "\n"); if (!this.responseText) { onError({ @@ -417,8 +304,8 @@ return; } - if (typeof (this.responseText) == "string") { - EnigmailLog.DEBUG("installPep.jsm: getDownloadUrl.reqListener: got: " + this.responseText + "\n"); + if (typeof(this.responseText) == "string") { + EnigmailLog.DEBUG("installGnuPG.jsm: getDownloadUrl.reqListener: got: " + this.responseText + "\n"); try { let doc = JSON.parse(this.responseText); @@ -426,9 +313,11 @@ self.hash = sanitizeHash(doc.hash); self.command = doc.command; self.mount = sanitizeFileName(doc.mountPath); + self.gpgVersion = doc.gpgVersion; deferred.resolve(); - } catch (ex) { - EnigmailLog.DEBUG("installPep.jsm: getDownloadUrl.reqListener: exception: " + ex.toString() + "\n"); + } + catch (ex) { + EnigmailLog.DEBUG("installGnuPG.jsm: getDownloadUrl.reqListener: exception: " + ex.toString() + "\n"); onError({ type: "Network" @@ -470,15 +359,16 @@ oReq.onload = reqListener; oReq.addEventListener("error", function(e) { - var error = createTCPErrorFromFailedXHR(oReq); + var error = EnigmailXhrUtils.createTCPErrorFromFailedXHR(oReq); onError(error); }, false); oReq.open("get", queryUrl + "?vEnigmail=" + escape(EnigmailApp.getVersion()) + "&os=" + escape(os) + "&platform=" + - escape(platform), true, "no-user", ""); + escape(platform), true); oReq.send(); - } catch (ex) { + } + catch (ex) { deferred.reject(ex); EnigmailLog.writeException("installGnuPG.jsm", ex); @@ -489,6 +379,18 @@ return deferred.promise; }, + getUrlObj: function() { + let o = { + url: this.url, + hash: this.hash, + comamnd: this.command, + mount: this.mount, + gpgVersion: this.gpgVersion + }; + + return o; + }, + performDownload: function() { EnigmailLog.DEBUG("installGnuPG.jsm: performDownload: " + this.url + "\n"); @@ -526,7 +428,8 @@ performInstall(this.response).then(function _f() { performCleanup(); }); - } catch (ex) { + } + catch (ex) { EnigmailLog.writeException("installGnuPG.jsm", ex); if (self.progressListener) @@ -596,7 +499,9 @@ default: self.installUnix(deferred); } - } catch (ex) { + + } + catch (ex) { deferred.reject(ex); EnigmailLog.writeException("installGnuPG.jsm", ex); @@ -611,7 +516,8 @@ EnigmailLog.DEBUG("installGnuPG.jsm: performCleanup:\n"); try { if (self.performCleanup) self.performCleanup(); - } catch (ex) {} + } + catch (ex) {} if (self.progressListener) { EnigmailLog.DEBUG("installGnuPG.jsm: performCleanup - onLoaded()\n"); @@ -626,13 +532,13 @@ oReq.addEventListener("load", onLoaded, false); oReq.addEventListener("error", function(e) { - var error = createTCPErrorFromFailedXHR(oReq); + var error = EnigmailXhrUtils.createTCPErrorFromFailedXHR(oReq); onError(error); }, false); oReq.addEventListener("progress", onProgress, false); - oReq.open("get", this.url, true, "no-user", ""); + oReq.open("get", this.url, true); oReq.responseType = "arraybuffer"; if (self.progressListener) self.progressListener.onStart({ @@ -641,7 +547,8 @@ } }); oReq.send(); - } catch (ex) { + } + catch (ex) { deferred.reject(ex); EnigmailLog.writeException("installGnuPG.jsm", ex); @@ -670,9 +577,19 @@ startInstaller: function(progressListener) { var i = new Installer(progressListener); - i.getDownloadUrl(i).then(function _dl() { + i.getDownloadUrl(i). + then(function _dl() { i.performDownload(); }); return i; + }, + + getAvailableInstaller: async function() { + if (!this.checkAvailability()) return null; + + let i = new Installer(null); + await i.getDownloadUrl(i); + + return i.getUrlObj(); } }; diff -Nru enigmail-2.0.12+ds1/package/installPep.jsm enigmail-2.1.3+ds1/package/installPep.jsm --- enigmail-2.0.12+ds1/package/installPep.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/installPep.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*global Components: false, escape: false, unescape: false, Uint8Array: false */ /* eslint no-invalid-this: 0 */ /* * This Source Code Form is subject to the terms of the Mozilla Public @@ -10,24 +9,18 @@ var EXPORTED_SYMBOLS = ["EnigmailInstallPep"]; -const Cu = Components.utils; -const Cc = Components.classes; -const Ci = Components.interfaces; - -Cu.importGlobalProperties(["XMLHttpRequest"]); -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ -Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ -Cu.import("resource://enigmail/app.jsm"); /*global EnigmailApp: false */ -Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -Cu.import("resource://gre/modules/PromiseUtils.jsm"); /* global PromiseUtils: false */ -Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ - +Components.utils.importGlobalProperties(["XMLHttpRequest"]); +const subprocess = ChromeUtils.import("chrome://enigmail/content/modules/subprocess.jsm").subprocess; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailOS = ChromeUtils.import("chrome://enigmail/content/modules/os.jsm").EnigmailOS; +const EnigmailApp = ChromeUtils.import("chrome://enigmail/content/modules/app.jsm").EnigmailApp; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const PromiseUtils = ChromeUtils.import("resource://gre/modules/PromiseUtils.jsm").PromiseUtils; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailXhrUtils = ChromeUtils.import("chrome://enigmail/content/modules/xhrUtils.jsm").EnigmailXhrUtils; +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; const EXEC_FILE_PERMS = 0x1C0; // 0700 - - const NS_LOCALFILEOUTPUTSTREAM_CONTRACTID = "@mozilla.org/network/file-output-stream;1"; const DIR_SERV_CONTRACTID = "@mozilla.org/file/directory_service;1"; const NS_LOCAL_FILE_CONTRACTID = "@mozilla.org/file/local;1"; @@ -51,120 +44,6 @@ return str.replace(/[^a-hA-H0-9]/g, ""); } -// Adapted from the patch for mozTCPSocket error reporting (bug 861196). - -function createTCPErrorFromFailedXHR(xhr) { - let status = xhr.channel.QueryInterface(Ci.nsIRequest).status; - - let errType; - let errName; - - if ((status & 0xff0000) === 0x5a0000) { // Security module - const nsINSSErrorsService = Ci.nsINSSErrorsService; - let nssErrorsService = Cc['@mozilla.org/nss_errors_service;1'].getService(nsINSSErrorsService); - let errorClass; - // getErrorClass will throw a generic NS_ERROR_FAILURE if the error code is - // somehow not in the set of covered errors. - try { - errorClass = nssErrorsService.getErrorClass(status); - } catch (ex) { - errorClass = 'SecurityProtocol'; - } - if (errorClass == nsINSSErrorsService.ERROR_CLASS_BAD_CERT) { - errType = 'SecurityCertificate'; - } - else { - errType = 'SecurityProtocol'; - } - - // NSS_SEC errors (happen below the base value because of negative vals) - if ((status & 0xffff) < Math.abs(nsINSSErrorsService.NSS_SEC_ERROR_BASE)) { - // The bases are actually negative, so in our positive numeric space, we - // need to subtract the base off our value. - let nssErr = Math.abs(nsINSSErrorsService.NSS_SEC_ERROR_BASE) - - (status & 0xffff); - switch (nssErr) { - case 11: // SEC_ERROR_EXPIRED_CERTIFICATE, sec(11) - errName = 'SecurityExpiredCertificateError'; - break; - case 12: // SEC_ERROR_REVOKED_CERTIFICATE, sec(12) - errName = 'SecurityRevokedCertificateError'; - break; - - // per bsmith, we will be unable to tell these errors apart very soon, - // so it makes sense to just folder them all together already. - case 13: // SEC_ERROR_UNKNOWN_ISSUER, sec(13) - case 20: // SEC_ERROR_UNTRUSTED_ISSUER, sec(20) - case 21: // SEC_ERROR_UNTRUSTED_CERT, sec(21) - case 36: // SEC_ERROR_CA_CERT_INVALID, sec(36) - errName = 'SecurityUntrustedCertificateIssuerError'; - break; - case 90: // SEC_ERROR_INADEQUATE_KEY_USAGE, sec(90) - errName = 'SecurityInadequateKeyUsageError'; - break; - case 176: // SEC_ERROR_CERT_SIGNATURE_ALGORITHM_DISABLED, sec(176) - errName = 'SecurityCertificateSignatureAlgorithmDisabledError'; - break; - default: - errName = 'SecurityError'; - break; - } - } - else { - let sslErr = Math.abs(nsINSSErrorsService.NSS_SSL_ERROR_BASE) - - (status & 0xffff); - switch (sslErr) { - case 3: // SSL_ERROR_NO_CERTIFICATE, ssl(3) - errName = 'SecurityNoCertificateError'; - break; - case 4: // SSL_ERROR_BAD_CERTIFICATE, ssl(4) - errName = 'SecurityBadCertificateError'; - break; - case 8: // SSL_ERROR_UNSUPPORTED_CERTIFICATE_TYPE, ssl(8) - errName = 'SecurityUnsupportedCertificateTypeError'; - break; - case 9: // SSL_ERROR_UNSUPPORTED_VERSION, ssl(9) - errName = 'SecurityUnsupportedTLSVersionError'; - break; - case 12: // SSL_ERROR_BAD_CERT_DOMAIN, ssl(12) - errName = 'SecurityCertificateDomainMismatchError'; - break; - default: - errName = 'SecurityError'; - break; - } - } - } - else { - errType = 'Network'; - switch (status) { - // connect to host:port failed - case 0x804B000C: // NS_ERROR_CONNECTION_REFUSED, network(13) - errName = 'ConnectionRefusedError'; - break; - // network timeout error - case 0x804B000E: // NS_ERROR_NET_TIMEOUT, network(14) - errName = 'NetworkTimeoutError'; - break; - // hostname lookup failed - case 0x804B001E: // NS_ERROR_UNKNOWN_HOST, network(30) - errName = 'DomainNotFoundError'; - break; - case 0x804B0047: // NS_ERROR_NET_INTERRUPT, network(71) - errName = 'NetworkInterruptError'; - break; - default: - errName = 'NetworkError'; - break; - } - } - - return { - name: errName, - type: errType - }; -} - function Installer(progressListener) { this.progressListener = progressListener; } @@ -178,7 +57,8 @@ try { let extAppLauncher = Cc["@mozilla.org/mime;1"].getService(Ci.nsPIExternalAppLauncher); extAppLauncher.deleteTemporaryFileOnExit(this.installerFile); - } catch (ex) {} + } + catch (ex) {} } if (this.progressListener) { this.progressListener.onInstalled(); @@ -190,7 +70,7 @@ var istream = Cc["@mozilla.org/network/file-input-stream;1"] .createInstance(Ci.nsIFileInputStream); // open for reading - istream.init(this.installerFile, 0x01, 292, 0); // octal 0444 - octal literals are deprecated + istream.init(this.installerFile, 0x01, 0o444, 0); var ch = Cc["@mozilla.org/security/hash;1"].createInstance(Ci.nsICryptoHash); ch.init(ch.SHA256); @@ -240,7 +120,7 @@ }); return; } - if (typeof (this.responseText) == "string") { + if (typeof(this.responseText) == "string") { EnigmailLog.DEBUG("installPep.jsm: getDownloadUrl.reqListener: got: " + this.responseText + "\n"); try { @@ -249,7 +129,8 @@ self.pepVersion = doc.pepVersion; self.hash = sanitizeHash(doc.hash); deferred.resolve(); - } catch (ex) { + } + catch (ex) { EnigmailLog.DEBUG("installPep.jsm: getDownloadUrl.reqListener: exception: " + ex.toString() + "\n"); onError({ @@ -293,12 +174,12 @@ oReq.onload = reqListener; oReq.addEventListener("error", function(e) { - var error = createTCPErrorFromFailedXHR(oReq); + var error = EnigmailXhrUtils.createTCPErrorFromFailedXHR(oReq); onError(error); }, false); queryUrl = queryUrl + "?vEnigmail=" + escape(EnigmailApp.getVersion()) + "&os=" + escape(os) + - "&platform=" + escape(platform); + "&platform=" + escape(platform); switch (installType) { case INSTALL_MANUAL: @@ -310,9 +191,10 @@ EnigmailLog.DEBUG("installPep.jsm: getDownloadUrl: accessing '" + queryUrl + "'\n"); - oReq.open("get", queryUrl, true, "no-user", ""); + oReq.open("get", queryUrl, true); oReq.send(); - } catch (ex) { + } + catch (ex) { deferred.reject(ex); EnigmailLog.writeException("installPep.jsm", ex); @@ -358,7 +240,8 @@ performCleanup(); gInstallInProgress = 0; }); - } catch (ex) { + } + catch (ex) { EnigmailLog.writeException("installPep.jsm", ex); gInstallInProgress = 0; @@ -427,7 +310,8 @@ else { deferred.reject("Could not unzip " + self.installerFile.path + " to " + tempDir.path + "\n"); } - } catch (ex) { + } + catch (ex) { deferred.reject(ex); EnigmailLog.writeException("installPep.jsm", ex); @@ -444,7 +328,8 @@ EnigmailLog.DEBUG("installPep.jsm: performCleanup:\n"); try { if (self.performCleanup) self.performCleanup(); - } catch (ex) {} + } + catch (ex) {} } @@ -463,16 +348,17 @@ oReq.addEventListener("load", onLoaded, false); oReq.addEventListener("error", function(e) { - var error = createTCPErrorFromFailedXHR(oReq); + var error = EnigmailXhrUtils.createTCPErrorFromFailedXHR(oReq); onError(error); }, false); oReq.addEventListener("progress", onProgress, false); - oReq.open("get", this.url, true, "no-user", ""); + oReq.open("get", this.url, true); oReq.responseType = "arraybuffer"; oReq.send(); - } catch (ex) { + } + catch (ex) { deferred.reject(ex); EnigmailLog.writeException("installPep.jsm", ex); @@ -503,6 +389,7 @@ startInstaller: function(progressListener, manualInstall = false) { EnigmailLog.DEBUG("installPep.jsm: startInstaller()\n"); + if (EnigmailCompat.isPostbox()) return null; if (!manualInstall) { if (!EnigmailPrefs.getPref("pEpAutoDownload")) return null; } @@ -512,7 +399,8 @@ gInstallInProgress = 1; let i = new Installer(progressListener); - i.getDownloadUrl(i, manualInstall ? INSTALL_MANUAL : INSTALL_AUTO).then(function _gotUrl() { + i.getDownloadUrl(i, manualInstall ? INSTALL_MANUAL : INSTALL_AUTO). + then(function _gotUrl() { i.performDownload(); }).catch(function _err() { gInstallInProgress = 0; @@ -526,30 +414,26 @@ * * @param manualInstall: Boolean: if true, ignore pEpAutoDownload option * - * @return true: installer for current platform is online available - * false: otherwise + * @return {Promise}: true: installer for current platform is online available + * false: otherwise */ - isPepInstallerAvailable: function(manualInstall = false) { + isPepInstallerAvailable: async function(manualInstall = false) { EnigmailLog.DEBUG("installPep.jsm: isPepInstallerAvailable()\n"); + if (EnigmailCompat.isPostbox()) return false; if (!manualInstall) { // don't download anything if auto-download is disabled if (!EnigmailPrefs.getPref("pEpAutoDownload")) return false; } - let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); let urlObj = null; - let i = new Installer(null); - i.getDownloadUrl(i, manualInstall ? INSTALL_MANUAL : INSTALL_AUTO).then(function _gotUrl() { + try { + let r = await i.getDownloadUrl(i, manualInstall ? INSTALL_MANUAL : INSTALL_AUTO); urlObj = i.getUrlObj(); - inspector.exitNestedEventLoop(); - }).catch(function _err(data) { - inspector.exitNestedEventLoop(); - }); - - inspector.enterNestedEventLoop(0); + } + catch (err) {} return (urlObj ? urlObj.url !== null && urlObj.url !== "" : false); }, @@ -566,6 +450,7 @@ isPepUpdateAvailable: function(manualInstall = false, currentPepVersion) { EnigmailLog.DEBUG("installPep.jsm: isPepUpdateAvailable()\n"); + if (EnigmailCompat.isPostbox()) return false; if (!manualInstall) { // don't download anything if auto-download is disabled if (!EnigmailPrefs.getPref("pEpAutoDownload")) return false; @@ -576,10 +461,12 @@ let i = new Installer(null); - i.getDownloadUrl(i, INSTALL_UPDATE).then(function _gotUrl() { + i.getDownloadUrl(i, INSTALL_UPDATE). + then(function _gotUrl() { urlObj = i.getUrlObj(); inspector.exitNestedEventLoop(); - }).catch(function _err(data) { + }). + catch(function _err(data) { inspector.exitNestedEventLoop(); }); diff -Nru enigmail-2.0.12+ds1/package/key.jsm enigmail-2.1.3+ds1/package/key.jsm --- enigmail-2.0.12+ds1/package/key.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/key.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false, Math: false */ -/*jshint -W097 */ /* * 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 @@ -10,36 +8,20 @@ var EXPORTED_SYMBOLS = ["EnigmailKey"]; -const Cu = Components.utils; - const KEY_BLOCK_UNKNOWN = 0; const KEY_BLOCK_KEY = 1; const KEY_BLOCK_REVOCATION = 2; -const SIG_TYPE_REVOCATION = 0x20; -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/armor.jsm"); /*global EnigmailArmor: false */ -Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ -Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ -Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ -Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ -Cu.import("resource://enigmail/openpgp.jsm"); /*global EnigmailOpenPGP: false */ -Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailArmor = ChromeUtils.import("chrome://enigmail/content/modules/armor.jsm").EnigmailArmor; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailFuncs = ChromeUtils.import("chrome://enigmail/content/modules/funcs.jsm").EnigmailFuncs; +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; const getKeyRing = EnigmailLazy.loader("enigmail/keyRing.jsm", "EnigmailKeyRing"); const getDialog = EnigmailLazy.loader("enigmail/dialog.jsm", "EnigmailDialog"); +const EnigmailCryptoAPI = ChromeUtils.import("chrome://enigmail/content/modules/cryptoAPI.jsm").EnigmailCryptoAPI; -const ENTRY_ID = 0; -const KEY_TRUST_ID = 1; -const KEY_SIZE_ID = 2; -const KEY_ALGO_ID = 3; -const KEY_ID = 4; -const CREATED_ID = 5; -const EXPIRY_ID = 6; -const UID_ID = 7; -const OWNERTRUST_ID = 8; -const USERID_ID = 9; -const SIG_TYPE_ID = 10; -const KEY_USE_FOR_ID = 11; var EnigmailKey = { /** @@ -106,27 +88,6 @@ }, /** - * Split armored blocks into an array of strings - */ - splitArmoredBlocks: function(keyBlockStr) { - let myRe = /-----BEGIN PGP (PUBLIC|PRIVATE) KEY BLOCK-----/g; - let myArray; - let retArr = []; - let startIndex = -1; - while ((myArray = myRe.exec(keyBlockStr)) !== null) { - if (startIndex >= 0) { - let s = keyBlockStr.substring(startIndex, myArray.index); - retArr.push(s); - } - startIndex = myArray.index; - } - - retArr.push(keyBlockStr.substring(startIndex)); - - return retArr; - }, - - /** * Get details (key ID, UID) of the data contained in a OpenPGP key block * * @param keyBlockStr String: the contents of one or more public keys @@ -137,75 +98,25 @@ * - id (key ID) * - fpr * - name (the UID of the key) - * - isSecret (boolean) - * - revoke? (boolean, true if contains a revocation cert, undefined is the same as false) + * - state (one of "old" [existing key], "new" [new key], "invalid" [key cannot not be imported]) */ getKeyListFromKeyBlock: function(keyBlockStr, errorMsgObj, interactive = true) { - EnigmailLog.DEBUG("key.jsm: getKeyListFromKeyBlock()\n"); + EnigmailLog.DEBUG("key.jsm: getKeyListFromKeyBlock\n"); + const cApi = EnigmailCryptoAPI(); + let keyList = []; + let key = {}; let blocks; - let isBinary = false; - errorMsgObj.value = ""; - let keyList = getGpgKeyData(keyBlockStr); - let key = {}; - - if (keyList.length === 0) { - EnigmailLog.DEBUG("key.jsm: getKeyListFromKeyBlock: no data from GnuPG\n"); - if (keyBlockStr.search(/-----BEGIN PGP (PUBLIC|PRIVATE) KEY BLOCK-----/) >= 0) { - blocks = this.splitArmoredBlocks(keyBlockStr); - } else { - isBinary = true; - blocks = [EnigmailOpenPGP.enigmailFuncs.bytesToArmor(EnigmailOpenPGP.openpgp.enums.armor.public_key, keyBlockStr)]; - } - - for (let b of blocks) { - let m = EnigmailOpenPGP.openpgp.message.readArmored(b); - - for (let i = 0; i < m.packets.length; i++) { - let packetType = EnigmailOpenPGP.openpgp.enums.read(EnigmailOpenPGP.openpgp.enums.packet, m.packets[i].tag); - switch (packetType) { - case "publicKey": - case "secretKey": - key = { - id: m.packets[i].getKeyId().toHex().toUpperCase(), - fpr: m.packets[i].getFingerprint().toUpperCase(), - name: null, - isSecret: false - }; - - if (!(key.id in keyList)) { - keyList[key.id] = key; - } - - if (packetType === "secretKey") { - keyList[key.id].isSecret = true; - } - break; - case "userid": - if (!key.name) { - key.name = m.packets[i].userid.replace(/[\r\n]+/g, " "); - } - break; - case "signature": - if (m.packets[i].signatureType === SIG_TYPE_REVOCATION) { - let keyId = m.packets[i].issuerKeyId.toHex().toUpperCase(); - if (keyId in keyList) { - keyList[keyId].revoke = true; - } else { - keyList[keyId] = { - revoke: true, - id: keyId - }; - } - } - break; - } - } - } + try { + keyList = cApi.sync(cApi.getKeyListFromKeyBlock(keyBlockStr)); + } catch (ex) { + errorMsgObj.value = ex.toString(); + return []; } + let retArr = []; for (let k in keyList) { retArr.push(keyList[k]); @@ -215,7 +126,6 @@ key = retArr[0]; if (("revoke" in key) && (!("name" in key))) { this.importRevocationCert(key.id, blocks.join("\n")); - errorMsgObj.value = ""; return []; } } @@ -265,82 +175,4 @@ return (keyId1Raw === keyId2Raw); } - }; - - -function getGpgKeyData(armorKeyString) { - if (!EnigmailGpg.getGpgFeature("supports-show-only")) return []; - - EnigmailLog.DEBUG("key.jsm: getGpgKeyData()\n"); - let command = EnigmailGpg.agentPath; - let args = EnigmailGpg.getStandardArgs(false).concat(["--no-tty", "--batch", "--no-verbose", "--with-fingerprint", "--with-colons", "--import-options", "import-show", "--dry-run", "--import"]); - - let statusFlagsObj = {}; - let statusMsgObj = {}; - let exitCodeObj = {}; - let errorMsgObj = {}; - - let output = EnigmailExecution.execCmd(command, args, armorKeyString, exitCodeObj, statusFlagsObj, statusMsgObj, errorMsgObj); - - let lines = output.split(/\r?\n/); - let key = {}; - let keyId = ""; - let keyList = []; - /* - pub:u:256:22:84F83BE88C892606:1525969855:1683649855::u:::scESC:::::ed25519:::0: - fpr:::::::::AFE1B65C5F39ACA7960B22CD84F83BE88C892606: - uid:u::::1525969914::22DB32406212400B52CDC74DA2B33418637430F1::Patrick (ECC) ::::::::::0: - uid:u::::1525969855::F70B7A77F085AA7BA003D6AFAB6FF0DB1FC901B0::enigmail ::::::::::0: - sub:u:256:18:329DAB3350400C40:1525969855:1683649855:::::e:::::cv25519:: - fpr:::::::::3B154538D4DFAA19BDADAAD0329DAB3350400C40: - */ - - for (let i = 0; i < lines.length; i++) { - const lineTokens = lines[i].split(/:/); - - switch (lineTokens[ENTRY_ID]) { - case "pub": - case "sec": - key = { - id: lineTokens[KEY_ID], - fpr: null, - name: null, - isSecret: false - }; - - if (!(key.id in keyList)) { - keyList[key.id] = key; - } - - if (lineTokens[ENTRY_ID] === "sec") { - keyList[key.id].isSecret = true; - } - break; - case "fpr": - if (!key.fpr) { - key.fpr = lineTokens[USERID_ID]; - } - break; - case "uid": - if (!key.name) { - key.name = lineTokens[USERID_ID]; - } - break; - case "rvs": - case "rvk": - keyId = lineTokens[KEY_ID]; - if (keyId in keyList) { - keyList[keyId].revoke = true; - } else { - keyList[keyId] = { - revoke: true, - id: keyId - }; - } - break; - } - } - - return keyList; -} diff -Nru enigmail-2.0.12+ds1/package/keyEditor.jsm enigmail-2.1.3+ds1/package/keyEditor.jsm --- enigmail-2.0.12+ds1/package/keyEditor.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/keyEditor.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,4 @@ -/*global Components: false */ -/*jshint -W097 */ + /* * 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 @@ -10,23 +9,23 @@ var EXPORTED_SYMBOLS = ["EnigmailKeyEditor"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ -Cu.import("resource://enigmail/key.jsm"); /*global EnigmailKey: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ -Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ -Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ -Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ -Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ -Cu.import("resource://enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ -Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ -Cu.import("resource://enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ -Cu.import("resource://enigmail/errorHandling.jsm"); /*global EnigmailErrorHandling: false */ -Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ + + + + +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailKey = ChromeUtils.import("chrome://enigmail/content/modules/key.jsm").EnigmailKey; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailOS = ChromeUtils.import("chrome://enigmail/content/modules/os.jsm").EnigmailOS; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailExecution = ChromeUtils.import("chrome://enigmail/content/modules/execution.jsm").EnigmailExecution; +const EnigmailGpgAgent = ChromeUtils.import("chrome://enigmail/content/modules/gpgAgent.jsm").EnigmailGpgAgent; +const EnigmailGpg = ChromeUtils.import("chrome://enigmail/content/modules/gpg.jsm").EnigmailGpg; +const EnigmailKeyRing = ChromeUtils.import("chrome://enigmail/content/modules/keyRing.jsm").EnigmailKeyRing; +const EnigmailErrorHandling = ChromeUtils.import("chrome://enigmail/content/modules/errorHandling.jsm").EnigmailErrorHandling; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; const GET_BOOL = "GET_BOOL"; const GET_LINE = "GET_LINE"; @@ -405,6 +404,7 @@ EnigmailKeyRing.updateKeys([keyId]); callbackFunc(returnCode, errorMsg); }); + }, genRevokeCert: function(parent, keyId, outFile, reasonCode, reasonText, callbackFunc) { diff -Nru enigmail-2.0.12+ds1/package/keyObj.jsm enigmail-2.1.3+ds1/package/keyObj.jsm --- enigmail-2.0.12+ds1/package/keyObj.jsm 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/keyObj.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,500 @@ +/* + * 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"; + +var EXPORTED_SYMBOLS = ["newEnigmailKeyObj"]; + + +/** + This module implements the EnigmailKeyObj class with the following members: + + - keyId - 16 digits (8-byte) public key ID (/not/ preceeded with 0x) + - userId - main user ID + - fpr - fingerprint + - fprFormatted - a formatted version of the fingerprint followin the scheme .... .... .... + - expiry - Expiry date as printable string + - expiryTime - Expiry time as seconds after 01/01/1970 + - created - Key creation date as printable string + - keyCreated - Key creation date/time as number + - keyTrust - key trust code as provided by GnuPG (calculated key validity) + - keyUseFor - key usage type as provided by GnuPG (key capabilities) + - ownerTrust - owner trust as provided by GnuPG + - photoAvailable - [Boolean] true if photo is available + - secretAvailable - [Boolean] true if secret key is available + - algoSym - public key algorithm type (String, e.g. RSA) + - keySize - size of public key + - type - "pub" or "grp" + - userIds - [Array]: - Contains ALL UIDs (including the primary UID) + * userId - User ID + * keyTrust - trust level of user ID + * uidFpr - fingerprint of the user ID + * type - one of "uid" (regular user ID), "uat" (photo) + * uatNum - photo number (starting with 0 for each key) + - subKeys - [Array]: + * keyId - subkey ID (16 digits (8-byte)) + * expiry - Expiry date as printable string + * expiryTime - Expiry time as seconds after 01/01/1970 + * created - Subkey creation date as printable string + * keyCreated - Subkey creation date/time as number + * keyTrust - key trust code as provided by GnuPG + * keyUseFor - key usage type as provided by GnuPG + * algoSym - subkey algorithm type (String, e.g. RSA) + * keySize - subkey size + * type - "sub" + + - signatures - [Array]: list of signature objects + * userId + * uidLabel + * created + * fpr + * sigList: Array of object: { userId, created, signerKeyId, sigType, sigKnown } + - methods: + * hasSubUserIds + * getKeyExpiry + * getEncryptionValidity + * getSigningValidity + * getPubKeyValidity + * clone + * getMinimalPubKey + * getVirtualKeySize +*/ + +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailKey = ChromeUtils.import("chrome://enigmail/content/modules/key.jsm").EnigmailKey; +const EnigmailFuncs = ChromeUtils.import("chrome://enigmail/content/modules/funcs.jsm").EnigmailFuncs; +const EnigmailTime = ChromeUtils.import("chrome://enigmail/content/modules/time.jsm").EnigmailTime; +const EnigmailCryptoAPI = ChromeUtils.import("chrome://enigmail/content/modules/cryptoAPI.jsm").EnigmailCryptoAPI; + +function newEnigmailKeyObj(keyData) { + return new EnigmailKeyObj(keyData); +} + +class EnigmailKeyObj { + constructor(keyData) { + this.keyId = ""; + this.expiry = ""; + this.expiryTime = 0; + this.created = ""; + this.keyTrust = ""; + this.keyUseFor = ""; + this.ownerTrust = ""; + this.algoSym = ""; + this.keySize = ""; + this.userId = ""; + this.userIds = []; + this.subKeys = []; + this.fpr = ""; + this.minimalKeyBlock = []; + this.photoAvailable = false; + this.secretAvailable = false; + this._sigList = null; + + this.type = keyData.type; + if ("keyId" in keyData) this.keyId = keyData.keyId; + if ("expiryTime" in keyData) { + this.expiryTime = keyData.expiryTime; + this.expiry = EnigmailTime.getDateTime(keyData.expiryTime, true, false); + } + + const ATTRS = [ + "created", "keyCreated", "keyTrust", "keyUseFor", "ownerTrust", "algoSym", "keySize", + "userIds", "subKeys", "fpr", "secretAvailable", "photoAvailable", "userId" + ]; + for (let i of ATTRS) { + if (i in keyData) { + this[i] = keyData[i]; + } + } + } + + /** + * gettter that returns a list of all signatures found on the key + * + * @return Array of Object, or null in case of error: + * - uid + * - uidLabel + * - creationDate + * - sigList: Array of object: { uid, creationDate, signerKeyId, sigType } + */ + get signatures() { + if (this._sigList === null) { + const cApi = EnigmailCryptoAPI(); + this._sigList = cApi.sync(cApi.getKeySignatures(this.keyId)); + } + + return this._sigList; + } + + /** + * create a copy of the object + */ + clone() { + let cp = new EnigmailKeyObj(["copy"]); + for (let i in this) { + if (i !== "signatures" && i !== "fprFormatted") { + // caution: don't try to evaluate this[i] if i==="signatures"; + // it would immediately get all signatures for the key (slow!) + if (typeof this[i] !== "function") { + if (typeof this[i] === "object") { + cp[i] = EnigmailFuncs.cloneObj(this[i]); + } else + cp[i] = this[i]; + } + } + } + + return cp; + } + + /** + * Does the key have secondary user IDs? + * + * @return: Boolean - true if yes; false if no + */ + hasSubUserIds() { + let nUid = 0; + for (let i in this.userIds) { + if (this.userIds[i].type === "uid") ++nUid; + } + + return nUid >= 2; + } + + /** + * Get a formatted version of the fingerprint: + * 1234 5678 90AB CDEF .... .... + * + * @return String - the formatted fingerprint + */ + get fprFormatted() { + let f = EnigmailKey.formatFpr(this.fpr); + if (f.length === 0) f = this.fpr; + return f; + } + + /** + * Is the function to set owner trust available for the key? + * Requirements: The key is signed with at least medium validity level, + * or the secret key is available. + * + * @return Boolean true if yes + */ + isOwnerTrustUseful() { + if (this.secretAvailable) return true; + if (this.keyTrust.search(/^[fu]/) === 0) return true; + + return false; + } + + /** + * Determine if the public key is valid. If not, return a description why it's not + * + * @return Object: + * - keyValid: Boolean (true if key is valid) + * - reason: String (explanation of invalidity) + */ + getPubKeyValidity() { + let retVal = { + keyValid: false, + reason: "" + }; + if (this.keyTrust.search(/r/i) >= 0) { + // public key revoked + retVal.reason = EnigmailLocale.getString("keyRing.pubKeyRevoked", [this.userId, "0x" + this.keyId]); + } else if (this.keyTrust.search(/e/i) >= 0) { + // public key expired + retVal.reason = EnigmailLocale.getString("keyRing.pubKeyExpired", [this.userId, "0x" + this.keyId]); + } else if (this.keyTrust.search(/d/i) >= 0 || this.keyUseFor.search(/D/i) >= 0) { + // public key disabled + retVal.reason = EnigmailLocale.getString("keyRing.keyDisabled", [this.userId, "0x" + this.keyId]); + } else if (this.keyTrust.search(/i/i) >= 0) { + // public key invalid + retVal.reason = EnigmailLocale.getString("keyRing.keyInvalid", [this.userId, "0x" + this.keyId]); + } else + retVal.keyValid = true; + + return retVal; + } + + + /** + * Check whether a key can be used for signing and return a description of why not + * + * @return Object: + * - keyValid: Boolean (true if key is valid) + * - reason: String (explanation of invalidity) + */ + getSigningValidity() { + let retVal = this.getPubKeyValidity(); + + if (!retVal.keyValid) return retVal; + + if (!this.secretAvailable) { + retVal.reason = EnigmailLocale.getString("keyRing.noSecretKey", [this.userId, "0x" + this.keyId]); + retVal.keyValid = false; + } else if (this.keyUseFor.search(/S/) < 0) { + retVal.keyValid = false; + + if (this.keyTrust.search(/u/i) < 0) { + // public key invalid + retVal.reason = EnigmailLocale.getString("keyRing.keyNotTrusted", [this.userId, "0x" + this.keyId]); + } else { + let expired = 0, + revoked = 0, + unusable = 0, + found = 0; + // public key is valid; check for signing subkeys + for (let sk in this.subKeys) { + if (this.subKeys[sk].keyUseFor.search(/[sS]/) >= 0) { + // found subkey usable for signing + ++found; + if (this.subKeys[sk].keyTrust.search(/e/i) >= 0) ++expired; + if (this.subKeys[sk].keyTrust.search(/r/i) >= 0) ++revoked; + if (this.subKeys[sk].keyTrust.search(/[di-]/i) >= 0 || this.subKeys[sk].keyUseFor.search(/D/) >= 0) ++unusable; + } + } + + if (found > 0 && (expired > 0 || revoked > 0)) { + if (found === expired) { + retVal.reason = EnigmailLocale.getString("keyRing.signSubKeysExpired", [this.userId, "0x" + this.keyId]); + } else if (found === revoked) { + retVal.reason = EnigmailLocale.getString("keyRing.signSubKeysRevoked", [this.userId, "0x" + this.keyId]); + } else { + retVal.reason = EnigmailLocale.getString("keyRing.signSubKeysUnusable", [this.userId, "0x" + this.keyId]); + } + } else + retVal.reason = EnigmailLocale.getString("keyRing.pubKeyNotForSigning", [this.userId, "0x" + this.keyId]); + } + } + + return retVal; + } + + /** + * Check whether a key can be used for encryption and return a description of why not + * + * @return Object: + * - keyValid: Boolean (true if key is valid) + * - reason: String (explanation of invalidity) + */ + getEncryptionValidity() { + let retVal = this.getPubKeyValidity(); + + if (!retVal.keyValid) return retVal; + + if (this.keyUseFor.search(/E/) < 0) { + retVal.keyValid = false; + + if (this.keyTrust.search(/u/i) < 0) { + // public key invalid + retVal.reason = EnigmailLocale.getString("keyRing.keyInvalid", [this.userId, "0x" + this.keyId]); + } else { + let expired = 0, + revoked = 0, + unusable = 0, + found = 0; + // public key is valid; check for encryption subkeys + + for (let sk in this.subKeys) { + if (this.subKeys[sk].keyUseFor.search(/[eE]/) >= 0) { + // found subkey usable for signing + ++found; + if (this.subKeys[sk].keyTrust.search(/e/i) >= 0) ++expired; + if (this.subKeys[sk].keyTrust.search(/r/i) >= 0) ++revoked; + if (this.subKeys[sk].keyTrust.search(/[di-]/i) >= 0 || this.subKeys[sk].keyUseFor.search(/D/) >= 0) ++unusable; + } + } + + if (found > 0 && (expired > 0 || revoked > 0)) { + if (found === expired) { + retVal.reason = EnigmailLocale.getString("keyRing.encSubKeysExpired", [this.userId, "0x" + this.keyId]); + } else if (found === revoked) { + retVal.reason = EnigmailLocale.getString("keyRing.encSubKeysRevoked", [this.userId, "0x" + this.keyId]); + } else { + retVal.reason = EnigmailLocale.getString("keyRing.encSubKeysUnusable", [this.userId, "0x" + this.keyId]); + } + } else + retVal.reason = EnigmailLocale.getString("keyRing.pubKeyNotForEncryption", [this.userId, "0x" + this.keyId]); + } + } + + return retVal; + } + + /** + * Determine the next expiry date of the key. This is either the public key expiry date, + * or the maximum expiry date of a signing or encryption subkey. I.e. this returns the next + * date at which the key cannot be used for signing and/or encryption anymore + * + * @return Number - The expiry date as seconds after 01/01/1970 + */ + getKeyExpiry() { + let expiryDate = Number.MAX_VALUE; + let encryption = -1; + let signing = -1; + + + // check public key expiry date + if (this.expiryTime > 0) { + expiryDate = this.expiryTime; + } + + for (let sk in this.subKeys) { + if (this.subKeys[sk].keyUseFor.search(/[eE]/) >= 0) { + let expiry = this.subKeys[sk].expiryTime; + if (expiry === 0) expiry = Number.MAX_VALUE; + encryption = Math.max(encryption, expiry); + } else if (this.subKeys[sk].keyUseFor.search(/[sS]/) >= 0) { + let expiry = this.subKeys[sk].expiryTime; + if (expiry === 0) expiry = Number.MAX_VALUE; + signing = Math.max(signing, expiry); + } + } + + if (expiryDate > encryption) { + if (this.keyUseFor.search(/[eE]/) < 0) { + expiryDate = encryption; + } + } + + if (expiryDate > signing) { + if (this.keyUseFor.search(/[Ss]/) < 0) { + expiryDate = signing; + } + } + + return expiryDate; + } + + /** + * Export the minimum key for the public key object: + * public key, desired UID, newest signing/encryption subkey + * + * @param {String} emailAddr: [optional] email address of UID to extract. Use primary UID if null . + * + * @return Object: + * - exitCode (0 = success) + * - errorMsg (if exitCode != 0) + * - keyData: BASE64-encded string of key data + */ + + getMinimalPubKey(emailAddr) { + EnigmailLog.DEBUG("keyObj.jsm: EnigmailKeyObj.getMinimalPubKey: " + this.keyId + "\n"); + + if (emailAddr) { + try { + emailAddr = EnigmailFuncs.stripEmail(emailAddr.toLowerCase()); + } catch (x) { + emailAddr = emailAddr.toLowerCase(); + } + + + let foundUid = false, + uid = ""; + for (let i in this.userIds) { + try { + uid = EnigmailFuncs.stripEmail(this.userIds[i].userId.toLowerCase()); + } catch (x) { + uid = this.userIds[i].userId.toLowerCase(); + } + + if (uid == emailAddr) { + foundUid = true; + break; + } + } + if (!foundUid) emailAddr = false; + } + + if (!emailAddr) { + emailAddr = this.userId; + } + + try { + emailAddr = EnigmailFuncs.stripEmail(emailAddr.toLowerCase()); + } catch (x) { + emailAddr = emailAddr.toLowerCase(); + } + + let newestSigningKey = 0, + newestEncryptionKey = 0, + subkeysArr = null; + + // search for valid subkeys + for (let sk in this.subKeys) { + if ("indDre".indexOf(this.subKeys[sk].keyTrust) < 0) { + if (this.subKeys[sk].keyUseFor.search(/[sS]/) >= 0) { + // found signing subkey + if (this.subKeys[sk].keyCreated > newestSigningKey) newestSigningKey = this.subKeys[sk].keyCreated; + } + if (this.subKeys[sk].keyUseFor.search(/[eE]/) >= 0) { + // found encryption subkey + if (this.subKeys[sk].keyCreated > newestEncryptionKey) newestEncryptionKey = this.subKeys[sk].keyCreated; + } + } + } + + if (newestSigningKey > 0 && newestEncryptionKey > 0) { + subkeysArr = [newestEncryptionKey, newestSigningKey]; + } + + if (!(emailAddr in this.minimalKeyBlock)) { + const cApi = EnigmailCryptoAPI(); + this.minimalKeyBlock[emailAddr] = cApi.sync(cApi.getMinimalPubKey(this.fpr, emailAddr, subkeysArr)); + } + return this.minimalKeyBlock[emailAddr]; + } + + /** + * Obtain a "virtual" key size that allows to compare different algorithms with each other + * e.g. elliptic curve keys have small key sizes with high cryptographic strength + * + * + * @return Number: a virtual size + */ + getVirtualKeySize() { + EnigmailLog.DEBUG("keyObj.jsm: EnigmailKeyObj.getVirtualKeySize: " + this.keyId + "\n"); + + switch (this.algoSym) { + case "DSA": + return this.keySize / 2; + case "ECDSA": + return this.keySize * 8; + case "EDDSA": + return this.keySize * 32; + default: + return this.keySize; + } + } + + + /** + * Get a file object holding the photo of a key + * + * @param {Number} photoNumber: number of the photo on the key, starting with 0 + * + * @return {nsIFile} object or null in case no data / error. + */ + getPhotoFile(photoNumber) { + const cApi = EnigmailCryptoAPI(); + return cApi.sync(cApi.getPhotoFile(this.fpr, photoNumber)); + } + + /** + * @param {Boolean} minimalKey if true, reduce key to minimum required + * + * @return {Object}: + * - {Number} exitCode: result code (0: OK) + * - {String} keyData: ASCII armored key data material + * - {String} errorMsg: error message in case exitCode !== 0 + */ + getSecretKey(minimalKey) { + const cApi = EnigmailCryptoAPI(); + return cApi.sync(cApi.extractSecretKey(this.fpr, minimalKey)); + } +} \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/keyRefreshService.jsm enigmail-2.1.3+ds1/package/keyRefreshService.jsm --- enigmail-2.0.12+ds1/package/keyRefreshService.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/keyRefreshService.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 @@ -9,17 +8,18 @@ const EXPORTED_SYMBOLS = ["EnigmailKeyRefreshService"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ -Cu.import("resource://enigmail/rng.jsm"); /*global EnigmailRNG: false */ -Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -Cu.import("resource://enigmail/keyserver.jsm"); /*global EnigmailKeyServer: false */ -Cu.import("resource://enigmail/keyserverUris.jsm"); /*global EnigmailKeyserverURIs: false */ + + + +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailKeyRing = ChromeUtils.import("chrome://enigmail/content/modules/keyRing.jsm").EnigmailKeyRing; +const EnigmailRNG = ChromeUtils.import("chrome://enigmail/content/modules/rng.jsm").EnigmailRNG; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailKeyServer = ChromeUtils.import("chrome://enigmail/content/modules/keyserver.jsm").EnigmailKeyServer; +const EnigmailKeyserverURIs = ChromeUtils.import("chrome://enigmail/content/modules/keyserverUris.jsm").EnigmailKeyserverURIs; + +const IOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1"; const ONE_HOUR_IN_MILLISEC = 60 * 60 * 1000; let gTimer = null; @@ -93,17 +93,27 @@ function refreshKeyIfReady(keyserver, readyToRefresh, keyId) { if (readyToRefresh) { EnigmailLog.DEBUG("keyRefreshService.jsm: refreshing key ID " + keyId + "\n"); - keyserver.refresh(keyId); + return keyserver.download(keyId); + } + else { + return Promise.resolve(0); } } -function refreshWith(keyserver, timer, readyToRefresh) { +async function refreshWith(keyserver, timer, readyToRefresh) { const keyId = getRandomKeyId(EnigmailRNG.generateRandomUint32()); const keyIdsExist = keyId !== null; const validKeyserversExist = EnigmailKeyserverURIs.validKeyserversExist(); + const ioService = Cc[IOSERVICE_CONTRACTID].getService(Ci.nsIIOService); if (keyIdsExist && validKeyserversExist) { - refreshKeyIfReady(keyserver, readyToRefresh, keyId); + if (ioService && (!ioService.offline)) { + // don't try to refresh if we are offline + await refreshKeyIfReady(keyserver, readyToRefresh, keyId); + } + else { + EnigmailLog.DEBUG("keyRefreshService.jsm: offline - not refreshing any key\n"); + } const waitTime = calculateWaitTimeInMilliseconds(EnigmailKeyRing.getAllKeys().keyList.length); setupNextRefresh(timer, waitTime); } diff -Nru enigmail-2.0.12+ds1/package/keyRing.jsm enigmail-2.1.3+ds1/package/keyRing.jsm --- enigmail-2.0.12+ds1/package/keyRing.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/keyRing.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*global Components: false, btoa: 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 @@ -9,74 +8,30 @@ var EXPORTED_SYMBOLS = ["EnigmailKeyRing"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ -Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ -Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ -Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ -Cu.import("resource://enigmail/trust.jsm"); /*global EnigmailTrust: false */ -Cu.import("resource://enigmail/armor.jsm"); /*global EnigmailArmor: false */ -Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ -Cu.import("resource://enigmail/time.jsm"); /*global EnigmailTime: false */ -Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ -Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ -Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ -Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ -Cu.import("resource://enigmail/key.jsm"); /*global EnigmailKey: false */ -Cu.import("resource://enigmail/timer.jsm"); /*global EnigmailTimer: false */ -Cu.import("resource://gre/modules/Services.jsm"); /* global Services: false */ -Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailExecution = ChromeUtils.import("chrome://enigmail/content/modules/execution.jsm").EnigmailExecution; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailGpg = ChromeUtils.import("chrome://enigmail/content/modules/gpg.jsm").EnigmailGpg; +const EnigmailTrust = ChromeUtils.import("chrome://enigmail/content/modules/trust.jsm").EnigmailTrust; +const EnigmailArmor = ChromeUtils.import("chrome://enigmail/content/modules/armor.jsm").EnigmailArmor; +const EnigmailTime = ChromeUtils.import("chrome://enigmail/content/modules/time.jsm").EnigmailTime; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const subprocess = ChromeUtils.import("chrome://enigmail/content/modules/subprocess.jsm").subprocess; +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; +const newEnigmailKeyObj = ChromeUtils.import("chrome://enigmail/content/modules/keyObj.jsm").newEnigmailKeyObj; +const EnigmailTimer = ChromeUtils.import("chrome://enigmail/content/modules/timer.jsm").EnigmailTimer; +const Services = ChromeUtils.import("resource://gre/modules/Services.jsm").Services; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; +const EnigmailCryptoAPI = ChromeUtils.import("chrome://enigmail/content/modules/cryptoAPI.jsm").EnigmailCryptoAPI; + const getDialog = EnigmailLazy.loader("enigmail/dialog.jsm", "EnigmailDialog"); const getWindows = EnigmailLazy.loader("enigmail/windows.jsm", "EnigmailWindows"); const getKeyUsability = EnigmailLazy.loader("enigmail/keyUsability.jsm", "EnigmailKeyUsability"); -const getOpenPGP = EnigmailLazy.loader("enigmail/openpgp.jsm", "EnigmailOpenPGP"); - -const NS_RDONLY = 0x01; -const NS_WRONLY = 0x02; -const NS_CREATE_FILE = 0x08; -const NS_TRUNCATE = 0x20; -const DEFAULT_FILE_PERMS = 0x180; // equals 0600 - -const NS_LOCALFILEOUTPUTSTREAM_CONTRACTID = "@mozilla.org/network/file-output-stream;1"; - -// field ID's of key list (as described in the doc/DETAILS file in the GnuPG distribution) -const ENTRY_ID = 0; -const KEY_TRUST_ID = 1; -const KEY_SIZE_ID = 2; -const KEY_ALGO_ID = 3; -const KEY_ID = 4; -const CREATED_ID = 5; -const EXPIRY_ID = 6; -const UID_ID = 7; -const OWNERTRUST_ID = 8; -const USERID_ID = 9; -const SIG_TYPE_ID = 10; -const KEY_USE_FOR_ID = 11; - -const UNKNOWN_SIGNATURE = "[User ID not found]"; - -const KEYTYPE_DSA = 1; -const KEYTYPE_RSA = 2; -const KEYTYPE_ECC = 3; - -const ALGO_SYMBOL = { - 1: "RSA", - 2: "RSA", - 3: "RSA", - 16: "ELG", - 17: "DSA", - 18: "ECDH", - 19: "ECDSA", - 20: "ELG", - 22: "EDDSA" -}; +const DEFAULT_FILE_PERMS = 0o600; let gKeygenProcess = null; let gKeyListObj = null; @@ -89,56 +44,7 @@ This module operates with a Key Store (array) containing objects with the following properties: - * keyList [Array] of |KeyObject|: - - keyId - 16 digits (8-byte) public key ID (/not/ preceeded with 0x) - - userId - main user ID - - fpr - fingerprint - - fprFormatted - a formatted version of the fingerprint followin the scheme .... .... .... - - expiry - Expiry date as printable string - - expiryTime - Expiry time as seconds after 01/01/1970 - - created - Key creation date as printable string - - keyTrust - key trust code as provided by GnuPG (calculated key validity) - - keyUseFor - key usage type as provided by GnuPG (key capabilities) - - ownerTrust - owner trust as provided by GnuPG - - photoAvailable - [Boolean] true if photo is available - - secretAvailable - [Boolean] true if secret key is available - - algorithm - public key algorithm type (number) - - algoSym - public key algorithm type (String, e.g. RSA) - - keySize - size of public key - - type - "pub" or "grp" - - userIds - [Array]: - Contains ALL UIDs (including the primary UID) - * userId - User ID - * keyTrust - trust level of user ID - * uidFpr - fingerprint of the user ID - * type - one of "uid" (regular user ID), "uat" (photo) - * uatNum - photo number (starting with 0 for each key) - - subKeys - [Array]: - * keyId - subkey ID (16 digits (8-byte)) - * expiry - Expiry date as printable string - * expiryTime - Expiry time as seconds after 01/01/1970 - * created - Key creation date as printable string - * keyTrust - key trust code as provided by GnuPG - * keyUseFor - key usage type as provided by GnuPG - * algorithm - subkey algorithm type (number) - * algoSym - subkey algorithm type (String, e.g. RSA) - * keySize - subkey size - * type - "sub" - - - signatures - [Array]: list of signature objects - * userId - * uidLabel - * created - * fpr - * sigList: Array of object: { userId, created, signerKeyId, sigType, sigKnown } - - methods: - * hasSubUserIds - * getKeyExpiry - * getEncryptionValidity - * getSigningValidity - * getPubKeyValidity - * clone - * getMinimalPubKey - * getVirtualKeySize + * keyList [Array] of EnigmailKeyObj * keySortList [Array]: used for quickly sorting the keys - userId (in lower case) @@ -194,7 +100,7 @@ **/ getAllSecretKeys: function(onlyValidKeys = false) { - this.getAllKeys(); // ensure keylist is loaded; + EnigmailLog.DEBUG("keyRing.jsm: getAllSecretKeys()\n"); let res = []; @@ -240,6 +146,8 @@ EnigmailLog.DEBUG("keyRing.jsm: getKeyById: " + keyId + "\n"); let s; + if (!keyId) return null; + if (keyId.search(/^0x/) === 0) { keyId = keyId.substr(2); } @@ -375,107 +283,25 @@ importKeyFromFile: function(inputFile, errorMsgObj, importedKeysObj) { EnigmailLog.DEBUG("keyRing.jsm: EnigmailKeyRing.importKeyFromFile: fileName=" + inputFile.path + "\n"); - var command = EnigmailGpg.agentPath; - var args = EnigmailGpg.getStandardArgs(false).concat(["--no-tty", "--batch", "--no-verbose", "--status-fd", "2", "--no-auto-check-trustdb", "--import"]); - importedKeysObj.value = ""; - - var fileName = EnigmailFiles.getEscapedFilename((inputFile.QueryInterface(Ci.nsIFile)).path); - - args.push(fileName); - - var statusFlagsObj = {}; - var statusMsgObj = {}; - var exitCodeObj = {}; - - var output = EnigmailExecution.execCmd(command, args, "", exitCodeObj, statusFlagsObj, statusMsgObj, errorMsgObj); - EnigmailLog.DEBUG("keyRing.jsm: EnigmailKeyRing.importKeyFromFile: error=" + errorMsgObj.value + "\n"); - - var statusMsg = statusMsgObj.value; - - var keyList = []; - let importedKeys = []; - let importSum = 0; - let importUnchanged = 0; - - // IMPORT_RES 0 - // - if (statusMsg) { - let import_res = statusMsg.match(/^IMPORT_RES ([0-9]+) ([0-9]+) ([0-9]+) 0 ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)/m); - - if (import_res !== null) { - let secCount = parseInt(import_res[9], 10); // number of secret keys found - let secImported = parseInt(import_res[10], 10); // number of secret keys imported - let secDups = parseInt(import_res[11], 10); // number of secret keys already on the keyring - - if (secCount !== secImported + secDups) { - EnigmailKeyRing.clearCache(); - errorMsgObj.value = "Error during import of secret key (probably a GnuPG bug)."; - return 1; - } - - // Normal - importSum = parseInt(import_res[1], 10); - importUnchanged = parseInt(import_res[4], 10); - exitCodeObj.value = 0; - var statusLines = statusMsg.split(/\r?\n/); - for (let j = 0; j < statusLines.length; j++) { - var matches = statusLines[j].match(/IMPORT_OK ([0-9]+) (\w+)/); - if (matches && (matches.length > 2)) { - if (typeof (keyList[matches[2]]) != "undefined") { - keyList[matches[2]] |= Number(matches[1]); - } - else - keyList[matches[2]] = Number(matches[1]); - - importedKeys.push(matches[2]); - EnigmailLog.DEBUG("keyRing.jsm: EnigmailKeyRing.importKeyFromFile: imported " + matches[2] + ":" + matches[1] + "\n"); - } - } - - for (let j in keyList) { - importedKeysObj.value += j + ":" + keyList[j] + ";"; - } - } + const cApi = EnigmailCryptoAPI(); + let res = cApi.sync(cApi.importKeyFromFile(inputFile)); + if (importedKeysObj) { + importedKeysObj.value = res.importedKeys.join(";"); } - if (importedKeys.length > 0) { - EnigmailKeyRing.updateKeys(importedKeys); + if (!res) return 1; + + if (res.importedKeys.length > 0) { + EnigmailKeyRing.updateKeys(res.importedKeys); } - else if (importSum > importUnchanged) { + else if (res.importSum > res.importUnchanged) { EnigmailKeyRing.clearCache(); } - return exitCodeObj.value; + return res.exitCode; }, - /** - * Get groups defined in gpg.conf in the same structure as KeyObject - * - * @return Array of KeyObject, with type = "grp" - */ - getGroups: function() { - let groups = EnigmailGpg.getGpgGroups(); - - let r = []; - for (var i = 0; i < groups.length; i++) { - - let keyObj = new KeyObject(["grp"]); - keyObj.keyTrust = "g"; - keyObj.userId = EnigmailData.convertGpgToUnicode(groups[i].alias).replace(/\\e3A/g, ":"); - keyObj.keyId = keyObj.userId; - var grpMembers = EnigmailData.convertGpgToUnicode(groups[i].keylist).replace(/\\e3A/g, ":").split(/[,;]/); - for (var grpIdx = 0; grpIdx < grpMembers.length; grpIdx++) { - keyObj.userIds.push({ - userId: grpMembers[grpIdx], - keyTrust: "q" - }); - } - r.push(keyObj); - } - - return r; - }, /** * empty the key cache, such that it will get loaded next time it is accessed @@ -535,7 +361,7 @@ else if (thisTrust === maxTrustLevel) { r.push(keyObj.userIds[i].userId); } - // else do not add uid + // else do not add uid } else if (!EnigmailTrust.isInvalid(keyObj.userIds[i].keyTrust) || !hideInvalidUid) { // UID valid OR key not valid, but invalid keys allowed @@ -587,11 +413,32 @@ } if (includeSecretKey) { - const secKeyBlock = this.extractSecretKey(false, userId, exitCodeObj, cmdErrorMsgObj); - if (keyBlock.substr(-1, 1).search(/[\r\n]/) < 0) { - keyBlock += "\n"; + + let keyList; + if (userId) { + keyList = userId.split(/[ ,\t]+/); + } + else { + keyList = this.getAllSecretKeys().map(keyObj => { + return keyObj.keyId; + }); } - keyBlock += secKeyBlock; + let secKeyBlock = keyList.map(uid => { + let keyObj = EnigmailKeyRing.getKeyById(uid); + if (keyObj) return keyObj.getSecretKey(false).keyData; + + let k = EnigmailKeyRing.getKeysByUserId(uid); + if (k && k.length > 0) { + return k.map(keyObj => { + return keyObj.getSecretKey(false).keyData; + }).join("\n"); + } + else { + return ""; + } + }).join("\n"); + + keyBlock += "\n" + secKeyBlock; } if (outputFile) { @@ -605,55 +452,6 @@ }, /** - * Export secret key(s) to a file - * - * @param minimalKey Boolean - if true, reduce key to minimum required - * @param userId String - space or comma separated list of keys to export. Specification by - * key ID, fingerprint, or userId - * @param exitCodeObj Object - o.value will contain exit code - * @param errorMsgObj Object - o.value will contain error message from GnuPG - * - * @return String - */ - extractSecretKey: function(minimalKey, userId, exitCodeObj, errorMsgObj) { - let args = EnigmailGpg.getStandardArgs(true); - - if (minimalKey) { - args.push("--export-options"); - args.push("export-minimal,no-export-attributes"); - } - - args.push("-a"); - args.push("--export-secret-keys"); - - if (userId) { - args = args.concat(userId.split(/[ ,\t]+/)); - } - - let cmdErrorMsgObj = {}; - const secKeyBlock = EnigmailExecution.execCmd(EnigmailGpg.agentPath, args, "", exitCodeObj, {}, {}, cmdErrorMsgObj); - - if (secKeyBlock) { - exitCodeObj.value = 0; - } - else { - exitCodeObj.value = -1; - } - - if (exitCodeObj.value !== 0) { - errorMsgObj.value = EnigmailLocale.getString("failKeyExtract"); - if (cmdErrorMsgObj.value) { - errorMsgObj.value += "\n" + EnigmailFiles.formatCmdLine(EnigmailGpg.agentPath, args); - errorMsgObj.value += "\n" + cmdErrorMsgObj.value; - } - - return ""; - } - - return secKeyBlock; - }, - - /** * Export the ownertrust database from GnuPG * @param outputFile String or nsIFile - output file name or Object - or NULL * @param exitCodeObj Object - o.value will contain exit code @@ -691,12 +489,35 @@ try { let trustData = EnigmailFiles.readFile(inputFile); EnigmailExecution.execCmd(EnigmailGpg.agentPath, args, trustData, exitCodeObj, {}, {}, errorMsgObj); - } catch (ex) {} + } + catch (ex) {} return exitCodeObj.value; }, /** + * import key from provided key data (synchronous) + * + * @param parent nsIWindow + * @param isInteractive Boolean - if true, display confirmation dialog + * @param keyBlock String - data containing key + * @param keyId String - key ID expected to import (no meaning) + * @param errorMsgObj Object - o.value will contain error message from GnuPG + * @param importedKeysObj Object - [OPTIONAL] o.value will contain an array of the FPRs imported + * @param minimizeKey Boolean - [OPTIONAL] minimize key for importing + * @param limitedUids Array - [OPTIONAL] restrict importing the key(s) to a given set of UIDs + * + * @return Integer - exit code: + * ExitCode == 0 => success + * ExitCode > 0 => error + * ExitCode == -1 => Cancelled by user + */ + importKey: function(parent, isInteractive, keyBlock, keyId, errorMsgObj, importedKeysObj, minimizeKey = false, limitedUids = []) { + const cApi = EnigmailCryptoAPI(); + return cApi.sync(this.importKeyAsync(parent, isInteractive, keyBlock, keyId, errorMsgObj, importedKeysObj, minimizeKey, limitedUids)); + }, + + /** * import key from provided key data * * @param parent nsIWindow @@ -704,15 +525,17 @@ * @param keyBlock String - data containing key * @param keyId String - key ID expected to import (no meaning) * @param errorMsgObj Object - o.value will contain error message from GnuPG - * @param importedKeysObj Object - [OPTIONAL] o.value will contain an array of the key FPRs imported + * @param importedKeysObj Object - [OPTIONAL] o.value will contain an array of the FPRs imported + * @param minimizeKey Boolean - [OPTIONAL] minimize key for importing + * @param limitedUids Array - [OPTIONAL] restrict importing the key(s) to a given set of UIDs * * @return Integer - exit code: * ExitCode == 0 => success * ExitCode > 0 => error * ExitCode == -1 => Cancelled by user */ - importKey: function(parent, isInteractive, keyBlock, keyId, errorMsgObj, importedKeysObj) { - EnigmailLog.DEBUG("keyRing.jsm: EnigmailKeyRing.importKey: id=" + keyId + ", " + isInteractive + "\n"); + importKeyAsync: async function(parent, isInteractive, keyBlock, keyId, errorMsgObj, importedKeysObj, minimizeKey = false, limitedUids = []) { + EnigmailLog.DEBUG(`keyRing.jsm: EnigmailKeyRing.importKeyAsync('${keyId}', ${isInteractive}, ${minimizeKey})\n`); const beginIndexObj = {}; const endIndexObj = {}; @@ -737,14 +560,24 @@ } } - const args = EnigmailGpg.getStandardArgs(false).concat(["--no-verbose", "--status-fd", "2", "--no-auto-check-trustdb", "--import"]); + let args = EnigmailGpg.getStandardArgs(false).concat(["--no-verbose", "--status-fd", "2"]); + if (minimizeKey) { + args = args.concat(["--import-options", "import-minimal"]); + } + + if (limitedUids.length > 0 && EnigmailGpg.getGpgFeature("export-specific-uid")) { + let filter = limitedUids.map(i => { + return `mbox =~ ${i}`; + }).join(" || "); - const exitCodeObj = {}; - const statusMsgObj = {}; + args.push("--import-filter"); + args.push(`keep-uid=${filter}`); + } + args = args.concat(["--no-auto-check-trustdb", "--import"]); - EnigmailExecution.execCmd(EnigmailGpg.agentPath, args, pgpBlock, exitCodeObj, {}, statusMsgObj, errorMsgObj); + const res = await EnigmailExecution.execAsync(EnigmailGpg.agentPath, args, pgpBlock); - const statusMsg = statusMsgObj.value; + const statusMsg = res.statusMsg; if (!importedKeysObj) { importedKeysObj = {}; @@ -762,7 +595,7 @@ if (secCount !== secImported + secDups) { EnigmailKeyRing.clearCache(); - errorMsgObj.value = "Error during import of secret key (probably a GnuPG bug)."; + errorMsgObj.value = EnigmailLocale.getString("import.secretKeyImportError"); return 1; } } @@ -788,98 +621,6 @@ return exitCode; }, - /** - * Extract a photo ID from a key, store it as file and return the file object. - * @keyId: String - Key ID - * @photoNumber: Number - number of the photo on the key, starting with 0 - * @exitCodeObj: Object - value holds exitCode (0 = success) - * @errorMsgObj: Object - value holds errorMsg - * - * @return: nsIFile object or null in case no data / error. - */ - getPhotoFile: function(keyId, photoNumber, exitCodeObj, errorMsgObj) { - EnigmailLog.DEBUG("keyRing.js: EnigmailKeyRing.getPhotoFile, keyId=" + keyId + " photoNumber=" + photoNumber + "\n"); - - const args = EnigmailGpg.getStandardArgs(false).concat(["--no-secmem-warning", "--no-verbose", "--no-auto-check-trustdb", - "--batch", "--no-tty", "--no-verbose", "--status-fd", "1", "--attribute-fd", "2", - "--fixed-list-mode", "--list-keys", keyId - ]); - - const photoDataObj = {}; - const outputTxt = EnigmailExecution.simpleExecCmd(EnigmailGpg.agentPath, args, exitCodeObj, photoDataObj); - - if (!outputTxt) { - exitCodeObj.value = -1; - return null; - } - - if (EnigmailOS.isDosLike && EnigmailGpg.getGpgFeature("windows-photoid-bug")) { - // workaround for error in gpg - photoDataObj.value = photoDataObj.value.replace(/\r\n/g, "\n"); - } - - // [GNUPG:] ATTRIBUTE A053069284158FC1E6770BDB57C9EB602B0717E2 2985 - let foundPicture = -1; - let skipData = 0; - let imgSize = -1; - const statusLines = outputTxt.split(/[\n\r+]/); - - for (let i = 0; i < statusLines.length; i++) { - const matches = statusLines[i].match(/\[GNUPG:\] ATTRIBUTE ([A-F\d]+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+)/); - if (matches && matches[3] == "1") { - // attribute is an image - foundPicture++; - if (foundPicture === photoNumber) { - imgSize = Number(matches[2]); - break; - } - else { - skipData += Number(matches[2]); - } - } - } - - if (foundPicture >= 0 && foundPicture === photoNumber) { - if (photoDataObj.value.search(/^gpg: /) === 0) { - // skip disturbing gpg output - let i = photoDataObj.value.search(/\n/) + 1; - skipData += i; - } - - const pictureData = photoDataObj.value.substr(16 + skipData, imgSize); - if (!pictureData.length) { - return null; - } - - try { - const flags = NS_WRONLY | NS_CREATE_FILE | NS_TRUNCATE; - const picFile = EnigmailFiles.getTempDirObj(); - - picFile.append(keyId + ".jpg"); - picFile.createUnique(picFile.NORMAL_FILE_TYPE, DEFAULT_FILE_PERMS); - - const fileStream = Cc[NS_LOCALFILEOUTPUTSTREAM_CONTRACTID].createInstance(Ci.nsIFileOutputStream); - fileStream.init(picFile, flags, DEFAULT_FILE_PERMS, 0); - if (fileStream.write(pictureData, pictureData.length) !== pictureData.length) { - fileStream.close(); - throw Components.results.NS_ERROR_FAILURE; - } - - fileStream.flush(); - fileStream.close(); - - // delete picFile upon exit - let extAppLauncher = Cc["@mozilla.org/mime;1"].getService(Ci.nsPIExternalAppLauncher); - extAppLauncher.deleteTemporaryFileOnExit(picFile); - return picFile; - } catch (ex) { - exitCodeObj.value = -1; - return null; - } - } - return null; - }, - isGeneratingKey: function() { return gKeygenProcess !== null; }, @@ -892,7 +633,7 @@ * @comment: String - email part of UID (<> will be added) * @expiryDate: Number - Unix timestamp of key expiry date; 0 if no expiry * @keyLength: Number - size of key in bytes (e.g 4096) - * @keyType: Number - 1 = DSA / 2 = RSA + * @keyType: String - RSA or ECC * @passphrase: String - password; null if no password * @listener: Object - { * function onDataAvailable(data) {...}, @@ -917,14 +658,11 @@ let inputData = "%echo Generating key\nKey-Type: "; switch (keyType) { - case KEYTYPE_DSA: - inputData += "DSA\nKey-Length: " + keyLength + "\nSubkey-Type: 16\nSubkey-Length: " + keyLength + "\n"; - break; - case KEYTYPE_RSA: + case "RSA": inputData += "RSA\nKey-Usage: sign,auth\nKey-Length: " + keyLength; inputData += "\nSubkey-Type: RSA\nSubkey-Usage: encrypt\nSubkey-Length: " + keyLength + "\n"; break; - case KEYTYPE_ECC: + case "ECC": inputData += "EDDSA\nKey-Curve: Ed25519\nKey-Usage: sign\n"; inputData += "Subkey-Type: ECDH\nSubkey-Curve: Curve25519\nSubkey-Usage: encrypt\n"; break; @@ -968,6 +706,13 @@ pipe.close(); }, stderr: function(data) { + // extract key ID + if (data.search(/^\[GNUPG:\] KEY_CREATED/m)) { + let m = data.match(/^(\[GNUPG:\] KEY_CREATED [BPS] )([^ \r\n\t]+)$/m); + if (m && m.length > 2) { + listener.keyId = "0x" + m[2]; + } + } listener.onDataAvailable(data); }, done: function(result) { @@ -977,11 +722,13 @@ EnigmailKeyRing.clearCache(); } listener.onStopRequest(result.exitCode); - } catch (ex) {} + } + catch (ex) {} }, mergeStderr: false }); - } catch (ex) { + } + catch (ex) { EnigmailLog.ERROR("keyRing.jsm: generateKey: subprocess.call failed with '" + ex.toString() + "'\n"); throw ex; } @@ -1151,16 +898,17 @@ /** * Determine the key ID for a set of given addresses * - * @param addresses: Array of String - email addresses - * @param minTrustLevel: String - f for Fully trusted keys / ? for any valid key - * @param details: Object - holds details for invalid keys: - * - errArray: { - * * addr: email addresses - * * msg: related error + * @param {Array} addresses: email addresses + * @param {String} minTrustLevel: f for Fully trusted keys / ? for any valid key + * @param {Object} details: holds details for invalid keys: + * - errArray: { + * * addr {String}: email addresses + * * msg {String}: related error * } - * @param resultingArray: Array of String - list of found key IDs + * - keyMap {Object}: map of email addr -> keyID + * @param {Array} resultingArray: list of found key IDs * - * @return Boolean: true if at least one key missing; false otherwise + * @return {Boolean}: true if at least one key missing; false otherwise */ getValidKeysForAllRecipients: function(addresses, minTrustLevel, details, resultingArray) { @@ -1170,22 +918,23 @@ let keyMissing = false; if (details) { details.errArray = []; + details.keyMap = {}; } for (let i = 0; i < addresses.length; i++) { let addr = addresses[i]; // try to find current address in key list: - var found = false; + let keyId = null; var errMsg = null; if (addr.indexOf('@') >= 0) { // try email match: var addrErrDetails = {}; - let keyId = this.getValidKeyForRecipient(addr, minTrustLevelIndex, addrErrDetails); + let foundKeyId = this.getValidKeyForRecipient(addr, minTrustLevelIndex, addrErrDetails); if (details && addrErrDetails.msg) { errMsg = addrErrDetails.msg; } - if (keyId) { - found = true; - resultingArray.push("0x" + keyId.toUpperCase()); + if (foundKeyId) { + keyId = "0x" + foundKeyId.toUpperCase(); + resultingArray.push(keyId); } } else { @@ -1195,12 +944,18 @@ if (keyObj) { // if found, check whether the trust level is enough if (TRUSTLEVELS_SORTED.indexOf(keyObj.keyTrust) >= minTrustLevelIndex) { - found = true; - resultingArray.push("0x" + keyObj.keyId.toUpperCase()); + keyId = "0x" + keyObj.keyId.toUpperCase(); + resultingArray.push(keyId); } } } - if (!found) { + + if (keyId) { + if (details) { + details.keyMap[addr.toLowerCase()] = keyId; + } + } + else { // no key for this address found keyMissing = true; if (details) { @@ -1264,87 +1019,6 @@ /************************ INTERNAL FUNCTIONS ************************/ -/** - * returns the output of --with-colons --list[-secret]-keys - */ -function getUserIdList(secretOnly, exitCodeObj, statusFlagsObj, errorMsgObj) { - - let args = EnigmailGpg.getStandardArgs(true); - - if (secretOnly) { - args = args.concat(["--with-fingerprint", "--fixed-list-mode", "--with-colons", "--list-secret-keys"]); - } - else { - args = args.concat(["--with-fingerprint", "--fixed-list-mode", "--with-colons", "--list-keys"]); - } - - statusFlagsObj.value = 0; - - const cmdErrorMsgObj = {}; - let listText = EnigmailExecution.execCmd(EnigmailGpg.agentPath, args, "", exitCodeObj, statusFlagsObj, {}, cmdErrorMsgObj); - - if (!(statusFlagsObj.value & EnigmailConstants.BAD_SIGNATURE)) { - // ignore exit code as recommended by GnuPG authors - exitCodeObj.value = 0; - } - - if (exitCodeObj.value !== 0) { - errorMsgObj.value = EnigmailLocale.getString("badCommand"); - if (cmdErrorMsgObj.value) { - errorMsgObj.value += "\n" + EnigmailFiles.formatCmdLine(EnigmailGpg.agentPath, args); - errorMsgObj.value += "\n" + cmdErrorMsgObj.value; - } - - return ""; - } - - listText = listText.replace(/(\r\n|\r)/g, "\n"); - - return listText; -} - -/** - * Get key list from GnuPG. If the keys may be pre-cached already - * - * @param win - Object : parent window for displaying error messages - * @param secretOnly - Boolean : true: get secret keys / false: get public keys - * @param onlyKeys - Array of String: only load data for specified key IDs - * - * @return Promise(Array of : separated key list entries as specified in GnuPG doc/DETAILS) - */ -function obtainKeyList(win, secretOnly, onlyKeys = null) { - return new Promise((resolve, reject) => { - EnigmailLog.DEBUG("keyRing.jsm: obtainKeyList\n"); - - let args = EnigmailGpg.getStandardArgs(true); - - if (secretOnly) { - args = args.concat(["--with-fingerprint", "--fixed-list-mode", "--with-colons", "--list-secret-keys"]); - } - else { - args = args.concat(["--with-fingerprint", "--fixed-list-mode", "--with-colons", "--list-keys"]); - } - - if (onlyKeys) { - args = args.concat(onlyKeys); - } - - let statusFlagsObj = {}; - let keyListStr = ""; - let listener = { - stdout: data => { - keyListStr += data; - }, - stderr: data => { - }, - done: exitCode => { - resolve(keyListStr.split(/\n/)); - } - }; - EnigmailExecution.execStart(EnigmailGpg.agentPath, args, false, win, listener, statusFlagsObj); - }); -} - function sortByUserId(keyListObj, sortDirection) { return function(a, b) { return (a.userId < b.userId) ? -sortDirection : sortDirection; @@ -1402,68 +1076,6 @@ return (sortFunctions[type] || sortByUserId)(keyListObj, sortDirection); } - -/** - * Return string with all colon-separated data of key list entry of given key. - * - key may be pub or sub key. - * - * @param String keyId of 8 or 16 chars key with optionally leading 0x - * @return String entry of first found user IDs with keyId or null if none - */ -function getKeyListEntryOfKey(keyId) { - keyId = keyId.replace(/^0x/, ""); - - let statusFlags = {}; - let errorMsg = {}; - let exitCodeObj = {}; - let listText = getUserIdList(false, exitCodeObj, statusFlags, errorMsg); - - // listText contains lines such as: - // tru::0:1407688184:1424970931:3:1:5 - // pub:f:1024:17:D581C6F8EBB80E50:1107251639:::-:::scESC: - // fpr:::::::::492A198AEA5EBE5574A1CE00D581C6F8EBB80E50: - // uid:f::::1107251639::2D505D1F6E744365B3B35FF11F32A19779E3A417::Giosue Vitaglione : - // sub:f:2048:16:2223D7E0301A66C6:1107251647::::::e: - - // search for key or subkey - let regexKey = new RegExp("^(pub|sub):[^:]*:[^:]*:[^:]*:[A-Fa-f0-9]*" + keyId + ":", "m"); - let foundPos = listText.search(regexKey); - if (foundPos < 0) { - return null; - } - - // find area of key entries in key list - // note: if subkey matches, key entry starts before - let regexPub = new RegExp("^pub:", "gm"); - let startPos; - - if (listText[foundPos] == "p") { // ^pub: - // KEY matches - startPos = foundPos; - } - else { - // SUBKEY matches - // search for pub entry right before sub entry - startPos = 0; - let match = regexPub.exec(listText.substr(0, foundPos)); - while (match && match.index < foundPos) { - startPos = match.index; - match = regexPub.exec(listText); - } - } - // find end of entry (next pub entry or end): - let match = regexPub.exec(listText.substr(startPos + 1)); - let res; - if (match && match.index) { - res = listText.substring(startPos, startPos + 1 + match.index); - } - else { - res = listText.substring(startPos); - } - return res; -} - - /** * Load the key list into memory and return it sorted by a specified column * @@ -1485,295 +1097,36 @@ } gLoadingKeys = true; - let aGpgUserList, - aGpgSecretsList; - try { - const TRUSTLEVELS_SORTED = EnigmailTrust.trustLevelsSorted(); - - obtainKeyList(win, false, onlyKeys) + const cApi = EnigmailCryptoAPI(); + cApi.getKeys(onlyKeys) .then(keyList => { - return new Promise((resolve, reject) => { - if (!keyList) { - reject(); - } - aGpgUserList = keyList; - EnigmailLog.DEBUG("keyRing.jsm: loadKeyList: got pubkey lines: " + keyList.length + "\n"); + createAndSortKeyList(keyList, sortColumn, sortDirection, onlyKeys === null); + gLoadingKeys = false; - let r = obtainKeyList(win, true, onlyKeys); - resolve(r); - }); }) - .then(keyList => { - EnigmailLog.DEBUG("keyRing.jsm: loadKeyList: got seckey lines: " + keyList.length + "\n"); - aGpgSecretsList = keyList; - - if ((!onlyKeys) && ((!aGpgSecretsList) || aGpgSecretsList.length === 0)) { - gLoadingKeys = false; - if (getDialog().confirmDlg(EnigmailLocale.getString("noSecretKeys"), - EnigmailLocale.getString("keyMan.button.generateKey"), - EnigmailLocale.getString("keyMan.button.skip"))) { - getWindows().openKeyGen(); - EnigmailKeyRing.clearCache(); - EnigmailKeyRing.loadKeyList(); - } - } - else { - createAndSortKeyList(aGpgUserList, aGpgSecretsList, sortColumn, sortDirection, onlyKeys === null); - gLoadingKeys = false; - } - }) - .catch(() => { - EnigmailLog.ERROR("keyRing.jsm: loadKeyList: error\n"); + .catch(e => { + EnigmailLog.ERROR(`keyRing.jsm: loadKeyList: error ${e} +`); gLoadingKeys = false; }); waitForKeyList(); - } catch (ex) { - EnigmailLog.ERROR("keyRing.jsm: loadKeyList: exception: " + ex.toString()); - } -} - - -// returns the output of --with-colons --list-sig -function getKeySig(keyId, exitCodeObj, errorMsgObj) { - const args = EnigmailGpg.getStandardArgs(true).concat(["--with-fingerprint", "--fixed-list-mode", "--with-colons", "--list-sig"]).concat(keyId.split(" ")); - - const statusFlagsObj = {}; - const cmdErrorMsgObj = {}; - const listText = EnigmailExecution.execCmd(EnigmailGpg.agentPath, args, "", exitCodeObj, statusFlagsObj, {}, cmdErrorMsgObj); - - if (!(statusFlagsObj.value & EnigmailConstants.BAD_SIGNATURE)) { - // ignore exit code as recommended by GnuPG authors - exitCodeObj.value = 0; } - - if (exitCodeObj.value !== 0) { - errorMsgObj.value = EnigmailLocale.getString("badCommand"); - if (cmdErrorMsgObj.value) { - errorMsgObj.value += "\n" + EnigmailFiles.formatCmdLine(EnigmailGpg.agentPath, args); - errorMsgObj.value += "\n" + cmdErrorMsgObj.value; - } - - return ""; - } - return listText; -} - -/** - * Return signatures for a given key list - * - * @param String gpgKeyList Output from gpg such as produced by getKeySig() - * Only the first public key is processed! - * @param Boolean ignoreUnknownUid true if unknown signer's UIDs should be filtered out - * - * @return Array of Object: - * - uid - * - uidLabel - * - creationDate - * - sigList: [uid, creationDate, signerKeyId, sigType ] - */ - -function extractSignatures(gpgKeyList, ignoreUnknownUid) { - EnigmailLog.DEBUG("keyRing.jsm: extractSignatures: " + gpgKeyList + "\n"); - - var listObj = {}; - - let havePub = false; - let currUid = "", - keyId = "", - fpr = ""; - - const lineArr = gpgKeyList.split(/\n/); - for (let i = 0; i < lineArr.length; i++) { - // process lines such as: - // tru::1:1395895453:1442881280:3:1:5 - // pub:f:4096:1:C1B875ED336XX959:2299509307:1546189300::f:::scaESCA: - // fpr:::::::::102A1C8CC524A966849C33D7C8B157EA336XX959: - // uid:f::::1388511201::67D5B96DC564598D4D4D9E0E89F5B83C9931A154::Joe Fox : - // sig:::1:C8B157EA336XX959:2299509307::::Joe Fox :13x:::::2: - // sub:e:2048:1:B214734F0F5C7041:1316219469:1199912694:::::e: - // sub:f:2048:1:70E7A471DABE08B0:1316221524:1546189300:::::s: - const lineTokens = lineArr[i].split(/:/); - switch (lineTokens[ENTRY_ID]) { - case "pub": - if (havePub) { - return listObj; - } - havePub = true; - keyId = lineTokens[KEY_ID]; - break; - case "fpr": - if (fpr === "") - fpr = lineTokens[USERID_ID]; - break; - case "uid": - case "uat": - currUid = lineTokens[UID_ID]; - listObj[currUid] = { - userId: lineTokens[ENTRY_ID] == "uat" ? EnigmailLocale.getString("keyring.photo") : EnigmailData.convertGpgToUnicode(lineTokens[USERID_ID]), - rawUserId: lineTokens[USERID_ID], - keyId: keyId, - fpr: fpr, - created: EnigmailTime.getDateTime(lineTokens[CREATED_ID], true, false), - sigList: [] - }; - break; - case "sig": - if (lineTokens[SIG_TYPE_ID].substr(0, 2).toLowerCase() !== "1f") { - // ignrore revoked signature - - let sig = { - userId: EnigmailData.convertGpgToUnicode(lineTokens[USERID_ID]), - created: EnigmailTime.getDateTime(lineTokens[CREATED_ID], true, false), - signerKeyId: lineTokens[KEY_ID], - sigType: lineTokens[SIG_TYPE_ID], - sigKnown: lineTokens[USERID_ID] != UNKNOWN_SIGNATURE - }; - - if (!ignoreUnknownUid || sig.userId != UNKNOWN_SIGNATURE) { - listObj[currUid].sigList.push(sig); - } - } - break; - } - } - - return listObj; -} - -/** - * Create a list of objects representing the keys in a key list. - * The internal cache is first deleted. - * - * @param keyListString: Array of String formatted output from GnuPG for key listing - * @param keyListObj: Object holding the resulting key list: - * obj.keyList: Array holding key objects - * obj.keySortList: Array holding values to make sorting easier - * @param reset: Boolean - true: delete existting key cache - * - * no return value - */ -function createKeyObjects(keyListString, keyListObj, reset = true) { - if (reset) { - keyListObj.keyList = []; - keyListObj.keySortList = []; - keyListObj.trustModel = "?"; + catch (ex) { + EnigmailLog.ERROR("keyRing.jsm: loadKeyList: exception: " + ex.toString()); } - - appendKeyItems(keyListString, keyListObj); } /** - * Append key objects to a given key cache - * - * @param keyListString: array of |string| formatted output from GnuPG for key listing - * @param keyListObj: |object| holding the resulting key list - * obj.keyList: Array holding key objects - * obj.keySortList: Array holding values to make sorting easier + * Update the global key sort-list (quick index to keys) * * no return value */ -function appendKeyItems(keyListString, keyListObj) { - let keyObj = {}; - let uatNum = 0; // counter for photos (counts per key) - let numKeys = 0; - - const TRUSTLEVELS_SORTED = EnigmailTrust.trustLevelsSorted(); - - for (let i = 0; i < keyListString.length; i++) { - const listRow = keyListString[i].split(/:/); - if (listRow.length >= 0) { - switch (listRow[ENTRY_ID]) { - case "pub": - keyObj = new KeyObject(listRow); - uatNum = 0; - ++numKeys; - keyListObj.keyList.push(keyObj); - break; - case "fpr": - // only take first fpr line, this is the fingerprint of the primary key and what we want - if (keyObj.fpr === "") { - keyObj.fpr = listRow[USERID_ID]; - } - break; - case "uid": - if (listRow[USERID_ID].length === 0) { - listRow[USERID_ID] = "-"; - } - if (typeof (keyObj.userId) !== "string") { - keyObj.userId = EnigmailData.convertGpgToUnicode(listRow[USERID_ID]); - if (TRUSTLEVELS_SORTED.indexOf(listRow[KEY_TRUST_ID]) < TRUSTLEVELS_SORTED.indexOf(keyObj.keyTrust)) { - // reduce key trust if primary UID is less trusted than public key - keyObj.keyTrust = listRow[KEY_TRUST_ID]; - } - } - keyObj.userIds.push({ - userId: EnigmailData.convertGpgToUnicode(listRow[USERID_ID]), - keyTrust: listRow[KEY_TRUST_ID], - uidFpr: listRow[UID_ID], - type: "uid" - }); - break; - case "sub": - keyObj.subKeys.push({ - keyId: listRow[KEY_ID], - expiry: EnigmailTime.getDateTime(listRow[EXPIRY_ID], true, false), - expiryTime: Number(listRow[EXPIRY_ID]), - keyTrust: listRow[KEY_TRUST_ID], - keyUseFor: listRow[KEY_USE_FOR_ID], - keySize: listRow[KEY_SIZE_ID], - algorithm: listRow[KEY_ALGO_ID], - algoSym: ALGO_SYMBOL[listRow[KEY_ALGO_ID]], - created: EnigmailTime.getDateTime(listRow[CREATED_ID], true, false), - type: "sub" - }); - break; - case "uat": - if (listRow[USERID_ID].indexOf("1 ") === 0) { - const userId = EnigmailLocale.getString("userAtt.photo"); - keyObj.userIds.push({ - userId: userId, - keyTrust: listRow[KEY_TRUST_ID], - uidFpr: listRow[UID_ID], - type: "uat", - uatNum: uatNum - }); - keyObj.photoAvailable = true; - ++uatNum; - } - break; - case "tru": - keyListObj.trustModel = "?"; - if (listRow[KEY_TRUST_ID].indexOf("t") >= 0) { - switch (listRow[KEY_SIZE_ID]) { - case "0": - keyListObj.trustModel = "p"; - break; - case "1": - keyListObj.trustModel = "t"; - break; - case "6": - keyListObj.trustModel = "TP"; - break; - case "7": - keyListObj.trustModel = "T"; - break; - } - } - else { - if (listRow[KEY_SIZE_ID] === "0") { - keyListObj.trustModel = "a"; - } - } - } - } - } - - // (re-) build key sort list (quick index to keys) - keyListObj.keySortList = []; - for (let i = 0; i < keyListObj.keyList.length; i++) { - let keyObj = keyListObj.keyList[i]; - keyListObj.keySortList.push({ +function updateSortList() { + gKeyListObj.keySortList = []; + for (let i = 0; i < gKeyListObj.keyList.length; i++) { + let keyObj = gKeyListObj.keyList[i]; + gKeyListObj.keySortList.push({ userId: keyObj.userId.toLowerCase(), keyId: keyObj.keyId, fpr: keyObj.fpr, @@ -1783,33 +1136,6 @@ } -/** - * Handle secret keys for which gpg 2.0 does not create a public key record - */ -function appendUnkownSecretKey(keyId, aKeyList, startIndex, endIndex) { - EnigmailLog.DEBUG("keyRing.jsm: appendUnkownSecretKey: keyId: " + keyId + "\n"); - - let keyListStr = []; - for (let j = startIndex; j < endIndex; j++) { - keyListStr.push(aKeyList[j]); - } - - // make the listing a "public" key - keyListStr[0] = keyListStr[0].replace(/^sec/, "pub"); - - appendKeyItems(keyListStr, gKeyListObj); - EnigmailKeyRing.rebuildKeyIndex(); - - let k = EnigmailKeyRing.getKeyById(keyId, true); - - if (k) { - k.secretAvailable = true; - k.keyUseFor = ""; - k.keyTrust = "i"; - k.ownerTrust = "i"; - } - -} /** * Delete a set of keys from the key cache. Does not rebuild key indexes. @@ -1849,7 +1175,7 @@ return deleted; } -function createAndSortKeyList(aGpgUserList, aGpgSecretsList, sortColumn, sortDirection, resetKeyCache) { +function createAndSortKeyList(keyList, sortColumn, sortDirection, resetKeyCache) { EnigmailLog.DEBUG("keyRing.jsm: createAndSortKeyList()\n"); if (typeof sortColumn !== "string") @@ -1857,47 +1183,28 @@ if (!sortDirection) sortDirection = 1; - createKeyObjects(aGpgUserList, gKeyListObj, resetKeyCache); + if ((!("keyList" in gKeyListObj)) || (resetKeyCache)) { + gKeyListObj.keyList = []; + gKeyListObj.keySortList = []; + gKeyListObj.trustModel = "?"; + } + + gKeyListObj.keyList = gKeyListObj.keyList.concat(keyList.map(k => { + return newEnigmailKeyObj(k); + })); + + // update the quick index for sorting keys + updateSortList(); // create a hash-index on key ID (8 and 16 characters and fingerprint) // in a single array EnigmailKeyRing.rebuildKeyIndex(); - let startRow = -1; - let lastKeyId = ""; - // search and mark keys that have secret keys - for (let i = 0; i < aGpgSecretsList.length; i++) { - let listRow = aGpgSecretsList[i].split(/:/); - if (listRow.length >= 0) { - if (listRow[ENTRY_ID] == "sec") { - - if (startRow >= 0) { - // handle secret key not found on public key ring - appendUnkownSecretKey(lastKeyId, aGpgSecretsList, startRow, i); - } - startRow = -1; - - let k = EnigmailKeyRing.getKeyById(listRow[KEY_ID], true); - if (k && typeof (k) === "object") { - k.secretAvailable = true; - } - else { - startRow = i; - lastKeyId = listRow[KEY_ID]; - } - } - } - } - - if (startRow >= 0) { - // handle secret key not found on public key ring - appendUnkownSecretKey(lastKeyId, aGpgSecretsList, startRow, aGpgSecretsList.length); - } - gKeyListObj.keySortList.sort(getSortFunction(sortColumn.toLowerCase(), gKeyListObj, sortDirection)); } + function runKeyUsabilityCheck() { EnigmailLog.DEBUG("keyRing.jsm: runKeyUsabilityCheck()\n"); @@ -1911,7 +1218,8 @@ else { getKeyUsability().checkOwnertrust(); } - } catch (ex) { + } + catch (ex) { EnigmailLog.DEBUG("keyRing.jsm: runKeyUsabilityCheck: exception " + ex.message + "\n" + ex.stack + "\n"); } @@ -1921,532 +1229,8 @@ function waitForKeyList() { let mainThread = Services.tm.mainThread; while (gLoadingKeys) - mainThread.processNextEvent(true); -} - -/************************ IMPLEMENTATION of KeyObject ************************/ - - -function KeyObject(lineArr) { - if (lineArr[ENTRY_ID] === "pub") { - this.keyId = lineArr[KEY_ID]; - this.expiry = EnigmailTime.getDateTime(lineArr[EXPIRY_ID], true, false); - this.expiryTime = Number(lineArr[EXPIRY_ID]); - this.created = EnigmailTime.getDateTime(lineArr[CREATED_ID], true, false); - this.keyTrust = lineArr[KEY_TRUST_ID]; - this.keyUseFor = lineArr[KEY_USE_FOR_ID]; - this.ownerTrust = lineArr[OWNERTRUST_ID]; - this.algorithm = lineArr[KEY_ALGO_ID]; - this.algoSym = ALGO_SYMBOL[lineArr[KEY_ALGO_ID]]; - this.keySize = lineArr[KEY_SIZE_ID]; - } - else { - this.keyId = ""; - this.expiry = ""; - this.expiryTime = 0; - this.created = ""; - this.keyTrust = ""; - this.keyUseFor = ""; - this.ownerTrust = ""; - this.algorithm = ""; - this.algoSym = ""; - this.keySize = ""; - } - this.type = lineArr[ENTRY_ID]; - this.userIds = []; - this.subKeys = []; - this.fpr = ""; - this.minimalKeyBlock = {}; - this.photoAvailable = false; - this.secretAvailable = false; - this._sigList = null; + mainThread.processNextEvent(true); } -KeyObject.prototype = { - /** - * gettter that returns a list of all signatures found on the key - * - * @return Array of Object, or null in case of error: - * - uid - * - uidLabel - * - creationDate - * - sigList: Array of object: { uid, creationDate, signerKeyId, sigType } - */ - get signatures() { - if (this._sigList === null) { - let exitCodeObj = {}, - errorMsgObj = {}; - let r = getKeySig(this.keyId, exitCodeObj, errorMsgObj); - - if (r.length > 0) { - this._sigList = extractSignatures(r, false); - } - } - - return this._sigList; - }, - - /** - * create a copy of the object - */ - clone: function() { - let cp = new KeyObject(["copy"]); - for (let i in this) { - if (i !== "signatures" && i !== "fprFormatted") { - // caution: don't try to evaluate this[i] if i==="signatures"; - // it would immediately get all signatures for the key (slow!) - if (typeof this[i] !== "function") { - if (typeof this[i] === "object") { - cp[i] = EnigmailFuncs.cloneObj(this[i]); - } - else - cp[i] = this[i]; - } - } - } - - return cp; - }, - - /** - * Does the key have secondary user IDs? - * - * @return: Boolean - true if yes; false if no - */ - hasSubUserIds: function() { - let nUid = 0; - for (let i in this.userIds) { - if (this.userIds[i].type === "uid") ++nUid; - } - - return nUid >= 2; - }, - - /** - * Get a formatted version of the fingerprint: - * 1234 5678 90AB CDEF .... .... - * - * @return String - the formatted fingerprint - */ - get fprFormatted() { - let f = EnigmailKey.formatFpr(this.fpr); - if (f.length === 0) - f = this.fpr; - return f; - }, - - /** - * Is the function to set owner trust available for the key? - * Requirements: The key is signed with at least medium validity level, - * or the secret key is available. - * - * @return Boolean true if yes - */ - isOwnerTrustUseful: function() { - if (this.secretAvailable) return true; - if (this.keyTrust.search(/^[fu]/) === 0) return true; - - return false; - }, - - /** - * Determine if the public key is valid. If not, return a description why it's not - * - * @return Object: - * - keyValid: Boolean (true if key is valid) - * - reason: String (explanation of invalidity) - */ - getPubKeyValidity: function() { - let retVal = { - keyValid: false, - reason: "" - }; - if (this.keyTrust.search(/r/i) >= 0) { - // public key revoked - retVal.reason = EnigmailLocale.getString("keyRing.pubKeyRevoked", [this.userId, "0x" + this.keyId]); - } - else if (this.keyTrust.search(/e/i) >= 0) { - // public key expired - retVal.reason = EnigmailLocale.getString("keyRing.pubKeyExpired", [this.userId, "0x" + this.keyId]); - } - else if (this.keyTrust.search(/d/i) >= 0 || this.keyUseFor.search(/D/i) >= 0) { - // public key disabled - retVal.reason = EnigmailLocale.getString("keyRing.keyDisabled", [this.userId, "0x" + this.keyId]); - } - else if (this.keyTrust.search(/i/i) >= 0) { - // public key invalid - retVal.reason = EnigmailLocale.getString("keyRing.keyInvalid", [this.userId, "0x" + this.keyId]); - } - else - retVal.keyValid = true; - - return retVal; - }, - - - /** - * Check whether a key can be used for signing and return a description of why not - * - * @return Object: - * - keyValid: Boolean (true if key is valid) - * - reason: String (explanation of invalidity) - */ - getSigningValidity: function() { - let retVal = this.getPubKeyValidity(); - - if (!retVal.keyValid) return retVal; - - if (!this.secretAvailable) { - retVal.reason = EnigmailLocale.getString("keyRing.noSecretKey", [this.userId, "0x" + this.keyId]); - retVal.keyValid = false; - } - else if (this.keyUseFor.search(/S/) < 0) { - retVal.keyValid = false; - - if (this.keyTrust.search(/u/i) < 0) { - // public key invalid - retVal.reason = EnigmailLocale.getString("keyRing.keyNotTrusted", [this.userId, "0x" + this.keyId]); - } - else { - let expired = 0, - revoked = 0, - unusable = 0, - found = 0; - // public key is valid; check for signing subkeys - for (let sk in this.subKeys) { - if (this.subKeys[sk].keyUseFor.search(/[sS]/) >= 0) { - // found subkey usable for signing - ++found; - if (this.subKeys[sk].keyTrust.search(/e/i) >= 0) ++expired; - if (this.subKeys[sk].keyTrust.search(/r/i) >= 0) ++revoked; - if (this.subKeys[sk].keyTrust.search(/[di-]/i) >= 0 || this.subKeys[sk].keyUseFor.search(/D/) >= 0) ++unusable; - } - } - - if (found > 0 && (expired > 0 || revoked > 0)) { - if (found === expired) { - retVal.reason = EnigmailLocale.getString("keyRing.signSubKeysExpired", [this.userId, "0x" + this.keyId]); - } - else if (found === revoked) { - retVal.reason = EnigmailLocale.getString("keyRing.signSubKeysRevoked", [this.userId, "0x" + this.keyId]); - } - else { - retVal.reason = EnigmailLocale.getString("keyRing.signSubKeysUnusable", [this.userId, "0x" + this.keyId]); - } - } - else - retVal.reason = EnigmailLocale.getString("keyRing.pubKeyNotForSigning", [this.userId, "0x" + this.keyId]); - } - } - - return retVal; - }, - - /** - * Check whether a key can be used for encryption and return a description of why not - * - * @return Object: - * - keyValid: Boolean (true if key is valid) - * - reason: String (explanation of invalidity) - */ - getEncryptionValidity: function() { - let retVal = this.getPubKeyValidity(); - - if (!retVal.keyValid) return retVal; - - if (this.keyUseFor.search(/E/) < 0) { - retVal.keyValid = false; - - if (this.keyTrust.search(/u/i) < 0) { - // public key invalid - retVal.reason = EnigmailLocale.getString("keyRing.keyInvalid", [this.userId, "0x" + this.keyId]); - } - else { - let expired = 0, - revoked = 0, - unusable = 0, - found = 0; - // public key is valid; check for encryption subkeys - - for (let sk in this.subKeys) { - if (this.subKeys[sk].keyUseFor.search(/[eE]/) >= 0) { - // found subkey usable for signing - ++found; - if (this.subKeys[sk].keyTrust.search(/e/i) >= 0) ++expired; - if (this.subKeys[sk].keyTrust.search(/r/i) >= 0) ++revoked; - if (this.subKeys[sk].keyTrust.search(/[di-]/i) >= 0 || this.subKeys[sk].keyUseFor.search(/D/) >= 0) ++unusable; - } - } - - if (found > 0 && (expired > 0 || revoked > 0)) { - if (found === expired) { - retVal.reason = EnigmailLocale.getString("keyRing.encSubKeysExpired", [this.userId, "0x" + this.keyId]); - } - else if (found === revoked) { - retVal.reason = EnigmailLocale.getString("keyRing.encSubKeysRevoked", [this.userId, "0x" + this.keyId]); - } - else { - retVal.reason = EnigmailLocale.getString("keyRing.encSubKeysUnusable", [this.userId, "0x" + this.keyId]); - } - } - else - retVal.reason = EnigmailLocale.getString("keyRing.pubKeyNotForEncryption", [this.userId, "0x" + this.keyId]); - } - } - - return retVal; - }, - - /** - * Determine the next expiry date of the key. This is either the public key expiry date, - * or the maximum expiry date of a signing or encryption subkey. I.e. this returns the next - * date at which the key cannot be used for signing and/or encryption anymore - * - * @return Number - The expiry date as seconds after 01/01/1970 - */ - getKeyExpiry: function() { - let expiryDate = Number.MAX_VALUE; - let encryption = -1; - let signing = -1; - - - // check public key expiry date - if (this.expiryTime > 0) { - expiryDate = this.expiryTime; - } - - for (let sk in this.subKeys) { - if (this.subKeys[sk].keyUseFor.search(/[eE]/) >= 0) { - let expiry = this.subKeys[sk].expiryTime; - if (expiry === 0) - expiry = Number.MAX_VALUE; - encryption = Math.max(encryption, expiry); - } - else if (this.subKeys[sk].keyUseFor.search(/[sS]/) >= 0) { - let expiry = this.subKeys[sk].expiryTime; - if (expiry === 0) - expiry = Number.MAX_VALUE; - signing = Math.max(signing, expiry); - } - } - - if (expiryDate > encryption) { - if (this.keyUseFor.search(/[eE]/) < 0) { - expiryDate = encryption; - } - } - - if (expiryDate > signing) { - if (this.keyUseFor.search(/[Ss]/) < 0) { - expiryDate = signing; - } - } - - return expiryDate; - }, - - /** - * Export the minimum key for the public key object: - * public key, user ID matching the given emailAddress, newest encryption subkey - * - * @param emailAddress - String: e-mail address that we want to match a user ID to - * - * @return Object: - * - exitCode (0 = success) - * - errorMsg (if exitCode != 0) - * - keyData: BASE64-encded string of key data - */ - - getMinimalPubKey: function(emailAddress) { - EnigmailLog.DEBUG("keyRing.jsm: KeyObject.getMinimalPubKey: " + this.keyId + " <" + emailAddress + ">\n"); - - let retObj = { - exitCode: 0, - errorMsg: "", - keyData: "" - }; - - - // TODO: remove ECC special case once OpenPGP.js supports it - let isECC = (this.algoSym.search(/(ECDH|ECDSA|EDDSA)/) >= 0); - - if (!this.minimalKeyBlock[emailAddress]) { - let args = EnigmailGpg.getStandardArgs(true); - - if (!isECC) { - args = args.concat(["--export-options", "export-minimal,no-export-attributes", "-a", "--export", this.fpr]); - } - else { - args = args.concat(["--export-options", "export-minimal,no-export-attributes", "--export", this.fpr]); - } - - const statusObj = {}; - const exitCodeObj = {}; - let keyBlock = EnigmailExecution.simpleExecCmd(EnigmailGpg.agentPath, args, exitCodeObj, statusObj); - let exportOK = true; - - if (EnigmailGpg.getGpgFeature("export-result")) { - // GnuPG 2.1.10+ - let r = new RegExp("^\\[GNUPG:\\] EXPORTED " + this.fpr, "m"); - if (statusObj.value.search(r) < 0) { - retObj.exitCode = 2; - retObj.errorMsg = EnigmailLocale.getString("failKeyExtract"); - exportOK = false; - } - } - else { - // GnuPG older than 2.1.10 - if (keyBlock.length < 50) { - retObj.exitCode = 2; - retObj.errorMsg = EnigmailLocale.getString("failKeyExtract"); - exportOK = false; - } - } - - if (exportOK) { - this.minimalKeyBlock[emailAddress] = null; - - if (isECC) { - this.minimalKeyBlock[emailAddress] = btoa(keyBlock); - } - else { - let minKey = getStrippedKey(keyBlock, emailAddress); - if (minKey) { - this.minimalKeyBlock[emailAddress] = btoa(String.fromCharCode.apply(null, minKey)); - } - } - - if (!this.minimalKeyBlock[emailAddress]) { - retObj.exitCode = 1; - retObj.errorMsg = "No valid (sub-)key"; - } - } - } - - retObj.keyData = this.minimalKeyBlock[emailAddress]; - return retObj; - }, - - /** - * Obtain a "virtual" key size that allows to compare different algorithms with each other - * e.g. elliptic curve keys have small key sizes with high cryptographic strength - * - * - * @return Number: a virtual size - */ - getVirtualKeySize: function() { - EnigmailLog.DEBUG("keyRing.jsm: KeyObject.getVirtualKeySize: " + this.keyId + "\n"); - - switch (this.algoSym) { - case "DSA": - return this.keySize / 2; - case "ECDSA": - return this.keySize * 8; - case "EDDSA": - return this.keySize * 32; - default: - return this.keySize; - } - } -}; - - -function _getBestUserId(key, emailAddress) { - let bestUser = []; - for (let i = 0; i < key.users.length; i++) { - if (!key.users[i].userId || !key.users[i].selfCertifications) { - continue; - } - for (let j = 0; j < key.users[i].selfCertifications.length; j++) { - bestUser.push({ - user: key.users[i], - selfCertificate: key.users[i].selfCertifications[j] - }); - } - } - /* prefer matching e-mail addresses, then primary user IDs, - then most-recent signatures: */ - bestUser = bestUser.sort(function(a, b) { - if ((a.user.userId.userid == emailAddress || - a.user.userId.userid.endsWith(' <' + emailAddress + '>')) && - !(b.user.userId.userid == emailAddress || - b.user.userId.userid.endsWith(' <' + emailAddress + '>'))) { - return -1; - } - else if ((b.user.userId.userid == emailAddress || - b.user.userId.userid.endsWith(' <' + emailAddress + '>')) && - !(a.user.userId.userid == emailAddress || - a.user.userId.userid.endsWith(' <' + emailAddress + '>'))) { - return 1; - } - else if (a.selfCertificate.isPrimaryUserID > b.selfCertificate.isPrimaryUserID) { - return -1; - } - else if (a.selfCertificate.isPrimaryUserID < b.selfCertificate.isPrimaryUserID) { - return 1; - } - else if (a.selfCertificate.created > b.selfCertificate.created) { - return -1; - } - else if (a.selfCertificate.created < b.selfCertificate.created) { - return 1; - } - else { - return 0; - } - }); - /* return first valid certification: */ - for (var k = 0; k < bestUser.length; k++) { - if (bestUser[k].user.isValidSelfCertificate(key.primaryKey, bestUser[k].selfCertificate)) { - return bestUser[k]; - } - } - return null; -} - -/** - * Get a minimal stripped key containing only: - * - The public key - * - the matching UID (or primary UID, if no match) + its self-signature - * - any valid signing-capable or encryption-capable subkeys + their signature packets - * - * @param armoredKey - String: Key data (in OpenPGP armored format) - * @param emailAddress - String: e-mail address that we want to match a user ID to - * - * @return Uint8Array, or null - */ - -function getStrippedKey(armoredKey, emailAddress) { - EnigmailLog.DEBUG("keyRing.jsm: KeyObject.getStrippedKey()\n"); - - try { - let openpgp = getOpenPGP().openpgp; - let msg = openpgp.key.readArmored(armoredKey); - - if (!msg || msg.keys.length === 0) return null; - - let key = msg.keys[0]; - let uid = _getBestUserId(key, emailAddress); - if (!uid || !uid.user) return null; - - let p = new openpgp.packet.List(); - p.push(key.primaryKey); - p.concat(uid.user.toPacketlist()); - - // go through the subkeys and pull out only valid encryption-capable and - // signing-capable subkeys. - for (let i = 0; i < key.subKeys.length; i++) { - if (key.subKeys[i].isValidEncryptionKey(key.primaryKey) || - key.subKeys[i].isValidSigningKey(key.primaryKey)) { - p.concat(key.subKeys[i].toPacketlist()); - } - } - - return p.write(); - } catch (ex) { - EnigmailLog.DEBUG("keyRing.jsm: KeyObject.getStrippedKey: ERROR " + ex.message + "\n"); - } - return null; -} EnigmailKeyRing.clearCache(); diff -Nru enigmail-2.0.12+ds1/package/keyUsability.jsm enigmail-2.1.3+ds1/package/keyUsability.jsm --- enigmail-2.0.12+ds1/package/keyUsability.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/keyUsability.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false, Number: false, Math: false, Date: false, JSON: false */ -/*jshint -W097 */ /* * 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 @@ -11,16 +9,12 @@ var EXPORTED_SYMBOLS = ["EnigmailKeyUsability"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ -Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ -Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ -Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; const getDialog = EnigmailLazy.loader("enigmail/dialog.jsm", "EnigmailDialog"); const getWindows = EnigmailLazy.loader("enigmail/windows.jsm", "EnigmailWindows"); diff -Nru enigmail-2.0.12+ds1/package/keyserver.jsm enigmail-2.1.3+ds1/package/keyserver.jsm --- enigmail-2.0.12+ds1/package/keyserver.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/keyserver.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 @@ -9,29 +8,21 @@ const EXPORTED_SYMBOLS = ["EnigmailKeyServer"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.importGlobalProperties(["XMLHttpRequest"]); -Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ -Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ -Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ -Cu.import("resource://enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ -Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ -Cu.import("resource://enigmail/httpProxy.jsm"); /*global EnigmailHttpProxy: false */ -Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/tor.jsm"); /*global EnigmailTor: false */ -Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ -Cu.import("resource://enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ -Cu.import("resource://enigmail/keyserverUris.jsm"); /*global EnigmailKeyserverURIs: false */ -Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ -Cu.import("resource://enigmail/stdlib.jsm"); /*global EnigmailStdlib: false */ -Cu.import("resource://enigmail/dialog.jsm"); /*global EnigmailDialog: false */ -Cu.import("resource://enigmail/webKey.jsm"); /*global EnigmailWks: false */ -Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ +Components.utils.importGlobalProperties(["XMLHttpRequest"]); +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailKeyRing = ChromeUtils.import("chrome://enigmail/content/modules/keyRing.jsm").EnigmailKeyRing; +const EnigmailKeyserverURIs = ChromeUtils.import("chrome://enigmail/content/modules/keyserverUris.jsm").EnigmailKeyserverURIs; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; +const EnigmailExecution = ChromeUtils.import("chrome://enigmail/content/modules/execution.jsm").EnigmailExecution; +const EnigmailGpg = ChromeUtils.import("chrome://enigmail/content/modules/gpg.jsm").EnigmailGpg; +const EnigmailHttpProxy = ChromeUtils.import("chrome://enigmail/content/modules/httpProxy.jsm").EnigmailHttpProxy; +const EnigmailOS = ChromeUtils.import("chrome://enigmail/content/modules/os.jsm").EnigmailOS; +const EnigmailXhrUtils = ChromeUtils.import("chrome://enigmail/content/modules/xhrUtils.jsm").EnigmailXhrUtils; +const EnigmailFuncs = ChromeUtils.import("chrome://enigmail/content/modules/funcs.jsm").EnigmailFuncs; +const EnigmailCryptoAPI = ChromeUtils.import("chrome://enigmail/content/modules/cryptoAPI.jsm").EnigmailCryptoAPI; const IOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1"; @@ -39,727 +30,1602 @@ const ENIG_DEFAULT_HKPS_PORT = "443"; const ENIG_DEFAULT_LDAP_PORT = "389"; -function matchesKeyserverAction(action, flag) { - return (action & flag) === flag; -} +const SKS_CACERT_URL = "https://sks-keyservers.net/sks-keyservers.netCA.pem"; +const HKPS_POOL_HOST = "hkps.pool.sks-keyservers.net"; +const SKS_CACERT_SUBJECTNAME = "CN=sks-keyservers.net CA,O=sks-keyservers.net CA,ST=Oslo,C=NO"; -function getRequestAction(actionFlags, keys) { - if (matchesKeyserverAction(actionFlags, EnigmailConstants.DOWNLOAD_KEY)) { - return ["--recv-keys"].concat(keys); - } - if (matchesKeyserverAction(actionFlags, EnigmailConstants.SEARCH_KEY)) { - return ["--search-keys"].concat(keys); - } - if (matchesKeyserverAction(actionFlags, EnigmailConstants.UPLOAD_KEY)) { - return ["--send-keys"].concat(keys); - } - if (matchesKeyserverAction(actionFlags, EnigmailConstants.REFRESH_KEY)) { - return ["--refresh-keys"]; - } - return null; -} +/** + KeySrvListener API + Object implementing: + - onProgress: function(percentComplete) [only implemented for download()] + - onCancel: function() - the body will be set by the callee +*/ -function getInputData(actionFlags) { - if (matchesKeyserverAction(actionFlags, EnigmailConstants.SEARCH_KEY)) { - return "quit\n"; + +function createError(errId) { + let msg = ""; + switch (errId) { + case EnigmailConstants.KEYSERVER_ERR_ABORTED: + msg = EnigmailLocale.getString("keyserver.error.aborted"); + break; + case EnigmailConstants.KEYSERVER_ERR_SERVER_ERROR: + msg = EnigmailLocale.getString("keyserver.error.serverError"); + break; + case EnigmailConstants.KEYSERVER_ERR_SERVER_UNAVAILABLE: + msg = EnigmailLocale.getString("keyserver.error.unavailable"); + break; + case EnigmailConstants.KEYSERVER_ERR_SECURITY_ERROR: + msg = EnigmailLocale.getString("keyserver.error.securityError"); + break; + case EnigmailConstants.KEYSERVER_ERR_CERTIFICATE_ERROR: + msg = EnigmailLocale.getString("keyserver.error.certificateError"); + break; + case EnigmailConstants.KEYSERVER_ERR_IMPORT_ERROR: + msg = EnigmailLocale.getString("keyserver.error.importError"); + break; + case EnigmailConstants.KEYSERVER_ERR_UNKNOWN: + msg = EnigmailLocale.getString("keyserver.error.unknown"); + break; } - return null; + + return { + result: errId, + errorDetails: msg + }; } -function buildProxyInfo(uri, proxyHost) { - if (proxyHost !== null) { - return ["--keyserver-options", "http-proxy=" + proxyHost]; +/** + * parse a keyserver specification and return host, protocol and port + * + * @param keyserver: String - name of keyserver with optional protocol and port. + * E.g. keys.gnupg.net, hkps://keys.gnupg.net:443 + * + * @return Object: {port, host, protocol} (all Strings) + */ +function parseKeyserverUrl(keyserver) { + if (keyserver.length > 1024) { + // insane length of keyserver is forbidden + throw Components.results.NS_ERROR_FAILURE; } - return []; -} -function buildStandardArgs(action) { - if (matchesKeyserverAction(action, EnigmailConstants.SEARCH_KEY)) { - return EnigmailGpg.getStandardArgs(false).concat(["--command-fd", "0", "--fixed-list", "--with-colons"]); + keyserver = keyserver.toLowerCase().trim(); + let protocol = ""; + if (keyserver.search(/^[a-zA-Z0-9_.-]+:\/\//) === 0) { + protocol = keyserver.replace(/^([a-zA-Z0-9_.-]+)(:\/\/.*)/, "$1"); + keyserver = keyserver.replace(/^[a-zA-Z0-9_.-]+:\/\//, ""); + } + else { + protocol = "hkp"; } - return EnigmailGpg.getStandardArgs(true); -} -function flatten(arrOfArr) { - return arrOfArr.reduce(function(a, b) { - return a.concat(b); - }, []); -} + let port = ""; + switch (protocol) { + case "hkp": + port = ENIG_DEFAULT_HKP_PORT; + break; + case "https": + case "hkps": + port = ENIG_DEFAULT_HKPS_PORT; + break; + case "ldap": + port = ENIG_DEFAULT_LDAP_PORT; + break; + } -function isDownload(action) { - return matchesKeyserverAction(action, EnigmailConstants.REFRESH_KEY) || matchesKeyserverAction(action, EnigmailConstants.DOWNLOAD_KEY); -} + let m = keyserver.match(/^(.+)(:)(\d+)$/); + if (m && m.length == 4) { + keyserver = m[1]; + port = m[3]; + } -function gpgRequest(keyId, uri, action, usingTor) { - const proxyHost = getProxyModule().getHttpProxy(uri.keyserverName); - const args = flatten([ - buildStandardArgs(action), ["--keyserver", uri], - buildProxyInfo(uri, proxyHost), - getRequestAction(action, keyId) - ]); + if (keyserver.search(/^(keys\.mailvelope\.com|api\.protonmail\.ch)$/) === 0) { + protocol = "hkps"; + port = ENIG_DEFAULT_HKPS_PORT; + } + if (keyserver.search(/^(keybase\.io)$/) === 0) { + protocol = "keybase"; + port = ENIG_DEFAULT_HKPS_PORT; + } return { - command: EnigmailGpgAgent.agentPath, - args: args, - usingTor: usingTor, - keyId: keyId, - inputData: getInputData(action), - envVars: [], - isDownload: isDownload(action) + protocol: protocol, + host: keyserver, + port: port }; } -function requestOverTorWithSocks(keyId, uri, torProperties, action) { - const args = flatten([ - buildStandardArgs(action), ["--keyserver", uri], - buildProxyInfo(uri, torProperties.args), - getRequestAction(action, keyId) - ]); - return { - command: EnigmailGpgAgent.agentPath, - args: args, - keyId: keyId, - usingTor: true, - envVars: [], - isDownload: isDownload(action) - }; -} - -function requestOverTorWithHelper(keyId, uri, torProperties, action) { - const args = flatten([ - torProperties.args, - buildStandardArgs(action), ["--keyserver", uri], - getRequestAction(action, keyId) - ]); +/** + Object to handle HKP/HKPS requests via builtin XMLHttpRequest() + */ +const accessHkpInternal = { + /** + * Create the payload of hkp requests (upload only) + * + */ + buildHkpPayload: function(actionFlag, searchTerms) { + let payLoad = null, + keyData = ""; + + switch (actionFlag) { + case EnigmailConstants.UPLOAD_KEY: + keyData = EnigmailKeyRing.extractKey(false, searchTerms, null, {}, {}); + if (keyData.length === 0) return null; + + payLoad = "keytext=" + encodeURIComponent(keyData); + return payLoad; + + case EnigmailConstants.DOWNLOAD_KEY: + case EnigmailConstants.SEARCH_KEY: + case EnigmailConstants.GET_SKS_CACERT: + return ""; + } - return { - command: torProperties.command, - args: args, - keyId: keyId, - usingTor: true, - envVars: torProperties.envVars, - isDownload: isDownload(action) - }; -} + // other actions are not yet implemented + return null; + }, -function buildRequests(keyId, action, tor) { + /** + * return the URL and the HTTP access method for a given action + */ + createRequestUrl: function(keyserver, actionFlag, searchTerm) { + let keySrv = parseKeyserverUrl(keyserver); + + let method = "GET"; + let protocol; + + switch (keySrv.protocol) { + case "hkp": + protocol = "http"; + break; + case "ldap": + throw Components.results.NS_ERROR_FAILURE; + default: // equals to hkps + protocol = "https"; + } - let torProperties = tor.getTorNotAvailableProperties(); + let url = protocol + "://" + keySrv.host + ":" + keySrv.port; - const uris = EnigmailKeyserverURIs.buildKeyserverUris(); - const requests = []; + if (actionFlag === EnigmailConstants.UPLOAD_KEY) { + url += "/pks/add"; + method = "POST"; + } + else if (actionFlag === EnigmailConstants.DOWNLOAD_KEY) { + if (searchTerm.indexOf("0x") !== 0) { + searchTerm = "0x" + searchTerm; + } + url += "/pks/lookup?search=" + searchTerm + "&op=get&options=mr"; + } + else if (actionFlag === EnigmailConstants.SEARCH_KEY) { + url += "/pks/lookup?search=" + escape(searchTerm) + "&fingerprint=on&op=index&options=mr"; + } + else if (actionFlag === EnigmailConstants.GET_SKS_CACERT) { + url = SKS_CACERT_URL; + } - if (tor.isPreferred(action)) { - // tor is preferred or required - torProperties = tor.torProperties(); + return { + url: url, + host: keySrv.host, + method: method + }; + }, - if (tor.isRequired(action) && !torProperties.isAvailable) { - EnigmailLog.CONSOLE("Unable to perform action with key " + keyId + " because Tor is required but not available.\n"); - return []; + /** + * Upload, search or download keys from a keyserver + * @param actionFlag: Number - Keyserver Action Flags: from EnigmailConstants + * @param keyId: String - space-separated list of search terms or key IDs + * @param keyserver: String - keyserver URL (optionally incl. protocol) + * @param listener: optional Object implementing the KeySrvListener API (above) + * + * @return: Promise + */ + accessKeyServer: function(actionFlag, keyserver, keyId, listener) { + EnigmailLog.DEBUG(`keyserver.jsm: accessHkpInternal.accessKeyServer(${keyserver})\n`); + if (keyserver === null) { + keyserver = EnigmailKeyserverURIs.getDefaultKeyServer(); } - uris.forEach(function(uri) { - if (torProperties.helper !== null) { - requests.push(requestOverTorWithHelper(keyId, uri, torProperties.helper, action)); + return new Promise((resolve, reject) => { + let xmlReq = null; + if (listener && typeof(listener) === "object") { + listener.onCancel = function() { + EnigmailLog.DEBUG(`keyserver.jsm: accessHkpInternal.accessKeyServer - onCancel() called\n`); + if (xmlReq) { + xmlReq.abort(); + } + reject(createError(EnigmailConstants.KEYSERVER_ERR_ABORTED)); + }; } - if (torProperties.socks !== null) { - requests.push(requestOverTorWithSocks(keyId, uri, torProperties.socks, action)); + if (actionFlag === EnigmailConstants.REFRESH_KEY) { + // we don't (need to) distinguish between refresh and download for our internal protocol + actionFlag = EnigmailConstants.DOWNLOAD_KEY; } - }); - } - if (!tor.isRequired(action) || torProperties.useTorMode) { - uris.forEach(function(uri) { - requests.push(gpgRequest(keyId, uri, action, torProperties.useTorMode)); - }); - } - - return requests; -} + let payLoad = this.buildHkpPayload(actionFlag, keyId); + if (payLoad === null) { + reject(createError(EnigmailConstants.KEYSERVER_ERR_UNKNOWN)); + return; + } -function stringContains(stringToCheck, substring) { - return stringToCheck.indexOf(substring) > -1; -} + let errorCode = 0; -function convertRequestArgsToStrings(args) { - return args.map(function(a) { - return a.toString(); - }); -} + xmlReq = new XMLHttpRequest(); -function execute(request, listener, subproc) { - EnigmailLog.CONSOLE("enigmail> " + EnigmailFiles.formatCmdLine(request.command, request.args) + "\n\n"); + xmlReq.onload = function _onLoad() { + EnigmailLog.DEBUG("keyserver.jsm: accessHkpInternal: onload(): status=" + xmlReq.status + "\n"); + switch (actionFlag) { + case EnigmailConstants.UPLOAD_KEY: + EnigmailLog.DEBUG("keyserver.jsm: accessHkpInternal: onload: " + xmlReq.responseText + "\n"); + if (xmlReq.status >= 400) { + reject(createError(EnigmailConstants.KEYSERVER_ERR_SERVER_ERROR)); + } + else { + resolve(0); + } + return; - const envVars = request.envVars.concat(EnigmailCore.getEnvList()); + case EnigmailConstants.SEARCH_KEY: + case EnigmailConstants.GET_SKS_CACERT: + if (xmlReq.status === 404) { + // key not found + resolve(""); + } + else if (xmlReq.status >= 400) { + reject(createError(EnigmailConstants.KEYSERVER_ERR_SERVER_ERROR)); + } + else { + resolve(xmlReq.responseText); + } + return; - let exitCode = null; - let proc = null; - try { - proc = subproc.call({ - command: request.command, - arguments: convertRequestArgsToStrings(request.args), - environment: envVars, - charset: null, - stdin: request.inputData, - done: function(result) { - try { - if (result.exitCode === 0 && request.isDownload) { - if (typeof (request.keyId) === "string") { - EnigmailKeyRing.updateKeys([request.keyId]); + case EnigmailConstants.DOWNLOAD_KEY: + if (xmlReq.status >= 400 && xmlReq.status < 500) { + // key not found + resolve(1); } - else - EnigmailKeyRing.updateKeys(request.keyId); - } - if (exitCode === null) { - exitCode = result.exitCode; - } - listener.done(exitCode); - } catch (ex) { - EnigmailLog.ERROR("keyserver.jsm: execute: subprocess.call failed at finish with '" + ex.message + "'\n"); - } - }, - stdout: function(data) { - listener.stdout(data); - }, - stderr: function(data) { - if (data.search(/^\[GNUPG:\] ERROR/m) >= 0) { - exitCode = 4; - } - listener.stderr(data); - }, - mergeStderr: false + else if (xmlReq.status >= 500) { + EnigmailLog.DEBUG("keyserver.jsm: accessHkpInternal: onload: " + xmlReq.responseText + "\n"); + reject(createError(EnigmailConstants.KEYSERVER_ERR_SERVER_ERROR)); + } + else { + let errorMsgObj = {}, + importedKeysObj = {}; + let importMinimal = (xmlReq.responseText.length > 1024000 && (!EnigmailGpg.getGpgFeature("handles-huge-keys"))); + let r = EnigmailKeyRing.importKey(null, false, xmlReq.responseText, "", errorMsgObj, importedKeysObj, importMinimal); + if (r === 0) { + resolve(importedKeysObj.value); + } + else { + reject(createError(EnigmailConstants.KEYSERVER_ERR_IMPORT_ERROR)); + } + } + return; + } + resolve(-1); + }; + + xmlReq.onerror = function(e) { + EnigmailLog.DEBUG("keyserver.jsm: accessHkpInternal.accessKeyServer: onerror: " + e + "\n"); + let err = EnigmailXhrUtils.createTCPErrorFromFailedXHR(e.target); + switch (err.type) { + case 'SecurityCertificate': + reject(createError(EnigmailConstants.KEYSERVER_ERR_CERTIFICATE_ERROR)); + break; + case 'SecurityProtocol': + reject(createError(EnigmailConstants.KEYSERVER_ERR_SECURITY_ERROR)); + break; + case 'Network': + reject(createError(EnigmailConstants.KEYSERVER_ERR_SERVER_UNAVAILABLE)); + break; + } + reject(createError(EnigmailConstants.KEYSERVER_ERR_SERVER_UNAVAILABLE)); + }; + + xmlReq.onloadend = function() { + EnigmailLog.DEBUG("keyserver.jsm: accessHkpInternal.accessKeyServer: loadEnd\n"); + }; + + let { + url, + host, + method + } = this.createRequestUrl(keyserver, actionFlag, keyId); + + if (host === HKPS_POOL_HOST && actionFlag !== EnigmailConstants.GET_SKS_CACERT) { + this.getSksCACert().then(r => { + EnigmailLog.DEBUG(`keyserver.jsm: accessHkpInternal.accessKeyServer: getting ${url}\n`); + xmlReq.open(method, url); + xmlReq.send(payLoad); + }); + } + else { + EnigmailLog.DEBUG(`keyserver.jsm: accessHkpInternal.accessKeyServer: requesting ${url}\n`); + xmlReq.open(method, url); + xmlReq.send(payLoad); + } }); - } catch (ex) { - EnigmailLog.ERROR("keyserver.jsm: execute: subprocess.call failed with '" + ex.message + "'\n"); - throw ex; - } + }, - if (proc === null) { - EnigmailLog.ERROR("keyserver.jsm: execute: subprocess failed due to unknown reasons\n"); - } - return proc; -} + installSksCACert: async function() { + EnigmailLog.DEBUG(`keyserver.jsm: installSksCACert()\n`); + let certDb = Cc["@mozilla.org/security/x509certdb;1"].getService(Ci.nsIX509CertDB); + try { + let certTxt = await this.accessKeyServer(EnigmailConstants.GET_SKS_CACERT, "", "", null); + const BEGIN_CERT = "-----BEGIN CERTIFICATE-----"; + const END_CERT = "-----END CERTIFICATE-----"; + + certTxt = certTxt.replace(/[\r\n]/g, ""); + let begin = certTxt.indexOf(BEGIN_CERT); + let end = certTxt.indexOf(END_CERT); + let certData = certTxt.substring(begin + BEGIN_CERT.length, end); + let x509cert = certDb.addCertFromBase64(certData, "C,C,C", ""); + return x509cert; + } + catch (x) { + return null; + } + }, -function executeRefresh(request, subproc) { - let stdout = ""; - let stderr = ""; - let successful = false; - - const listener = { - done: function(exitCode) { - successful = stringContains(stderr, "IMPORT_OK"); - }, - stderr: function(data) { - stderr += data; - }, - stdout: function(data) { - stdout += data; + /** + * Get the CA certificate for the HKPS sks-keyserver pool + */ + getSksCACert: async function() { + EnigmailLog.DEBUG(`keyserver.jsm: getSksCACert()\n`); + let certDb = Cc["@mozilla.org/security/x509certdb;1"].getService(Ci.nsIX509CertDB); + let cert = null; + + let it = certDb.getCerts().getEnumerator(); + while (it.hasMoreElements()) { + cert = it.getNext().QueryInterface(Ci.nsIX509Cert); + if (cert.subjectName === SKS_CACERT_SUBJECTNAME && cert.certType === Ci.nsIX509Cert.CA_CERT) { + return cert; + } } - }; - execute(request, listener, subproc).wait(); - return successful; -} -function invalidArgumentsExist(actionFlags, keyserver, searchTerms, errorMsgObj) { - if (!keyserver) { - errorMsgObj.value = EnigmailLocale.getString("failNoServer"); - return true; - } + cert = await this.installSksCACert(); + return cert; + }, + + /** + * Download keys from a keyserver + * @param keyIDs: String - space-separated list of search terms or key IDs + * @param keyserver: String - keyserver URL (optionally incl. protocol) + * @param listener: optional Object implementing the KeySrvListener API (above) + * + * @return: Promise<...> + */ + download: async function(keyIDs, keyserver, listener = null) { + EnigmailLog.DEBUG(`keyserver.jsm: accessHkpInternal.download(${keyIDs})\n`); + let keyIdArr = keyIDs.split(/ +/); + let retObj = { + result: 0, + errorDetails: "", + keyList: [] + }; - if (!searchTerms && !matchesKeyserverAction(actionFlags, EnigmailConstants.REFRESH_KEY)) { - errorMsgObj.value = EnigmailLocale.getString("failNoID"); - return true; - } + for (let i = 0; i < keyIdArr.length; i++) { + try { + let r = await this.accessKeyServer(EnigmailConstants.DOWNLOAD_KEY, keyserver, keyIdArr[i], listener); + if (Array.isArray(r)) { + retObj.keyList = retObj.keyList.concat(r); + } + } + catch (ex) { + retObj.result = ex.result; + retObj.errorDetails = ex.errorDetails; + throw retObj; + } - return false; -} + if (listener && "onProgress" in listener) { + listener.onProgress((i + 1) / keyIdArr.length * 100); + } + } -function build(actionFlags, keyserver, searchTerms, errorMsgObj) { - if (invalidArgumentsExist(actionFlags, keyserver, searchTerms, errorMsgObj)) { - return null; - } + return retObj; + }, - const searchTermsList = searchTerms.split(" "); - return gpgRequest(searchTermsList, keyserver.trim(), actionFlags); -} + refresh: function(keyServer, listener = null) { + let keyList = EnigmailKeyRing.getAllKeys().keyList.map(keyObj => { + return "0x" + keyObj.fpr; + }).join(" "); + + return this.download(keyList, keyServer, listener); + }, + + /** + * Upload keys to a keyserver + * @param keyIDs: String - space-separated list of search terms or key IDs + * @param keyserver: String - keyserver URL (optionally incl. protocol) + * @param listener: optional Object implementing the KeySrvListener API (above) + * + * @return: Promise<...> + */ + upload: async function(keyIDs, keyserver, listener = null) { + EnigmailLog.DEBUG(`keyserver.jsm: accessHkpInternal.upload(${keyIDs})\n`); + let keyIdArr = keyIDs.split(/ +/); + let retObj = { + result: 0, + errorDetails: "", + keyList: [] + }; -/** - * search, download or upload key on, from or to a keyserver - * - * @actionFlags: Integer - flags (bitmap) to determine the required action - * (see EnigmailConstants - Keyserver action flags for details) - * @keyserver: String - keyserver URL (optionally incl. protocol) - * @searchTerms: String - space-separated list of search terms or key IDs - * @listener: Object - execStart Listener Object. See execStart for details. - * @errorMsgObj: Object - object to hold error message in .value - * - * @return: Subprocess object, or null in case process could not be started - */ -function access(actionFlags, keyserver, searchTerms, listener, errorMsgObj) { + for (let i = 0; i < keyIdArr.length; i++) { + try { + let r = await this.accessKeyServer(EnigmailConstants.UPLOAD_KEY, keyserver, keyIdArr[i], listener); + if (r === 0) { + retObj.keyList.push(keyIdArr[i]); + } + else { + retObj.result = r; + } + } + catch (ex) { + retObj.result = ex.result; + retObj.errorDetails = ex.errorDetails; + throw retObj; + } - if (keyserver.search(/^(hkps:\/\/)?keys.mailvelope.com$/i) === 0) { - if (matchesKeyserverAction(actionFlags, EnigmailConstants.UPLOAD_KEY) || - matchesKeyserverAction(actionFlags, EnigmailConstants.DOWNLOAD_KEY)) { - // special API for mailvelope.com - return accessHkp(actionFlags, keyserver, searchTerms, listener, errorMsgObj); + if (listener && "onProgress" in listener) { + listener.onProgress((i + 1) / keyIdArr.length * 100); + } } - } - const request = build(actionFlags, keyserver, searchTerms, errorMsgObj, EnigmailHttpProxy); - if (request === null) return null; - return execute(request, listener, subprocess); -} + return retObj; + }, -function buildHkpPayload(actionFlags, searchTerms) { - let payLoad = null; + /** + * Search for keys on a keyserver + * @param searchTerm: String - search term + * @param keyserver: String - keyserver URL (optionally incl. protocol) + * @param listener: optional Object implementing the KeySrvListener API (above) + * + * @return: Promise + * - result: Number + * - pubKeys: Array of Object: + * PubKeys: Object with: + * - keyId: String + * - keyLen: String + * - keyType: String + * - created: String (YYYY-MM-DD) + * - status: String: one of ''=valid, r=revoked, e=expired + * - uid: Array of Strings with UIDs + */ + search: async function(searchTerm, keyserver, listener = null) { + EnigmailLog.DEBUG(`keyserver.jsm: accessHkpInternal.search(${searchTerm})\n`); + let retObj = { + result: 0, + errorDetails: "", + pubKeys: [] + }; + let key = null; - if (matchesKeyserverAction(actionFlags, EnigmailConstants.UPLOAD_KEY)) { - let keyData = EnigmailKeyRing.extractKey(false, searchTerms, null, {}, {}); - if (keyData.length === 0) return null; + let searchArr = searchTerm.split(/ +/); - payLoad = "keytext=" + encodeURIComponent(keyData); - return payLoad; - } - else if (matchesKeyserverAction(actionFlags, EnigmailConstants.DOWNLOAD_KEY)) { - return ""; - } + try { + for (let k in searchArr) { + let r = await this.accessKeyServer(EnigmailConstants.SEARCH_KEY, keyserver, searchArr[k], listener); + + let lines = r.split(/\r?\n/); + + for (var i = 0; i < lines.length; i++) { + let line = lines[i].split(/:/).map(unescape); + if (line.length <= 1) continue; + + switch (line[0]) { + case "info": + if (line[1] !== "1") { + // protocol version not supported + throw { + result: 7, + errorDetails: EnigmailLocale.getString("keyserver.error.unsupported"), + pubKeys: [] + }; + } + break; + case "pub": + if (line.length >= 6) { + if (key) { + retObj.pubKeys.push(key); + key = null; + } + let dat = new Date(line[4] * 1000); + let month = String(dat.getMonth() + 101).substr(1); + let day = String(dat.getDate() + 100).substr(1); + key = { + keyId: line[1], + keyLen: line[3], + keyType: line[2], + created: dat.getFullYear() + "-" + month + "-" + day, + uid: [], + status: line[6] + }; + } + break; + case "uid": + key.uid.push(EnigmailData.convertToUnicode(line[1].trim(), "utf-8")); + } + } - // other actions are not yet implemented - return null; + if (key) { + retObj.pubKeys.push(key); + } + } + } + catch (ex) { + retObj.result = ex.result; + retObj.errorDetails = ex.errorDetails; + throw retObj; + } -} + return retObj; + } +}; /** - * Access a HKP server directly (without gpg involved) - * Same API as access() - * currently only key uploading is supported + Object to handle KeyBase requests (search & download only) */ -function accessHkp(actionFlags, keyserver, searchTerms, listener, errorMsgObj) { - EnigmailLog.DEBUG("keyserver.jsm: accessHkp()\n"); +const accessKeyBase = { + /** + * return the URL and the HTTP access method for a given action + */ + createRequestUrl: function(actionFlag, searchTerm) { + const method = "GET"; - const ERROR_MSG = "[GNUPG:] ERROR X"; + let url = "https://keybase.io/_/api/1.0/user/"; - function downloadNextKey() { - if (searchTerms.length > 0) { - accessHkp(actionFlags, keyserver, searchTerms, listener, errorMsgObj); + if (actionFlag === EnigmailConstants.UPLOAD_KEY) { + // not supported + throw Components.results.NS_ERROR_FAILURE; } - else { - listener.done(0); + else if (actionFlag === EnigmailConstants.DOWNLOAD_KEY) { + if (searchTerm.indexOf("0x") === 0) { + searchTerm = searchTerm.substr(0, 40); + } + url += "lookup.json?key_fingerprint=" + escape(searchTerm) + "&fields=public_keys"; + } + else if (actionFlag === EnigmailConstants.SEARCH_KEY) { + url += "autocomplete.json?q=" + escape(searchTerm); } - } - let keySrv = parseKeyserverUrl(keyserver); - let protocol = "https"; // protocol is always hkps (which equals to https in TB) + return { + url: url, + method: "GET" + }; + }, - let payLoad = buildHkpPayload(actionFlags, searchTerms); - if (payLoad === null) return null; + /** + * Upload, search or download keys from a keyserver + * @param actionFlag: Number - Keyserver Action Flags: from EnigmailConstants + * @param keyId: String - space-separated list of search terms or key IDs + * @param listener: optional Object implementing the KeySrvListener API (above) + * + * @return: Promise + */ + accessKeyServer: function(actionFlag, keyId, listener) { + EnigmailLog.DEBUG(`keyserver.jsm: accessKeyBase: accessKeyServer()\n`); + + return new Promise((resolve, reject) => { + let xmlReq = null; + if (listener && typeof(listener) === "object") { + listener.onCancel = function() { + EnigmailLog.DEBUG(`keyserver.jsm: accessKeyBase: accessKeyServer - onCancel() called\n`); + if (xmlReq) { + xmlReq.abort(); + } + reject(createError(EnigmailConstants.KEYSERVER_ERR_ABORTED)); + }; + } + if (actionFlag === EnigmailConstants.REFRESH_KEY) { + // we don't (need to) distinguish between refresh and download for our internal protocol + actionFlag = EnigmailConstants.DOWNLOAD_KEY; + } - let errorCode = 0; - let method = "GET"; + let errorCode = 0; - let xmlReq = new XMLHttpRequest(); + xmlReq = new XMLHttpRequest(); - xmlReq.onload = function _onLoad() { - EnigmailLog.DEBUG("keyserver.jsm: onload(): status=" + xmlReq.status + "\n"); - if (matchesKeyserverAction(actionFlags, EnigmailConstants.UPLOAD_KEY)) { - if (xmlReq.status >= 400) { - EnigmailLog.DEBUG("keyserver.jsm: onload: " + xmlReq.responseText + "\n"); - listener.stderr(ERROR_MSG); - errorCode = 1; - } - } - else if (matchesKeyserverAction(actionFlags, EnigmailConstants.DOWNLOAD_KEY)) { - if (xmlReq.status >= 400 && xmlReq.status < 500) { - downloadNextKey(); - } - else if (xmlReq.status >= 500) { - EnigmailLog.DEBUG("keyserver.jsm: onload: " + xmlReq.responseText + "\n"); - listener.stderr(ERROR_MSG); - errorCode = 1; - } - else { - let r = importHkpKey(xmlReq.responseText, listener); - if (r !== 0) { - listener.done(r); + xmlReq.onload = function _onLoad() { + EnigmailLog.DEBUG("keyserver.jsm: onload(): status=" + xmlReq.status + "\n"); + switch (actionFlag) { + case EnigmailConstants.SEARCH_KEY: + if (xmlReq.status >= 400) { + reject(createError(EnigmailConstants.KEYSERVER_ERR_SERVER_ERROR)); + } + else { + resolve(xmlReq.responseText); + } + return; + + case EnigmailConstants.DOWNLOAD_KEY: + if (xmlReq.status >= 400 && xmlReq.status < 500) { + // key not found + resolve([]); + } + else if (xmlReq.status >= 500) { + EnigmailLog.DEBUG("keyserver.jsm: onload: " + xmlReq.responseText + "\n"); + reject(createError(EnigmailConstants.KEYSERVER_ERR_SERVER_ERROR)); + } + else { + try { + let resp = JSON.parse(xmlReq.responseText); + let imported = []; + + if (resp.status.code === 0) { + for (let hit in resp.them) { + EnigmailLog.DEBUG(JSON.stringify(resp.them[hit].public_keys.primary) + "\n"); + + if (resp.them[hit] !== null) { + let errorMsgObj = {}, + importedKeysObj = {}; + let r = EnigmailKeyRing.importKey(null, false, resp.them[hit].public_keys.primary.bundle, "", errorMsgObj, importedKeysObj); + if (r === 0) { + imported.push(importedKeysObj.value); + } + } + } + } + resolve(imported); + } + catch (ex) { + reject(createError(EnigmailConstants.KEYSERVER_ERR_UNKNOWN)); + } + } + return; } - else { - downloadNextKey(); + resolve(-1); + }; + + xmlReq.onerror = function(e) { + EnigmailLog.DEBUG("keyserver.jsm: accessKeyBase: onerror: " + e + "\n"); + let err = EnigmailXhrUtils.createTCPErrorFromFailedXHR(e.target); + switch (err.type) { + case 'SecurityCertificate': + reject(createError(EnigmailConstants.KEYSERVER_ERR_CERTIFICATE_ERROR)); + break; + case 'SecurityProtocol': + reject(createError(EnigmailConstants.KEYSERVER_ERR_SECURITY_ERROR)); + break; + case 'Network': + reject(createError(EnigmailConstants.KEYSERVER_ERR_SERVER_UNAVAILABLE)); + break; + } + reject(createError(EnigmailConstants.KEYSERVER_ERR_SERVER_UNAVAILABLE)); + }; + + xmlReq.onloadend = function() { + EnigmailLog.DEBUG("keyserver.jsm: accessKeyBase: loadEnd\n"); + }; + + let { + url, + method + } = this.createRequestUrl(actionFlag, keyId); + + EnigmailLog.DEBUG(`keyserver.jsm: accessKeyBase: requesting ${url}\n`); + xmlReq.open(method, url); + xmlReq.send(""); + }); + }, + + /** + * Download keys from a KeyBase + * @param keyIDs: String - space-separated list of search terms or key IDs + * @param keyserver: (not used for keybase) + * @param listener: optional Object implementing the KeySrvListener API (above) + * + * @return: Promise<...> + */ + download: async function(keyIDs, keyserver, listener = null) { + EnigmailLog.DEBUG(`keyserver.jsm: accessKeyBase: download()\n`); + let keyIdArr = keyIDs.split(/ +/); + let retObj = { + result: 0, + errorDetails: "", + keyList: [] + }; + + + for (let i = 0; i < keyIdArr.length; i++) { + try { + let r = await this.accessKeyServer(EnigmailConstants.DOWNLOAD_KEY, keyIdArr[i], listener); + if (r.length > 0) { + retObj.keyList = retObj.keyList.concat(r); } } + catch (ex) { + retObj.result = ex.result; + retObj.errorDetails = ex.result; + throw retObj; + } - return; + if (listener && "onProgress" in listener) { + listener.onProgress(i / keyIdArr.length); + } } - listener.done(errorCode); - }; + return retObj; + }, - xmlReq.onerror = function(e) { - EnigmailLog.DEBUG("keyserver.jsm: onerror: " + e + "\n"); - listener.stderr(ERROR_MSG); - listener.done(1); - }; + /** + * Search for keys on a keyserver + * @param searchTerm: String - search term + * @param keyserver: String - keyserver URL (optionally incl. protocol) + * @param listener: optional Object implementing the KeySrvListener API (above) + * + * @return: Promise + * - result: Number + * - pubKeys: Array of Object: + * PubKeys: Object with: + * - keyId: String + * - keyLen: String + * - keyType: String + * - created: String (YYYY-MM-DD) + * - status: String: one of ''=valid, r=revoked, e=expired + * - uid: Array of Strings with UIDs + + */ + search: async function(searchTerm, keyserver, listener = null) { + EnigmailLog.DEBUG(`keyserver.jsm: accessKeyBase: search()\n`); + let retObj = { + result: 0, + errorDetails: "", + pubKeys: [] + }; - xmlReq.onloadend = function() { - EnigmailLog.DEBUG("keyserver.jsm: loadEnd:\n"); - }; + let key = {}; + + try { + let r = await this.accessKeyServer(EnigmailConstants.SEARCH_KEY, searchTerm, listener); + + let res = JSON.parse(r); + let completions = res.completions; - let url = protocol + "://" + keySrv.host + ":" + keySrv.port; - if (matchesKeyserverAction(actionFlags, EnigmailConstants.UPLOAD_KEY)) { - url += "/pks/add"; - method = "POST"; - } - else if (matchesKeyserverAction(actionFlags, EnigmailConstants.DOWNLOAD_KEY)) { - let keys = searchTerms.split(/ +/); - if (searchTerms.length > 0) { - let keyId = keys[0]; - if (keyId.indexOf("0x") !== 0) { - keyId = "0x" + keyId; - } - url += "/pks/lookup?search=" + keyId + "&op=get&options=mr"; - keys.shift(); // remove 1st key - searchTerms = keys.join(" "); + for (let hit in completions) { + if (completions[hit] && completions[hit].components.key_fingerprint !== undefined) { + let uid = completions[hit].components.username.val; + if ("full_name" in completions[hit].components) { + uid += " (" + completions[hit].components.full_name.val + ")"; + } + let key = { + keyId: completions[hit].components.key_fingerprint.val.toUpperCase(), + keyLen: completions[hit].components.key_fingerprint.nbits.toString(), + keyType: completions[hit].components.key_fingerprint.algo.toString(), + created: 0, //date.toDateString(), + uid: [uid], + status: "" + }; + retObj.pubKeys.push(key); + } + } } - else { - listener.done(0); - return null; + catch (ex) { + retObj.result = ex.result; + retObj.errorDetails = ex.errorDetails; + throw retObj; } - } - xmlReq.open(method, url, true, "no-user", ""); - xmlReq.send(payLoad); + return retObj; + }, - // return the same API as subprocess - return { - wait: function() { - throw Components.results.NS_ERROR_FAILURE; - }, - kill: function() { - xmlReq.abort(); - } - }; -} + upload: function() { + throw Components.results.NS_ERROR_FAILURE; + }, -function importHkpKey(keyData, listener) { - EnigmailLog.DEBUG("keyserver.jsm: importHkpKey()\n"); + refresh: function(keyServer, listener = null) { + EnigmailLog.DEBUG(`keyserver.jsm: accessKeyBase: refresh()\n`); + let keyList = EnigmailKeyRing.getAllKeys().keyList.map(keyObj => { + return "0x" + keyObj.fpr; + }).join(" "); - if (keyData.length > 0) { - let errorMsgObj = {}; - return EnigmailKeyRing.importKey(null, false, keyData, "", errorMsgObj); + return this.download(keyList, keyServer, listener); } +}; - return 0; -} /** - * Refresh will refresh a key over Tor if Tor is available and over hkps if hkps is configured - * and available. - * - * @param String keyId - ID of the key to be refreshed + Object to handle HKP/HKPS and LDAP/LDAPS requests via GnuPG */ -function refresh(keyId) { - EnigmailLog.DEBUG("keyserver.jsm: Trying to refresh key: " + keyId + " at time: " + new Date().toUTCString() + "\n"); - const refreshAction = EnigmailConstants.DOWNLOAD_KEY; - const requests = buildRequests(keyId, refreshAction, EnigmailTor, EnigmailHttpProxy); - - for (let i = 0; i < requests.length; i++) { - const successStatus = executeRefresh(requests[i], subprocess); - if (successStatus || i === requests.length - 1) { - logRefreshAction(successStatus, requests[i].usingTor, keyId); - return; - } - } -} +const accessGnuPG = { -function logRefreshAction(successStatus, usingTor, keyId) { - if (successStatus) { - EnigmailLog.CONSOLE("Refreshed key " + keyId + " over Tor: " + usingTor + ". Refreshed successfully: " + successStatus + "\n\n"); - } - else { - EnigmailLog.CONSOLE("Failed to refresh key " + keyId + "\n\n"); - } -} + /** + * Upload, search or download keys from a keyserver + * @param actionFlag: Number - Keyserver Action Flags: from EnigmailConstants + * @param keyId: String - space-separated list of search terms or key IDs + * @param keyserver: String - keyserver URL (optionally incl. protocol) + * @param listener: optional Object implementing the KeySrvListener API (above) + * + * @return Promise Object from execAsync + */ + accessKeyServer: function(actionFlag, keyserver, keyId, listener) { + EnigmailLog.DEBUG(`keyserver.jsm: accessGnuPG: accessKeyServer(${keyserver})\n`); -let currentProxyModule = null; + let processHandle = { + value: null + }; -function getProxyModule() { - if (currentProxyModule === null) { - currentProxyModule = EnigmailHttpProxy; - } - return currentProxyModule; -} + if (listener) { + listener._isCancelled = 0; + listener.onCancel = function() { + EnigmailLog.DEBUG(`keyserver.jsm: accessGnuPG: accessKeyServer: onCancel\n`); + if (processHandle.value) { + processHandle.value.killProcess(); + } + this._isCancelled = 1; + }; + } -/** - * Upload/refresh keys to/from keyservers. - * - * @param win - |object| holding the parent window for the dialog. - * @param keys - |array| with key objects for the keys to upload/refresh - * @param access - |EnigmailConstants| UPLOAD_WKS, UPLOAD_KEY or REFRESH_KEY - * @param hideProgess - |boolean| do not display progress dialogs - * @param callbackFunc - |function| called when the key server operation finishes - * params: exitCode, errorMsg, displayErrorMsg - * @param resultObj - |object| with member importedKeys (|number| containing the number of imported keys) - * - * no return value - */ -function keyServerUpDownload(win, keys, access, hideProgess, callbackFunc, resultObj) { - let keyList = keys.map(function(x) { - return "0x" + x.keyId.toString(); - }).join(" "); - - EnigmailLog.DEBUG("keyserver.jsm: keyServerUpDownload: keyId=" + keyList + "\n"); - - const ioService = Cc[IOSERVICE_CONTRACTID].getService(Ci.nsIIOService); - if (ioService && ioService.offline) { - EnigmailDialog.alert(win, EnigmailLocale.getString("needOnline")); - return; - } - - let keyDlObj = { - accessType: access, - keyServer: resultObj.value, - keyList: keyList, - fprList: [], - senderIdentities: [], - cbFunc: callbackFunc - }; + if (keyserver === null) { + keyserver = EnigmailKeyserverURIs.getDefaultKeyServer(); + } - if (access === EnigmailConstants.UPLOAD_WKD) { - for (let key of keys) { - // UPLOAD_WKD needs a nsIMsgIdentity - try { - for (let uid of key.userIds) { - let email = EnigmailFuncs.stripEmail(uid.userId); - let maybeIdent = EnigmailStdlib.getIdentityForEmail(email); - - if (maybeIdent && maybeIdent.identity) { - keyDlObj.senderIdentities.push(maybeIdent.identity); - keyDlObj.fprList.push(key.fpr); - } - } + let args = EnigmailGpg.getStandardArgs(true); + args.push("--log-file"); + args.push(EnigmailOS.isWin32 ? "NUL" : "/dev/null"); + args.push("--with-colons"); + + let cmd = ""; + + let proxyHost = EnigmailHttpProxy.getHttpProxy(); + if (proxyHost) { + args = args.concat(["--keyserver-options", "http-proxy=" + proxyHost]); + } - if (keyDlObj.senderIdentities.length === 0) { - let uids = key.userIds.map(function(x) { - return " - " + x.userId; - }).join("\n"); + args.push("--keyserver"); + args.push(keyserver); - if (!hideProgess) { - EnigmailDialog.alert(win, EnigmailLocale.getString("noWksIdentity", [uids])); - } - return; - } - } catch (ex) { - EnigmailLog.DEBUG(ex + "\n"); - return; - } + switch (actionFlag) { + case EnigmailConstants.SEARCH_KEY: + cmd = "--search-keys"; + break; + case EnigmailConstants.DOWNLOAD_KEY: + cmd = "--recv-keys"; + break; + case EnigmailConstants.UPLOAD_KEY: + cmd = "--send-keys"; + break; } - } - else { - let autoKeyServer = EnigmailPrefs.getPref("autoKeyServerSelection") ? EnigmailPrefs.getPref("keyserver").split(/[ ,;]/g)[0] : null; - if (autoKeyServer) { - keyDlObj.keyServer = autoKeyServer; - } - else { - let inputObj = {}; - let resultObj = {}; - switch (access) { - case EnigmailConstants.REFRESH_KEY: - inputObj.upload = false; - inputObj.keyId = ""; + + args.push(cmd); + args = args.concat(keyId.split(/ +/)); + + return EnigmailExecution.execAsync(EnigmailGpg.agentPath, args, "", processHandle); + }, + + parseStatusMsg: function(execResult) { + let errorCode = 0, + errorType = null; + + // Find the 1st FAILURE message in the gpg status output + let m = execResult.stderrData.match(/^\[GNUPG:\] (FAILURE|ERROR) ([^ ]+ )(\d+)/m); + + if (m && m.length >= 4 && m[3].search(/^[0-9]+$/) === 0) { + let errorNumber = Number(m[3]); + //let sourceSystem = errorNumber >> 24; + errorCode = errorNumber & 0xFFFFFF; + + switch (errorCode) { + case 58: // no data break; - case EnigmailConstants.DOWNLOAD_KEY: - inputObj.upload = false; - inputObj.keyId = keyList; + case 32793: // connection refused + case 32810: // host unreachable + case 220: // Server not found (no name) + errorType = EnigmailConstants.KEYSERVER_ERR_SERVER_UNAVAILABLE; break; - case EnigmailConstants.UPLOAD_KEY: - inputObj.upload = true; - inputObj.keyId = keyList; + case 228: + errorType = EnigmailConstants.KEYSERVER_ERR_SECURITY_ERROR; + break; + case 100: // various certificate errors + case 101: + case 102: + case 103: + case 185: + errorType = EnigmailConstants.KEYSERVER_ERR_CERTIFICATE_ERROR; break; default: - inputObj.upload = true; - inputObj.keyId = ""; + errorType = EnigmailConstants.KEYSERVER_ERR_SERVER_ERROR; } + } - win.openDialog("chrome://enigmail/content/enigmailKeyserverDlg.xul", - "", "dialog,modal,centerscreen", inputObj, resultObj); - keyDlObj.keyServer = resultObj.value; + if (execResult.isKilled !== 0) { + errorType = EnigmailConstants.KEYSERVER_ERR_ABORTED; } - if (!keyDlObj.keyServer) { - return; + if (errorType !== null) { + EnigmailLog.DEBUG(`keyserver.jsm: accessGnuPG.parseStatusMsg: got errorCode=${errorCode}\n`); + return createError(errorType); } - } - if (!hideProgess) { - win.openDialog("chrome://enigmail/content/enigRetrieveProgress.xul", - "", "dialog,modal,centerscreen", keyDlObj, resultObj); - } - else { - resultObj.fprList = []; - let observer = { - isCanceled: false, - onProgress: function() {}, - onFinished: function(resultStatus, errorMsg, displayError) { - resultObj.result = (resultStatus === 0); - callbackFunc(resultStatus, errorMsg, displayError); - }, - onUpload: function(fpr) { - resultObj.fprList.push(fpr); + return null; + }, + /** + * Download keys from a keyserver + * @param keyIDs: String - space-separated list of search terms or key IDs + * @param keyserver: String - keyserver URL (optionally incl. protocol) + * @param listener: optional Object implementing the KeySrvListener API (above) + * + * @return: Promise<...> + */ + download: async function(keyIDs, keyserver, listener = null) { + EnigmailLog.DEBUG(`keyserver.jsm: accessGnuPG.download(${keyIDs})\n`); + let retObj = { + result: 0, + errorDetails: "", + keyList: [] + }; + let keyIdArr = keyIDs.split(/ +/); + + for (let i = 0; i < keyIdArr.length; i++) { + let r = await this.accessKeyServer(EnigmailConstants.DOWNLOAD_KEY, keyserver, keyIdArr[i], listener); + + let exitValue = this.parseStatusMsg(r); + if (exitValue) { + exitValue.keyList = []; + throw exitValue; + } + + var statusLines = r.statusMsg.split(/\r?\n/); + + for (let j = 0; j < statusLines.length; j++) { + let matches = statusLines[j].match(/IMPORT_OK ([0-9]+) (\w+)/); + if (matches && (matches.length > 2)) { + retObj.keyList.push(matches[2]); + EnigmailKeyRing.updateKeys([matches[2]]); + } + } + + if (listener && "onProgress" in listener) { + listener.onProgress((i + 1) / keyIdArr.length * 100); + } + } + + return retObj; + }, + + refresh: function(keyServer, listener = null) { + let keyList = EnigmailKeyRing.getAllKeys().keyList.map(keyObj => { + return "0x" + keyObj.fpr; + }).join(" "); + + return this.download(keyList, keyServer, listener); + }, + + /** + * Upload keys to a keyserver + * @param keyIDs: String - space-separated list of search terms or key IDs + * @param keyserver: String - keyserver URL (optionally incl. protocol) + * @param listener: optional Object implementing the KeySrvListener API (above) + * + * @return: Promise<...> + */ + upload: async function(keyIDs, keyserver, listener = null) { + EnigmailLog.DEBUG(`keyserver.jsm: accessGnuPG.upload(${keyIDs})\n`); + let keyIdArr = keyIDs.split(/ +/); + let retObj = { + result: 0, + errorDetails: "", + keyList: [] + }; + + for (let i = 0; i < keyIdArr.length; i++) { + let r = await this.accessKeyServer(EnigmailConstants.UPLOAD_KEY, keyserver, keyIdArr[i], listener); + + let exitValue = this.parseStatusMsg(r); + if (exitValue) { + exitValue.keyList = []; + throw exitValue; + } + + if (r.exitCode === 0) { + retObj.keyList.push(keyIdArr[i]); } + + if (listener && "onProgress" in listener) { + listener.onProgress((i + 1) / keyIdArr.length * 100); + } + } + + return retObj; + }, + + /** + * Search for keys on a keyserver + * @param searchTerm: String - search term + * @param keyserver: String - keyserver URL (optionally incl. protocol) + * @param listener: optional Object implementing the KeySrvListener API (above) + * + * @return: Promise + * - result: Number + * - pubKeys: Array of Object: + * PubKeys: Object with: + * - keyId: String + * - keyLen: String + * - keyType: String + * - created: String (YYYY-MM-DD) + * - status: String: one of ''=valid, r=revoked, e=expired + * - uid: Array of Strings with UIDs + */ + search: async function(searchTerm, keyserver, listener = null) { + EnigmailLog.DEBUG(`keyserver.jsm: accessGnuPG.search(${searchTerm})\n`); + let retObj = { + result: 0, + errorDetails: "", + pubKeys: [] }; + let key = null; + + try { + let r = await this.accessKeyServer(EnigmailConstants.SEARCH_KEY, keyserver, searchTerm, listener); + + let exitValue = this.parseStatusMsg(r); + if (exitValue) { + exitValue.pubKeys = []; + throw exitValue; + } + + let lines = r.stdoutData.split(/\r?\n/); + + for (var i = 0; i < lines.length; i++) { + let line = lines[i].split(/:/).map(unescape); + if (line.length <= 1) continue; + + switch (line[0]) { + case "info": + if (line[1] !== "1") { + // protocol version not supported + throw { + result: 7, + errorDetails: EnigmailLocale.getString("keyserver.error.unsupported"), + pubKeys: [] + }; + } + break; + case "pub": + if (line.length >= 6) { + if (key) { + retObj.pubKeys.push(key); + key = null; + } + let dat = new Date(line[4] * 1000); + let month = String(dat.getMonth() + 101).substr(1); + let day = String(dat.getDate() + 100).substr(1); + key = { + keyId: line[1], + keyLen: line[3], + keyType: line[2], + created: dat.getFullYear() + "-" + month + "-" + day, + uid: [], + status: line[6] + }; + } + break; + case "uid": + key.uid.push(EnigmailData.convertToUnicode(line[1].trim(), "utf-8")); + } + } + + if (key) { + retObj.pubKeys.push(key); + } + } + catch (ex) { + retObj.result = ex.result; + retObj.errorDetails = ex.errorDetails; + throw retObj; + } + + return retObj; + } +}; + + +function getAccessType(keyserver) { + if (keyserver === null) { + keyserver = EnigmailKeyserverURIs.getDefaultKeyServer(); + } + + + let srv = parseKeyserverUrl(keyserver); + switch (srv.protocol) { + case "keybase": + return accessKeyBase; + case "ldap": + case "ldaps": + return accessGnuPG; + case "vks": + return accessVksServer; + } + + if (srv.host.search(/keys.openpgp.org$/i) >= 0) { + return accessVksServer; + } - performWkdUpload(keyDlObj, null, observer); + if (EnigmailPrefs.getPref("useGpgKeysTool")) { + return accessGnuPG; } + + return accessHkpInternal; } /** - * Do the WKD upload and interact with a progress receiver - * - * @param keyList: Object: - * - fprList (String - fingerprint) - * - senderIdentities (nsIMsgIdentity) - * @param win: nsIWindow - parent window - * @param observer: Object: - * - onProgress: function(percentComplete [0 .. 100]) - * called after processing of every key (indpendent of status) - * - onUpload: function(fpr) - * called after successful uploading of a key - * - onFinished: function(completionStatus, errorMessage, displayError) - * - isCanceled: Boolean - used to determine if process is canceled + Object to handle VKS requests (for example keys.openpgp.org) */ -function performWkdUpload(keyList, win, observer) { - try { - let uploads = []; - - let numKeys = keyList.senderIdentities.length; - - // For each key fpr/sender identity pair, check whenever WKS is supported - // Result is an array of booleans - for (let i = 0; i < numKeys; i++) { - let keyFpr = keyList.fprList[i]; - let senderIdent = keyList.senderIdentities[i]; - - let was_uploaded = new Promise(function(resolve, reject) { - EnigmailLog.DEBUG("keyserver.jsm: performWkdLoad: ident=" + senderIdent.email + ", key=" + keyFpr + "\n"); - EnigmailWks.isWksSupportedAsync(senderIdent.email, win, function(is_supported) { - if (observer.isCanceled) { - EnigmailLog.DEBUG("keyserver.jsm: performWkdLoad: canceled by user\n"); - reject("canceled"); - } +const accessVksServer = { + /** + * Create the payload of VKS requests (currently upload only) + * + */ + buildJsonPayload: function(actionFlag, searchTerms, locale) { + let payLoad = null, + keyData = ""; + + switch (actionFlag) { + case EnigmailConstants.UPLOAD_KEY: + keyData = EnigmailKeyRing.extractKey(false, searchTerms, null, {}, {}); + if (keyData.length === 0) return null; + + payLoad = JSON.stringify({ + keytext: keyData + }); + return payLoad; - EnigmailLog.DEBUG("keyserver.jsm: performWkdLoad: ident=" + senderIdent.email + ", supported=" + is_supported + "\n"); - resolve(is_supported); + case EnigmailConstants.GET_CONFIRMATION_LINK: + payLoad = JSON.stringify({ + token: searchTerms.token, + addresses: searchTerms.addresses, + locale: [locale] }); - }).then(function(is_supported) { - let senderIdent = keyList.senderIdentities[i]; - if (is_supported) { - let keyFpr = keyList.fprList[i]; - - return new Promise(function(resolve, reject) { - EnigmailWks.submitKey(senderIdent, { - 'fpr': keyFpr - }, win, function(success) { - observer.onProgress((i + 1) / numKeys * 100); - if (success) { - observer.onUpload(keyFpr); - resolve(senderIdent); + return payLoad; + + case EnigmailConstants.DOWNLOAD_KEY: + case EnigmailConstants.SEARCH_KEY: + case EnigmailConstants.GET_SKS_CACERT: + return ""; + } + + // other actions are not yet implemented + return null; + }, + + /** + * return the URL and the HTTP access method for a given action + */ + createRequestUrl: function(keyserver, actionFlag, searchTerm) { + let keySrv = parseKeyserverUrl(keyserver); + let contentType = "text/plain;charset=UTF-8"; + + let method = "GET"; + + let url = "https://" + keySrv.host + ":443"; + + if (actionFlag === EnigmailConstants.UPLOAD_KEY) { + url += "/vks/v1/upload"; + method = "POST"; + contentType = "application/json"; + } + else if (actionFlag === EnigmailConstants.GET_CONFIRMATION_LINK) { + url += "/vks/v1/request-verify"; + method = "POST"; + contentType = "application/json"; + } + else if (actionFlag === EnigmailConstants.DOWNLOAD_KEY || actionFlag === EnigmailConstants.SEARCH_KEY) { + if (searchTerm) { + let lookup = "/vks/"; + if (searchTerm.indexOf("0x") === 0) { + searchTerm = searchTerm.substr(2); + if (searchTerm.length == 16 && searchTerm.search(/^[A-F0-9]+$/) === 0) { + lookup = "/vks/v1/by-keyid/" + searchTerm; + } + else if (searchTerm.length == 40 && searchTerm.search(/^[A-F0-9]+$/) === 0) { + lookup = "/vks/v1/by-fingerprint/" + searchTerm; + } + } + else { + try { + searchTerm = EnigmailFuncs.stripEmail(searchTerm); + } + catch (x) {} + lookup = "/vks/v1/by-email/" + searchTerm; + } + url += lookup; + } + } + + return { + url: url, + host: keySrv.host, + method: method, + contentType: contentType + }; + }, + + /** + * Upload, search or download keys from a keyserver + * @param actionFlag: Number - Keyserver Action Flags: from EnigmailConstants + * @param keyId: String - space-separated list of search terms or key IDs + * @param keyserver: String - keyserver URL (optionally incl. protocol) + * @param listener: optional Object implementing the KeySrvListener API (above) + * + * @return: Promise + */ + accessKeyServer: function(actionFlag, keyserver, keyId, listener) { + EnigmailLog.DEBUG(`keyserver.jsm: accessVksServer.accessKeyServer(${keyserver})\n`); + if (keyserver === null) { + keyserver = "keys.openpgp.org"; + } + + return new Promise((resolve, reject) => { + let xmlReq = null; + if (listener && typeof(listener) === "object") { + listener.onCancel = function() { + EnigmailLog.DEBUG(`keyserver.jsm: accessVksServer.accessKeyServer - onCancel() called\n`); + if (xmlReq) { + xmlReq.abort(); + } + reject(createError(EnigmailConstants.KEYSERVER_ERR_ABORTED)); + }; + } + if (actionFlag === EnigmailConstants.REFRESH_KEY) { + // we don't (need to) distinguish between refresh and download for our internal protocol + actionFlag = EnigmailConstants.DOWNLOAD_KEY; + } + + let uiLocale = EnigmailLocale.getUILocale(); + let payLoad = this.buildJsonPayload(actionFlag, keyId, uiLocale); + if (payLoad === null) { + reject(createError(EnigmailConstants.KEYSERVER_ERR_UNKNOWN)); + return; + } + + let errorCode = 0; + + xmlReq = new XMLHttpRequest(); + + xmlReq.onload = function _onLoad() { + EnigmailLog.DEBUG("keyserver.jsm: accessVksServer.onload(): status=" + xmlReq.status + "\n"); + switch (actionFlag) { + case EnigmailConstants.UPLOAD_KEY: + case EnigmailConstants.GET_CONFIRMATION_LINK: + + EnigmailLog.DEBUG("keyserver.jsm: accessVksServer.onload: " + xmlReq.responseText + "\n"); + if (xmlReq.status >= 400) { + reject(createError(EnigmailConstants.KEYSERVER_ERR_SERVER_ERROR)); + } + else { + resolve(xmlReq.responseText); + } + return; + + case EnigmailConstants.SEARCH_KEY: + if (xmlReq.status === 404) { + // key not found + resolve(""); + } + else if (xmlReq.status >= 400) { + reject(createError(EnigmailConstants.KEYSERVER_ERR_SERVER_ERROR)); + } + else { + resolve(xmlReq.responseText); + } + return; + + case EnigmailConstants.DOWNLOAD_KEY: + if (xmlReq.status >= 400 && xmlReq.status < 500) { + // key not found + resolve(1); + } + else if (xmlReq.status >= 500) { + EnigmailLog.DEBUG("keyserver.jsm: accessVksServer.onload: " + xmlReq.responseText + "\n"); + reject(createError(EnigmailConstants.KEYSERVER_ERR_SERVER_ERROR)); + } + else { + let errorMsgObj = {}, + importedKeysObj = {}; + let r = EnigmailKeyRing.importKey(null, false, xmlReq.responseText, "", errorMsgObj, importedKeysObj); + if (r === 0) { + resolve(importedKeysObj.value); } else { - reject(); + reject(createError(EnigmailConstants.KEYSERVER_ERR_IMPORT_ERROR)); } - }); - }); + } + return; } - else { - observer.onProgress((i + 1) / numKeys * 100); - return Promise.resolve(null); + resolve(-1); + }; + + xmlReq.onerror = function(e) { + EnigmailLog.DEBUG("keyserver.jsm: accessVksServer.accessKeyServer: onerror: " + e + "\n"); + let err = EnigmailXhrUtils.createTCPErrorFromFailedXHR(e.target); + switch (err.type) { + case 'SecurityCertificate': + reject(createError(EnigmailConstants.KEYSERVER_ERR_CERTIFICATE_ERROR)); + break; + case 'SecurityProtocol': + reject(createError(EnigmailConstants.KEYSERVER_ERR_SECURITY_ERROR)); + break; + case 'Network': + reject(createError(EnigmailConstants.KEYSERVER_ERR_SERVER_UNAVAILABLE)); + break; } - }); + reject(createError(EnigmailConstants.KEYSERVER_ERR_SERVER_UNAVAILABLE)); + }; + + xmlReq.onloadend = function() { + EnigmailLog.DEBUG("keyserver.jsm: accessVksServer.accessKeyServer: loadEnd\n"); + }; + + let { + url, + host, + method, + contentType + } = this.createRequestUrl(keyserver, actionFlag, keyId); + + EnigmailLog.DEBUG(`keyserver.jsm: accessVksServer.accessKeyServer: requesting ${method} for ${url}\n`); + xmlReq.open(method, url); + xmlReq.setRequestHeader("Content-Type", contentType); + xmlReq.send(payLoad); + }); + }, + + /** + * Download keys from a keyserver + * @param keyIDs: String - space-separated list of search terms or key IDs + * @param keyserver: String - keyserver URL (optionally incl. protocol) + * @param listener: optional Object implementing the KeySrvListener API (above) + * + * @return: Promise<...> + */ + download: async function(keyIDs, keyserver, listener = null) { + EnigmailLog.DEBUG(`keyserver.jsm: accessVksServer.download(${keyIDs})\n`); + let keyIdArr = keyIDs.split(/ +/); + let retObj = { + result: 0, + errorDetails: "", + keyList: [] + }; + + for (let i = 0; i < keyIdArr.length; i++) { + try { + let r = await this.accessKeyServer(EnigmailConstants.DOWNLOAD_KEY, keyserver, keyIdArr[i], listener); + if (Array.isArray(r)) { + retObj.keyList = retObj.keyList.concat(r); + } + } + catch (ex) { + retObj.result = ex.result; + retObj.errorDetails = ex.errorDetails; + throw retObj; + } + + if (listener && "onProgress" in listener) { + listener.onProgress((i + 1) / keyIdArr.length * 100); + } + } + + return retObj; + }, + + refresh: function(keyServer, listener = null) { + let keyList = EnigmailKeyRing.getAllKeys().keyList.map(keyObj => { + return "0x" + keyObj.fpr; + }).join(" "); - uploads.push(was_uploaded); + return this.download(keyList, keyServer, listener); + }, + + requestConfirmationLink: async function(keyserver, jsonFragment) { + EnigmailLog.DEBUG(`keyserver.jsm: accessVksServer.requestConfirmationLink()\n`); + + let response = JSON.parse(jsonFragment); + + let addr = []; + + for (let email in response.status) { + if (response.status[email] !== "published") { + addr.push(email); + } + } + + if (addr.length > 0) { + let r = await this.accessKeyServer(EnigmailConstants.GET_CONFIRMATION_LINK, keyserver, { + token: response.token, + addresses: addr + }, null); + + if (typeof r === "string") { + return addr.length; + } } - Promise.all(uploads).catch(function(reason) { - let errorMsg = EnigmailLocale.getString("keyserverProgress.wksUploadFailed"); - observer.onFinished(-1, errorMsg, true); - }).then(function(senders) { - let uploaded_uids = []; - if (senders) { - senders.forEach(function(val) { - if (val !== null) { - uploaded_uids.push(val.email); + return 0; + }, + + /** + * Upload keys to a keyserver + * @param keyIDs: String - space-separated list of search terms or key IDs + * @param keyserver: String - keyserver URL (optionally incl. protocol) + * @param listener: optional Object implementing the KeySrvListener API (above) + * + * @return: Promise<...> + */ + upload: async function(keyIDs, keyserver, listener = null) { + EnigmailLog.DEBUG(`keyserver.jsm: accessVksServer.upload(${keyIDs})\n`); + let keyIdArr = keyIDs.split(/ +/); + let retObj = { + result: 0, + errorDetails: "", + keyList: [] + }; + + for (let i = 0; i < keyIdArr.length; i++) { + let keyObj = EnigmailKeyRing.getKeyById(keyIdArr[i]); + + if (!keyObj.secretAvailable) { + // VKS keyservers only accept uploading own keys + retObj.result = 1; + retObj.errorDetails = "NO_SECRET_KEY_AVAILABLE"; + throw retObj; + } + + try { + let r = await this.accessKeyServer(EnigmailConstants.UPLOAD_KEY, keyserver, keyIdArr[i], listener); + if (typeof r === "string") { + retObj.keyList.push(keyIdArr[i]); + let req = await this.requestConfirmationLink(keyserver, r); + + if (req >= 0) { + retObj.result = 0; + retObj.numEmails = req; } - }); + } + else { + retObj.result = r; + } + } + catch (ex) { + retObj.result = ex.result; + retObj.errorDetails = ex.errorDetails; + throw retObj; } - observer.onProgress(100); - observer.onFinished(0); - }); - } catch (ex) { - EnigmailLog.DEBUG(ex); - } -} -/** - * parse a keyserver specification and return host, protocol and port - * - * @param keyserver: String - name of keyserver with optional protocol and port. - * E.g. keys.gnupg.net, hkps://keys.gnupg.net:443 - * - * @return Object: {port, host, protocol} (all Strings) - */ -function parseKeyserverUrl(keyserver) { - if (keyserver.length > 1024) { - // insane length of keyserver is forbidden - throw Components.results.NS_ERROR_FAILURE; - } + if (listener && "onProgress" in listener) { + listener.onProgress((i + 1) / keyIdArr.length * 100); + } + } - keyserver = keyserver.toLowerCase(); - let protocol = ""; - if (keyserver.search(/^[a-zA-Z0-9_.-]+:\/\//) === 0) { - protocol = keyserver.replace(/^([a-zA-Z0-9_.-]+)(:\/\/.*)/, "$1"); - keyserver = keyserver.replace(/^[a-zA-Z0-9_.-]+:\/\//, ""); - } - else { - protocol = "hkp"; - } + return retObj; + }, - let port = ""; - switch (protocol) { - case "hkp": - port = ENIG_DEFAULT_HKP_PORT; - break; - case "hkps": - port = ENIG_DEFAULT_HKPS_PORT; - break; - case "ldap": - port = ENIG_DEFAULT_LDAP_PORT; - break; - } + /** + * Search for keys on a keyserver + * @param searchTerm: String - search term + * @param keyserver: String - keyserver URL (optionally incl. protocol) + * @param listener: optional Object implementing the KeySrvListener API (above) + * + * @return: Promise + * - result: Number + * - pubKeys: Array of Object: + * PubKeys: Object with: + * - keyId: String + * - keyLen: String + * - keyType: String + * - created: String (YYYY-MM-DD) + * - status: String: one of ''=valid, r=revoked, e=expired + * - uid: Array of Strings with UIDs + */ + search: async function(searchTerm, keyserver, listener = null) { + EnigmailLog.DEBUG(`keyserver.jsm: accessVksServer.search(${searchTerm})\n`); + let retObj = { + result: 0, + errorDetails: "", + pubKeys: [] + }; + let key = null; - var m = keyserver.match(/^(.+)(:)(\d+)$/); - if (m && m.length == 4) { - keyserver = m[1]; - port = m[3]; - } + let searchArr = searchTerm.split(/ +/); - if (keyserver === "keys.mailvelope.com") { - protocol = "hkps"; - port = ENIG_DEFAULT_HKPS_PORT; - } + try { + for (let i in searchArr) { + let r = await this.accessKeyServer(EnigmailConstants.SEARCH_KEY, keyserver, searchArr[i], listener); + + const cApi = EnigmailCryptoAPI(); + let keyList = await cApi.getKeyListFromKeyBlock(r); + + for (let k in keyList) { + key = { + keyId: keyList[k].fpr, + keyLen: "0", + keyType: "", + created: keyList[k].created, + uid: [keyList[k].name], + status: keyList[k].revoke ? "r" : "" + }; - return { - protocol: protocol, - host: keyserver, - port: port - }; -} + for (let uid of keyList[k].uids) { + key.uid.push(uid); + } + + retObj.pubKeys.push(key); + } + } + } + catch (ex) { + retObj.result = ex.result; + retObj.errorDetails = ex.errorDetails; + throw retObj; + } + + return retObj; + } +}; var EnigmailKeyServer = { - access: access, - refresh: refresh, - keyServerUpDownload: keyServerUpDownload, - parseKeyserverUrl: parseKeyserverUrl, - performWkdUpload: performWkdUpload + /** + * Download keys from a keyserver + * @param keyIDs: String - space-separated list of FPRs or key IDs + * @param keyserver: String - keyserver URL (optionally incl. protocol) + * @param listener: optional Object implementing the KeySrvListener API (above) + * + * @return: Promise + * Object: - result: Number - result Code (0 = OK), + * - keyList: Array of String - imported key FPR + */ + download: function(keyIDs, keyserver = null, listener) { + let acc = getAccessType(keyserver); + return acc.download(keyIDs, keyserver, listener); + }, + + /** + * Upload keys to a keyserver + * @param keyIDs: String - space-separated list of key IDs or FPR + * @param keyserver: String - keyserver URL (optionally incl. protocol) + * @param listener: optional Object implementing the KeySrvListener API (above) + * + * @return: Promise + * Object: - result: Number - result Code (0 = OK), + * - keyList: Array of String - imported key FPR + */ + + upload: function(keyIDs, keyserver = null, listener) { + let acc = getAccessType(keyserver); + return acc.upload(keyIDs, keyserver, listener); + }, + + /** + * Search keys on a keyserver + * @param searchString: String - search term. Multiple email addresses can be search by spaces + * @param keyserver: String - keyserver URL (optionally incl. protocol) + * @param listener: optional Object implementing the KeySrvListener API (above) + * + * @return: Promise + * - result: Number + * - pubKeys: Array of Object: + * PubKeys: Object with: + * - keyId: String + * - keyLen: String + * - keyType: String + * - created: String (YYYY-MM-DD) + * - status: String: one of ''=valid, r=revoked, e=expired + * - uid: Array of Strings with UIDs + */ + search: function(searchString, keyserver = null, listener) { + let acc = getAccessType(keyserver); + return acc.search(searchString, keyserver, listener); + }, + + /** + * Refresh all keys + * + * @param keyserver: String - keyserver URL (optionally incl. protocol) + * @param listener: optional Object implementing the KeySrvListener API (above) + * + * @return: Promise (identical to download) + */ + refresh: function(keyserver = null, listener) { + let acc = getAccessType(keyserver); + return acc.refresh(keyserver, listener); + } }; diff -Nru enigmail-2.0.12+ds1/package/keyserverUris.jsm enigmail-2.1.3+ds1/package/keyserverUris.jsm --- enigmail-2.0.12+ds1/package/keyserverUris.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/keyserverUris.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 @@ -9,12 +8,8 @@ const EXPORTED_SYMBOLS = ["EnigmailKeyserverURIs"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailOS = ChromeUtils.import("chrome://enigmail/content/modules/os.jsm").EnigmailOS; const KEYSERVER_PREF = "keyserver"; const AUTO_KEYSERVER_SELECTION_PREF = "autoKeyServerSelection"; @@ -63,21 +58,18 @@ return uris; } +function getDefaultKeyServer() { + let keyservers = EnigmailPrefs.getPref(KEYSERVER_PREF).split(/\s*[,;]\s*/g); + return keyservers[0]; +} + function getUserDefinedKeyserverURIs() { const keyservers = EnigmailPrefs.getPref(KEYSERVER_PREF).split(/\s*[,;]\s*/g); return EnigmailPrefs.getPref(AUTO_KEYSERVER_SELECTION_PREF) ? [keyservers[0]] : keyservers; } function combineIntoURI(protocol, domain, port) { - // HACK: Returns hkps.pool.sks-keyservers.net only because - // GnuPG version 2.1.14 in Windows does not parse - // hkps://hkps.pool.sks-keyservers.net:443 correctly - if (domain === "hkps.pool.sks-keyservers.net" && EnigmailOS.isDosLike) { - return domain; - } - else { - return protocol + "://" + domain + ":" + port; - } + return protocol + "://" + domain + ":" + port; } function isValidProtocol(uri) { @@ -123,6 +115,7 @@ } var EnigmailKeyserverURIs = { + getDefaultKeyServer: getDefaultKeyServer, buildKeyserverUris: buildKeyserverUris, validKeyserversExist: validKeyserversExist }; diff -Nru enigmail-2.0.12+ds1/package/lazy.jsm enigmail-2.1.3+ds1/package/lazy.jsm --- enigmail-2.0.12+ds1/package/lazy.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/lazy.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -10,15 +8,14 @@ const EXPORTED_SYMBOLS = ["EnigmailLazy"]; -const Cu = Components.utils; var EnigmailLazy = { loader: function(component, name) { let holder = null; return function() { if (holder === null) { - const into = {}; - Cu.import("resource://" + component, into); + component = component.replace(/^enigmail\//, ""); + const into = ChromeUtils.import("chrome://enigmail/content/modules/" + component); holder = into[name]; } return holder; diff -Nru enigmail-2.0.12+ds1/package/locale.jsm enigmail-2.1.3+ds1/package/locale.jsm --- enigmail-2.0.12+ds1/package/locale.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/locale.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false, EnigmailLog: false, EnigmailOS: false */ -/*jshint -W097 */ /* * 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 @@ -10,23 +8,29 @@ var EXPORTED_SYMBOLS = ["EnigmailLocale"]; -Components.utils.import("resource://enigmail/log.jsm"); +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; -const Cc = Components.classes; -const Ci = Components.interfaces; var gEnigStringBundle = null; var EnigmailLocale = { + /** + * Get the application locale. Discrecommended - use getUILocale instead! + */ get: function() { - try { + try { return Cc["@mozilla.org/intl/nslocaleservice;1"].getService(Ci.nsILocaleService).getApplicationLocale(); - } - catch (ex) { + } catch (ex) { return { getCategory: function(whatever) { // always return the application locale - return Cc["@mozilla.org/intl/localeservice;1"].getService(Ci.mozILocaleService).getAppLocaleAsBCP47(); + try { + // TB < 64 + return Cc["@mozilla.org/intl/localeservice;1"].getService(Ci.mozILocaleService).getAppLocaleAsBCP47(); + } catch (x) { + let a = Cc["@mozilla.org/intl/localeservice;1"].getService(Ci.mozILocaleService).appLocalesAsBCP47; + return (a.length > 0 ? a[0] : ""); + } } }; } @@ -54,8 +58,7 @@ EnigmailLog.DEBUG("locale.jsm: loading stringBundle " + bundlePath + "\n"); let strBundleService = Cc["@mozilla.org/intl/stringbundle;1"].getService(Ci.nsIStringBundleService); gEnigStringBundle = strBundleService.createBundle(bundlePath); - } - catch (ex) { + } catch (ex) { EnigmailLog.ERROR("locale.jsm: Error in instantiating stringBundleService\n"); } } @@ -63,7 +66,7 @@ if (gEnigStringBundle) { try { if (subPhrases) { - if (typeof(subPhrases) == "string") { + if (typeof (subPhrases) == "string") { return gEnigStringBundle.formatStringFromName(aStr, [subPhrases], 1); } else { @@ -73,8 +76,7 @@ else { return gEnigStringBundle.GetStringFromName(aStr); } - } - catch (ex) { + } catch (ex) { EnigmailLog.ERROR("locale.jsm: Error in querying stringBundleService for string '" + aStr + "'\n"); } } @@ -92,8 +94,7 @@ try { return uaPref.getComplexValue("locale", Ci.nsISupportsString).data; - } - catch (e) {} + } catch (e) {} return this.get().getCategory("NSILOCALE_MESSAGES").substr(0, 5); }, @@ -103,7 +104,6 @@ gEnigStringBundle = null; let strBundleService = Cc["@mozilla.org/intl/stringbundle;1"].getService(Ci.nsIStringBundleService); strBundleService.flushBundles(); - } - catch (e) {} + } catch (e) {} } }; diff -Nru enigmail-2.0.12+ds1/package/localizeHtml.jsm enigmail-2.1.3+ds1/package/localizeHtml.jsm --- enigmail-2.0.12+ds1/package/localizeHtml.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/localizeHtml.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -4,22 +4,19 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -/*global Components: false */ - "use strict"; var EXPORTED_SYMBOLS = ["EnigmailLocalizeHtml"]; -const Cu = Components.utils; - -Cu.import("resource://enigmail/locale.jsm"); /* global EnigmailLocale: false */ -Cu.import("resource://enigmail/buildDate.jsm"); /* global EnigmailBuildDate: false */ -Cu.import("resource://enigmail/app.jsm"); /* global EnigmailApp: false */ -Cu.import("resource://enigmail/core.jsm"); /* global EnigmailCore: false */ -Cu.import("resource://enigmail/gpgAgent.jsm"); /* global EnigmailGpgAgent: false */ +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailBuildDate = ChromeUtils.import("chrome://enigmail/content/modules/buildDate.jsm").EnigmailBuildDate; +const EnigmailApp = ChromeUtils.import("chrome://enigmail/content/modules/app.jsm").EnigmailApp; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailGpgAgent = ChromeUtils.import("chrome://enigmail/content/modules/gpgAgent.jsm").EnigmailGpgAgent; +const Services = ChromeUtils.import("resource://gre/modules/Services.jsm").Services; function getEnigmailVersion() { - let versionStr = EnigmailApp.getVersion() + " (" + EnigmailBuildDate + ")"; + let versionStr = EnigmailApp.getVersion() + " (" + EnigmailBuildDate.built + ")"; return EnigmailLocale.getString("usingVersion", versionStr); } @@ -29,8 +26,7 @@ var agentStr; if (enigmailSvc) { agentStr = EnigmailLocale.getString("usingAgent", [EnigmailGpgAgent.agentType, EnigmailGpgAgent.agentPath.path]); - } - else { + } else { agentStr = EnigmailLocale.getString("agentError"); if (enigmailSvc && enigmailSvc.initializationError) diff -Nru enigmail-2.0.12+ds1/package/log.jsm enigmail-2.1.3+ds1/package/log.jsm --- enigmail-2.0.12+ds1/package/log.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/log.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,26 +1,23 @@ -/*global Components: false, EnigmailConsole: false, dump: false, EnigmailFiles: false*/ -/*jshint -W097 */ /* * 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/. */ +/* global dump: false */ + "use strict"; var EXPORTED_SYMBOLS = ["EnigmailLog"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/pipeConsole.jsm"); -Cu.import("resource://enigmail/files.jsm"); -Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ +const EnigmailConsole = ChromeUtils.import("chrome://enigmail/content/modules/pipeConsole.jsm").EnigmailConsole; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailOS = ChromeUtils.import("chrome://enigmail/content/modules/os.jsm").EnigmailOS; const XPCOM_APPINFO = "@mozilla.org/xre/app-info;1"; const NS_IOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1"; +const MAX_LOG_LEN = 2500; var EnigmailLog = { level: 3, @@ -91,7 +88,7 @@ data += ex.toString() + "\n"; } } - return data + "\n" + EnigmailLog.data; + return data + "\n" + EnigmailLog.data.join(""); }, WRITE: function(str) { @@ -106,16 +103,16 @@ dump(datStr + str); if (EnigmailLog.data === null) { - EnigmailLog.data = ""; + EnigmailLog.data = []; let appInfo = Cc[XPCOM_APPINFO].getService(Ci.nsIXULAppInfo); EnigmailLog.WRITE("Mozilla Platform: " + appInfo.name + " " + appInfo.version + "\n"); } // truncate first part of log data if it grow too much - if (EnigmailLog.data.length > 5120000) { - EnigmailLog.data = EnigmailLog.data.substr(-400000); + if (EnigmailLog.data.length > MAX_LOG_LEN) { + EnigmailLog.data.splice(0, 200); } - EnigmailLog.data += datStr + str; + EnigmailLog.data.push(datStr + str); if (EnigmailLog.fileStream) { EnigmailLog.fileStream.write(datStr, datStr.length); diff -Nru enigmail-2.0.12+ds1/package/manifest.json enigmail-2.1.3+ds1/package/manifest.json --- enigmail-2.0.12+ds1/package/manifest.json 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/manifest.json 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,22 @@ +{ + "manifest_version": 2, + "name": "Enigmail", + "description": "OpenPGP message encryption and authentication", + "version": "${EnigmailVersion}", + "author": "Enigmail Team", + "homepage_url": "https://enigmail.net/", + "legacy": { + "type": "bootstrap", + "options": { + "page": "chrome://enigmail/content/ui/pref-enigmail.xul", + "open_in_tab": false + } + }, + "applications": { + "gecko": { + "id": "{847b3a00-7ab1-11d4-8f02-006008948af5}", // Enigmail GUID + "strict_min_version": "68.0a1", + "strict_max_version": "68.*" + } + } +} diff -Nru enigmail-2.0.12+ds1/package/mime.jsm enigmail-2.1.3+ds1/package/mime.jsm --- enigmail-2.0.12+ds1/package/mime.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/mime.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false, escape: false, btoa: false*/ -/*jshint -W097 */ /* * 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 @@ -10,13 +8,10 @@ var EXPORTED_SYMBOLS = ["EnigmailMime"]; -const Cc = Components.classes; -const Ci = Components.interfaces; - -Components.utils.import("resource:///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 jsmime = ChromeUtils.import("resource:///modules/jsmime.jsm").jsmime; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailRNG = ChromeUtils.import("chrome://enigmail/content/modules/rng.jsm").EnigmailRNG; +const EnigmailStreams = ChromeUtils.import("chrome://enigmail/content/modules/streams.jsm").EnigmailStreams; var EnigmailMime = { /*** @@ -143,7 +138,7 @@ header = hdrValue.join("").split(" "); } else { - header = hdrValue.split(" "); + header = hdrValue.split(/ +/); } let line = ""; @@ -277,6 +272,10 @@ let headers = Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders); headers.initialize(contentData.substring(0, startPos)); + // we got a potentially protected header. Let's check ... + ct = headers.extractHeader("content-type", false) || ""; + if (this.getParameter(ct, "protected-headers").search(/^v1$/i) !== 0) return null; + for (let i in protectedHdr) { if (headers.hasHeader(protectedHdr[i])) { newHeaders[protectedHdr[i]] = jsmime.headerparser.decodeRFC2047Words(headers.extractHeader(protectedHdr[i], true)) || undefined; @@ -369,8 +368,10 @@ * @return Boolean: true: regular message structure, MIME part is safe to be decrypted * false: otherwise */ - isRegularMimeStructure: function(mimePartNumber, uriSpec) { + isRegularMimeStructure: function(mimePartNumber, uriSpec, acceptSubParts = false) { if (mimePartNumber.length === 0) return true; + + if (acceptSubParts && (mimePartNumber.search(/^1(\.1)*$/) === 0)) return true; if (mimePartNumber === "1") return true; if (!uriSpec) return true; @@ -402,9 +403,9 @@ * * @return undefined */ - getMimeTreeFromUrl: function(url, getBody, callbackFunc) { + getMimeTreeFromUrl: function(url, getBody = false, callbackFunc) { function onData(data) { - let tree = getMimeTree(data); + let tree = getMimeTree(data, getBody); callbackFunc(tree); } diff -Nru enigmail-2.0.12+ds1/package/mimeDecrypt.jsm enigmail-2.1.3+ds1/package/mimeDecrypt.jsm --- enigmail-2.0.12+ds1/package/mimeDecrypt.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/mimeDecrypt.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 https://mozilla.org/MPL/2.0/. */ @@ -12,23 +11,21 @@ * implemented as an XPCOM object */ -/*global atob: false */ - -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ -Cu.import("resource://enigmail/mimeVerify.jsm"); /*global EnigmailVerify: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ -Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ -Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -Cu.import("resource://enigmail/decryption.jsm"); /*global EnigmailDecryption: false */ -Cu.import("resource://enigmail/mime.jsm"); /*global EnigmailMime: false */ -Cu.import("resource://enigmail/uris.jsm"); /*global EnigmailURIs: false */ -Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ -Cu.import("resource://enigmail/singletons.jsm"); /*global EnigmailSingletons: false */ +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailVerify = ChromeUtils.import("chrome://enigmail/content/modules/mimeVerify.jsm").EnigmailVerify; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailDecryption = ChromeUtils.import("chrome://enigmail/content/modules/decryption.jsm").EnigmailDecryption; +var EnigmailMime = ChromeUtils.import("chrome://enigmail/content/modules/mime.jsm").EnigmailMime; +const EnigmailURIs = ChromeUtils.import("chrome://enigmail/content/modules/uris.jsm").EnigmailURIs; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; +const EnigmailSingletons = ChromeUtils.import("chrome://enigmail/content/modules/singletons.jsm").EnigmailSingletons; +const EnigmailHttpProxy = ChromeUtils.import("chrome://enigmail/content/modules/httpProxy.jsm").EnigmailHttpProxy; +const EnigmailCryptoAPI = ChromeUtils.import("chrome://enigmail/content/modules/cryptoAPI.jsm").EnigmailCryptoAPI; +const EnigmailAutocrypt = ChromeUtils.import("chrome://enigmail/content/modules/autocrypt.jsm").EnigmailAutocrypt; +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; const APPSHELL_MEDIATOR_CONTRACTID = "@mozilla.org/appshell/window-mediator;1"; const PGPMIME_JS_DECRYPTOR_CONTRACTID = "@mozilla.org/mime/pgp-mime-js-decrypt;1"; @@ -100,8 +97,7 @@ if (dbHdr.author) msg += `From: ${dbHdr.author}\r\n`; if (dbHdr.recipients) msg += `To: ${dbHdr.recipients}\r\n`; if (dbHdr.ccList) msg += `Cc: ${dbHdr.ccList}\r\n`; - } - catch (x) {} + } catch (x) {} } return msg; @@ -140,6 +136,12 @@ this.mimePartNumber = ""; this.dataIsBase64 = null; this.base64Cache = ""; + + if (EnigmailCompat.isMessageUriInPgpMime()) { + this.onDataAvailable = this.onDataAvailable68; + } else { + this.onDataAvailable = this.onDataAvailable60; + } } MimeDecryptHandler.prototype = { @@ -160,10 +162,24 @@ this.mimeSvc = request.QueryInterface(Ci.nsIPgpMimeProxy); if ("mimePart" in this.mimeSvc) { this.mimePartNumber = this.mimeSvc.mimePart; - } - else { + } else { this.mimePartNumber = ""; } + + if ("messageURI" in this.mimeSvc) { + this.uri = this.mimeSvc.messageURI; + if (this.uri) { + EnigmailLog.DEBUG("mimeDecrypt.jsm: onStartRequest: uri='" + this.uri.spec + "'\n"); + } + else { + EnigmailLog.DEBUG("mimeDecrypt.jsm: onStartRequest: uri=null\n"); + } + } else { + if (uri) { + this.uri = uri.QueryInterface(Ci.nsIURI); + EnigmailLog.DEBUG("mimeDecrypt.jsm: onStartRequest: uri='" + this.uri.spec + "'\n"); + } + } this.pipe = null; this.closePipe = false; this.exitCode = null; @@ -186,11 +202,6 @@ this.xferEncoding = ENCODING_DEFAULT; this.boundary = EnigmailMime.getBoundary(this.mimeSvc.contentType); - if (uri) { - this.uri = uri.QueryInterface(Ci.nsIURI).clone(); - EnigmailLog.DEBUG("mimeDecrypt.jsm: onStartRequest: uri='" + this.uri.spec + "'\n"); - } - if (!this.isReloadingLastMessage()) { EnigmailSingletons.clearLastDecryptedMessage(); } @@ -214,35 +225,35 @@ // end of Mime-part headers reached this.headerMode = 2; return; - } - else { + } else { if (data.search(/^content-transfer-encoding:\s*/i) >= 0) { // extract content-transfer-encoding data = data.replace(/^content-transfer-encoding:\s*/i, ""); data = data.replace(/;.*/, "").toLowerCase().trim(); if (data.search(/base64/i) >= 0) { this.xferEncoding = ENCODING_BASE64; - } - else if (data.search(/quoted-printable/i) >= 0) { + } else if (data.search(/quoted-printable/i) >= 0) { this.xferEncoding = ENCODING_QP; } } } - } - else { + } else { // PGP/MIME main part body if (this.xferEncoding == ENCODING_QP) { this.cacheData(EnigmailData.decodeQuotedPrintable(data)); - } - else { + } else { this.cacheData(data); } } } }, - onDataAvailable: function(req, sup, stream, offset, count) { + /** + * onDataAvailable for TB <= 66 + */ + onDataAvailable60: function(req, dummy, stream, offset, count) { + // get data from libmime if (!this.initOk) return; this.inStream.init(stream); @@ -263,11 +274,42 @@ for (let i = 0; i < lines.length; i++) { this.processData(lines[i] + "\r\n"); } - } - else + } else this.processData(data); + } else { + this.base64Cache += data; } - else { + } + }, + + /** + * onDataAvailable for TB >= 68 + */ + onDataAvailable68: function(req, stream, offset, count) { + + // get data from libmime + if (!this.initOk) return; + this.inStream.init(stream); + + if (count > 0) { + var data = this.inStream.read(count); + + if (this.mimePartCount == 0 && this.dataIsBase64 === null) { + // try to determine if this could be a base64 encoded message part + this.dataIsBase64 = this.isBase64Encoding(data); + } + + if (!this.dataIsBase64) { + if (data.search(/[\r\n][^\r\n]+[\r\n]/) >= 0) { + // process multi-line data line by line + let lines = data.replace(/\r\n/g, "\n").split(/\n/); + + for (let i = 0; i < lines.length; i++) { + this.processData(lines[i] + "\r\n"); + } + } else + this.processData(data); + } else { this.base64Cache += data; } } @@ -288,8 +330,7 @@ let s = atob(str); // if the conversion succeds, we have a base64 encoded message ret = true; - } - catch (ex) { + } catch (ex) { // not a base64 encoded } } @@ -310,8 +351,7 @@ try { this.base64Cache = EnigmailData.decodeBase64(this.base64Cache); - } - catch (ex) { + } catch (ex) { // if decoding failed, try non-encoded version } @@ -348,7 +388,7 @@ return (this.uri.spec.search(/[&?]header=enigmailConvert/) >= 0); }, - onStopRequest: function(request, win, status) { + onStopRequest: function(request, status, dummy) { LOCAL_DEBUG("mimeDecrypt.jsm: onStopRequest\n"); --gNumProc; if (!this.initOk) return; @@ -379,11 +419,8 @@ let manUrl = {}; if (EnigmailVerify.getManualUri()) { - let msgSvc = messenger.messageServiceFromURI(EnigmailVerify.getManualUri()); - - msgSvc.GetUrlForUri(EnigmailVerify.getManualUri(), manUrl, null); - } - else { + manUrl.value = EnigmailCompat.getUrlFromUriSpec(EnigmailVerify.getManualUri()); + } else { manUrl.value = { spec: "enigmail://invalid/message" }; @@ -401,9 +438,7 @@ } if (this.msgUriSpec) { - let msgSvc = messenger.messageServiceFromURI(this.msgUriSpec); - - msgSvc.GetUrlForUri(this.msgUriSpec, url, null); + url.value = EnigmailCompat.getUrlFromUriSpec(this.msgUriSpec); } if (this.uri.spec.search(/[&?]header=[^&]+/) > 0 && @@ -426,8 +461,7 @@ if (url.value.host !== this.uri.host || url.value.path !== this.uri.path) return; - } - else { + } else { // TB >= 57 if (url.value.host !== this.uri.host || url.value.pathQueryRef !== this.uri.pathQueryRef) @@ -435,8 +469,7 @@ } } } - } - catch (ex) { + } catch (ex) { EnigmailLog.writeException("mimeDecrypt.js", ex); EnigmailLog.DEBUG("mimeDecrypt.jsm: error while processing " + this.msgUriSpec + "\n"); } @@ -444,11 +477,11 @@ let spec = this.uri ? this.uri.spec : null; EnigmailLog.DEBUG(`mimeDecrypt.jsm: checking MIME structure for ${this.mimePartNumber} / ${spec}\n`); + if (!EnigmailMime.isRegularMimeStructure(this.mimePartNumber, spec, false)) { if (!this.isUrlEnigmailConvert()) { this.returnData(EnigmailMimeDecrypt.emptyAttachment()); - } - else { + } else { throw "mimeDecrypt.jsm: Cannot decrypt messages with mixed (encrypted/non-encrypted) content"; } return; @@ -459,45 +492,36 @@ this.outQueue = EnigmailData.decodeBase64(this.outQueue) + "\n"; } - var statusFlagsObj = {}; - var errorMsgObj = {}; - var windowManager = Cc[APPSHELL_MEDIATOR_CONTRACTID].getService(Ci.nsIWindowMediator); - win = windowManager.getMostRecentWindow(null); - - var maxOutput = this.outQueue.length * 100; // limit output to 100 times message size - // to avoid DoS attack - this.proc = EnigmailDecryption.decryptMessageStart(win, false, false, this, - statusFlagsObj, errorMsgObj, null, maxOutput); - - if (!this.proc) return; - - if (this.bytesWritten === 0 && this.outQueue.length === 0) { - // write something to gpg such that the process doesn't get stuck - this.outQueue = "NO DATA\n"; - } - - if (this.pipe) { - this.pipe.write(this.outQueue); - this.bytesWritten += this.outQueue.length; - this.outQueue = ""; - this.pipe.close(); - } - else { - EnigmailLog.DEBUG("mimeDecrypt.jsm: onStopRequest: pipe not yet ready\n"); - this.closePipe = true; - } + let win = this.msgWindow; - // wait here for this.proc to terminate - this.proc.wait(); + if (!EnigmailDecryption.isReady(win)) return; - this.returnStatus = {}; - EnigmailDecryption.decryptMessageEnd(this.statusStr, - this.exitCode, - this.dataLength, - false, - false, - EnigmailConstants.UI_PGP_MIME, - this.returnStatus); + // limit output to 100 times message size to avoid DoS attack + let maxOutput = this.outQueue.length * 100; + let statusFlagsObj = {}; + let errorMsgObj = {}; + let listener = this; + + EnigmailLog.DEBUG("mimeDecryp.jsm: starting decryption\n"); + + let keyserver = EnigmailPrefs.getPref("autoKeyRetrieve"); + let options = { + keyserver: keyserver, + keyserverProxy: EnigmailHttpProxy.getHttpProxy(keyserver), + fromAddr: EnigmailDecryption.getFromAddr(win), + maxOutputLength: maxOutput + }; + const cApi = EnigmailCryptoAPI(); + this.returnStatus = cApi.sync(cApi.decryptMime(this.outQueue, options)); + if (!this.returnStatus) { + this.returnStatus = { + decryptedData: "", + exitCode: -1, + statusFlags: EnigmailConstants.DECRYPTION_FAILED + }; + } + this.decryptedData = this.returnStatus.decryptedData; + this.handleResult(this.returnStatus.exitCode); let mdcError = ((this.returnStatus.statusFlags & EnigmailConstants.DECRYPTION_FAILED) || !(this.returnStatus.statusFlags & EnigmailConstants.DECRYPTION_OKAY)); @@ -529,8 +553,7 @@ LAST_MSG.lastStatus = this.returnStatus; LAST_MSG.lastStatus.decryptedHeaders = this.decryptedHeaders; LAST_MSG.lastStatus.mimePartNumber = this.mimePartNumber; - } - else { + } else { LAST_MSG.lastMessageURI = null; LAST_MSG.lastMessageData = ""; } @@ -538,8 +561,7 @@ this.decryptedData = ""; EnigmailLog.DEBUG("mimeDecrypt.jsm: onStopRequest: process terminated\n"); // always log this one this.proc = null; - } - else { + } else { this.returnStatus = LAST_MSG.lastStatus; this.decryptedHeaders = LAST_MSG.lastStatus.decryptedHeaders; this.mimePartNumber = LAST_MSG.lastStatus.mimePartNumber; @@ -550,10 +572,12 @@ }, displayStatus: function() { - EnigmailLog.DEBUG("mimeDecrypt.jsm: displayStatus\n"); + EnigmailLog.DEBUG("mimeDecrypt.jsm: displayStatus()\n"); - if (this.exitCode === null || this.msgWindow === null || this.statusDisplayed) + if (this.exitCode === null || this.msgWindow === null || this.statusDisplayed) { + EnigmailLog.DEBUG("mimeDecrypt.jsm: displayStatus: nothing to display\n"); return; + } let uriSpec = (this.uri ? this.uri.spec : null); @@ -579,51 +603,17 @@ encryptedTo: this.returnStatus.encToDetails }), this.mimePartNumber); - } - else { + } else { this.updateHeadersInMsgDb(); } this.statusDisplayed = true; - } - catch (ex) { + } catch (ex) { EnigmailLog.writeException("mimeDecrypt.jsm", ex); } LOCAL_DEBUG("mimeDecrypt.jsm: displayStatus done\n"); }, - // API for decryptMessage Listener - stdin: function(pipe) { - EnigmailLog.DEBUG("mimeDecrypt.jsm: stdin()\n"); - - if (this.closePipe) { - if (this.outQueue.length > 0) { - pipe.write(this.outQueue); - this.bytesWritten += this.outQueue.length; - this.outQueue = ""; - } - EnigmailLog.DEBUG("mimeDecrypt.jsm: stdin: closing pipe\n"); - pipe.close(); - this.pipe = null; - } - else { - this.pipe = pipe; - } - }, - - stdout: function(s) { - // write data back to libmime - //LOCAL_DEBUG("mimeDecrypt.jsm: stdout:"+s.length+"\n"); - this.dataLength += s.length; - this.decryptedData += s; - }, - - stderr: function(s) { - LOCAL_DEBUG("mimeDecrypt.jsm: stderr\n"); - this.statusStr += s; - }, - - done: function(result) { - let exitCode = result.exitCode; + handleResult: function(exitCode) { LOCAL_DEBUG("mimeDecrypt.jsm: done: " + exitCode + "\n"); if (gDebugLogLevel > 4) @@ -634,12 +624,10 @@ this.decryptedData += "\r\n"; } - var verifyData = this.decryptedData; - try { this.extractEncryptedHeaders(); - } - catch (ex) {} + this.extractAutocryptGossip(); + } catch (ex) {} let i = this.decryptedData.search(/\n\r?\n/); if (i > 0) { @@ -698,13 +686,12 @@ let veri = EnigmailVerify.newVerifier(proto); veri.onStartRequest(this.mimeSvc, this.uri); veri.onTextData(data); - veri.onStopRequest(null, null, 0); - } - else { + veri.onStopRequest(null, 0); + } else { if ("outputDecryptedData" in this.mimeSvc) { + // TB >= 57 this.mimeSvc.outputDecryptedData(data, data.length); - } - else { + } else { let gConv = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); gConv.setData(data, data.length); this.mimeSvc.onStartRequest(null, null); @@ -712,8 +699,7 @@ this.mimeSvc.onStopRequest(null, null, 0); } } - } - catch (ex) { + } catch (ex) { EnigmailLog.ERROR("mimeDecrypt.jsm: returnData(): mimeSvc.onDataAvailable failed:\n" + ex.toString()); } }, @@ -737,8 +723,7 @@ null, ""); } - } - catch (ex) {} + } catch (ex) {} return 0; }, @@ -751,13 +736,11 @@ try { let msgDbHdr = this.uri.QueryInterface(Ci.nsIMsgMessageUrl).messageHeader; msgDbHdr.subject = EnigmailData.convertFromUnicode(this.decryptedHeaders.subject, "utf-8"); - } - catch (x) {} + } catch (x) {} } }, extractEncryptedHeaders: function() { - let r = EnigmailMime.extractProtectedHeaders(this.decryptedData); if (!r) return; @@ -765,7 +748,34 @@ if (r.startPos >= 0 && r.endPos > r.startPos) { this.decryptedData = this.decryptedData.substr(0, r.startPos) + this.decryptedData.substr(r.endPos); } + }, + + extractAutocryptGossip: async function() { + let m1 = this.decryptedData.search(/^--/m); + let m2 = this.decryptedData.search(/\r?\n\r?\n/); + let m = Math.max(m1, m2); + + let hdr = Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders); + hdr.initialize(this.decryptedData.substr(0, m)); + + let gossip = hdr.getHeader("autocrypt-gossip") || []; + EnigmailLog.DEBUG(`mimeDecrypt.jsm: extractAutocryptGossip: found ${gossip.length} headers\n`); + let msgDate = null; + try { + msgDate = this.uri.QueryInterface(Ci.nsIMsgMessageUrl).messageHeader.dateInSeconds; + } catch (x) {} + + + for (let i in gossip) { + let addr = EnigmailMime.getParameter(gossip[i], "addr"); + try { + let r = await EnigmailAutocrypt.processAutocryptHeader(addr, [gossip[i].replace(/ /g, "")], msgDate, true, true); + EnigmailLog.DEBUG(`mimeDecrypt.jsm: extractAutocryptGossip: r=${r}\n`); + } catch (x) { + EnigmailLog.DEBUG(`mimeDecrypt.jsm: extractAutocryptGossip: Error: ${x}\n`); + } + } } }; diff -Nru enigmail-2.0.12+ds1/package/mimeEncrypt.jsm enigmail-2.1.3+ds1/package/mimeEncrypt.jsm --- enigmail-2.0.12+ds1/package/mimeEncrypt.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/mimeEncrypt.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false, EnigmailLog: false, EnigmailDialog: false, EnigmailFuncs: false */ -/*jshint -W097 */ /* 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/. */ @@ -13,30 +11,31 @@ var EXPORTED_SYMBOLS = ["EnigmailMimeEncrypt"]; -const Cc = Components.classes; -const Ci = Components.interfaces; const Cr = Components.results; -const Cu = Components.utils; -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ -Cu.import("resource:///modules/jsmime.jsm"); /*global jsmime: false*/ -Cu.import("resource://enigmail/funcs.jsm"); -Cu.import("resource://enigmail/dialog.jsm"); -Cu.import("resource://enigmail/log.jsm"); -Cu.import("resource://enigmail/encryption.jsm"); /*global EnigmailEncryption: false */ -Cu.import("resource://enigmail/mime.jsm"); /*global EnigmailMime: false */ -Cu.import("resource://enigmail/hash.jsm"); /*global EnigmailHash: false */ -Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ -Cu.import("resource://enigmail/msgCompFields.jsm"); /*global EnigmailMsgCompFields: false */ -Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ -Cu.import("resource://enigmail/pEpAdapter.jsm"); /*global EnigmailPEPAdapter: false */ -const EnigmailLocale = Cu.import("resource://enigmail/locale.jsm").EnigmailLocale; +const jsmime = ChromeUtils.import("resource:///modules/jsmime.jsm").jsmime; +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; +const EnigmailFuncs = ChromeUtils.import("chrome://enigmail/content/modules/funcs.jsm").EnigmailFuncs; +const EnigmailDialog = ChromeUtils.import("chrome://enigmail/content/modules/dialog.jsm").EnigmailDialog; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailEncryption = ChromeUtils.import("chrome://enigmail/content/modules/encryption.jsm").EnigmailEncryption; +const EnigmailMime = ChromeUtils.import("chrome://enigmail/content/modules/mime.jsm").EnigmailMime; +const EnigmailHash = ChromeUtils.import("chrome://enigmail/content/modules/hash.jsm").EnigmailHash; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; +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; + +// our own contract IDs +const PGPMIME_ENCRYPT_CID = Components.ID("{96fe88f9-d2cd-466f-93e0-3a351df4c6d2}"); +const PGPMIME_ENCRYPT_CONTRACTID = "@enigmail.net/compose/mimeencrypt;1"; -const PGPMIME_JS_ENCRYPT_CONTRACTID = "@mozilla.org/messengercompose/composesecure;1"; -const PGPMIME_JS_ENCRYPT_CID = Components.ID("{1b040e64-e704-42b9-b05a-942e569afffc}"); const APPSHELL_MEDIATOR_CONTRACTID = "@mozilla.org/appshell/window-mediator;1"; -const kMsgComposeSecureCID = "{dd753201-9a23-4e08-957f-b3616bf7e012}"; +// S/MIME contract IDs +const SMIME_ENCRYPT_CONTRACTID = "@mozilla.org/messengercompose/composesecure;1"; +const kSmimeComposeSecureCID = "{dd753201-9a23-4e08-957f-b3616bf7e012}"; const maxBufferLen = 102400; const MIME_SIGNED = 1; @@ -44,13 +43,61 @@ var gDebugLogLevel = 0; -function PgpMimeEncrypt() {} +function PgpMimeEncrypt(sMimeSecurityInfo) { + this.wrappedJSObject = this; + + // nsIMsgSMIMECompFields + this.signMessage = false; + this.requireEncryptMessage = false; + + // "securityInfo" variables + this.sendFlags = 0; + this.UIFlags = 0; + this.senderEmailAddr = ""; + this.recipients = ""; + this.bccRecipients = ""; + this.originalSubject = null; + this.keyMap = {}; + + if (EnigmailCompat.isMessageUriInPgpMime()) { + this.onDataAvailable = this.onDataAvailable68; + } + else { + this.onDataAvailable = this.onDataAvailable60; + } + + try { + if (sMimeSecurityInfo) { + if ("nsIMsgSMIMECompFields" in Ci) { + sMimeSecurityInfo = sMimeSecurityInfo.QueryInterface(Ci.nsIMsgSMIMECompFields); + } + this.signMessage = sMimeSecurityInfo.signMessage; + this.requireEncryptMessage = sMimeSecurityInfo.requireEncryptMessage; + } + } + catch (ex) {} +} PgpMimeEncrypt.prototype = { classDescription: "Enigmail JS Encryption Handler", - classID: PGPMIME_JS_ENCRYPT_CID, - contractID: PGPMIME_JS_ENCRYPT_CONTRACTID, - QueryInterface: XPCOMUtils.generateQI([Ci.nsIMsgComposeSecure, Ci.nsIStreamListener, Ci.nsIEnigScriptableMsgCompose]), + classID: PGPMIME_ENCRYPT_CID, + get contractID() { + if (Components.classesByID && Components.classesByID[kSmimeComposeSecureCID]) { + // hack needed for TB < 62: we overwrite the S/MIME encryption handler + return SMIME_ENCRYPT_CONTRACTID; + } + else { + return PGPMIME_ENCRYPT_CONTRACTID; + } + }, + QueryInterface: EnigmailCompat.generateQI([ + "nsIMsgComposeSecure", + "nsIStreamListener", + "nsIMsgSMIMECompFields" // TB < 64 + ]), + + signMessage: false, + requireEncryptMessage: false, // private variables @@ -89,7 +136,21 @@ this.encHeader = null; }, - onDataAvailable: function(req, sup, stream, offset, count) { + /** + * onDataAvailable for TB <= 66 + */ + onDataAvailable60: function(req, ctxt, stream, offset, count) { + LOCAL_DEBUG("mimeEncrypt.js: onDataAvailable\n"); + this.inStream.init(stream); + var data = this.inStream.read(count); + //LOCAL_DEBUG("mimeEncrypt.js: >"+data+"<\n"); + + }, + + /** + * onDataAvailable for TB >= 67 + */ + onDataAvailable68: function(req, stream, offset, count) { LOCAL_DEBUG("mimeEncrypt.js: onDataAvailable\n"); this.inStream.init(stream); var data = this.inStream.read(count); @@ -97,7 +158,7 @@ }, - onStopRequest: function(request, win, status) { + onStopRequest: function(request, status) { EnigmailLog.DEBUG("mimeEncrypt.js: onStopRequest\n"); }, @@ -120,28 +181,34 @@ } } else { - if (this.checkSMime) { - // Remember to use original CID, not CONTRACTID, to avoid infinite looping! - this.smimeCompose = Components.classesByID[kMsgComposeSecureCID].createInstance(Ci.nsIMsgComposeSecure); - this.useSmime = this.smimeCompose.requiresCryptoEncapsulation(msgIdentity, msgCompFields); - } + if (Components.classesByID && kSmimeComposeSecureCID in Components.classesByID) { + // TB < 64 + if (this.checkSMime) { + // Remember to use original CID, not CONTRACTID, to avoid infinite looping! + this.smimeCompose = Components.classesByID[kSmimeComposeSecureCID].createInstance(Ci.nsIMsgComposeSecure); + this.useSmime = this.smimeCompose.requiresCryptoEncapsulation(msgIdentity, msgCompFields); + } + + if (this.useSmime) return true; + + if (msgCompFields.securityInfo) { + let securityInfo = msgCompFields.securityInfo.wrappedJSObject; + if (!securityInfo) return false; - if (this.useSmime) return true; - - var securityInfo = msgCompFields.securityInfo; - if (!securityInfo) return false; - - try { - if (EnigmailMsgCompFields.isEnigmailCompField(securityInfo)) { - return (EnigmailMsgCompFields.getValue(securityInfo, "sendFlags") & (EnigmailConstants.SEND_SIGNED | - EnigmailConstants.SEND_ENCRYPTED | - EnigmailConstants.SEND_VERBATIM)) !== 0; + for (let prop of ["sendFlags", "UIFlags", "senderEmailAddr", "recipients", "bccRecipients", "originalSubject", "keyMap"]) { + this[prop] = securityInfo[prop]; + } } else return false; } - catch (ex) { - return false; + else { + // TB >= 64: we are not called for S/MIME + this.disableSMimeCheck(); } + + return (this.sendFlags & (EnigmailConstants.SEND_SIGNED | + EnigmailConstants.SEND_ENCRYPTED | + EnigmailConstants.SEND_VERBATIM)) !== 0; } } catch (ex) { @@ -182,16 +249,12 @@ this.isDraft = isDraft; this.msgCompFields = msgCompFields; - var securityInfo = msgCompFields.securityInfo; - if (!securityInfo) throw Cr.NS_ERROR_FAILURE; - - this.enigmailFlags = EnigmailMsgCompFields.getEnigmailValues(securityInfo); this.outStringStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); var windowManager = Cc[APPSHELL_MEDIATOR_CONTRACTID].getService(Ci.nsIWindowMediator); this.win = windowManager.getMostRecentWindow(null); - if (this.enigmailFlags.sendFlags & EnigmailConstants.SEND_VERBATIM) { + if (this.sendFlags & EnigmailConstants.SEND_VERBATIM) { this.recipientList = recipientList; this.msgIdentity = msgIdentity; this.msgCompFields = msgCompFields; @@ -199,19 +262,19 @@ return null; } - if (this.enigmailFlags.sendFlags & EnigmailConstants.SEND_PGP_MIME) { + if (this.sendFlags & EnigmailConstants.SEND_PGP_MIME) { - if (this.enigmailFlags.sendFlags & EnigmailConstants.SEND_ENCRYPTED) { + if (this.sendFlags & EnigmailConstants.SEND_ENCRYPTED) { // applies to encrypted and signed & encrypted this.cryptoMode = MIME_ENCRYPTED; } - else if (this.enigmailFlags.sendFlags & EnigmailConstants.SEND_SIGNED) { + else if (this.sendFlags & EnigmailConstants.SEND_SIGNED) { this.cryptoMode = MIME_SIGNED; let hashAlgoObj = {}; if (EnigmailHash.determineAlgorithm(this.win, - this.enigmailFlags.UIFlags, - this.enigmailFlags.senderEmailAddr, + this.UIFlags, + this.senderEmailAddr, hashAlgoObj) === 0) { this.hashAlgorithm = hashAlgoObj.value; } @@ -252,90 +315,114 @@ this.encHeader = EnigmailMime.createBoundary(); let allHdr = ""; - let visibleHdr = ""; - let addrParser = jsmime.headerparser.parseAddressingHeader; - let newsParser = function(s) { - return jsmime.headerparser.parseStructuredHeader("Newsgroups", s); - }; - let noParser = function(s) { - return s; - }; - - let h = { - from: { - field: "From", - parser: addrParser - }, - replyTo: { - field: "Reply-To", - parser: addrParser - }, - to: { - field: "To", - parser: addrParser - }, - cc: { - field: "Cc", - parser: addrParser - }, - newsgroups: { - field: "Newsgroups", - parser: newsParser - }, - followupTo: { - field: "Followup-To", - parser: addrParser - }, - messageId: { - field: "Message-Id", - parser: noParser - } - }; - - for (let i in h) { - if (this.msgCompFields[i] && this.msgCompFields[i].length > 0) { - allHdr += jsmime.headeremitter.emitStructuredHeader(h[i].field, h[i].parser(this.msgCompFields[i]), {}); - } - } - - if (this.enigmailFlags.originalSubject && this.enigmailFlags.originalSubject.length > 0) { - allHdr += jsmime.headeremitter.emitStructuredHeader("subject", this.enigmailFlags.originalSubject, {}); - visibleHdr += jsmime.headeremitter.emitStructuredHeader("subject", this.enigmailFlags.originalSubject, {}); - } - - // special handling for references and in-reply-to - - if (this.enigmailFlags.originalReferences && this.enigmailFlags.originalReferences.length > 0) { - allHdr += jsmime.headeremitter.emitStructuredHeader("references", this.enigmailFlags.originalReferences, {}); - - let bracket = this.enigmailFlags.originalReferences.lastIndexOf("<"); - if (bracket >= 0) { - allHdr += jsmime.headeremitter.emitStructuredHeader("in-reply-to", this.enigmailFlags.originalReferences.substr(bracket), {}); - } - } - - let w = 'Content-Type: multipart/mixed; boundary="' + this.encHeader + '";\r\n' + - ' protected-headers="v1"\r\n' + - allHdr + '\r\n' + - "--" + this.encHeader + "\r\n"; - - if (this.cryptoMode == MIME_ENCRYPTED && this.enigmailFlags.sendFlags & EnigmailConstants.ENCRYPT_HEADERS && visibleHdr) { - w += 'Content-Type: text/rfc822-headers; protected-headers="v1"\r\n' + - 'Content-Disposition: inline\r\n\r\n' + - visibleHdr + - "\r\n--" + this.encHeader + "\r\n"; + if (this.sendFlags & EnigmailConstants.ENCRYPT_HEADERS) { + let addrParser = jsmime.headerparser.parseAddressingHeader; + let newsParser = function(s) { + return jsmime.headerparser.parseStructuredHeader("Newsgroups", s); + }; + let noParser = function(s) { + return s; + }; + + let h = { + from: { + field: "From", + parser: addrParser + }, + replyTo: { + field: "Reply-To", + parser: addrParser + }, + to: { + field: "To", + parser: addrParser + }, + cc: { + field: "Cc", + parser: addrParser + }, + newsgroups: { + field: "Newsgroups", + parser: newsParser + }, + followupTo: { + field: "Followup-To", + parser: addrParser + }, + messageId: { + field: "Message-Id", + parser: noParser + }, + subject: { + field: "Subject", + parser: noParser + } + }; + + for (let i in h) { + if (this.msgCompFields[i] && this.msgCompFields[i].length > 0) { + allHdr += jsmime.headeremitter.emitStructuredHeader(h[i].field, h[i].parser(this.msgCompFields[i]), {}); + } + } + + if (this.cryptoMode == MIME_ENCRYPTED && this.originalSubject && this.originalSubject.length > 0) { + allHdr += jsmime.headeremitter.emitStructuredHeader("subject", this.originalSubject, {}); + } + + // special handling for references and in-reply-to + + if (this.originalReferences && this.originalReferences.length > 0) { + allHdr += jsmime.headeremitter.emitStructuredHeader("references", this.originalReferences, {}); + + let bracket = this.originalReferences.lastIndexOf("<"); + if (bracket >= 0) { + allHdr += jsmime.headeremitter.emitStructuredHeader("in-reply-to", this.originalReferences.substr(bracket), {}); + } + } + } + + let w = `Content-Type: multipart/mixed; boundary="${this.encHeader}"`; + + if (allHdr.length > 0) { + w += `;\r\n protected-headers="v1"\r\n${allHdr}`; + } + else { + w += '\r\n'; } + + w += this.getAutocryptGossip() + `\r\n--${this.encHeader}\r\n`; this.writeToPipe(w); if (this.cryptoMode == MIME_SIGNED) this.writeOut(w); }, + getAutocryptGossip: function() { + let gossip = ""; + if (this.cryptoMode == MIME_ENCRYPTED && + this.msgCompFields.hasHeader("autocrypt") && + this.keyMap && + EnigmailFuncs.getNumberOfRecipients(this.msgCompFields) > 1) { + for (let email in this.keyMap) { + let keyObj = EnigmailKeyRing.getKeyById(this.keyMap[email]); + if (keyObj) { + let k = keyObj.getMinimalPubKey(email); + if (k.exitCode === 0) { + let keyData = " " + k.keyData.replace(/(.{72})/g, "$1\r\n ").replace(/\r\n $/, ""); + gossip += 'Autocrypt-Gossip: addr=' + email + '; keydata=\r\n' + keyData + "\r\n"; + } + } + } + } + + return gossip; + }, + encryptedHeaders: function(isEightBit) { EnigmailLog.DEBUG("mimeEncrypt.js: encryptedHeaders\n"); let subj = ""; - if (this.enigmailFlags.sendFlags & EnigmailConstants.ENCRYPT_HEADERS) { + if (this.sendFlags & EnigmailConstants.ENCRYPT_HEADERS) { subj = jsmime.headeremitter.emitStructuredHeader("subject", EnigmailFuncs.getProtectedSubjectText(), {}); } @@ -402,7 +489,7 @@ return; } - if ((this.enigmailFlags.sendFlags & EnigmailConstants.SEND_VERBATIM) !== 0) { + if ((this.sendFlags & EnigmailConstants.SEND_VERBATIM) !== 0) { this.flushOutput(); return; } @@ -411,12 +498,12 @@ let statusFlagsObj = {}; let errorMsgObj = {}; let proc = EnigmailEncryption.encryptMessageStart(this.win, - this.enigmailFlags.UIFlags, - this.enigmailFlags.senderEmailAddr, - this.enigmailFlags.recipients, - this.enigmailFlags.bccRecipients, + this.UIFlags, + this.senderEmailAddr, + this.recipients, + this.bccRecipients, this.hashAlgorithm, - this.enigmailFlags.sendFlags, + this.sendFlags, this, statusFlagsObj, errorMsgObj); @@ -475,11 +562,11 @@ try { let line = buffer.substr(0, length); if (this.inputMode === 0) { - if ((this.enigmailFlags.sendFlags & EnigmailConstants.SEND_VERBATIM) !== 0) { + if ((this.sendFlags & EnigmailConstants.SEND_VERBATIM) !== 0) { line = EnigmailData.decodeQuotedPrintable(line.replace("=\r\n", "")); } - if ((this.enigmailFlags.sendFlags & EnigmailConstants.SEND_VERBATIM) === 0 || + if ((this.sendFlags & EnigmailConstants.SEND_VERBATIM) === 0 || line.match(/^(From|To|Subject|Message-ID|Date|User-Agent|MIME-Version):/i) === null) { this.headerData += line; } @@ -507,7 +594,7 @@ this.writeToPipe(this.headerData); if (this.cryptoMode == MIME_SIGNED || - (this.enigmailFlags.sendFlags & EnigmailConstants.SEND_VERBATIM) !== 0) { + (this.sendFlags & EnigmailConstants.SEND_VERBATIM) !== 0) { this.writeOut(this.headerData); } } @@ -526,7 +613,7 @@ if (this.cryptoMode == MIME_SIGNED) { this.writeOut(line); } - else if ((this.enigmailFlags.sendFlags & EnigmailConstants.SEND_VERBATIM) !== 0) { + else if ((this.sendFlags & EnigmailConstants.SEND_VERBATIM) !== 0) { this.writeOut(EnigmailData.decodeQuotedPrintable(line.replace("=\r\n", ""))); } } @@ -649,11 +736,11 @@ let retStatusObj = {}; - this.exitCode = EnigmailEncryption.encryptMessageEnd(this.enigmailFlags.senderEmailAddr, + this.exitCode = EnigmailEncryption.encryptMessageEnd(this.senderEmailAddr, this.statusStr, exitCode, - this.enigmailFlags.UIFlags, - this.enigmailFlags.sendFlags, + this.UIFlags, + this.sendFlags, this.dataLength, retStatusObj); @@ -673,13 +760,9 @@ this.outQueue = ""; if ((!this.isDraft) || self.msgIdentity.getBoolAttribute("autoEncryptDrafts")) { - let securityInfo = this.msgCompFields.securityInfo; - if (!securityInfo) throw Cr.NS_ERROR_FAILURE; - - this.enigmailFlags = EnigmailMsgCompFields.getEnigmailValues(securityInfo); try { - originalSubject = this.enigmailFlags.originalSubject; - sendFlags = this.enigmailFlags.sendFlags; + originalSubject = this.originalSubject; + sendFlags = this.sendFlags; } catch (ex) {} @@ -783,6 +866,7 @@ } function initModule() { + EnigmailLog.DEBUG("mimeEncrypt.jsm: initModule()\n"); var env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); var nspr_log_modules = env.get("NSPR_LOG_MODULES"); var matches = nspr_log_modules.match(/mimeEncrypt:(\d+)/); @@ -799,7 +883,13 @@ startup: function(reason) { initModule(); }, - shutdown: function(reason) { + shutdown: function(reason) {}, + + createMimeEncrypt: function(sMimeSecurityInfo) { + return new PgpMimeEncrypt(sMimeSecurityInfo); + }, + isEnigmailCompField: function(obj) { + return obj instanceof PgpMimeEncrypt; } }; diff -Nru enigmail-2.0.12+ds1/package/mimeVerify.jsm enigmail-2.1.3+ds1/package/mimeVerify.jsm --- enigmail-2.0.12+ds1/package/mimeVerify.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/mimeVerify.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 https://mozilla.org/MPL/2.0/. */ @@ -12,20 +11,18 @@ * implemented as JS module */ -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ -Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ -Cu.import("resource://enigmail/mime.jsm"); /*global EnigmailMime: false */ -Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ -Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ -Cu.import("resource://enigmail/decryption.jsm"); /*global EnigmailDecryption: false */ -Cu.import("resource://enigmail/singletons.jsm"); /*global EnigmailSingletons: false */ +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; +const EnigmailFuncs = ChromeUtils.import("chrome://enigmail/content/modules/funcs.jsm").EnigmailFuncs; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailMime = ChromeUtils.import("chrome://enigmail/content/modules/mime.jsm").EnigmailMime; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; +const EnigmailDecryption = ChromeUtils.import("chrome://enigmail/content/modules/decryption.jsm").EnigmailDecryption; +const EnigmailSingletons = ChromeUtils.import("chrome://enigmail/content/modules/singletons.jsm").EnigmailSingletons; +const EnigmailHttpProxy = ChromeUtils.import("chrome://enigmail/content/modules/httpProxy.jsm").EnigmailHttpProxy; +const EnigmailCryptoAPI = ChromeUtils.import("chrome://enigmail/content/modules/cryptoAPI.jsm").EnigmailCryptoAPI; const APPSHELL_MEDIATOR_CONTRACTID = "@mozilla.org/appshell/window-mediator;1"; const PGPMIME_PROTO = "application/pgp-signature"; @@ -43,11 +40,18 @@ this.protocol = protocol; this.verifyEmbedded = false; this.partiallySigned = false; + this.exitCode = null; this.inStream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream); + + if (EnigmailCompat.isMessageUriInPgpMime()) { + this.onDataAvailable = this.onDataAvailable68; + } else { + this.onDataAvailable = this.onDataAvailable60; + } } -const EnigmailVerify = { +var EnigmailVerify = { lastMsgWindow: null, lastMsgUri: null, manualMsgUri: null, @@ -116,14 +120,13 @@ msgWindow: null, msgUriSpec: null, statusDisplayed: false, - exitCode: null, window: null, inStream: null, sigFile: null, sigData: "", mimePartNumber: "", - QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener]), + QueryInterface: EnigmailCompat.generateQI([Ci.nsIStreamListener]), startStreaming: function(window, msgWindow, msgUriSpec) { LOCAL_DEBUG("mimeVerify.jsm: startStreaming\n"); @@ -173,23 +176,28 @@ hdr.micalg = hdr.micalg || ""; this.boundary = hdr.boundary.replace(/['"]/g, ""); } - }, onStartRequest: function(request, uri) { EnigmailLog.DEBUG("mimeVerify.jsm: onStartRequest\n"); // always log this one - this.uri = uri ? uri.QueryInterface(Ci.nsIURI).clone() : null; this.mimeSvc = request.QueryInterface(Ci.nsIPgpMimeProxy); this.msgUriSpec = EnigmailVerify.lastMsgUri; if ("mimePart" in this.mimeSvc) { this.mimePartNumber = this.mimeSvc.mimePart; - } - else { + } else { this.mimePartNumber = ""; } + if ("messageURI" in this.mimeSvc) { + this.uri = this.mimeSvc.messageURI; + } else { + if (uri) { + this.uri = uri.QueryInterface(Ci.nsIURI); + } + } + this.dataCount = 0; this.foundMsg = false; this.backgroundJob = false; @@ -209,8 +217,23 @@ this.parseContentType(); }, - onDataAvailable: function(req, sup, stream, offset, count) { - LOCAL_DEBUG("mimeVerify.jsm: onDataAvailable: " + count + "\n"); + /** + * onDataAvailable for TB <= 66 + */ + onDataAvailable60: function(req, ctxt, stream, offset, count) { + LOCAL_DEBUG("mimeVerify.jsm: onDataAvailable60: " + count + "\n"); + if (count > 0) { + this.inStream.init(stream); + var data = this.inStream.read(count); + this.onTextData(data); + } + }, + + /** + * onDataAvailable for TB >= 67 + */ + onDataAvailable68: function(req, stream, offset, count) { + LOCAL_DEBUG("mimeVerify.jsm: onDataAvailable68: " + count + "\n"); if (count > 0) { this.inStream.init(stream); var data = this.inStream.read(count); @@ -231,8 +254,7 @@ i += 2 + this.boundary.length; if (this.keepData[i] == "\n") { ++i; - } - else if (this.keepData[i] == "\r") { + } else if (this.keepData[i] == "\r") { ++i; if (this.keepData[i] == "\n") ++i; } @@ -240,8 +262,7 @@ this.keepData = this.keepData.substr(i); data = this.keepData; this.readMode = 1; - } - else { + } else { this.keepData = data.substr(-this.boundary.length - 3); } } @@ -260,8 +281,7 @@ this.keepData = this.keepData.substr(i); this.readMode = 2; } - } - else + } else return; } @@ -284,8 +304,7 @@ if (xferEnc.search(/base64/i) >= 0) { let bound = this.getBodyPart(); this.keepData = EnigmailData.decodeBase64(this.keepData.substring(bound.start, bound.end)) + "\n"; - } - else if (xferEnc.search(/quoted-printable/i) >= 0) { + } else if (xferEnc.search(/quoted-printable/i) >= 0) { let bound = this.getBodyPart(); let qp = this.keepData.substring(bound.start, bound.end); this.keepData = EnigmailData.decodeQuotedPrintable(qp) + "\n"; @@ -295,8 +314,7 @@ let s = Math.max(this.keepData.search(/^-----BEGIN PGP /m), 0); let e = Math.max(this.keepData.search(/^-----END PGP /m), this.keepData.length - 30); this.sigData = this.keepData.substring(s, e + 30); - } - else { + } else { this.sigData = ""; } @@ -387,11 +405,13 @@ if (this.protectedHeaders && this.protectedHeaders.startPos >= 0 && this.protectedHeaders.endPos > this.protectedHeaders.startPos) { let r = this.signedData.substr(0, this.protectedHeaders.startPos) + this.signedData.substr(this.protectedHeaders.endPos); this.returnData(r); - } - else { + } else { this.returnData(this.signedData); } + // return if not verifying first mime part + if (this.mimePartNumber.length > 0 && this.mimePartNumber.search(/^1(\.1)?$/) < 0) return; + if (this.uri) { // return if not decrypting currently displayed message (except if // printing, replying, etc) @@ -406,19 +426,16 @@ let manUrl = {}; if (EnigmailVerify.getManualUri()) { - let msgSvc = messenger.messageServiceFromURI(EnigmailVerify.getManualUri()); - - msgSvc.GetUrlForUri(EnigmailVerify.getManualUri(), manUrl, null); - } - else { - manUrl.value = { + manUrl = EnigmailCompat.getUrlFromUriSpec(EnigmailVerify.getManualUri()); + } else { + manUrl = { spec: "enigmail://invalid/message" }; } // print a message if not message explicitly decrypted let currUrlSpec = this.uri.spec.replace(/(\?.*)(number=[0-9]*)(&.*)?$/, "?$2"); - let manUrlSpec = manUrl.value.spec.replace(/(\?.*)(number=[0-9]*)(&.*)?$/, "?$2"); + let manUrlSpec = manUrl.spec.replace(/(\?.*)(number=[0-9]*)(&.*)?$/, "?$2"); if ((!this.backgroundJob) && currUrlSpec != manUrlSpec) { @@ -427,9 +444,7 @@ } if (this.msgUriSpec) { - let msgSvc = messenger.messageServiceFromURI(this.msgUriSpec); - - msgSvc.GetUrlForUri(this.msgUriSpec, url, null); + url = EnigmailCompat.getUrlFromUriSpec(this.msgUriSpec); } if (this.uri.spec.search(/[&?]header=[a-zA-Z0-9]*$/) < 0 && @@ -439,24 +454,22 @@ if (this.uri.spec.search(/[&?]header=filter&.*$/) > 0) return; - if (this.uri && url && url.value) { + if (this.uri && url) { if ("path" in url) { // TB < 57 - if (url.value.host !== this.uri.host || - url.value.path !== this.uri.path) + if (url.host !== this.uri.host || + url.path !== this.uri.path) return; - } - else { + } else { // TB >= 57 - if (url.value.host !== this.uri.host || - url.value.pathQueryRef !== this.uri.pathQueryRef) + if (url.host !== this.uri.host || + url.pathQueryRef !== this.uri.pathQueryRef) return; } } } - } - catch (ex) { + } catch (ex) { EnigmailLog.writeException("mimeVerify.jsm", ex); EnigmailLog.DEBUG("mimeVerify.jsm: error while processing " + this.msgUriSpec + "\n"); } @@ -472,19 +485,33 @@ this.sigFile.createUnique(this.sigFile.NORMAL_FILE_TYPE, 0x180); EnigmailFiles.writeFileContents(this.sigFile, this.sigData, 0x180); - var statusFlagsObj = {}; - var errorMsgObj = {}; + if (!EnigmailDecryption.isReady(win)) return; - this.proc = EnigmailDecryption.decryptMessageStart(win, true, true, this, - statusFlagsObj, errorMsgObj, - EnigmailFiles.getEscapedFilename(EnigmailFiles.getFilePath(this.sigFile))); - - if (this.pipe) { - EnigmailLog.DEBUG("mimeVerify.jsm: onStopRequest: closing pipe\n"); // always log this one - this.pipe.close(); + + let sigFileName = EnigmailFiles.getEscapedFilename(EnigmailFiles.getFilePath(this.sigFile)); + let keyserver = EnigmailPrefs.getPref("autoKeyRetrieve"); + let options = { + keyserver: keyserver, + keyserverProxy: EnigmailHttpProxy.getHttpProxy(keyserver), + fromAddr: EnigmailDecryption.getFromAddr(win), + mimeSignatureFile: sigFileName + }; + const cApi = EnigmailCryptoAPI(); + + // ensure all lines end with CRLF as specified in RFC 3156, section 5 + if (this.signedData.search(/[^\r]\n/) >= 0) { + this.signedData = this.signedData.replace(/\r\n/g, "\n").replace(/\n/g, "\r\n"); } - else - this.closePipe = true; + + this.returnStatus = cApi.sync(cApi.verifyMime(this.signedData, options)); + this.exitCode = this.returnStatus.exitCode; + + if (this.partiallySigned) + this.returnStatus.statusFlags |= EnigmailConstants.PARTIALLY_PGP; + + this.displayStatus(); + + if (this.sigFile) this.sigFile.remove(false); } }, @@ -507,73 +534,21 @@ } if ("outputDecryptedData" in this.mimeSvc) { + // TB >= 57 this.mimeSvc.outputDecryptedData(data, data.length); - } - else { + } else { let gConv = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); gConv.setData(data, data.length); try { this.mimeSvc.onStartRequest(null, null); this.mimeSvc.onDataAvailable(null, null, gConv, 0, data.length); this.mimeSvc.onStopRequest(null, null, 0); - } - catch (ex) { + } catch (ex) { EnigmailLog.ERROR("mimeVerify.jsm: returnData(): mimeSvc.onDataAvailable failed:\n" + ex.toString()); } } }, - // API for decryptMessage Listener - stdin: function(pipe) { - LOCAL_DEBUG("mimeVerify.jsm: stdin\n"); - if (this.signedData.length > 0) { - LOCAL_DEBUG("mimeVerify.jsm: writing " + this.signedData.length + " bytes\n"); - - // ensure all lines end with CRLF as specified in RFC 3156, section 5 - this.signedData = this.signedData.replace(/\r\n/g, "\n").replace(/\n/g, "\r\n"); - - pipe.write(this.signedData); - } - if (this.closePipe) { - pipe.close(); - } - else { - this.pipe = pipe; - } - }, - - stdout: function(s) { - LOCAL_DEBUG("mimeVerify.jsm: stdout:" + s.length + "\n"); - this.dataLength += s.length; - }, - - stderr: function(s) { - LOCAL_DEBUG("mimeVerify.jsm: stderr\n"); - this.statusStr += s; - }, - - done: function(exitCode) { - LOCAL_DEBUG("mimeVerify.jsm: done: " + exitCode + "\n"); - this.exitCode = exitCode; - //LOCAL_DEBUG("mimeVerify.jsm: "+this.statusStr+"\n"); - - this.returnStatus = {}; - EnigmailDecryption.decryptMessageEnd(this.statusStr, - this.exitCode, - this.dataLength, - true, // verifyOnly - true, - EnigmailConstants.UI_PGP_MIME, - this.returnStatus); - - if (this.partiallySigned) - this.returnStatus.statusFlags |= EnigmailConstants.PARTIALLY_PGP; - - this.displayStatus(); - - if (this.sigFile) this.sigFile.remove(false); - }, - setMsgWindow: function(msgWindow, msgUriSpec) { EnigmailLog.DEBUG("mimeVerify.jsm: setMsgWindow: " + msgUriSpec + "\n"); @@ -612,8 +587,7 @@ this.mimePartNumber); } this.statusDisplayed = true; - } - catch (ex) { + } catch (ex) { EnigmailLog.writeException("mimeVerify.jsm", ex); } } diff -Nru enigmail-2.0.12+ds1/package/msgCompFields.jsm enigmail-2.1.3+ds1/package/msgCompFields.jsm --- enigmail-2.0.12+ds1/package/msgCompFields.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/msgCompFields.jsm 1970-01-01 00:00:00.000000000 +0000 @@ -1,178 +0,0 @@ -/*global Components XPCOMUtils */ -/* jshint -W097 */ -/* - * 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'; - -var EXPORTED_SYMBOLS = ["EnigmailMsgCompFields"]; - -Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); - -const Ci = Components.interfaces; - - -// components defined in this file -const ENIG_ENIGMSGCOMPFIELDS_CONTRACTID = - "@mozdev.org/enigmail/composefields;1"; -const ENIG_ENIGMSGCOMPFIELDS_CID = - Components.ID("{847b3a30-7ab1-11d4-8f02-006008948af5}"); - -/** - * This object extends nsIMsgSMIMECompFields and nsIMsgCompFields. - * As this can't be done directly anymore, we abuse nsIMsgSearchValue - * to store a JSON string in the "str" field. - * - * The Enigmail-specific values should not be accessed directly, but via - * EnigmailMsgCompFields.getValue and EnigmailMsgCompFields.setValue - * - */ -function MessageCompFields(smimeCompFields) { - this._parent = smimeCompFields; - - // nsIMsgCompFields and nsIMsgSMIMECompFields values - const members = ["from", - "replyTo", - "to", - "cc", - "bcc", - "fcc", - "fcc2", - "newsgroups", - "newshost", - "newspostUrl", - "followupTo", - "subject", - "attachments", - "organization", - "references", - "priority", - "messageId", - "characterSet", - "defaultCharacterSet", - "templateName", - "draftId", - "returnReceipt", - "receiptHeaderType", - "attachVCard", - "forcePlainText", - "useMultipartAlternative", - "uuEncodeAttachments", - "bodyIsAsciiOnly", - "forceMsgEncoding", - "otherRandomHeaders", - "body", - "temporaryFiles", - "attachmentsArray", - "addAttachment", - "removeAttachment", - "removeAttachments", - "ConvertBodyToPlainText", - "checkCharsetConversion", - "needToCheckCharset", - "securityInfo", - "senderReply", - "allReply", - "splitRecipients", - "listReply", - "requireEncryptMessage", - "signMessage" - ]; - - this._parent = smimeCompFields; - - if (smimeCompFields) { - for (let m in members) { - this[m] = smimeCompFields[m]; - } - } - - // nsIMsgSearchValue attributes - this.str = "{}"; - this.date = null; - this.status = null; - this.size = null; - this.msgKey = null; - this.age = null; - this.folder = null; - this.label = null; - this.junkStatus = null; - this.junkPercent = null; - -} - -MessageCompFields.prototype = { - - classDescription: "Enigmail Msg Compose Fields", - classID: ENIG_ENIGMSGCOMPFIELDS_CID, - contractID: ENIG_ENIGMSGCOMPFIELDS_CONTRACTID, - QueryInterface: XPCOMUtils.generateQI([ - Ci.nsIMsgSearchValue, // we abuse nsIMsgSearchValue as we cannot create a custom QueryInterface anymore - Ci.nsIMsgSMIMECompFields, - Ci.nsIMsgCompFields - ]), - - toString: function() { - return ""; - } -}; - - -var EnigmailMsgCompFields = { - CompFields: MessageCompFields, - - createObject: function(smimeCompFields) { - return new MessageCompFields(smimeCompFields); - }, - - setValue: function(enigCompFields, fieldName, value) { - let cf = enigCompFields.QueryInterface(Ci.nsIMsgSearchValue); - let o = {}; - try { - o = JSON.parse(cf.str); - } - catch (ex) {} - - o[fieldName] = value; - - cf.str = JSON.stringify(o); - }, - - getEnigmailValues: function(enigCompFields) { - let cf = '{}'; - try { - cf = enigCompFields.QueryInterface(Ci.nsIMsgSearchValue); - } - catch (x) {} - - let o = {}; - try { - o = JSON.parse(cf.str); - } - catch (ex) { - return null; - } - - return o; - }, - - getValue: function(enigCompFields, fieldName) { - let o = this.getEnigmailValues(enigCompFields); - - if (!o) return null; - return o[fieldName]; - }, - - isEnigmailCompField: function(enigCompFields) { - try { - let cf = enigCompFields.QueryInterface(Ci.nsIMsgSearchValue); - return true; - } - catch (ex) { - return false; - } - } -}; diff -Nru enigmail-2.0.12+ds1/package/msgRead.jsm enigmail-2.1.3+ds1/package/msgRead.jsm --- enigmail-2.0.12+ds1/package/msgRead.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/msgRead.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -4,23 +4,21 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -/*global Components: false */ - "use strict"; var EXPORTED_SYMBOLS = ["EnigmailMsgRead"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - /** * Message-reading related functions */ -Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -Cu.import("resource://enigmail/app.jsm"); /*global EnigmailApp: false */ -Cu.import("resource://enigmail/versioning.jsm"); /*global EnigmailVersioning: false */ +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailApp = ChromeUtils.import("chrome://enigmail/content/modules/app.jsm").EnigmailApp; +const EnigmailVersioning = ChromeUtils.import("chrome://enigmail/content/modules/versioning.jsm").EnigmailVersioning; +const EnigmailKeyRing = ChromeUtils.import("chrome://enigmail/content/modules/keyRing.jsm").EnigmailKeyRing; +const EnigmailFuncs = ChromeUtils.import("chrome://enigmail/content/modules/funcs.jsm").EnigmailFuncs; +const EnigmailAutocrypt = ChromeUtils.import("chrome://enigmail/content/modules/autocrypt.jsm").EnigmailAutocrypt; +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; const ExtraHeaders = ["autocrypt", "openpgp"]; @@ -32,44 +30,24 @@ let r = EnigmailPrefs.getPrefRoot(); // is the Mozilla Platform number >= 59? - let isPlatform59 = EnigmailVersioning.greaterThanOrEqual(EnigmailApp.getPlatformVersion(), "59.0a1"); - - let prefName = (isPlatform59 ? "mailnews.headers.extraAddonHeaders" : "mailnews.headers.extraExpandedHeaders"); + const PREF_NAME = "mailnews.headers.extraAddonHeaders"; - let hdr = r.getCharPref(prefName); + try { + let hdr = r.getCharPref(PREF_NAME); - if (hdr !== "*") { // do nothing if extraAddonHeaders is "*" (all headers) - for (let h of ExtraHeaders) { - let sr = new RegExp("\\b" + h + "\\b", "i"); - if (hdr.search(h) < 0) { - if (hdr.length > 0) hdr += " "; - hdr += h; + if (hdr !== "*") { // do nothing if extraAddonHeaders is "*" (all headers) + for (let h of ExtraHeaders) { + let sr = new RegExp("\\b" + h + "\\b", "i"); + if (hdr.search(h) < 0) { + if (hdr.length > 0) hdr += " "; + hdr += h; + } } - } - - r.setCharPref(prefName, hdr); - } - - if (isPlatform59) { - this.cleanupOldPref(); - } - }, - - /** - * Clean up extraExpandedHeaders after upgrading to TB 59 and newer, or upon shutdown. - */ - cleanupOldPref: function() { - let r = EnigmailPrefs.getPrefRoot(); - let hdr = r.getCharPref("mailnews.headers.extraExpandedHeaders"); - for (let h of ExtraHeaders) { - let sr = new RegExp("\\b" + h + "\\b", "i"); - if (hdr.search(h) >= 0) { - hdr = hdr.replace(sr, " "); + r.setCharPref(PREF_NAME, hdr); } } - - r.setCharPref("mailnews.headers.extraExpandedHeaders", hdr.trim()); + catch (x) {} }, /** @@ -80,29 +58,7 @@ * @return Object: nsIURL or nsIMsgMailNewsUrl object */ getUrlFromUriSpec: function(uriSpec) { - try { - if (!uriSpec) - return null; - - let messenger = Cc["@mozilla.org/messenger;1"].getService(Ci.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(Ci.nsIMsgMailNewsUrl); - } - - } - catch (ex) { - return null; - } + return EnigmailCompat.getUrlFromUriSpec(uriSpec); }, /** @@ -163,7 +119,7 @@ return attachment.name; } else - // SeaMonkey + // SeaMonkey return attachment.displayName; }, @@ -259,14 +215,46 @@ return text; }, - onShutdown: function(reason) { + /** + * Match the key to the sender's from address + * + * @param {String} keyId: signing key ID + * @param {String} fromAddr: sender's email address + * + * @return Promise: matching email address + */ + matchUidToSender: function(keyId, fromAddr) { + if ((!fromAddr) || !keyId) { + return null; + } + try { - let isPlatform59 = EnigmailVersioning.greaterThanOrEqual(EnigmailApp.getPlatformVersion(), "59.0a1"); - if (isPlatform59) return; + fromAddr = EnigmailFuncs.stripEmail(fromAddr).toLowerCase(); + } + catch (ex) {} + + let keyObj = EnigmailKeyRing.getKeyById(keyId); + if (!keyObj) return null; - EnigmailMsgRead.cleanupOldPref(); + let userIdList = keyObj.userIds; + + try { + for (let i = 0; i < userIdList.length; i++) { + if (fromAddr == EnigmailFuncs.stripEmail(userIdList[i].userId).toLowerCase()) { + return EnigmailFuncs.stripEmail(userIdList[i].userId); + } + } + + // // uid not found, try Autocrypt keystore + // let acList = await EnigmailAutocrypt.getOpenPGPKeyForEmail([fromAddr]); + // for (let i = 0; i < acList.length; i++) { + // if (acList[i].fpr == keyObj.fpr) { + // return fromAddr; + // } + // } } catch (ex) {} + return null; }, searchQuotedPgp: function(node) { @@ -284,5 +272,10 @@ } return false; + }, + + trimAllLines: function(txt) { + return txt.replace(/^[ \t]+/mg, ""); } + }; diff -Nru enigmail-2.0.12+ds1/package/openpgp.jsm enigmail-2.1.3+ds1/package/openpgp.jsm --- enigmail-2.0.12+ds1/package/openpgp.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/openpgp.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -11,23 +11,10 @@ * Do OpenPGP packet parsing */ -/* global Components: false */ /* eslint no-invalid-this: 0 */ var EXPORTED_SYMBOLS = ["EnigmailOpenPGP"]; - -const Cu = Components.utils; -const Cc = Components.classes; -const Ci = Components.interfaces; - -var window = null; -var document = null; - -const { - Services -} = Cu.import("resource://gre/modules/Services.jsm"); - var crc_table = [0x00000000, 0x00864cfb, 0x018ad50d, 0x010c99f6, 0x0393e6e1, 0x0315aa1a, 0x021933ec, 0x029f7f17, 0x07a18139, 0x0727cdc2, 0x062b5434, 0x06ad18cf, 0x043267d8, 0x04b42b23, 0x05b8b2d5, 0x053efe2e, 0x0fc54e89, 0x0f430272, 0x0e4f9b84, 0x0ec9d77f, 0x0c56a868, 0x0cd0e493, 0x0ddc7d65, 0x0d5a319e, 0x0864cfb0, 0x08e2834b, 0x09ee1abd, 0x09685646, 0x0bf72951, 0x0b7165aa, 0x0a7dfc5c, 0x0afbb0a7, 0x1f0cd1e9, 0x1f8a9d12, 0x1e8604e4, 0x1e00481f, 0x1c9f3708, 0x1c197bf3, 0x1d15e205, 0x1d93aefe, 0x18ad50d0, 0x182b1c2b, 0x192785dd, 0x19a1c926, @@ -48,35 +35,31 @@ 0x575bc9c3, 0x57dd8538 ]; +var gOpenPGPLib; function initialize() { - const { - EnigmailLog - } = Cu.import("resource://enigmail/log.jsm", {}); + const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; + const getOpenPGPLibrary = ChromeUtils.import("chrome://enigmail/content/modules/stdlib/openpgp-lib.jsm").getOpenPGPLibrary; + EnigmailLog.DEBUG("openpgp.jsm: initialize()\n"); try { - let appShellSvc = Cc["@mozilla.org/appshell/appShellService;1"].getService(Ci.nsIAppShellService); - - window = appShellSvc.hiddenDOMWindow; - document = window.document; + gOpenPGPLib = getOpenPGPLibrary(); - Services.scriptloader.loadSubScript("resource://enigmail/stdlib/openpgp-lib.js", null, "UTF-8"); - - //this.openpgp = window.openpgp; + EnigmailLog.DEBUG(`openpgp.jsm: openpgp: ${gOpenPGPLib}\n`); } catch (ex) { - EnigmailLog.ERROR("openpgp.jsm: initialize: error: " + ex.message + "\n"); + EnigmailLog.ERROR("openpgp.jsm: initialize: error: " + ex.toString() + "\n"); } } var EnigmailOpenPGP = { get openpgp() { - if (!(window && window.openpgp)) { + if (!gOpenPGPLib) { initialize(); } - return window.openpgp; + return gOpenPGPLib; }, enigmailFuncs: { @@ -172,13 +155,6 @@ "-----END PGP " + hdr + "-----\n"; return s; - }, - - getCrypto: function() { - if (!window) { - initialize(); - } - return window.crypto; } } }; diff -Nru enigmail-2.0.12+ds1/package/os.jsm enigmail-2.1.3+ds1/package/os.jsm --- enigmail-2.0.12+ds1/package/os.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/os.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -10,13 +8,8 @@ const EXPORTED_SYMBOLS = ["EnigmailOS"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - const XPCOM_APPINFO = "@mozilla.org/xre/app-info;1"; -// Cu.import("chrome://enigmail/content/modules/lazy.jsm"); /* global EnigmailLazy: false */ // const getExecution = EnigmailLazy.loader("enigmail/execution.jsm", "EnigmailExecution"); let operatingSystem = null; diff -Nru enigmail-2.0.12+ds1/package/overlays.jsm enigmail-2.1.3+ds1/package/overlays.jsm --- enigmail-2.0.12+ds1/package/overlays.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/overlays.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,305 +1,168 @@ -/*global Components: false*/ -/* - * This Source Code Form is subject to the terms of the Mozilla Public +/* 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/. - */ + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /** * Load overlays in a similar way as XUL did for non-bootstrapped addons * Unlike "real" XUL, overlays are only loaded over window URLs, and no longer - * over any xul file that is loaded somewhere. - * - * - * Prepare the XUL files: + * over any XUL file that is loaded somewhere. * - * 1. Elements can be referenced by ID, or by CSS selector (document.querySelector()). - * To use the a CSS Selector query, define the attribute "overlay_target" - * e.g. + * 1. Prepare your XUL files: * - * 3. inline scripts are not supported + * If you add buttons to a toolbar using in your XUL, add the + * following attributes to the toolbarpalette: + * targetToolbox="some_id" --> the ID of the *toolbox* where the buttons are added + * targetToolbar="some_id" --> the ID of the *toolbar* where the buttons are added * - * 4. if you add buttons to a toolbar using in your XUL, add the - * following attributes to the toolbarpalette: - * targetToolbox="some_id" --> the ID of the *toolbox* where the buttons are added - * targetToolbar="some_id" --> the ID of the *toolbar* where the buttons are added + * 2. Prepare your JavaScript: * - * Prepare the JavaScript: - * 1. Event listeners registering for "load" now need to listen to "load-"+MY_ADDON_ID + * Event listeners registering to listen for a "load" event now need to listen to "load-"+ addonID */ +/* eslint no-invalid-this: 0 */ + "use strict"; -var EXPORTED_SYMBOLS = ["EnigmailOverlays"]; +var EXPORTED_SYMBOLS = ["Overlays"]; -const { - classes: Cc, - interfaces: Ci, - utils: Cu -} = Components; - -const APP_SHUTDOWN = 2; - -const { - Services -} = Cu.import("resource://gre/modules/Services.jsm", {}); - -Cu.importGlobalProperties(["XMLHttpRequest"]); - -// the following constants need to be customized for each addon -const BASE_PATH = "chrome://enigmail/content/"; -const MY_ADDON_ID = "enigmail"; - -const overlays = { - // main mail reading window - "chrome://messenger/content/messenger.xul": [ - "columnOverlay.xul", { - // Overlay for Thunderbird (and other non-SeaMonkey apps) - url: "messengerOverlay-tbird.xul", - application: "!{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}" - }, { - // Overlay for SeaMonkey - url: "messengerOverlay-sm.xul", - application: "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}" - }, - "enigmailMessengerOverlay.xul", - "enigmailMsgHdrViewOverlay.xul" - ], - - // single message reader window - "chrome://messenger/content/messageWindow.xul": [{ - // Overlay for Thunderbird (and other non-SeaMonkey apps) - url: "messengerOverlay-tbird.xul", - application: "!{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}" - }, { - // Overlay for SeaMonkey - url: "messengerOverlay-sm.xul", - application: "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}" - }, - "enigmailMessengerOverlay.xul", - "enigmailMsgHdrViewOverlay.xul" - ], - - "chrome://messenger/content/messengercompose/messengercompose.xul": [{ - // Overlay for Thunderbird (and other non-SeaMonkey apps) - url: "enigmailMsgComposeOverlay.xul", - application: "!{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}" - }, { - // Overlay for SeaMonkey - url: "enigmailMsgComposeOverlay-sm.xul", - application: "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}" - }], - - "chrome://messenger/content/FilterEditor.xul": ["enigmailFilterEditorOverlay.xul"], - "chrome://messenger/content/FilterListDialog.xul": ["enigmailFilterListOverlay.xul"], - "chrome://messenger/content/am-identity-edit.xul": [ - "enigmailAmIdEditOverlay.xul", - "enigmailEditIdentity.xul" - ], - "chrome://messenger/content/addressbook/addressbook.xul": ["enigmailAbCardViewOverlay.xul"], - "chrome://enigmail/content/editSingleAccount.xul": ["enigmailEditIdentity.xul"], - // - // // Overlay for privacy preferences in Thunderbird - "chrome://messenger/content/preferences/preferences.xul": ["enigmailPrivacyOverlay.xul"], - - // - // Overlay for Customize Toolbar (Windows, Linux) - "chrome://global/content/customizeToolbar.xul": ["enigmailCustToolOverlay.xul"], - "chrome://messenger/content/customizeToolbar.xul": ["enigmailCustToolOverlay.xul"], - - // - // // Overlay for Account Manager - "chrome://messenger/content/AccountManager.xul": ["accountManagerOverlay.xul"], - "chrome://messenger/content/msgPrintEngine.xul": ["enigmailMsgPrintOverlay.xul"] -}; +var ConsoleAPI = ChromeUtils.import("resource://gre/modules/Console.jsm").ConsoleAPI; +const Services = ChromeUtils.import("resource://gre/modules/Services.jsm").Services; +Components.utils.importGlobalProperties(["XMLHttpRequest"]); -///////// Enigmail-specific part start -const { - EnigmailLog -} = Cu.import("resource://enigmail/log.jsm", {}); +let oconsole = new ConsoleAPI({ + prefix: "Overlays.jsm", + consoleID: "overlays-jsm", + maxLogLevel: "warn" // "all" +}); -function DEBUG_LOG(str) { - EnigmailLog.DEBUG(str); -} +var Overlays = { + /** + * Load one or more overlays into a window. + * + * @param {String} addonID The ID of the addon (e.g. "addon@example.com") + * @param {DOMWindow} targetWindow The target window where to merge XUL files + * @param {String[]} listOfXul The list of overlays (URLs) to load + * + * @return {Promise} Promise resolving with the number of overlays loaded + */ + async loadOverlays(addonID, targetWindow, listOfXul) { + let document = targetWindow.document; + let deferredLoad = []; + for (let url of listOfXul) { + oconsole.log(`loadOverlay(${url})`); + // TODO can we do this in parallel? + deferredLoad.push(...await insertXul(addonID, url, targetWindow, document)); + } -function ERROR_LOG(str) { - EnigmailLog.ERROR(str); -} -///////// Enigmail-specific part end + if (document.readyState == "complete") { + let fakeEvent = new targetWindow.UIEvent("load", { + view: targetWindow + }); + for (let listener of deferredLoad) { + if (typeof listener == "function") { + listener(fakeEvent); + } else if (listener && typeof listener == "object") { + listener.handleEvent(fakeEvent); + } + } + } else { + for (let listener of deferredLoad) { + targetWindow.addEventListener("load", listener); + } + } + oconsole.log("loadOverlay: completed"); -var WindowListener = { - setupUI: function(window, overlayDefs) { - DEBUG_LOG("overlays.jsm: setupUI(" + window.document.location.href + ")\n"); + let e = new Event("load-" + addonID); + targetWindow.dispatchEvent(e); + oconsole.log("loadOverlay: event completed"); - loadOverlays(window, overlayDefs).then(ignore => {}).catch(ignore => {}); + return listOfXul.length; }, - tearDownUI: function(window) { - let document = window.document; + /** + * Unload overlays from a window, e.g. if an addon is disabled. + * UI elements and CSS added by loadOverlays() are removed with this function. + * JavaScript needs to be unloaded manually. + * + * @param {String} addonID The ID of the addon (e.g. "addon@example.com") + * @param {DOMWindow} targetWindow The target window where to merge XUL files + */ + unloadOverlays(addonID, targetWindow) { + let document = targetWindow.document; // unload UI elements - let s = document.querySelectorAll("[overlay_source='" + MY_ADDON_ID + "']"); - - for (let i = 0; i < s.length; i++) { - let p = s[i].parentNode; - p.removeChild(s[i]); + let sources = document.querySelectorAll(`[overlay_source='${addonID}']`); + for (let node of sources) { + node.remove(); } - let e = new Event("unload-" + MY_ADDON_ID); - window.dispatchEvent(e); + let event = new Event("unload-" + addonID); + targetWindow.dispatchEvent(event); // unload CSS - s = document.querySelectorAll("overlayed_css[source='" + MY_ADDON_ID + "']"); - for (let i = 0; i < s.length; i++) { - unloadCSS(s[i].getAttribute("href"), window); - - let p = s[i].parentNode; - p.removeChild(s[i]); + sources = document.querySelectorAll(`overlayed_css[source='${addonID}']`); + for (let node of sources) { + unloadCSS(node.getAttribute("href"), targetWindow); + node.remove(); } - }, - - // nsIWindowMediatorListener functions - onOpenWindow: function(xulWindow) { - // A new window has opened - let domWindow = xulWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindow); - - // Wait for it to finish loading - domWindow.addEventListener("load", function listener() { - domWindow.removeEventListener("load", listener, false); - - for (let w in overlays) { - // If this is a relevant window then setup its UI - if (domWindow.document.location.href.startsWith(w)) - WindowListener.setupUI(domWindow, overlays[w]); - } - }, false); - }, + } +}; - onCloseWindow: function(xulWindow) {}, - onWindowTitleChange: function(xulWindow, newTitle) {} -}; +// ////////////////////////////////////////////////////////////////////////////////////// // +// Private functions // +// ////////////////////////////////////////////////////////////////////////////////////// // /** - * Determine if an overlay exists for a window, and if so - * load it + * Fetches the xul overlay from srcUrl. + * + * @param {String} srcUrl The source url to fetch + * @return {Promise} The XHR loaded with the results */ +function fetchOverlay(srcUrl) { + return new Promise((resolve, reject) => { + let xhr = new XMLHttpRequest(); + xhr.onload = () => { + resolve(xhr); + }; + xhr.onerror = xhr.onabort = (e) => { + reject(e); + }; -function loadUiForWindow(domWindow) { - for (let w in overlays) { - // If this is a relevant window then setup its UI - if (domWindow.document.location.href.startsWith(w)) - WindowListener.setupUI(domWindow, overlays[w]); - } -} - - -var EnigmailOverlays = { - /** - * Called by bootstrap.js upon startup of the addon - * (e.g. enabling, instalation, update, application startup) - * - * @param reason: Number - bootstrap "reason" constant - */ - startup: function(reason) { - DEBUG_LOG("overlays.jsm: startup()\n"); - - let wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator); + xhr.overrideMimeType("application/xml"); + xhr.open("GET", srcUrl); - // Wait for any new windows to open - wm.addListener(WindowListener); - - // Get the list of windows already open - let windows = wm.getEnumerator(null); - while (windows.hasMoreElements()) { - try { - let domWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow); - - DEBUG_LOG("overlays.jsm: startup: found window: " + domWindow.document.location.href + "\n"); - - if (domWindow.document.location.href === "about:blank") { - // a window is available, but it's not yet fully loaded - // ==> add an event listener to fire when the window is completely loaded - - domWindow.addEventListener("load", function loadUi() { - domWindow.removeEventListener("load", loadUi, false); - loadUiForWindow(domWindow); - }, false); - } - else { - loadUiForWindow(domWindow); - } - } - catch (ex) { - DEBUG_LOG("overlays.jsm: startup: error " + ex.message + "\n"); - } - } - }, - - /** - * Called by bootstrap.js upon shutdown of the addon - * (e.g. disabling, uninstalling, update, application shutdown) - * - * @param reason: Number - bootstrap "reason" constant - */ - shutdown: function(reason) { - DEBUG_LOG("overlay.jsm: initiating shutdown\n"); - // When the application is shutting down we normally don't have to clean - // up any UI changes made - if (reason == APP_SHUTDOWN) + // Elevate the request, so DTDs will work. Should not be a security issue since we + // only load chrome, resource and file URLs, and that is our privileged chrome package. + try { + xhr.channel.owner = Services.scriptSecurityManager.getSystemPrincipal(); + } catch (ex) { + oconsole.error("insertXul: Failed to set system principal"); + xhr.close(); + reject("Failed to set system principal"); return; - - let wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator); - - // Stop listening for any new windows to open - wm.removeListener(WindowListener); - - // Get the list of windows already open - let windows = wm.getEnumerator(null); - while (windows.hasMoreElements()) { - let domWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow); - - WindowListener.tearDownUI(domWindow); - - // If this is a window opened by the addon, then close it - if (domWindow.document.location.href.startsWith(BASE_PATH)) - domWindow.close(); } - DEBUG_LOG("overlay.jsm: shutdown complete\n"); - }, - - /** - * Load overlays (See below) - */ - loadOverlays: loadOverlays, - - /** - * Load insert a single overlay (see below) - */ - insertXul: insertXul -}; - -function getAppId() { - return Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo).ID; + xhr.send(); + }); } + /** * Load XUL into window - * @param srcUrl: String - URL of XUL to load - * @param window: Object - target window - * @param document: Object - document in target window + * + * @param {String} addonID The addon loading these overlays + * @param {String} srcUrl URL of XUL to load + * @param {DOMWindow} window Target window + * @param {Document} document Document in target window + * @return {Promise} Promise resolving when document is completed */ - -function insertXul(srcUrl, window, document, callback) { - +async function insertXul(addonID, srcUrl, window, document) { function injectDOM(xul) { function $(id) { return document.getElementById(id); @@ -311,7 +174,7 @@ function getToolbarNthTag(toolbar, tagName, elemIndex) { if (elemIndex >= 0) { - let s = new RegExp("^" + tagName + "[0-9]+$"); + let s = new RegExp(`^${tagName}[0-9]+$`); let node = toolbar.firstChild; let n = -1; while (node) { @@ -354,18 +217,17 @@ * */ function addToolbarButton(palette, toolbarButton, toolbarId) { - DEBUG_LOG("overlays.jsm: adding button '" + toolbarButton.id + " to " + toolbarId + "'\n"); + oconsole.log(`adding button '${toolbarButton.id}' to '${toolbarId}'`); let toolbar = $(toolbarId); let buttonId = toolbarButton.id; - let firstRun = false; let currentset = toolbar.getAttribute("currentset").split(/,/); if (toolbar.getAttribute("currentset").length === 0) { currentset = toolbar.getAttribute("defaultset").split(/,/); } - toolbarButton.setAttribute("overlay_source", MY_ADDON_ID); + toolbarButton.setAttribute("overlay_source", addonID); palette.appendChild(toolbarButton); let index = currentset.indexOf(buttonId); @@ -376,11 +238,13 @@ for (let i = index + 1; i < currentset.length; i++) { if (currentset[i].search(/^(separator|spacer|spring)$/) < 0) { before = $(currentset[i]); - } - else { + } else { before = getToolbarElem(toolbar, currentset, i); } - if (before) break; + + if (before) { + break; + } } toolbar.insertItem(buttonId, before); @@ -391,85 +255,80 @@ // loadOverlay for the poor function addNode(target, node) { // helper: insert according to position - function insertX(nn, attr, callbackFunc) { + function insertX(nn, attr) { if (!nn.hasAttribute(attr)) { - return false; + return null; } let places = nn.getAttribute(attr) - .split(',') + .split(",") .map(p => p.trim()) .filter(p => Boolean(p)); for (let p of places) { - let pn = $$('#' + target.id + ' > #' + p); + let pn = $$(`#${target.id} > #${p}`); if (!pn) { continue; } - if (callbackFunc) callbackFunc(pn); - return true; + return pn; } - return false; + return null; } - node.setAttribute("overlay_source", MY_ADDON_ID); + node.setAttribute("overlay_source", addonID); // bring the node to be inserted into the document let nn = document.importNode(node, true); - // try to insert according to insertafter/before - if (insertX(nn, 'insertafter', - pn => pn.parentNode.insertBefore(nn, pn.nextSibling)) || - insertX(nn, 'insertbefore', - pn => pn.parentNode.insertBefore(nn, pn))) {} - // just append - else { - target.appendChild(nn); + let pn = insertX(nn, "insertafter"); + if (pn) { + pn.parentNode.insertBefore(nn, pn.nextSibling); + } else { + pn = insertX(nn, "insertbefore"); + if (pn) { + pn.parentNode.insertBefore(nn, pn); + } else { + target.appendChild(nn); + } } + return nn; } - if (document.location) - DEBUG_LOG("overlays.jsm: injectDOM: gonna stuff: " + srcUrl + " into: " + document.location.href + "\n"); + if (document.location) { + oconsole.log(`injectDOM: gonna stuff: ${srcUrl} into: ${document.location.href}`); + } try { - let rootNode = null; - - for (let n = document.documentElement.firstChild; n; n = n.nextSibling) { - if (n.nodeType == n.ELEMENT_NODE) { - rootNode = n; - break; - } - } + let anonymousTargetId = 0; + let rootNode = document.documentElement.firstElementChild; if (!rootNode) { - ERROR_LOG("overlays.jsm: injectDOM: no root node found\n"); + oconsole.error("injectDOM: no root node found"); } // Add all overlays - for (let i in xul) { + for (let node of xul) { let target; - if (xul[i].hasAttribute("id")) { - target = $(xul[i].id); - } - else if (xul[i].hasAttribute("overlay_target")) { - target = $$(xul[i].getAttribute("overlay_target")); + if (node.hasAttribute("id")) { + target = $(node.id); + } else if (node.hasAttribute("overlay_target")) { + target = $$(node.getAttribute("overlay_target")); if (target && !target.hasAttribute("id")) { - target.id = MY_ADDON_ID + "_overlay_" + i; + target.id = `${addonID}_overlay_${anonymousTargetId++}`; } - } - else { + } else { target = rootNode; } - if (xul[i].tagName === "toolbarpalette") { - let toolboxId = xul[i].getAttribute("targetToolbox"); - let toolbarId = xul[i].getAttribute("targetToolbar"); - let defaultSet = xul[i].getAttribute("targetToolbarDefaultset"); + if (node.tagName === "toolbarpalette") { + let toolboxId = node.getAttribute("targetToolbox"); + let toolbarId = node.getAttribute("targetToolbar"); + let defaultSet = node.getAttribute("targetToolbarDefaultset"); if (!toolboxId) { - DEBUG_LOG("overlays.jsm: injectDOM: cannot overlay toolbarpalette: no target toolbox defined\n"); + oconsole.log("injectDOM: cannot overlay toolbarpalette: no target toolbox defined"); continue; } if (!toolbarId) { - DEBUG_LOG("overlays.jsm: injectDOM: cannot overlay toolbarpalette: no target toolbar defined\n"); + oconsole.log("injectDOM: cannot overlay toolbarpalette: no target toolbar defined"); continue; } @@ -482,7 +341,7 @@ let toolbox = $(toolboxId); let palette = toolbox.palette; - let c = xul[i].children; + let c = node.children; while (c.length > 0) { // added toolbar buttons are removed from the palette's children @@ -490,215 +349,213 @@ addToolbarButton(palette, c[0], toolbarId); } } - } - else if (!target) { - DEBUG_LOG("overlays.jsm: injectDOM: no target for " + xul[i].tagName + ", not inserting\n"); + } else if (!target) { + oconsole.log(`injectDOM: no target for ${node.tagName}, not inserting`); continue; } // insert all children - for (let n of xul[i].children) { - if (n.nodeType != n.ELEMENT_NODE) { - continue; - } - let nn = addNode(target, n); + for (let n of node.children) { + addNode(target, n); } } - } - catch (ex) { - ERROR_LOG("overlays.jsm: injectDOM: failed to inject xul " + ex.message + "\n"); + } catch (ex) { + oconsole.error("insertXul: injectDOM: failed to inject xul " + ex.message); } } - DEBUG_LOG("overlays.jsm: insertXul(" + srcUrl + ")\n"); + oconsole.log(`insertXul(${srcUrl})`); - let xmlReq = new XMLHttpRequest(); + if (typeof(srcUrl) !== "string" || (srcUrl.search(/^(chrome|resource|file):\/\//) < 0)) { + oconsole.error(`insertXul ${srcUrl} is not a valid chrome/resource/file URL`); + throw new Error(`insertXul ${srcUrl} is not a valid chrome/resource/file URL`); + } - xmlReq.onload = function() { - DEBUG_LOG("loaded: " + srcUrl + "\n"); - let document = xmlReq.responseXML; + let xhr = await fetchOverlay(srcUrl); - // clean the document a bit - let emptyNodes = document.evaluate( - "//text()[normalize-space(.) = '']", document, null, 7, null); - for (let i = 0, e = emptyNodes.snapshotLength; i < e; ++i) { - let n = emptyNodes.snapshotItem(i); - n.parentNode.removeChild(n); - } + oconsole.log(`loaded: ${srcUrl}`); + let overlaydoc = xhr.responseXML; - // prepare all elements to be inserted - let xul = []; - let foundElement = false; - for (let n = document.documentElement.firstChild; n; n = n.nextSibling) { - if (n.nodeType != n.ELEMENT_NODE) { - continue; - } - if (n.tagName === "script" || n.tagName === "link") { - foundElement = true; - continue; - } + // clean the document a bit - foundElement = true; - xul.push(n); - } - if (!foundElement) { - ERROR_LOG("No element to overlay found. Maybe a parsing error?\n"); - return; + let emptyNodes = overlaydoc.evaluate("//text()[normalize-space(.) = '']", overlaydoc, null, 7, null); + for (let i = 0, len = emptyNodes.snapshotLength; i < len; ++i) { + let node = emptyNodes.snapshotItem(i); + node.remove(); + } + + // prepare all elements to be inserted + let xul = []; + let scripts = []; + let links = []; + for (let node of overlaydoc.documentElement.children) { + if (node.tagName == "script") { + scripts.push(node); + } else if (node.tagName == "link") { + links.push(node); + } else { + xul.push(node); } + } - injectDOM(xul); + if (xul.length === 0 && links.length === 0 && scripts.length === 0) { + oconsole.error("insertXul: No element to overlay found. Maybe a parsing error?"); + return []; + } - // load css into window - let css = document.getElementsByTagName("link"); - for (let i = 0; i < css.length; i++) { - let rel = css[i].getAttribute("rel"); - if (rel && rel === "stylesheet") { - loadCss(css[i].getAttribute("href"), window); - } + injectDOM(xul); + + // Load sheets from xml-stylesheet PI + let stylesheets = overlaydoc.evaluate("/processing-instruction('xml-stylesheet')", overlaydoc, null, 7, null); + for (let i = 0, len = stylesheets.snapshotLength; i < len; ++i) { + let node = stylesheets.snapshotItem(i); + let match = node.nodeValue.match(/href=["']([^"']*)["']/); + if (match) { + loadCss(addonID, match[1], window); + oconsole.log(match[1]); } + } - // load scripts into window - let sc = document.getElementsByTagName("script"); - for (let i = 0; i < sc.length; i++) { - let src = sc[i].getAttribute("src"); - if (src) { - loadScript(src, window); - } + // load css into window + for (let node of links) { + if (node.getAttribute("rel") === "stylesheet") { + loadCss(addonID, node.getAttribute("href"), window); } + } - if (callback) { - callback(0); + // load scripts into window + let deferredLoad = []; + for (let node of scripts) { + let src = node.getAttribute("src"); + if (src) { + oconsole.log("Loading script " + src); + deferredLoad.push(...loadScriptFromUrl(src, window)); + } else { + if (node.firstChild && node.firstChild.nodeName.search(/^#(text|cdata-section)$/) === 0) { + oconsole.log("Loading inline script " + node.firstChild.wholeText.substr(0, 20)); + deferredLoad.push(...loadInlineScript(node.firstChild.wholeText, window)); + } } - }; + } + let loadExtraOverlays = []; + let processingInstructions = overlaydoc.evaluate("/processing-instruction('xul-overlay')", overlaydoc, null, 7, null); + for (let i = 0, len = processingInstructions.snapshotLength; i < len; ++i) { + let node = processingInstructions.snapshotItem(i); + let match = node.nodeValue.match(/href=["']([^"']*)["']/); + if (match) { + loadExtraOverlays.push(insertXul(addonID, match[1], window, document)); + oconsole.log(match[1]); + } + } - xmlReq.onerror = xmlReq.onabort = function() { - ERROR_LOG("Failed to load " + srcUrl + "\n"); - callback(0); - }; + await Promise.all(loadExtraOverlays); - xmlReq.overrideMimeType("application/xml"); - xmlReq.open("GET", BASE_PATH + srcUrl); + return deferredLoad; +} - // Elevate the request, so DTDs will work. Not a security issue since we - // always load from BASE_PATH, and that is our privileged chrome package. - // This is no different than regular overlays. - let sec = Cc['@mozilla.org/scriptsecuritymanager;1'].getService(Ci.nsIScriptSecurityManager); - try { - xmlReq.channel.owner = sec.getSystemPrincipal(); - } - catch (ex) { - ERROR_LOG("Failed to set system principal\n"); +/** + * Unload CSS from the given window + * + * @param {String} url The url of the css to unload + * @param {DOMWindow} targetWindow DOM window to unload from + */ +function unloadCSS(url, targetWindow) { + let domWindow = targetWindow.QueryInterface(Ci.nsIInterfaceRequestor); + let domWindowUtils; + if ("windowUtils" in domWindow) { + // TB < 64 + domWindowUtils = domWindow.windowUtils; + } else { + domWindowUtils = domWindow.getInterface(Ci.nsIDOMWindowUtils); } - - xmlReq.send(); - + domWindowUtils.removeSheetUsingURIString(url, 1); } /** - * Load one or more overlays into a window. - * - * @param window: nsIDOMWindow - the target window - * @param overlayDefsArr: Array - the list of overlays to load - * either: String - the XUL filename - * or : Object: - * url: String - the XUL filename, - * application: String - the target application ID (use ! to exclude an application) + * Load CSS into the given window * - * @return Promise (numOverlays - the number of overlays loaded) + * @param {String} addonID The addon loading these css files + * @param {String} url The CSS url to load + * @param {DOMWindow} targetWindow THe target window to load into */ -function loadOverlays(window, overlayDefsArr) { +function loadCss(addonID, url, targetWindow) { + oconsole.log(`loadCss(${url})`); - let p = new Promise((resolve, reject) => { - function loadOverlay(window, overlayDefs, index) { - DEBUG_LOG("overlays.jsm: loadOverlay(" + index + ")\n"); - - try { - if (index < overlayDefs.length) { - let overlayDef = overlayDefs[index]; - let document = window.document; - let url = overlayDef; - - if (typeof(overlayDef) !== "string") { - url = overlayDef.url; - if (overlayDef.application.substr(0, 1) === "!") { - if (overlayDef.application.indexOf(getAppId()) > 0) { - DEBUG_LOG("overlays.jsm: loadOverlay: skipping " + url + "\n"); - loadOverlay(window, overlayDefs, index + 1); - return; - } - } - else if (overlayDef.application.indexOf(getAppId()) < 0) { - DEBUG_LOG("overlays.jsm: loadOverlay: skipping " + url + "\n"); - loadOverlay(window, overlayDefs, index + 1); - return; - } - } - - let observer = function(result) { - loadOverlay(window, overlayDefs, index + 1); - }; + try { + let document = targetWindow.document; - insertXul(url, window, document, observer); - } - else { - DEBUG_LOG("overlays.jsm: loadOverlay: completed\n"); + let link = document.createElementNS("http://www.w3.org/1999/xhtml", "link"); + link.setAttribute("rel", "stylesheet"); + link.setAttribute("type", "text/css"); + link.setAttribute("href", url); + link.setAttribute("extension_id", addonID); + document.documentElement.appendChild(link); + } catch (ex) { + oconsole.error(`loadCss: Error with loading CSS ${url}:\n${ex.message}`); + } +} - let e = new Event("load-" + MY_ADDON_ID); - window.dispatchEvent(e); - DEBUG_LOG("overlays.jsm: loadOverlay: event completed\n"); +/** + * Load a subscript into the given window + * + * @param {String} url The URL to load + * @param {DOMWindow} targetWindow The window global to load into + */ +function loadScriptFromUrl(url, targetWindow) { + let deferredLoad = []; - resolve(index); - } - } - catch (ex) { - ERROR_LOG("overlays.jsm: could not overlay for " + window.document.location.href + ":\n" + ex.message + "\n"); - reject(index); - } + let oldAddEventListener = targetWindow.addEventListener; + targetWindow.addEventListener = function(type, listener, ...args) { + if (type == "load") { + deferredLoad.push(listener); + return null; } + return oldAddEventListener.call(this, type, listener, ...args); + }; - loadOverlay(window, overlayDefsArr, 0); - }); - - return p; -} + try { + Services.scriptloader.loadSubScript(url, targetWindow); + } catch (ex) { + oconsole.error(`loadScriptFromUrl: Error with loading script ${url}:\n${ex.message}`); + } + targetWindow.addEventListener = oldAddEventListener; -function unloadCSS(url, targetWindow) { - let domWindowUtils = targetWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils); - domWindowUtils.removeSheetUsingURIString(url, 1); + // This works because we only care about immediately executed addEventListener calls and + // loadSubScript is synchronous. Everyone else should be checking readyState anyway. + return deferredLoad; } -function loadCss(url, targetWindow) { - DEBUG_LOG("overlays.jsm: loadCss(" + url + ")\n"); +/** + * Load a subscript into the given window + * + * @param {String} scriptCode The JavaScript code to load + * @param {DOMWindow} targetWindow The window global to load into + */ +function loadInlineScript(scriptCode, targetWindow) { + let deferredLoad = []; - try { - let domWindowUtils = targetWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils); - domWindowUtils.loadSheetUsingURIString(url, 1); - let document = targetWindow.document; - let e = document.createElement("overlayed_css"); - e.setAttribute("href", url); - e.setAttribute("source", MY_ADDON_ID); - - let node = document.firstChild; - while (node && (!node.tagName)) { - node = node.nextSibling; + let oldAddEventListener = targetWindow.addEventListener; + targetWindow.addEventListener = function(type, listener, ...args) { + if (type == "load") { + deferredLoad.push(listener); + return null; } - if (node) node.appendChild(e); - } - catch (ex) { - ERROR_LOG("Error while loading CSS " + url + ":\n" + ex.message + "\n"); - } -} - -function loadScript(url, targetWindow) { - let loader = Cc["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader); + return oldAddEventListener.call(this, type, listener, ...args); + }; try { - loader.loadSubScript(url, targetWindow); - } - catch (ex) { - ERROR_LOG("Error while loading script " + url + ":\n" + ex.message + "\n"); + //targetWindow.eval(scriptCode); + throw "not supported"; + } catch (ex) { + oconsole.error(`loadInlineScript: Error with loading script:\n${ex.message}`); } + + targetWindow.addEventListener = oldAddEventListener; + + // This works because we only care about immediately executed addEventListener calls and + // loadSubScript is synchronous. Everyone else should be checking readyState anyway. + return deferredLoad; } diff -Nru enigmail-2.0.12+ds1/package/pEp-nonfunc.jsm enigmail-2.1.3+ds1/package/pEp-nonfunc.jsm --- enigmail-2.0.12+ds1/package/pEp-nonfunc.jsm 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/pEp-nonfunc.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,176 @@ +/* + * 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/. + */ + +/** + * This is a dummy dummy module for pEp + */ + +"use strict"; + +var EXPORTED_SYMBOLS = ["EnigmailpEp"]; + + +var EnigmailpEp = { + + getPepVersion: function() { + return null; + }, + + getPepHomeDir: function() { + return null; + }, + + getConnectionInfo: function() { + return null; + }, + + getGpgEnv: function() { + return null; + }, + + + registerLogHandler: function(logFunction) {}, + + encryptMessage: function(fromAddr, toAddrList, subject, messageObj, pEpMode) { + return null; + }, + + + encryptMimeString: function(mimeStr, pEpMode, encryptFlags = 0) { + return null; + }, + + decryptMessage: function(message, sender, to, cc, replyTo) { + return null; + }, + + + + decryptMimeString: function(mimeStr) { + return null; + }, + + getIdentityRating: function(userId) { + return null; + }, + + setMyself: function(idObject) { + return null; + }, + + updateIdentity: function(idObject) { + return null; + }, + + + getOwnIdentities: function() { + return null; + }, + + + getTrustWords: function(id1, id2, language, longList = false) { + return null; + }, + + + trustIdentity: function(idObject) { + return null; + }, + + + resetIdentityTrust: function(idObject) { + return null; + }, + + mistrustIdentity: function(idObject) { + return null; + }, + + deliverHandshakeResult: function(partnerId, resultValue) { + return null; + }, + + + getLanguageList: function() { + return null; + }, + + + processLanguageList: function(languageStr) { + return null; + }, + + + outgoingMessageRating: function(from, to, message) { + return null; + }, + + blacklistGetKeyList: function() { + return null; + }, + + blacklistAddKey: function(fpr) { + return null; + }, + + blacklistDeleteKey: function(fpr) { + return null; + }, + + + startKeyserverLookup: function() { + return null; + }, + + stopKeyserverLookup: function() { + return null; + }, + + startKeySync: function() { + return null; + }, + + stopKeySync: function() { + return null; + }, + + setPassiveMode: function(isPassive) { + return null; + }, + + shutdown: function() { + return null; + }, + + registerTbListener: function(port, securityToken) { + return null; + }, + + + registerListener: function() { + return null; + }, + + unregisterListener: function(port, securityToken) { + return null; + }, + + parseJSON: function(str) { + return null; + }, + + setServerPath: function(pathName) { + return null; + }, + + setAdapterApiVersion: function(v) { + return null; + }, + + checkAdapterApiLevel: function(requiredVersion) { + return false; + } +}; diff -Nru enigmail-2.0.12+ds1/package/pEp.jsm enigmail-2.1.3+ds1/package/pEp.jsm --- enigmail-2.0.12+ds1/package/pEp.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/pEp.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*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 @@ -28,17 +26,17 @@ var gShuttingDown = false; var gPepAdapterApiVer = "0.0.0"; -const Cu = Components.utils; -const Cc = Components.classes; -const Ci = Components.interfaces; - -Cu.importGlobalProperties(["XMLHttpRequest"]); -Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ -Cu.import("resource://gre/modules/PromiseUtils.jsm"); /* global PromiseUtils: false */ -Cu.import("resource://enigmail/timer.jsm"); /*global EnigmailTimer: false */ -Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ -Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ -Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ + + + + +Components.utils.importGlobalProperties(["XMLHttpRequest"]); +const subprocess = ChromeUtils.import("chrome://enigmail/content/modules/subprocess.jsm").subprocess; +const PromiseUtils = ChromeUtils.import("resource://gre/modules/PromiseUtils.jsm").PromiseUtils; +const EnigmailTimer = ChromeUtils.import("chrome://enigmail/content/modules/timer.jsm").EnigmailTimer; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailOS = ChromeUtils.import("chrome://enigmail/content/modules/os.jsm").EnigmailOS; var gRequestId = 1; var gConnectionInfo = null; diff -Nru enigmail-2.0.12+ds1/package/pEpAdapter.jsm enigmail-2.1.3+ds1/package/pEpAdapter.jsm --- enigmail-2.0.12+ds1/package/pEpAdapter.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/pEpAdapter.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 https://mozilla.org/MPL/2.0/. */ @@ -9,34 +8,30 @@ * Module for interfacing to pEp (Enigmail-specific functions) */ - -const Cu = Components.utils; -const Cc = Components.classes; -const Ci = Components.interfaces; - -Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ -Cu.import("resource://enigmail/pEp.jsm"); /*global EnigmailpEp: false */ -Cu.import("resource://enigmail/pEpListener.jsm"); /*global EnigmailpEpListener: false */ -Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ -Cu.import("resource://enigmail/mime.jsm"); /*global EnigmailMime: false */ -Cu.import("resource://gre/modules/PromiseUtils.jsm"); /* global PromiseUtils: false */ -Cu.import("resource://enigmail/rng.jsm"); /*global EnigmailRNG: false */ -Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ -Cu.import("resource://enigmail/streams.jsm"); /*global EnigmailStreams: false */ -Cu.import("resource://enigmail/addrbook.jsm"); /*global EnigmailAddrbook: false */ -Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ -Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ -Cu.import("resource://enigmail/pEpFilter.jsm"); /*global EnigmailPEPFilter: false */ -Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ -Cu.import("resource://enigmail/installPep.jsm"); /*global EnigmailInstallPep: false */ -Cu.import("resource:///modules/jsmime.jsm"); /*global jsmime: false*/ -Cu.import("resource://enigmail/pEpKeySync.jsm"); /*global EnigmailPEPKeySync: false */ -Cu.import("resource://enigmail/timer.jsm"); /*global EnigmailTimer: false */ -Cu.import("resource://enigmail/filters.jsm"); /*global EnigmailFilters: false */ -Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ -Cu.import("resource://enigmail/app.jsm"); /*global EnigmailApp: false */ +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailpEp = ChromeUtils.import("chrome://enigmail/content/modules/pEp.jsm").EnigmailpEp; +const EnigmailpEpListener = ChromeUtils.import("chrome://enigmail/content/modules/pEpListener.jsm").EnigmailpEpListener; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailOS = ChromeUtils.import("chrome://enigmail/content/modules/os.jsm").EnigmailOS; +const EnigmailMime = ChromeUtils.import("chrome://enigmail/content/modules/mime.jsm").EnigmailMime; +const PromiseUtils = ChromeUtils.import("resource://gre/modules/PromiseUtils.jsm").PromiseUtils; +const EnigmailRNG = ChromeUtils.import("chrome://enigmail/content/modules/rng.jsm").EnigmailRNG; +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; +const EnigmailStreams = ChromeUtils.import("chrome://enigmail/content/modules/streams.jsm").EnigmailStreams; +const EnigmailAddrbook = ChromeUtils.import("chrome://enigmail/content/modules/addrbook.jsm").EnigmailAddrbook; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailFuncs = ChromeUtils.import("chrome://enigmail/content/modules/funcs.jsm").EnigmailFuncs; +const EnigmailPEPFilter = ChromeUtils.import("chrome://enigmail/content/modules/pEpFilter.jsm").EnigmailPEPFilter; +const subprocess = ChromeUtils.import("chrome://enigmail/content/modules/subprocess.jsm").subprocess; +const EnigmailInstallPep = ChromeUtils.import("chrome://enigmail/content/modules/installPep.jsm").EnigmailInstallPep; +const jsmime = ChromeUtils.import("resource:///modules/jsmime.jsm").jsmime; +const EnigmailPEPKeySync = ChromeUtils.import("chrome://enigmail/content/modules/pEpKeySync.jsm").EnigmailPEPKeySync; +const EnigmailTimer = ChromeUtils.import("chrome://enigmail/content/modules/timer.jsm").EnigmailTimer; +const EnigmailFilters = ChromeUtils.import("chrome://enigmail/content/modules/filters.jsm").EnigmailFilters; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailApp = ChromeUtils.import("chrome://enigmail/content/modules/app.jsm").EnigmailApp; +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; const getDialog = EnigmailLazy.loader("enigmail/dialog.jsm", "EnigmailDialog"); const getInstallGnuPG = EnigmailLazy.loader("enigmail/installGnuPG.jsm", "InstallGnuPG"); @@ -139,6 +134,7 @@ * @return: Boolean: true - pEp is available / false - pEp is not usable */ usingPep: function() { + if (EnigmailCompat.isPostbox()) return false; if (!this.getPepJuniorMode()) return false; if ((gPepVersion !== null) && gPepVersion.api.length > 0) { @@ -170,13 +166,25 @@ }, /** + * Reset the status of the pEp adapter, such that it may be checked again + */ + resetPepAvailability: function() { + gPepAvailable = null; + }, + + /** * Determine if the pEp JSON adapter is available at all * - * @param attemptInstall: Boolean - try to install pEp if possible + * @param {Boolean} attemptInstall: try to install pEp if possible * - * @return Boolean - true if pEp is available / false otherwise + * @return {Promise}: true if pEp is available / false otherwise */ - isPepAvailable: function(attemptInstall = true) { + isPepAvailable: async function(attemptInstall = true) { + if (EnigmailCompat.isPostbox()) { + gPepAvailable = false; + return false; + } + if (gPepAvailable === null) { EnigmailLog.DEBUG("pEpAdapter: isPepAvailable()\n"); @@ -223,13 +231,11 @@ EnigmailpEp.setAdapterApiVersion(m[1]); } - } - else { + } else { EnigmailpEp.setAdapterApiVersion("0.10.0"); } - } - else if (attemptInstall) { - this.installPep(); + } else if (attemptInstall) { + return await this.installPep(); } } @@ -240,30 +246,44 @@ /** * try to download and install pEp (runs asynchronously!) * - * @param isManual: Boolean: is installation manually requested + * @param {Boolean} isManual: is installation manually requested + * + * @return {Promise}: pep successfully installed */ installPep: function(isManual = false) { EnigmailLog.DEBUG("pEpAdapter.jsm: installPep()\n"); + if (EnigmailCompat.isPostbox()) { + return new Promise((resolve, reject) => { + reject(-1); + }); + } + gAttemptedInstall = true; let self = this; - let progressListener = { - onError: function(err) { - EnigmailLog.DEBUG("pEpAdapter.jsm: installPep: got error " + err.type + "\n"); - gPepAvailable = false; - }, - onInstalled: function() { - EnigmailLog.DEBUG("pEpAdapter.jsm: installPep: installation completed\n"); - gPepAvailable = null; - self.initialize(); - }, - stopPep: function() { - EnigmailpEp.shutdown(); - } - }; + return new Promise((resolve, reject) => { + let progressListener = { + onError: function(err) { + EnigmailLog.DEBUG("pEpAdapter.jsm: installPep: got error " + err.type + "\n"); + gPepAvailable = false; + resolve(false); + }, + onInstalled: function() { + EnigmailLog.DEBUG("pEpAdapter.jsm: installPep: installation completed\n"); + gPepAvailable = null; - EnigmailInstallPep.startInstaller(progressListener, isManual); + self.initialize().then(r => { + resolve(gPepAvailable); + }); + }, + stopPep: function() { + EnigmailpEp.shutdown(); + } + }; + + EnigmailInstallPep.startInstaller(progressListener, isManual); + }); }, /** @@ -307,6 +327,7 @@ */ getPepJuniorMode: function() { + if (EnigmailCompat.isPostbox()) return false; let mode = EnigmailPrefs.getPref("juniorMode"); if (mode === 0) return false; @@ -385,141 +406,134 @@ */ initialize: function() { EnigmailLog.DEBUG("pEpAdapter.jsm: initialize:\n"); - - let deferred = PromiseUtils.defer(); let self = this; - EnigmailpEp.registerLogHandler(EnigmailLog.DEBUG); + return new Promise((resolve, reject) => { + EnigmailpEp.registerLogHandler(EnigmailLog.DEBUG); - if (gJmObservers === null) { - gJmObservers = {}; - EnigmailPrefs.registerPrefObserver("juniorMode", self.handleJuniorModeChange); - } + if (gJmObservers === null) { + gJmObservers = {}; + EnigmailPrefs.registerPrefObserver("juniorMode", self.handleJuniorModeChange); + } - let pEpMode = EnigmailPrefs.getPref("juniorMode"); - // force using Enigmail (do not use pEp) - if (pEpMode === 0) { - deferred.resolve(); - return deferred.promise; - } + let pEpMode = EnigmailPrefs.getPref("juniorMode"); + // force using Enigmail (do not use pEp) + if (pEpMode === 0) { + resolve(true); + return; + } - // automatic mode, with Crypto enabled (do not use pEp) - if (this.isAccountCryptEnabled() && pEpMode !== 2) { - deferred.resolve(); - return deferred.promise; - } + // automatic mode, with Crypto enabled (do not use pEp) + if (this.isAccountCryptEnabled() && pEpMode !== 2) { + resolve(true); + return; + } - let execFile = this.getPepMiniDesktopAdapterBinaryFile(); - if (execFile) { - EnigmailpEp.setServerPath(execFile.path); - } - else if (pEpMode === 2) { - // if force pEp mode, and pEp not found, try to install it - if (!gAttemptedInstall) this.installPep(); - deferred.resolve(); - return deferred.promise; - } + let execFile = this.getPepMiniDesktopAdapterBinaryFile(); + if (execFile) { + EnigmailpEp.setServerPath(execFile.path); + } else if (pEpMode === 2) { + // if force pEp mode, and pEp not found, try to install it + if (!gAttemptedInstall) this.installPep(); + resolve(true); + return; + } - try { - EnigmailpEp.getPepVersion().then(function _success(data) { - EnigmailLog.DEBUG("pEpAdapter.jsm: initialize: success '" + JSON.stringify(data) + "'\n"); - if (data === null) { - gPepVersion = { - api: "0.10.0", - package: null, - engine: "0.9.0" - }; - } - else if (typeof (data) === "object") { - if ("api_version" in data) { - gPepVersion = { - api: data.api_version, - package: data.package_version, - engine: data.engine_version - }; - } - else { + try { + EnigmailpEp.getPepVersion().then(function _success(data) { + EnigmailLog.DEBUG("pEpAdapter.jsm: initialize: success '" + JSON.stringify(data) + "'\n"); + if (data === null) { gPepVersion = { - api: data.version, - package: data.version, - engine: data.version + api: "0.10.0", + package: null, + engine: "0.9.0" }; + } else if (typeof(data) === "object") { + if ("api_version" in data) { + gPepVersion = { + api: data.api_version, + package: data.package_version, + engine: data.engine_version + }; + } else { + gPepVersion = { + api: data.version, + package: data.version, + engine: data.version + }; + } } - } - if (gPepVersion) { - startListener(); - if (EnigmailPrefs.getPref("autoKeyRetrieve").length > 0) { - EnigmailpEp.startKeyserverLookup(); - } - else { - EnigmailpEp.stopKeyserverLookup(); + if (gPepVersion) { + startListener(); + if (EnigmailPrefs.getPref("autoKeyRetrieve").length > 0) { + EnigmailpEp.startKeyserverLookup(); + } else { + EnigmailpEp.stopKeyserverLookup(); + } + EnigmailpEp.startKeySync(); + self.setupIncomingFilter(); + self.handleJuniorModeChange(); } - EnigmailpEp.startKeySync(); - self.setupIncomingFilter(); - self.handleJuniorModeChange(); - } - - return EnigmailpEp.getGpgEnv(); - }).then(function _gotGpgEnv(gpgEnv) { - EnigmailLog.DEBUG("pEpAdapter.jsm: initialize: got GnuPG env '" + JSON.stringify(gpgEnv) + "'\n"); - let envStr = ""; - if (gpgEnv && typeof gpgEnv === "object" && "gnupg_path" in gpgEnv) { + return EnigmailpEp.getGpgEnv(); + }).then(function _gotGpgEnv(gpgEnv) { + EnigmailLog.DEBUG("pEpAdapter.jsm: initialize: got GnuPG env '" + JSON.stringify(gpgEnv) + "'\n"); - EnigmailLog.DEBUG("pEpAdapter.jsm: initialize: got GnuPG path '" + gpgEnv.gnupg_path + "'\n"); + let envStr = ""; + if (gpgEnv && typeof gpgEnv === "object" && "gnupg_path" in gpgEnv) { - if (typeof (gpgEnv.gpg_agent_info) === "string" && gpgEnv.gpg_agent_info.length > 0) { - envStr += "GPG_AGENT_INFO=" + gpgEnv.gpg_agent_info + "\n"; - } - if (typeof (gpgEnv.gnupg_home) === "string" && gpgEnv.gnupg_home.length > 0) { - envStr += "GNUPGHOME=" + gpgEnv.gnupg_home + "\n"; - } + EnigmailLog.DEBUG("pEpAdapter.jsm: initialize: got GnuPG path '" + gpgEnv.gnupg_path + "'\n"); - let gpgFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); - gpgFile.initWithPath(gpgEnv.gnupg_path); + if (typeof(gpgEnv.gpg_agent_info) === "string" && gpgEnv.gpg_agent_info.length > 0) { + envStr += "GPG_AGENT_INFO=" + gpgEnv.gpg_agent_info + "\n"; + } + if (typeof(gpgEnv.gnupg_home) === "string" && gpgEnv.gnupg_home.length > 0) { + envStr += "GNUPGHOME=" + gpgEnv.gnupg_home + "\n"; + } - if (!gpgFile.exists()) { - // this should not really happen ... - deferred.resolve(); - return; - } + let gpgFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); + gpgFile.initWithPath(gpgEnv.gnupg_path); - let enigmailSvc = EnigmailCore.createInstance(); - enigmailSvc.perferGpgPath(gpgEnv.gnupg_path); - enigmailSvc.overwriteEnvVar(envStr); + if (!gpgFile.exists()) { + // this should not really happen ... + resolve(false); + return; + } - if (enigmailSvc.initialized) { - enigmailSvc.reinitialize(); - } - else { - enigmailSvc.initialize(null, false); + let enigmailSvc = EnigmailCore.createInstance(); + enigmailSvc.perferGpgPath(gpgEnv.gnupg_path); + enigmailSvc.overwriteEnvVar(envStr); + + if (enigmailSvc.initialized) { + enigmailSvc.reinitialize(); + } else { + enigmailSvc.initialize(null, false); + } } - } - - self.setOwnIdentities(0); - deferred.resolve(); - }).catch(function failed(err) { - EnigmailLog.DEBUG("pEpAdapter.jsm: initialize: error during pEp init:\n"); - EnigmailLog.DEBUG(" " + err.code + ": " + ("exception" in err && err.exception ? err.exception.toString() : err.message) + "\n"); - - if (err.code === "GNUPG-UNAVAILABLE") { - // GnuPG not found, try to install it - installMissingGnuPG(); - } - gPepVersion = { - api: "", - package: null, - engine: "" - }; - deferred.resolve(); - }); - } catch (ex) { - deferred.resolve(); - } + self.setOwnIdentities(0); + resolve(false); + }).catch(function failed(err) { + EnigmailLog.DEBUG("pEpAdapter.jsm: initialize: error during pEp init:\n"); + EnigmailLog.DEBUG(" " + err.code + ": " + ("exception" in err && err.exception ? err.exception.toString() : err.message) + "\n"); + + if (err.code === "GNUPG-UNAVAILABLE") { + // GnuPG not found, try to install it + installMissingGnuPG(); + } - return deferred.promise; + gPepVersion = { + api: "", + package: null, + engine: "" + }; + resolve(false); + }); + } catch (ex) { + resolve(false); + } + }); }, setOwnIdentities: function(accountNum) { @@ -565,8 +579,7 @@ function _err(data) { EnigmailLog.DEBUG("pEpAdapter.jsm: setOwnIdentities: ERROR: '" + JSON.stringify(data) + "'\n"); }); - } - else { + } else { EnigmailLog.DEBUG("pEpAdapter.jsm: setOwnIdentities: done.\n"); } }, @@ -611,7 +624,7 @@ */ stripMsgHeadersFromEncryption: function(resObj) { let mimeStr = ""; - if (Array.isArray(resObj) && typeof (resObj[0]) === "string") { + if (Array.isArray(resObj) && typeof(resObj[0]) === "string") { mimeStr = resObj[0]; } @@ -629,8 +642,7 @@ let hdr = n.getNext(); if (hdr.search(/^(from|to|mime-version|subject|message-id)$/i) < 0) { printHdr += hdr + ": " + EnigmailMime.formatHeaderData(headers.extractHeader(hdr, true)) + "\r\n"; - } - else if (hdr.search(/^subject$/i) === 0) { + } else if (hdr.search(/^subject$/i) === 0) { // workaround for encoding bug in jsmime let s = headers.extractHeader(hdr, true); if (s === "pap") { @@ -668,11 +680,10 @@ EnigmailPEPAdapter.pep.outgoingMessageRating(from, to, "test").then(function _step2(res) { EnigmailLog.DEBUG("pEpAdapter.jsm: outgoingMessageRating: SUCCESS\n"); - if ((typeof (res) === "object") && ("result" in res)) { + if ((typeof(res) === "object") && ("result" in res)) { resultObj = res.result.outParams; - } - else - EnigmailLog.DEBUG("pEpAdapter.jsm: outgoingMessageRating: typeof res=" + typeof (res) + "\n"); + } else + EnigmailLog.DEBUG("pEpAdapter.jsm: outgoingMessageRating: typeof res=" + typeof(res) + "\n"); if (inspector && inspector.eventLoopNestLevel > 0) { @@ -763,14 +774,12 @@ if ("name" in emailObj && emailObj.name.length > 0) { p.username = emailObj.name; - } - else { + } else { let addr = EnigmailAddrbook.lookupEmailAddress(p.address); if (addr) { if (addr.card.displayName.length > 0) { p.username = addr.card.displayName; - } - else { + } else { p.username = (addr.card.firstName + " " + addr.card.lastName).trim(); } } @@ -788,7 +797,7 @@ processPGPMIME: function(headerData) { EnigmailLog.DEBUG("pEpAdapter.jsm: processPGPMIME\n"); - // placeholder for pEp-specific actions on PGP/MIME messages + // placeholder for pEp-specific actions on PGP/MIME messages }, /** @@ -846,10 +855,9 @@ let allEmails = ""; - if (typeof (headerData) === "string") { + if (typeof(headerData) === "string") { allEmails = headerData; - } - else { + } else { if ("from" in headerData) { allEmails += headerData.from.headerValue + ","; } @@ -892,15 +900,14 @@ }).then(function _gotIdentityForEmail(data) { if (("result" in data) && typeof data.result === "object" && typeof data.result.outParams[0] === "object") { emailId = data.result.outParams[0]; - } - else { + } else { deferred.reject("cannotFindKey"); } return EnigmailPEPAdapter.pep.getIdentityRating(emailId); }).then(function _gotIdentityRating(data) { - if ("result" in data && Array.isArray(data.result.outParams) && typeof (data.result.outParams[0]) === "object" && + if ("result" in data && Array.isArray(data.result.outParams) && typeof(data.result.outParams[0]) === "object" && "rating" in data.result.outParams[0]) { emailIdRating = data.result.outParams[0]; } @@ -928,8 +935,7 @@ trustWords: trustWords, dialogMode: 0 }); - } - else { + } else { deferred.reject("generalFailure"); } }).catch(function _err(errorMsg) { @@ -998,8 +1004,7 @@ if (data && ("result" in data) && typeof data.result === "object" && typeof data.result.outParams[0] === "object") { identity = data.result.outParams[0]; return EnigmailPEPAdapter.pep.getIdentityRating(identity); - } - else { + } else { let deferred = PromiseUtils.defer(); deferred.resolve({ status: 0 @@ -1008,7 +1013,7 @@ } }).then( function _gotRating(data) { - if ("result" in data && Array.isArray(data.result.outParams) && typeof (data.result.outParams[0]) === "object" && + if ("result" in data && Array.isArray(data.result.outParams) && typeof(data.result.outParams[0]) === "object" && "rating" in data.result.outParams[0]) { rating = data.result.outParams[0].rating; } @@ -1034,17 +1039,13 @@ let color = "grey"; if (rating === -2 || rating === 2) { color = "grey"; - } - else if (rating < 0) { + } else if (rating < 0) { color = "red"; - } - else if (rating < 6) { + } else if (rating < 6) { color = "grey"; - } - else if (rating >= 7) { + } else if (rating >= 7) { color = "green"; - } - else { + } else { color = "yellow"; } @@ -1171,8 +1172,7 @@ if (EnigmailOS.isDosLike) { p = p.replace(/;$/, ""); p += ";" + gpgPath.parent.path + ";"; - } - else { + } else { p += ":" + gpgPath.parent.path; } env.set("PATH", p); diff -Nru enigmail-2.0.12+ds1/package/pEpDecrypt.jsm enigmail-2.1.3+ds1/package/pEpDecrypt.jsm --- enigmail-2.0.12+ds1/package/pEpDecrypt.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/pEpDecrypt.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 https://mozilla.org/MPL/2.0/. */ @@ -10,25 +9,22 @@ */ -const Cu = Components.utils; -const Cc = Components.classes; -const Ci = Components.interfaces; - const COLOR_UNDEF = -471142; -Cu.import("resource://enigmail/pEp.jsm"); /*global EnigmailpEp: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/pEpAdapter.jsm"); /*global EnigmailPEPAdapter: false */ -Cu.import("resource://enigmail/mime.jsm"); /*global EnigmailMime: false */ -Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ -Cu.import("resource://enigmail/mimeVerify.jsm"); /*global EnigmailVerify: false */ -Cu.import("resource://enigmail/uris.jsm"); /*global EnigmailURIs: false */ -Cu.import("resource://enigmail/streams.jsm"); /*global EnigmailStreams: false */ -Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ -Cu.import("resource:///modules/jsmime.jsm"); /*global jsmime: false*/ -Cu.import("resource://enigmail/singletons.jsm"); /*global EnigmailSingletons: false */ -Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ -Cu.import("resource://enigmail/mimeDecrypt.jsm"); /*global EnigmailMimeDecrypt: false */ +const EnigmailpEp = ChromeUtils.import("chrome://enigmail/content/modules/pEp.jsm").EnigmailpEp; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailPEPAdapter = ChromeUtils.import("chrome://enigmail/content/modules/pEpAdapter.jsm").EnigmailPEPAdapter; +const EnigmailMime = ChromeUtils.import("chrome://enigmail/content/modules/mime.jsm").EnigmailMime; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailVerify = ChromeUtils.import("chrome://enigmail/content/modules/mimeVerify.jsm").EnigmailVerify; +const EnigmailURIs = ChromeUtils.import("chrome://enigmail/content/modules/uris.jsm").EnigmailURIs; +const EnigmailStreams = ChromeUtils.import("chrome://enigmail/content/modules/streams.jsm").EnigmailStreams; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const jsmime = ChromeUtils.import("resource:///modules/jsmime.jsm").jsmime; +const EnigmailSingletons = ChromeUtils.import("chrome://enigmail/content/modules/singletons.jsm").EnigmailSingletons; +const EnigmailFuncs = ChromeUtils.import("chrome://enigmail/content/modules/funcs.jsm").EnigmailFuncs; +const EnigmailMimeDecrypt = ChromeUtils.import("chrome://enigmail/content/modules/mimeDecrypt.jsm").EnigmailMimeDecrypt; +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; var EXPORTED_SYMBOLS = ["EnigmailPEPDecrypt"]; @@ -113,54 +109,64 @@ } }, - getEmailsFromMessage: function(url) { - EnigmailLog.DEBUG("pEpDecrypt.jsm: getEmailsFromMessage:\n"); - let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + getEmailAddrFromMessage: function(uri, mimePartNumber) { + EnigmailLog.DEBUG("pEpDecrypt.jsm: getEmailAddrFromMessage:\n"); let addresses = { from: null, to: [], cc: [] }; - let s = EnigmailStreams.newStringStreamListener( - function analyzeData(data) { - EnigmailLog.DEBUG("pEpDecrypt.jsm: getEmailsFromMessage: got " + data.length + " bytes\n"); + if (mimePartNumber === "1") { + // quick version for regular mails + let dbHdr = uri.QueryInterface(Ci.nsIMsgMessageUrl).messageHeader; + if (dbHdr.author) addresses.from = EnigmailFuncs.parseEmails(dbHdr.author)[0]; + if (dbHdr.recipients) addresses.to = EnigmailFuncs.parseEmails(dbHdr.recipients); + if (dbHdr.ccList) addresses.cc = EnigmailFuncs.parseEmails(dbHdr.ccList); + } + else { + // slow version for mixed messages + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + let s = EnigmailStreams.newStringStreamListener( + function analyzeData(data) { + EnigmailLog.DEBUG("pEpDecrypt.jsm: getEmailAddrFromMessage: got " + data.length + " bytes\n"); - let i = data.search(/\n\r?\n/); - if (i < 0) i = data.length; + let i = data.search(/\n\r?\n/); + if (i < 0) i = data.length; - let hdr = Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders); - hdr.initialize(data.substr(0, i)); + let hdr = Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders); + hdr.initialize(data.substr(0, i)); - if (hdr.hasHeader("from")) { - addresses.from = hdr.getHeader("from")[0]; - } - if (hdr.hasHeader("to")) { - addresses.to = hdr.getHeader("to"); - } - if (hdr.hasHeader("cc")) { - addresses.cc = hdr.getHeader("cc"); - } - if (hdr.hasHeader("reply-to")) { - addresses.replyTo = hdr.getHeader("reply-to"); - } + if (hdr.hasHeader("from")) { + addresses.from = hdr.getHeader("from")[0]; + } + if (hdr.hasHeader("to")) { + addresses.to = hdr.getHeader("to"); + } + if (hdr.hasHeader("cc")) { + addresses.cc = hdr.getHeader("cc"); + } + if (hdr.hasHeader("reply-to")) { + addresses.replyTo = hdr.getHeader("reply-to"); + } - if (inspector && inspector.eventLoopNestLevel > 0) { - // unblock the waiting lock - inspector.exitNestedEventLoop(); + if (inspector && inspector.eventLoopNestLevel > 0) { + // unblock the waiting lock + inspector.exitNestedEventLoop(); + } } - } - ); + ); - try { - var channel = EnigmailStreams.createChannel(url); - channel.asyncOpen(s, null); + try { + var channel = EnigmailStreams.createChannel(uri.spec); + channel.asyncOpen(s, null); - // wait here for message parsing to terminate - inspector.enterNestedEventLoop(0); - } - catch (e) { - EnigmailLog.DEBUG("pEpDecrypt.jsm: getEmailsFromMessage: exception " + e + "\n"); + // wait here for message parsing to terminate + inspector.enterNestedEventLoop(0); + } + catch (e) { + EnigmailLog.DEBUG("pEpDecrypt.jsm: getEmailAddrFromMessage: exception " + e + "\n"); + } } return addresses; @@ -180,6 +186,12 @@ this.mimePartNumber = ""; this.requestingSubpart = false; this.ignoreMessage = false; + + if (EnigmailCompat.isMessageUriInPgpMime()) { + this.onDataAvailable = this.onDataAvailable68; + } else { + this.onDataAvailable = this.onDataAvailable60; + } } @@ -189,8 +201,14 @@ EnigmailLog.DEBUG("pEpDecrypt.jsm: onStartRequest\n"); this.mimeSvc = request.QueryInterface(Ci.nsIPgpMimeProxy); this.msgWindow = EnigmailVerify.lastMsgWindow; - if (uri) { - this.uri = uri.QueryInterface(Ci.nsIURI).clone(); + if ("messageURI" in this.mimeSvc) { + this.uri = this.mimeSvc.messageURI; + } + else if (uri) { + this.uri = uri.QueryInterface(Ci.nsIURI); + } + + if (this.uri) { EnigmailLog.DEBUG("pEpDecrypt.jsm: onStartRequest: uri='" + this.uri.spec + "'\n"); this.backgroundJob = (this.uri.spec.search(/[&?]header=(filter|print|quotebody|enigmailConvert)/) >= 0); @@ -211,7 +229,20 @@ } }, - onDataAvailable: function(req, sup, stream, offset, count) { + /** + * onDataAvailable for TB <= 66 + */ + onDataAvailable60: function(req, ctxt, stream, offset, count) { + if (count > 0) { + inStream.init(stream); + this.sourceData += inStream.read(count); + } + }, + + /** + * onDataAvailable for TB >= 68 + */ + onDataAvailable68: function(req, stream, offset, count) { if (count > 0) { inStream.init(stream); this.sourceData += inStream.read(count); @@ -244,7 +275,6 @@ // only display the decrption/verification status if not background-Job this.decryptedHeaders = LAST_MSG.lastPepStatus.decryptedHeaders; this.mimePartNumber = LAST_MSG.lastPepStatus.mimePartNumber; - if (!LAST_MSG.lastPepStatus.dec) { LAST_MSG.lastPepStatus.dec = { persons: {} @@ -269,7 +299,7 @@ let addresses; if (this.uri && (!this.backgroundJob) && (!this.requestingSubpart)) { - addresses = EnigmailPEPDecrypt.getEmailsFromMessage(this.uri.spec); + addresses = EnigmailPEPDecrypt.getEmailAddrFromMessage(this.uri, this.mimePartNumber); } let dec = EnigmailPEPDecrypt.decryptMessageData(true, this.sourceData, addresses, this.contentType); @@ -322,6 +352,9 @@ mimePartNumber: this.mimePartNumber }; } + else { + this.updateHeadersInMsgDb(); + } } if (this.mimePartNumber === "1" && @@ -360,13 +393,14 @@ returnData: function() { if ("outputDecryptedData" in this.mimeSvc) { + // TB >= 57 this.mimeSvc.outputDecryptedData(this.decryptedData, this.decryptedData.length); } else { let gConv = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); gConv.setData(this.decryptedData, this.decryptedData.length); - this.mimeSvc.onDataAvailable(null, null, gConv, 0, this.decryptedData.length); - this.mimeSvc.onStopRequest(null, null, 0); + this.mimeSvc.onDataAvailable(null, gConv, 0, this.decryptedData.length); + this.mimeSvc.onStopRequest(null, 0); } }, @@ -431,6 +465,19 @@ if (r.startPos >= 0 && r.endPos > r.startPos) { this.decryptedData = this.decryptedData.substr(0, r.startPos) + this.decryptedData.substr(r.endPos); } + }, + + updateHeadersInMsgDb: function() { + if (this.mimePartNumber !== "1") return; + if (!this.uri) return; + + if (this.decryptedHeaders && ("subject" in this.decryptedHeaders)) { + try { + let msgDbHdr = this.uri.QueryInterface(Ci.nsIMsgMessageUrl).messageHeader; + msgDbHdr.subject = EnigmailData.convertFromUnicode(this.decryptedHeaders.subject, "utf-8"); + } + catch (x) {} + } } }; diff -Nru enigmail-2.0.12+ds1/package/pEpFilter.jsm enigmail-2.1.3+ds1/package/pEpFilter.jsm --- enigmail-2.0.12+ds1/package/pEpFilter.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/pEpFilter.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 https://mozilla.org/MPL/2.0/. */ @@ -10,17 +9,17 @@ */ -const Cu = Components.utils; -const Cc = Components.classes; -const Ci = Components.interfaces; - -Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ -Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ -Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ -Cu.import("resource://gre/modules/Services.jsm"); /* global Services */ -Cu.import("resource://enigmail/timer.jsm"); /* global EnigmailTimer: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ + + + + +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailFuncs = ChromeUtils.import("chrome://enigmail/content/modules/funcs.jsm").EnigmailFuncs; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; +const Services = ChromeUtils.import("resource://gre/modules/Services.jsm").Services; +const EnigmailTimer = ChromeUtils.import("chrome://enigmail/content/modules/timer.jsm").EnigmailTimer; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; const getPepAdapter = EnigmailLazy.loader("enigmail/pEpAdapter.jsm", "EnigmailPEPAdapter"); diff -Nru enigmail-2.0.12+ds1/package/pEpKeySync.jsm enigmail-2.1.3+ds1/package/pEpKeySync.jsm --- enigmail-2.0.12+ds1/package/pEpKeySync.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/pEpKeySync.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 https://mozilla.org/MPL/2.0/. */ @@ -7,21 +6,21 @@ var EXPORTED_SYMBOLS = ["EnigmailPEPKeySync"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/rng.jsm"); /*global EnigmailRNG: false */ -Cu.import("resource://enigmail/mime.jsm"); /*global EnigmailMime: false */ -Cu.import("resource:///modules/jsmime.jsm"); /*global jsmime: false*/ -Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ -Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/send.jsm"); /*global EnigmailSend: false */ -Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ -Cu.import("resource://enigmail/pEp.jsm"); /*global EnigmailpEp: false */ -Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ -Cu.import("resource://gre/modules/PromiseUtils.jsm"); /* global PromiseUtils: false */ + + + + +const EnigmailRNG = ChromeUtils.import("chrome://enigmail/content/modules/rng.jsm").EnigmailRNG; +const EnigmailMime = ChromeUtils.import("chrome://enigmail/content/modules/mime.jsm").EnigmailMime; +const jsmime = ChromeUtils.import("resource:///modules/jsmime.jsm").jsmime; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailSend = ChromeUtils.import("chrome://enigmail/content/modules/send.jsm").EnigmailSend; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailpEp = ChromeUtils.import("chrome://enigmail/content/modules/pEp.jsm").EnigmailpEp; +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; +const PromiseUtils = ChromeUtils.import("resource://gre/modules/PromiseUtils.jsm").PromiseUtils; const getWindows = EnigmailLazy.loader("enigmail/windows.jsm", "EnigmailWindows"); @@ -142,7 +141,7 @@ ownId: myId, otherId: partnerId }; - win.openDialog("chrome://enigmail/content/pepTrustWords.xul", + win.openDialog("chrome://enigmail/content/ui/pepTrustWords.xul", "", "dialog,modal,centerscreen", inputObj); } catch (ex) { diff -Nru enigmail-2.0.12+ds1/package/pEpListener.jsm enigmail-2.1.3+ds1/package/pEpListener.jsm --- enigmail-2.0.12+ds1/package/pEpListener.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/pEpListener.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*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 @@ -16,16 +14,12 @@ var EXPORTED_SYMBOLS = ["EnigmailpEpListener"]; -const Cu = Components.utils; -const Cc = Components.classes; -const Ci = Components.interfaces; - const MIN_PORT_NUM = 15900; const MAX_PORT_NUM = 15991; -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; const HTTP_OK = "200"; const HTTP_ERR_BAD_REQUEST = "400"; @@ -95,7 +89,7 @@ PepListener.prototype = { - QueryInterface: XPCOMUtils.generateQI([Ci.nsIServerSocketListener]), + QueryInterface: EnigmailCompat.generateQI(["nsIServerSocketListener"]), reader: { self: null, diff -Nru enigmail-2.0.12+ds1/package/passwords.jsm enigmail-2.1.3+ds1/package/passwords.jsm --- enigmail-2.0.12+ds1/package/passwords.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/passwords.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -10,12 +8,12 @@ var EXPORTED_SYMBOLS = ["EnigmailPassword"]; -const Cu = Components.utils; -Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ -Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ -Cu.import("resource://enigmail/subprocess.jsm"); /*global subprocess: false */ + +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const subprocess = ChromeUtils.import("chrome://enigmail/content/modules/subprocess.jsm").subprocess; const gpgAgent = EnigmailLazy.loader("enigmail/gpgAgent.jsm", "EnigmailGpgAgent"); diff -Nru enigmail-2.0.12+ds1/package/persistentCrypto.jsm enigmail-2.1.3+ds1/package/persistentCrypto.jsm --- enigmail-2.0.12+ds1/package/persistentCrypto.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/persistentCrypto.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 @@ -10,41 +9,28 @@ var EXPORTED_SYMBOLS = ["EnigmailPersistentCrypto"]; -const Cu = Components.utils; +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailArmor = ChromeUtils.import("chrome://enigmail/content/modules/armor.jsm").EnigmailArmor; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailExecution = ChromeUtils.import("chrome://enigmail/content/modules/execution.jsm").EnigmailExecution; +const GlodaUtils = ChromeUtils.import("chrome://enigmail/content/modules/glodaUtils.jsm").GlodaUtils; +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailGpg = ChromeUtils.import("chrome://enigmail/content/modules/gpg.jsm").EnigmailGpg; +const EnigmailStreams = ChromeUtils.import("chrome://enigmail/content/modules/streams.jsm").EnigmailStreams; +const EnigmailMime = ChromeUtils.import("chrome://enigmail/content/modules/mime.jsm").EnigmailMime; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailTimer = ChromeUtils.import("chrome://enigmail/content/modules/timer.jsm").EnigmailTimer; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; +const jsmime = ChromeUtils.import("resource:///modules/jsmime.jsm").jsmime; +const EnigmailStdlib = ChromeUtils.import("chrome://enigmail/content/modules/stdlib.jsm").EnigmailStdlib; +const EnigmailEncryption = ChromeUtils.import("chrome://enigmail/content/modules/encryption.jsm").EnigmailEncryption; -Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ -Cu.import("resource://gre/modules/AddonManager.jsm"); /*global AddonManager: false */ -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/armor.jsm"); /*global EnigmailArmor: false */ -Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ -Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ -Cu.import("resource://enigmail/glodaUtils.jsm"); /*global GlodaUtils: false */ -Cu.import("resource:///modules/MailUtils.js"); /*global MailUtils: false */ -Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ -Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ -Cu.import("resource://enigmail/streams.jsm"); /*global EnigmailStreams: false */ -Cu.import("resource://enigmail/passwords.jsm"); /*global EnigmailPassword: false */ -Cu.import("resource://enigmail/mime.jsm"); /*global EnigmailMime: false */ -Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ -Cu.import("resource://enigmail/attachment.jsm"); /*global EnigmailAttachment: false */ -Cu.import("resource://enigmail/timer.jsm"); /*global EnigmailTimer: false */ -Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ -Cu.import("resource:///modules/jsmime.jsm"); /*global jsmime: false*/ -Cu.import("resource://enigmail/stdlib.jsm"); /*global EnigmailStdlib: false*/ -Cu.import("resource://enigmail/encryption.jsm"); /*global EnigmailEncryption: false*/ -Cu.import("resource://gre/modules/NetUtil.jsm"); /*global NetUtil: false*/ - -/*global MimeBody: false, MimeUnknown: false, MimeMessageAttachment: false */ -/*global msgHdrToMimeMessage: false, MimeMessage: false, MimeContainer: false */ -Cu.import("resource://enigmail/glodaMime.jsm"); - -const getGpgAgent = EnigmailLazy.loader("enigmail/gpgAgent.jsm", "EnigmailGpgAgent"); +const getFixExchangeMsg = EnigmailLazy.loader("enigmail/fixExchangeMsg.jsm", "EnigmailFixExchangeMsg"); const getDecryption = EnigmailLazy.loader("enigmail/decryption.jsm", "EnigmailDecryption"); const getDialog = EnigmailLazy.loader("enigmail/dialog.jsm", "EnigmailDialog"); - -const Cc = Components.classes; -const Ci = Components.interfaces; +const getGpgAgent = EnigmailLazy.loader("enigmail/gpgAgent.jsm", "EnigmailGpgAgent"); const STATUS_OK = 0; const STATUS_FAILURE = 1; @@ -89,17 +75,23 @@ dispatchMessages: function(aMsgHdrs, targetFolder, copyListener, move, targetKey) { EnigmailLog.DEBUG("persistentCrypto.jsm: dispatchMessages()\n"); + let enigmailSvc = EnigmailCore.getService(); + if (copyListener && !enigmailSvc) { + // could not initiate Enigmail - do nothing + copyListener.OnStopCopy(0); + return; + } + if (copyListener) { copyListener.OnStartCopy(); } let promise = EnigmailPersistentCrypto.cryptMessage(aMsgHdrs[0], targetFolder, move, targetKey); - var processNext = function(data) { + let processNext = function(data) { aMsgHdrs.splice(0, 1); if (aMsgHdrs.length > 0) { EnigmailPersistentCrypto.dispatchMessages(aMsgHdrs, targetFolder, copyListener, move, targetKey); - } - else { + } else { // last message was finished processing if (copyListener) { copyListener.OnStopCopy(0); @@ -131,19 +123,17 @@ return new Promise( function(resolve, reject) { let msgUriSpec = hdr.folder.getUriForMsg(hdr); - - const msgSvc = Cc["@mozilla.org/messenger;1"].createInstance(Ci.nsIMessenger).messageServiceFromURI(msgUriSpec); + let msgUrl = EnigmailCompat.getUrlFromUriSpec(msgUriSpec); const crypt = new CryptMessageIntoFolder(destFolder, move, resolve, targetKey); try { - msgHdrToMimeMessage(hdr, crypt, crypt.messageParseCallback, true, { - examineEncryptedParts: false, - partsOnDemand: false - }); - } - catch (ex) { - reject("msgHdrToMimeMessage failed"); + EnigmailMime.getMimeTreeFromUrl(msgUrl, true, + function f_(mime) { + crypt.messageParseCallback(mime, hdr); + }); + } catch (ex) { + reject("msgHdrsDeleteoMimeMessage failed: " + ex.toString()); } return; } @@ -156,277 +146,56 @@ this.move = move; this.resolve = resolve; this.targetKey = targetKey; + this.messageDecrypted = false; - this.foundPGP = 0; - this.mime = null; - this.hdr = null; + this.mimeTree = null; this.decryptionTasks = []; this.subject = ""; } CryptMessageIntoFolder.prototype = { - messageParseCallback: function(hdr, mime) { - this.hdr = hdr; - this.mime = mime; - var self = this; + messageParseCallback: async function(mimeTree, msgHdr) { + this.mimeTree = mimeTree; + this.hdr = msgHdr; - try { - if (!mime) { - this.resolve(true); - return; - } - - if (!("content-type" in mime.headers)) { - mime.headers["content-type"] = ["text/plain"]; - } - - var ct = getContentType(getHeaderValue(mime, 'content-type')); - var pt = getProtocol(getHeaderValue(mime, 'content-type')); - - this.subject = GlodaUtils.deMime(getHeaderValue(mime, 'subject')); - - if (!ct) { - this.resolve(true); - return; - } + if (mimeTree.headers.has("subject")) { + this.subject = mimeTree.headers.get("subject"); + } + await this.decryptMimeTree(mimeTree); - this.walkMimeTree(this.mime, this.mime); + let msg = ""; - this.decryptINLINE(this.mime); - if (this.foundPGP < 0) { - // decryption failed + // Encrypt the message if a target key is given. + if (this.targetKey) { + msg = this.encryptToKey(mimeTree); + if (!msg) { + // do nothing (still better than destroying the message) this.resolve(true); return; + } else { + this.messageDecrypted = true; } - - - for (let i in this.mime.allAttachments) { - let a = this.mime.allAttachments[i]; - let suffixIndexEnd = a.name.toLowerCase().lastIndexOf('.pgp'); - if (suffixIndexEnd < 0) { - suffixIndexEnd = a.name.toLowerCase().lastIndexOf('.asc'); - } - - if (suffixIndexEnd > 0 && - a.contentType.search(/application\/pgp-signature/i) < 0) { - - // possible OpenPGP attachment - let p = self.decryptAttachment(a, a.name.substring(0, suffixIndexEnd)); - this.decryptionTasks.push(p); - } - else { - let p = this.readAttachment(a); - this.decryptionTasks.push(p); - } - } - - Promise.all(this.decryptionTasks).then( - function(tasks) { - self.allTasks = tasks; - for (let a in tasks) { - switch (tasks[a].status) { - case STATUS_NOT_REQUIRED: - tasks[a].name = tasks[a].origName; - break; - case STATUS_OK: - ++self.foundPGP; - break; - case STATUS_FAILURE: - // attachment did not decrypt successfully - self.resolve(true); - return; - default: - // no valid result?! - tasks[a].name = tasks[a].origName; - } - } - - if (self.foundPGP === 0 && !self.targetKey) { - self.resolve(true); - return; - } - - // No dest folder. Let's use the same folder. - if (!self.destFolder) { - // We need to use the URI and not the folderURL folderURL - // would work for IMAP but fail for Local Folders. - self.destFolder = hdr.folder.URI; - } - - let rfc822Headers; - if (self.targetKey) { - // If we encrypt we don't want to include all headers - // int the encrypted message. So we only pass - // content headers and store the rest. - rfc822Headers = mime.headers; - var contentHeaders = []; - - contentHeaders["content-type"] = getHeaderValue(self.mime, 'content-type'); - contentHeaders["content-transfer-encoding"] = getHeaderValue(self.mime, 'content-transfer-encoding'); - contentHeaders["content-disposition"] = getHeaderValue(self.mime, 'content-disposition'); - self.mime.headers = contentHeaders; - } - - // Build the new message - let msg = ""; - if (self.foundPGP) { - // A decrypted message - msg = self.mimeToString(self.mime, true); - } - else { - // Not found pgp. Copy the msg for encryption - // we avoid mimeToString as mimeToString is not - // really a direct conversion but has awareness of - // crypto tasks and will not work properly for messages - // that are not encrypted. - EnigmailLog.DEBUG("persistentCrypto.jsm: did not find encryption. Using original.\n"); - var folder = hdr.folder; - var stream = folder.getMsgInputStream(hdr, {}); - - var messageSize = folder.hasMsgOffline(hdr.messageKey) ? hdr.offlineMessageSize : hdr.messageSize; - var scriptInput = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(); - try { - msg = NetUtil.readInputStreamToString(stream, messageSize); - } - catch (ex) { - EnigmailLog.DEBUG("persistentCrypto.jsm: failed to get plain data: " + ex + "\n"); - // Uhm,.. What to do? Ok let's give mimeToString a chance. - msg = self.mimeToString(self.mime, true); - } - stream.close(); - } - - if (!msg || msg === "") { - // no message data found - self.resolve(true); - return; - } - - // Encrypt the message if a target key is given. - if (self.targetKey) { - msg = self.encryptToKey(rfc822Headers, msg); - if (!msg) { - // do nothing (still better than destroying the message) - self.resolve(true); - return; - } - } - - //XXX Do we wanna use the tmp for this? - var tempFile = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("TmpD", Ci.nsIFile); - tempFile.append("message.eml"); - tempFile.createUnique(0, 384); // == 0600, octal is deprecated - - // ensure that file gets deleted on exit, if something goes wrong ... - var extAppLauncher = Cc["@mozilla.org/mime;1"].getService(Ci.nsPIExternalAppLauncher); - - var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream); - foStream.init(tempFile, 2, 0x200, false); // open as "write only" - foStream.write(msg, msg.length); - foStream.close(); - - extAppLauncher.deleteTemporaryFileOnExit(tempFile); - - // - // This was taken from the HeaderToolsLite Example Addon "original by Frank DiLecce" - // - // this is interesting: nsIMsgFolder.copyFileMessage seems to have a bug on Windows, when - // the nsIFile has been already used by foStream (because of Windows lock system?), so we - // must initialize another nsIFile object, pointing to the temporary file - var fileSpec = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); - fileSpec.initWithPath(tempFile.path); - - const copySvc = Cc["@mozilla.org/messenger/messagecopyservice;1"].getService(Ci.nsIMsgCopyService); - - var copyListener = { - QueryInterface: function(iid) { - if (iid.equals(Ci.nsIMsgCopyServiceListener) || iid.equals(Ci.nsISupports)) { - return this; - } - EnigmailLog.DEBUG("persistentCrypto.jsm: copyListener error\n"); - throw Components.results.NS_NOINTERFACE; - }, - GetMessageId: function(messageId) {}, - OnProgress: function(progress, progressMax) {}, - OnStartCopy: function() { - EnigmailLog.DEBUG("persistentCrypto.jsm: copyListener: OnStartCopy()\n"); - }, - SetMessageKey: function(key) { - EnigmailLog.DEBUG("persistentCrypto.jsm: copyListener: SetMessageKey(" + key + ")\n"); - }, - OnStopCopy: function(statusCode) { - EnigmailLog.DEBUG("persistentCrypto.jsm: copyListener: OnStopCopy()\n"); - if (statusCode !== 0) { - EnigmailLog.DEBUG("persistentCrypto.jsm: Error copying message: " + statusCode + "\n"); - try { - tempFile.remove(false); - } - catch (ex) { - try { - fileSpec.remove(false); - } - catch (e2) { - EnigmailLog.DEBUG("persistentCrypto.jsm: Could not delete temp file\n"); - } - } - self.resolve(true); - return; - } - EnigmailLog.DEBUG("persistentCrypto.jsm: Copy complete\n"); - - if (self.move) { - deleteOriginalMail(self.hdr); - } - - try { - tempFile.remove(false); - } - catch (ex) { - try { - fileSpec.remove(false); - } - catch (e2) { - EnigmailLog.DEBUG("persistentCrypto.jsm: Could not delete temp file\n"); - } - } - - EnigmailLog.DEBUG("persistentCrypto.jsm: Cave Johnson. We're done\n"); - self.resolve(true); - } - }; - - EnigmailLog.DEBUG("persistentCrypto.jsm: copySvc ready for copy\n"); - try { - if (self.mime.headers.subject) { - self.hdr.subject = self.mime.headers.subject.join(); - } - } - catch (ex) {} - - copySvc.CopyFileMessage(fileSpec, MailUtils.getFolderForURI(self.destFolder, false), self.hdr, - false, 0, "", copyListener, null); - } - ).catch( - function catchErr(errorMsg) { - EnigmailLog.DEBUG("persistentCrypto.jsm: Promise.catchErr: " + errorMsg + "\n"); - self.resolve(false); - } - ); - - } - catch (ex) { - EnigmailLog.DEBUG("persistentCrypto.jsm: messageParseCallback: caught error " + ex.toString() + "\n"); - self.resolve(false); + } else if (this.messageDecrypted) { + msg = this.mimeToString(mimeTree, true); } + + if (this.messageDecrypted) { + this.resolve(await this.storeMessage(msg)); + } else + this.resolve(true); }, - encryptToKey: function(rfc822Headers, inputMsg) { + encryptToKey: function(mimeTree) { let exitCodeObj = {}; let statusFlagsObj = {}; let errorMsgObj = {}; EnigmailLog.DEBUG("persistentCrypto.jsm: Encrypting message.\n"); + + let inputMsg = this.mimeToString(mimeTree, false); + + let encmsg = ""; try { encmsg = EnigmailEncryption.encryptMessage(null, @@ -440,8 +209,7 @@ statusFlagsObj, errorMsgObj ); - } - catch (ex) { + } catch (ex) { EnigmailLog.DEBUG("persistentCrypto.jsm: Encryption failed: " + ex + "\n"); return null; } @@ -449,6 +217,8 @@ // Build the pgp-encrypted mime structure let msg = ""; + let rfc822Headers = []; // FIXME + // First the original headers for (let header in rfc822Headers) { if (header != "content-type" && @@ -488,176 +258,26 @@ return msg; }, - readAttachment: function(attachment, strippedName) { - return new Promise( - function(resolve, reject) { - EnigmailLog.DEBUG("persistentCrypto.jsm: readAttachment\n"); - let o; - var f = function _cb(data) { - EnigmailLog.DEBUG("persistentCrypto.jsm: readAttachment - got data (" + data.length + ")\n"); - o = { - type: "attachment", - data: data, - name: strippedName ? strippedName : attachment.name, - partName: attachment.partName, - origName: attachment.name, - status: STATUS_NOT_REQUIRED - }; - resolve(o); - }; - - try { - var bufferListener = EnigmailStreams.newStringStreamListener(f); - var ioServ = Cc[IOSERVICE_CONTRACTID].getService(Components.interfaces.nsIIOService); - var msgUri = ioServ.newURI(attachment.url, null, null); - - var channel = EnigmailStreams.createChannelFromURI(msgUri); - channel.asyncOpen(bufferListener, msgUri); - } - catch (ex) { - reject(o); - } - } - ); - }, - - decryptAttachment: function(attachment, strippedName) { - var self = this; - - return new Promise( - function(resolve, reject) { - EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment\n"); - self.readAttachment(attachment, strippedName).then( - function(o) { - var attachmentHead = o.data.substr(0, 30); - 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; - } - var enigmailSvc = EnigmailCore.getService(); - var args = EnigmailGpg.getStandardArgs(true); - args = args.concat(EnigmailPassword.command()); - args.push("-d"); - - var statusMsgObj = {}; - var cmdLineObj = {}; - var exitCode = -1; - var statusFlagsObj = {}; - var errorMsgObj = {}; - statusFlagsObj.value = 0; - - var listener = EnigmailExecution.newSimpleListener( - function _stdin(pipe) { - - // try to get original file name if file does not contain suffix - if (strippedName.indexOf(".") < 0) { - let s = EnigmailAttachment.getFileName(null, o.data); - if (s) o.name = s; - } - - pipe.write(o.data); - pipe.close(); - - } - ); - - do { - var proc = EnigmailExecution.execStart(getGpgAgent().agentPath, args, false, null, listener, statusFlagsObj); - if (!proc) { - resolve(o); - return; - } - // Wait for child STDOUT to close - proc.wait(); - EnigmailExecution.execEnd(listener, statusFlagsObj, statusMsgObj, cmdLineObj, errorMsgObj); - - if ((listener.stdoutData && listener.stdoutData.length > 0) || - (statusFlagsObj.value & EnigmailConstants.DECRYPTION_OKAY)) { - EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment: decryption OK\n"); - exitCode = 0; - } - else if (statusFlagsObj.value & (EnigmailConstants.DECRYPTION_FAILED | EnigmailConstants.MISSING_MDC)) { - EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment: decryption without MDC protection\n"); - exitCode = 0; - } - else if (statusFlagsObj.value & EnigmailConstants.DECRYPTION_FAILED) { - EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment: decryption failed\n"); - // since we cannot find out if the user wants to cancel - // we should ask - let msg = EnigmailLocale.getString("converter.decryptAtt.failed", [attachment.name, self.subject]); - - if (!getDialog().confirmDlg(null, msg, - EnigmailLocale.getString("dlg.button.retry"), EnigmailLocale.getString("dlg.button.skip"))) { - o.status = STATUS_FAILURE; - resolve(o); - return; - } - } - else if (statusFlagsObj.value & EnigmailConstants.DECRYPTION_INCOMPLETE) { - // failure; message not complete - EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment: decryption incomplete\n"); - o.status = STATUS_FAILURE; - resolve(o); - return; - } - else { - // there is nothing to be decrypted - EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment: no decryption required\n"); - o.status = STATUS_NOT_REQUIRED; - resolve(o); - return; - } - - } while (exitCode !== 0); - - - EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment: decrypted to " + listener.stdoutData.length + " bytes\n"); - - o.data = listener.stdoutData; - o.status = STATUS_OK; - - resolve(o); - } - ); - } - ); - }, - - - /* - * The following functions walk the MIME message structure and decrypt if they find something to decrypt + /** + * Walk through the MIME message structure and decrypt the body if there is something to decrypt */ + decryptMimeTree: async function(mimePart) { + EnigmailLog.DEBUG("persistentCrypto.jsm: decryptMimeTree:\n"); - // the sunny world of PGP/MIME - - walkMimeTree: function(mime, parent) { - EnigmailLog.DEBUG("persistentCrypto.jsm: walkMimeTree:\n"); - let ct = getContentType(getHeaderValue(mime, 'content-type')); - - EnigmailLog.DEBUG("persistentCrypto.jsm: walkMimeTree: part=" + mime.partName + " - " + ct + "\n"); - - // assign part name on lowest possible level -> that's where the attachment - // really belongs to - for (let i in mime.allAttachments) { - mime.allAttachments[i].partName = mime.partName; - } - if (this.isPgpMime(mime) || this.isSMime(mime)) { - let p = this.decryptPGPMIME(parent, mime.partName); - this.decryptionTasks.push(p); + if (this.isBrokenByExchange(mimePart)) { + this.fixExchangeMessage(mimePart); } - else if (this.isBrokenByExchange(mime)) { - let p = this.decryptAttachment(mime.parts[0].parts[2], "decrypted.txt"); - mime.isBrokenByExchange = true; - mime.parts[0].parts[2].name = "ignore.txt"; - this.decryptionTasks.push(p); - } - else if (typeof(mime.body) == "string") { - EnigmailLog.DEBUG(" body size: " + mime.body.length + "\n"); + + if (this.isPgpMime(mimePart)) { + this.decryptPGPMIME(mimePart); + } else if (isAttachment(mimePart)) { + this.decryptAttachment(mimePart); + } else { + this.decryptINLINE(mimePart); } - for (var i in mime.parts) { - this.walkMimeTree(mime.parts[i], mime); + for (let i in mimePart.subParts) { + await this.decryptMimeTree(mimePart.subParts[i]); } }, @@ -670,214 +290,252 @@ * - application/octet-stream Attachment with name "encrypted.asc" having the encrypted content in base64 * - see: * - https://www.enigmail.net/forum/viewtopic.php?f=4&t=425 - * - https://sourceforge.net/p/enigmail/forum/support/thread/4add2b69/ + * - https://sourceforge.net/p/enigmail/forum/support/thread/4add2b69/ */ isBrokenByExchange: function(mime) { EnigmailLog.DEBUG("persistentCrypto.jsm: isBrokenByExchange:\n"); try { - if (mime.parts && mime.parts.length && mime.parts.length == 1 && - mime.parts[0].parts && mime.parts[0].parts.length && mime.parts[0].parts.length == 3 && - mime.parts[0].headers["content-type"][0].indexOf("multipart/mixed") >= 0 && - mime.parts[0].parts[0].size === 0 && - mime.parts[0].parts[0].headers["content-type"][0].search(/multipart\/encrypted/i) < 0 && - mime.parts[0].parts[0].headers["content-type"][0].indexOf("text/plain") >= 0 && - mime.parts[0].parts[1].headers["content-type"][0].indexOf("application/pgp-encrypted") >= 0 && - mime.parts[0].parts[1].headers["content-type"][0].search(/multipart\/encrypted/i) < 0 && - mime.parts[0].parts[1].headers["content-type"][0].search(/PGPMIME Versions? Identification/i) >= 0 && - mime.parts[0].parts[2].headers["content-type"][0].indexOf("application/octet-stream") >= 0 && - mime.parts[0].parts[2].headers["content-type"][0].indexOf("encrypted.asc") >= 0) { + if (mime.subParts && mime.subParts.length === 3 && + mime.fullContentType.toLowerCase().indexOf("multipart/mixed") >= 0 && + mime.subParts[0].subParts.length === 0 && + mime.subParts[0].fullContentType.search(/multipart\/encrypted/i) < 0 && + mime.subParts[0].fullContentType.toLowerCase().indexOf("text/plain") >= 0 && + mime.subParts[1].fullContentType.toLowerCase().indexOf("application/pgp-encrypted") >= 0 && + mime.subParts[1].fullContentType.toLowerCase().search(/multipart\/encrypted/i) < 0 && + mime.subParts[1].fullContentType.toLowerCase().search(/PGPMIME Versions? Identification/i) >= 0 && + mime.subParts[2].fullContentType.toLowerCase().indexOf("application/octet-stream") >= 0 && + mime.subParts[2].fullContentType.toLowerCase().indexOf("encrypted.asc") >= 0) { EnigmailLog.DEBUG("persistentCrypto.jsm: isBrokenByExchange: found message broken by MS-Exchange\n"); return true; } - } - catch (ex) {} + } catch (ex) {} return false; }, - isPgpMime: function(mime) { - EnigmailLog.DEBUG("persistentCrypto.jsm: isPgpMime:\n"); - try { - var ct = mime.contentType; - if (!ct) return false; - if (!('content-type' in mime.headers)) return false; - - var pt = getProtocol(getHeaderValue(mime, 'content-type')); - if (!pt) return false; + isPgpMime: function(mimePart) { + EnigmailLog.DEBUG("persistentCrypto.jsm: isPgpMime()\n"); - if (ct.toLowerCase() == "multipart/encrypted" && pt == "application/pgp-encrypted") { - return true; + try { + if (mimePart.headers.has("content-type")) { + if (mimePart.headers.get("content-type").type.toLowerCase() === "multipart/encrypted" && + mimePart.headers.get("content-type").get("protocol").toLowerCase() === "application/pgp-encrypted" && + mimePart.subParts.length === 2) { + return true; + } } - } - catch (ex) { - //EnigmailLog.DEBUG("persistentCrypto.jsm: isPgpMime:"+ex+"\n"); - } + } catch (x) {} return false; }, - // smime-type=enveloped-data - isSMime: function(mime) { - EnigmailLog.DEBUG("persistentCrypto.jsm: isSMime:\n"); - try { - var ct = mime.contentType; - if (!ct) return false; - if (!('content-type' in mime.headers)) return false; + decryptPGPMIME: async function(mimePart) { + EnigmailLog.DEBUG("persistentCrypto.jsm: decryptPGPMIME(" + mimePart.partNum + ")\n"); - var pt = getSMimeProtocol(getHeaderValue(mime, 'content-type')); - if (!pt) return false; + if (!mimePart.subParts[1]) throw "Not a correct PGP/MIME message"; - if (ct.toLowerCase() == "application/pkcs7-mime" && pt == "enveloped-data") { - return true; - } - } - catch (ex) { - EnigmailLog.DEBUG("persistentCrypto.jsm: isSMime:" + ex + "\n"); - } - return false; - }, + const uiFlags = EnigmailConstants.UI_INTERACTIVE | EnigmailConstants.UI_UNVERIFIED_ENC_OK | + EnigmailConstants.UI_IGNORE_MDC_ERROR; + let exitCodeObj = {}; + let statusFlagsObj = {}; + let userIdObj = {}; + let sigDetailsObj = {}; + let errorMsgObj = {}; + let keyIdObj = {}; + let blockSeparationObj = { + value: "" + }; + let encToDetailsObj = {}; + var signatureObj = {}; + signatureObj.value = ""; - decryptPGPMIME: function(mime, part) { - EnigmailLog.DEBUG("persistentCrypto.jsm: decryptPGPMIME: part=" + part + "\n"); - var self = this; + let data = getDecryption().decryptMessage(null, uiFlags, mimePart.subParts[1].body, signatureObj, exitCodeObj, statusFlagsObj, + keyIdObj, userIdObj, sigDetailsObj, errorMsgObj, blockSeparationObj, encToDetailsObj); - return new Promise( - function(resolve, reject) { - var m = Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders); + if (!data || data.length === 0) { + if (statusFlagsObj.value & EnigmailConstants.DISPLAY_MESSAGE) { + getDialog().alert(null, errorMsgObj.value); + throw "Decryption impossible"; + } + } - var messenger = Cc["@mozilla.org/messenger;1"].getService(Ci.nsIMessenger); - let msgSvc = messenger.messageServiceFromURI(self.hdr.folder.getUriForMsg(self.hdr)); - let u = {}; - msgSvc.GetUrlForUri(self.hdr.folder.getUriForMsg(self.hdr), u, null); + EnigmailLog.DEBUG("persistentCrypto.jsm: analyzeDecryptedData: got " + data.length + " bytes\n"); - let op = (u.value.spec.indexOf("?") > 0 ? "&" : "?"); - let url = u.value.spec + op + 'part=' + part + "&header=enigmailConvert"; + if (EnigmailLog.getLogLevel() > 5) { + EnigmailLog.DEBUG("*** start data ***\n'" + data + "'\n***end data***\n"); + } - EnigmailLog.DEBUG("persistentCrypto.jsm: getting data from URL " + url + "\n"); + if (data.length === 0) { + // fail if no data found + return; + } - let s = EnigmailStreams.newStringStreamListener( - function analyzeDecryptedData(data) { - EnigmailLog.DEBUG("persistentCrypto.jsm: analyzeDecryptedData: got " + data.length + " bytes\n"); + let bodyIndex = data.search(/\n\s*\r?\n/); + if (bodyIndex < 0) { + bodyIndex = 0; + } else { + ++bodyIndex; + } - if (EnigmailLog.getLogLevel() > 5) { - EnigmailLog.DEBUG("*** start data ***\n'" + data + "'\n***end data***\n"); - } + if (data.substr(bodyIndex).search(/\r?\n$/) === 0) { + return; + } + let m = Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders); + m.initialize(data.substr(0, bodyIndex)); + let ct = m.extractHeader("content-type", false) || ""; + let part = mimePart.partNum; - let subpart = mime.parts[0]; + if (part.length > 0 && part.search(/[^01.]/) < 0) { + if (ct.search(/protected-headers/i) >= 0) { + if (m.hasHeader("subject")) { + let subject = m.extractHeader("subject", false) || ""; + subject = subject.replace(/^(Re: )+/, "Re: "); + this.mimeTree.headers._rawHeaders.set("subject", [subject]); + } + } else if (this.mimeTree.headers.get("subject") === "p≡p") { + let subject = getPepSubject(data); + if (subject) { + subject = subject.replace(/^(Re: )+/, "Re: "); + this.mimeTree.headers._rawHeaders.set("subject", [subject]); + } + } + } - let o = { - type: "mime", - name: "", - origName: "", - data: "", - partName: part, - status: STATUS_OK - }; - - if (data.length === 0) { - // fail if no data found - o.status = STATUS_FAILURE; - resolve(o); - return; - } + let boundary = getBoundary(mimePart); + if (!boundary) + boundary = EnigmailMime.createBoundary(); + + // append relevant headers + mimePart.headers.get("content-type").type = "multipart/mixed"; + mimePart.headers._rawHeaders.set("content-type", ['multipart/mixed; boundary="' + boundary + '"']); + mimePart.subParts = [{ + body: data, + decryptedPgpMime: true, + partNum: mimePart.partNum + ".1", + headers: { + _rawHeaders: new Map(), + get: function() { + return null; + }, + has: function() { + return false; + } + }, + subParts: [] + }]; - let bodyIndex = data.search(/\n\s*\r?\n/); - if (bodyIndex < 0) { - bodyIndex = 0; - } - else { - ++bodyIndex; - } - if (data.substr(bodyIndex).search(/\r?\n$/) === 0) { - o.status = STATUS_FAILURE; - resolve(o); - return; + this.messageDecrypted = true; + }, - } - m.initialize(data.substr(0, bodyIndex)); - let ct = m.extractHeader("content-type", false) || ""; + decryptAttachment: function(mimePart) { - if (part.length > 0 && part.search(/[^01.]/) < 0) { - if (ct.search(/protected-headers/i) >= 0) { - if (m.hasHeader("subject")) { - let subject = m.extractHeader("subject", false) || ""; - self.mime.headers.subject = [subject]; - } - } - else if (self.mime.headers.subject.join("") === "p≡p") { - let subject = getPepSubject(data); - if (subject) { - self.mime.headers.subject = [subject]; - } - } - } + EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment()\n"); + let attachmentHead = mimePart.body.substr(0, 30); + if (attachmentHead.search(/-----BEGIN PGP \w{5,10} KEY BLOCK-----/) >= 0) { + // attachment appears to be a PGP key file, we just go-a-head + return; + } + + let attachmentName = getAttachmentName(mimePart); + attachmentName = attachmentName ? attachmentName.replace(/\.(pgp|asc|gpg)$/, "") : ""; + + let args = EnigmailGpg.getStandardArgs(true); + args.push("-d"); + + let statusMsgObj = {}; + let cmdLineObj = {}; + let exitCode = -1; + let statusFlagsObj = { + value: 0 + }; + let errorMsgObj = {}; - let boundary = getBoundary(getHeaderValue(mime, 'content-type')); - if (!boundary) boundary = EnigmailMime.createBoundary(); + let listener = EnigmailExecution.newSimpleListener((pipe) => { + pipe.write(mimePart.body); + pipe.close(); + }); - // append relevant headers - mime.headers['content-type'] = "multipart/mixed; boundary=\"" + boundary + "\""; + do { + // loop to allow for multiple tries of the passphrase + let proc = EnigmailExecution.execStart(getGpgAgent().agentPath, args, false, null, listener, statusFlagsObj); + if (!proc) { + return; + } + // Wait for child STDOUT to close + proc.wait(); + EnigmailExecution.execEnd(listener, statusFlagsObj, statusMsgObj, cmdLineObj, errorMsgObj); + + if ((listener.stdoutData && listener.stdoutData.length > 0) || + (statusFlagsObj.value & EnigmailConstants.DECRYPTION_OKAY)) { + EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment: decryption OK\n"); + exitCode = 0; + } else if (statusFlagsObj.value & (EnigmailConstants.DECRYPTION_FAILED | EnigmailConstants.MISSING_MDC)) { + EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment: decryption without MDC protection\n"); + exitCode = 0; + } else if (statusFlagsObj.value & EnigmailConstants.DECRYPTION_FAILED) { + EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment: decryption failed\n"); + // since we cannot find out if the user wants to cancel + // we should ask + let msg = EnigmailLocale.getString("converter.decryptAtt.failed", [attachmentName, this.subject]); + + if (!getDialog().confirmDlg(null, msg, + EnigmailLocale.getString("dlg.button.retry"), EnigmailLocale.getString("dlg.button.skip"))) { + return; + } + } else if (statusFlagsObj.value & EnigmailConstants.DECRYPTION_INCOMPLETE) { + // failure; message not complete + EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment: decryption incomplete\n"); + return; + } else { + // there is nothing to be decrypted + EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment: no decryption required\n"); + return; + } - o.data = "--" + boundary + "\r\n"; - o.data += "Content-Type: " + ct + "\r\n"; + } while (exitCode !== 0); - let h = m.headerNames; - while (h.hasMore()) { - let hdr = h.getNext(); - if (hdr.search(/^content-type$/i) < 0) { - try { - EnigmailLog.DEBUG("persistentCrypto.jsm: getUnstructuredHeader: hdr=" + hdr + "\n"); - let hdrVal = m.getUnstructuredHeader(hdr.toLowerCase()); - o.data += hdr + ": " + hdrVal + "\r\n"; - } - catch (ex) { - try { - let hdrVal = m.getRawHeader(hdr.toLowerCase()); - o.data += hdr + ": " + hdrVal + "\r\n"; - } - catch (ex) { - EnigmailLog.DEBUG("persistentCrypto.jsm: getUnstructuredHeader: exception " + ex.toString() + "\n"); - } - } - } - } - EnigmailLog.DEBUG("persistentCrypto.jsm: getUnstructuredHeader: done\n"); + EnigmailLog.DEBUG("persistentCrypto.jsm: decryptAttachment: decrypted to " + listener.stdoutData.length + " bytes\n"); + if (statusFlagsObj.encryptedFileName && statusFlagsObj.encryptedFileName.length > 0) { + attachmentName = statusFlagsObj.encryptedFileName; + } - o.data += data.substr(bodyIndex); - if (subpart) { - subpart.body = undefined; - subpart.headers['content-type'] = ct; - } + this.decryptedMessage = true; + mimePart.body = listener.stdoutData; + mimePart.headers._rawHeaders.set("content-disposition", `attachment; filename="${attachmentName}"`); + mimePart.headers._rawHeaders.set("content-transfer-encoding", ["base64"]); + let origCt = mimePart.headers.get("content-type"); + let ct = origCt.type; - resolve(o); - } - ); - try { - var channel = EnigmailStreams.createChannel(url); - channel.asyncOpen(s, null); - } - catch (e) { - EnigmailLog.DEBUG("persistentCrypto.jsm: decryptPGPMIME: exception " + e.toString() + "\n"); - } + for (let i of origCt.entries()) { + if (i[0].toLowerCase() === "name") { + i[1] = i[1].replace(/\.(pgp|asc|gpg)$/, ""); } - ); + ct += `; ${i[0]}="${i[1]}"`; + } + + mimePart.headers._rawHeaders.set("content-type", [ct]); }, - //inline wonderland - decryptINLINE: function(mime) { - EnigmailLog.DEBUG("persistentCrypto.jsm: decryptINLINE:\n"); - if (typeof mime.body !== 'undefined') { - let ct = getContentType(getHeaderValue(mime, 'content-type')); - if (ct == "text/html") { - mime.body = this.stripHTMLFromArmoredBlocks(mime.body); + decryptINLINE: function(mimePart) { + EnigmailLog.DEBUG("persistentCrypto.jsm: decryptINLINE()\n"); + + if (("decryptedPgpMime" in mimePart) && mimePart.decryptedPgpMime) { + return 0; + } + + if ("body" in mimePart && mimePart.body.length > 0) { + let ct = getContentType(mimePart); + + if (ct === "text/html") { + mimePart.body = this.stripHTMLFromArmoredBlocks(mimePart.body); } var exitCodeObj = {}; @@ -897,7 +555,7 @@ EnigmailConstants.UI_IGNORE_MDC_ERROR; var plaintexts = []; - var blocks = EnigmailArmor.locateArmoredBlocks(mime.body); + var blocks = EnigmailArmor.locateArmoredBlocks(mimePart.body); var tmp = []; for (let i = 0; i < blocks.length; i++) { @@ -917,7 +575,7 @@ for (let i = 0; i < blocks.length; i++) { let plaintext = null; do { - let ciphertext = mime.body.substring(blocks[i].begin, blocks[i].end + 1); + let ciphertext = mimePart.body.substring(blocks[i].begin, blocks[i].end + 1); if (ciphertext.length === 0) { break; @@ -935,7 +593,7 @@ if (!plaintext || plaintext.length === 0) { if (statusFlagsObj.value & EnigmailConstants.DISPLAY_MESSAGE) { getDialog().alert(null, errorMsgObj.value); - this.foundPGP = -1; + this.messageDecrypted = false; return -1; } @@ -949,27 +607,33 @@ if (!getDialog().confirmDlg(null, msg, EnigmailLocale.getString("dlg.button.retry"), EnigmailLocale.getString("dlg.button.skip"))) { - this.foundPGP = -1; + this.messageDecrypted = false; return -1; } - } - else if (statusFlagsObj.value & EnigmailConstants.DECRYPTION_INCOMPLETE) { - this.foundPGP = -1; + } else if (statusFlagsObj.value & EnigmailConstants.DECRYPTION_INCOMPLETE) { + this.messageDecrypted = false; return -1; + } else { + plaintext = " "; } } - if (ct == "text/html") { + if (ct === "text/html") { plaintext = plaintext.replace(/\n/ig, "
\n"); } - if (i == 0 && this.mime.headers.subject && this.mime.headers.subject[0] === "pEp" && - mime.partName.length > 0 && mime.partName.search(/[^01.]/) < 0) { + let subject = ""; + if (this.mimeTree.headers.has("subject")) { + subject = this.mimeTree.headers.get("subject"); + } + + if (i == 0 && this.mimeTree.headers.subject === "pEp" && + mimePart.partNum.length > 0 && mimePart.partNum.search(/[^01.]/) < 0) { let m = EnigmailMime.extractSubjectFromBody(plaintext); if (m) { plaintext = m.messageBody; - this.mime.headers.subject = [m.subject]; + this.mimeTree.headers._rawHeaders.set("subject", [m.subject]); } } @@ -981,48 +645,34 @@ - var decryptedMessage = mime.body.substring(0, blocks[0].begin) + plaintexts[0]; + var decryptedMessage = mimePart.body.substring(0, blocks[0].begin) + plaintexts[0]; for (let i = 1; i < blocks.length; i++) { - decryptedMessage += mime.body.substring(blocks[i - 1].end + 1, blocks[i].begin + 1) + plaintexts[i]; + decryptedMessage += mimePart.body.substring(blocks[i - 1].end + 1, blocks[i].begin + 1) + plaintexts[i]; } - decryptedMessage += mime.body.substring(blocks[(blocks.length - 1)].end + 1); + decryptedMessage += mimePart.body.substring(blocks[(blocks.length - 1)].end + 1); // enable base64 encoding if non-ASCII character(s) found let j = decryptedMessage.search(/[^\x01-\x7F]/); // eslint-disable-line no-control-regex if (j >= 0) { - mime.headers['content-transfer-encoding'] = ['base64']; - mime.body = EnigmailData.encodeBase64(decryptedMessage); - } - else { - mime.body = decryptedMessage; - mime.headers['content-transfer-encoding'] = ['8bit']; + mimePart.headers._rawHeaders.set('content-transfer-encoding', ['base64']); + } else { + mimePart.headers._rawHeaders.set('content-transfer-encoding', ['8bit']); } + mimePart.body = decryptedMessage; - let origCharset = getCharset(getHeaderValue(mime, 'content-type')); + let origCharset = getCharset(getHeaderValue(mimePart, 'content-type')); if (origCharset) { - mime.headers['content-type'] = getHeaderValue(mime, 'content-type').replace(origCharset, charset); - } - else { - mime.headers['content-type'] = getHeaderValue(mime, 'content-type') + "; charset=" + charset; + mimePart.headers_rawHeaders.set('content-type', getHeaderValue(mimePart, 'content-type').replace(origCharset, charset)); + } else { + mimePart.headers._rawHeaders.set('content-type', getHeaderValue(mimePart, 'content-type') + "; charset=" + charset); } - this.foundPGP = 1; + this.messageDecrypted = true; return 1; } - - - if (typeof mime.parts !== 'undefined' && mime.parts.length > 0) { - var ret = 0; - for (let part in mime.parts) { - ret += this.decryptINLINE(mime.parts[part]); - } - - return ret; - } - - let ct = getContentType(getHeaderValue(mime, 'content-type')); + let ct = getContentType(mimePart); EnigmailLog.DEBUG("persistentCrypto.jsm: Decryption skipped: " + ct + "\n"); return 0; @@ -1060,135 +710,168 @@ * ******/ - mimeToString: function(mime, topLevel) { - EnigmailLog.DEBUG("persistentCrypto.jsm: mimeToString: part: '" + mime.partName + "', is of type '" + typeof(mime) + "'\n"); - - let ct = getContentType(getHeaderValue(mime, 'content-type')); - - if (!ct) { - return ""; - } - - let boundary = getBoundary(getHeaderValue(mime, 'content-type')); + mimeToString: function(mimePart, includeHeaders) { + EnigmailLog.DEBUG("persistentCrypto.jsm: mimeToString: part: '" + mimePart.partNum + "'\n"); let msg = ""; + let rawHdr = mimePart.headers._rawHeaders; - if (mime.isBrokenByExchange) { - EnigmailLog.DEBUG("persistentCrypto.jsm: mimeToString: MS-Exchange fix\n"); - for (let j in this.allTasks) { - if (this.allTasks[j].partName == mime.parts[0].partName) { - - boundary = EnigmailMime.createBoundary(); - - msg += getRfc822Headers(mime.headers, ct, "content-type"); - msg += 'Content-Type: multipart/mixed; boundary="' + boundary + '"\r\n\r\n'; - - msg += "This is a multi-part message in MIME format."; - msg += "\r\n--" + boundary + "\r\n"; - msg += this.allTasks[j].data; - msg += "\r\n--" + boundary + "--\r\n"; - - return msg; - } + if (includeHeaders && rawHdr.size > 0) { + for (let hdr of rawHdr.keys()) { + msg += formatMimeHeader(hdr, rawHdr.get(hdr)) + "\r\n"; } + + msg += "\r\n"; } - else if (mime instanceof MimeMessageAttachment) { - for (let j in this.allTasks) { - if (this.allTasks[j].partName == mime.partName && - this.allTasks[j].origName == mime.name) { - - let a = this.allTasks[j]; - EnigmailLog.DEBUG("persistentCrypto.jsm: mimeToString: attaching " + j + " as '" + a.name + "'\n"); - - for (let header in mime.headers) { - if (!(a.status == STATUS_OK && header == "content-type")) { - msg += prettyPrintHeader(header, mime.headers[header]) + "\r\n"; - } - } - if (a.type == "attachment") { - if (a.status == STATUS_OK) { - msg += "Content-Type: application/octet-stream; name=\"" + a.name + "\"\r\n"; - msg += "Content-Disposition: attachment; filename\"" + a.name + "\"\r\n"; - } + if (mimePart.body.length > 0) { + let encoding = getTransferEncoding(mimePart); + if (!encoding) encoding = "8bit"; - msg += "Content-Transfer-Encoding: base64\r\n\r\n"; - msg += EnigmailData.encodeBase64(a.data) + "\r\n"; + if (encoding === "quoted-printable") { + mimePart.headers._rawHeaders.set("content-transfer-encoding", ["base64"]); + encoding = "base64"; + } - } - } + if (encoding === "base64") { + msg += EnigmailData.encodeBase64(mimePart.body); + } else { + msg += mimePart.body; } + } - else if (mime instanceof MimeContainer || mime instanceof MimeUnknown) { - for (let j in this.allTasks) { - if (this.allTasks[j].partName == mime.partName && - this.allTasks[j].type == "mime") { - let a = this.allTasks[j]; - msg += a.data; - mime.noBottomBoundary = true; + + if (mimePart.subParts.length > 0) { + let boundary = EnigmailMime.getBoundary(rawHdr.get("content-type").join("")); + + for (let i in mimePart.subParts) { + msg += `--${boundary}\r\n`; + msg += this.mimeToString(mimePart.subParts[i], true); + if (msg.search(/[\r\n]$/) < 0) { + msg += "\r\n"; } } + + msg += `--${boundary}--\r\n`; } - else if (mime instanceof MimeMessage && ct.substr(0, 5) == "text/") { - let subct = mime.parts[0].headers['content-type']; - if (subct) { - mime.headers['content-type'] = subct; - } + return msg; + }, - subct = mime.parts[0].headers['content-transfer-encoding']; - if (subct) { - mime.headers['content-transfer-encoding'] = subct; - } + storeMessage: function(msg) { + let self = this; - msg += getRfc822Headers(mime.headers, ct); + return new Promise((resolve, reject) => { + //XXX Do we wanna use the tmp for this? + let tempFile = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("TmpD", Ci.nsIFile); + tempFile.append("message.eml"); + tempFile.createUnique(0, 384); // == 0600, octal is deprecated + + // ensure that file gets deleted on exit, if something goes wrong ... + let extAppLauncher = Cc["@mozilla.org/mime;1"].getService(Ci.nsPIExternalAppLauncher); + + let foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream); + foStream.init(tempFile, 2, 0x200, false); // open as "write only" + foStream.write(msg, msg.length); + foStream.close(); + + extAppLauncher.deleteTemporaryFileOnExit(tempFile); + + // + // This was taken from the HeaderToolsLite Example Addon "original by Frank DiLecce" + // + // this is interesting: nsIMsgFolder.copyFileMessage seems to have a bug on Windows, when + // the nsIFile has been already used by foStream (because of Windows lock system?), so we + // must initialize another nsIFile object, pointing to the temporary file + let fileSpec = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); + fileSpec.initWithPath(tempFile.path); + + const copySvc = Cc["@mozilla.org/messenger/messagecopyservice;1"].getService(Ci.nsIMsgCopyService); + + let copyListener = { + QueryInterface: function(iid) { + if (iid.equals(Ci.nsIMsgCopyServiceListener) || iid.equals(Ci.nsISupports)) { + return this; + } + EnigmailLog.DEBUG("persistentCrypto.jsm: copyListener error\n"); + throw Components.results.NS_NOINTERFACE; + }, + GetMessageId: function(messageId) {}, + OnProgress: function(progress, progressMax) {}, + OnStartCopy: function() { + EnigmailLog.DEBUG("persistentCrypto.jsm: copyListener: OnStartCopy()\n"); + }, + SetMessageKey: function(key) { + EnigmailLog.DEBUG("persistentCrypto.jsm: copyListener: SetMessageKey(" + key + ")\n"); + }, + OnStopCopy: function(statusCode) { + EnigmailLog.DEBUG("persistentCrypto.jsm: copyListener: OnStopCopy()\n"); + if (statusCode !== 0) { + EnigmailLog.DEBUG("persistentCrypto.jsm: Error copying message: " + statusCode + "\n"); + try { + tempFile.remove(false); + } catch (ex) { + try { + fileSpec.remove(false); + } catch (e2) { + EnigmailLog.DEBUG("persistentCrypto.jsm: Could not delete temp file\n"); + } + } + resolve(true); + return; + } + EnigmailLog.DEBUG("persistentCrypto.jsm: Copy complete\n"); - msg += "\r\n" + mime.parts[0].body + "\r\n"; + if (self.move) { + deleteOriginalMail(self.hdr); + } - return msg; - } - else { - if (!topLevel && (mime instanceof MimeMessage)) { - let mimeName = mime.name; - if (!mimeName || mimeName === "") { - mimeName = getHeaderValue(mime, 'subject') + ".eml"; + try { + tempFile.remove(false); + } catch (ex) { + try { + fileSpec.remove(false); + } catch (e2) { + EnigmailLog.DEBUG("persistentCrypto.jsm: Could not delete temp file\n"); + } + } + + EnigmailLog.DEBUG("persistentCrypto.jsm: Cave Johnson. We're done\n"); + resolve(true); } + }; - msg += 'Content-Type: message/rfc822; name="' + EnigmailMime.encodeHeaderValue(mimeName) + '\r\n'; - msg += 'Content-Transfer-Encoding: 7bit\r\n'; - msg += 'Content-Disposition: attachment; filename="' + EnigmailMime.encodeHeaderValue(mimeName) + '"\r\n\r\n'; - } + EnigmailLog.DEBUG("persistentCrypto.jsm: copySvc ready for copy\n"); + try { + if (self.mimeTree.headers.has("subject")) { + self.hdr.subject = self.mimeTree.headers.get("subject"); + } + } catch (ex) {} - msg += getRfc822Headers(mime.headers, ct); + EnigmailCompat.copyFileToMailFolder(fileSpec, EnigmailCompat.getExistingFolder(self.destFolder), + 0, "", copyListener, null); + }); + }, - msg += "\r\n"; + fixExchangeMessage: function(mimePart) { + EnigmailLog.DEBUG("persistentCrypto.jsm: fixExchangeMessage()\n"); - if (mime.body) { - msg += mime.body + "\r\n"; - } - else if ((mime instanceof MimeMessage) && ct.substr(0, 5) != "text/") { - msg += "This is a multi-part message in MIME format.\r\n"; - } - } + const FixEx = getFixExchangeMsg(); - for (let i in mime.parts) { - let subPart = this.mimeToString(mime.parts[i], false); - if (subPart.length > 0) { - if (boundary && !(mime instanceof MimeMessage)) { - msg += "--" + boundary + "\r\n"; - } - msg += subPart + "\r\n"; - } - } + let msg = this.mimeToString(mimePart, true); + let app = FixEx.determineCreatorApp(msg); - if (ct.indexOf("multipart/") === 0 && !(mime instanceof MimeContainer)) { - if (!mime.noBottomBoundary) { - msg += "--" + boundary + "--\r\n"; + try { + let fixedMsg = FixEx.getRepairedMessage(msg); + let replacement = EnigmailMime.getMimeTree(fixedMsg, true); + + for (let i in replacement) { + mimePart[i] = replacement[i]; } - } - return msg; + } catch (ex) {} } }; + /** * Format a mime header * @@ -1202,10 +885,12 @@ } function formatMimeHeader(headerLabel, headerValue) { + if (Array.isArray(headerValue)) { + headerValue = headerValue.join(""); + } if (headerLabel.search(/^(sender|from|reply-to|to|cc|bcc)$/i) === 0) { return formatHeader(headerLabel) + ": " + EnigmailMime.formatHeaderData(EnigmailMime.formatEmailAddress(headerValue)); - } - else { + } else { return formatHeader(headerLabel) + ": " + EnigmailMime.formatHeaderData(EnigmailMime.encodeHeaderValue(headerValue)); } } @@ -1219,8 +904,7 @@ h.push(formatMimeHeader(headerLabel, GlodaUtils.deMime(headerData[i]))); } return h.join("\r\n"); - } - else { + } else { return formatMimeHeader(headerLabel, GlodaUtils.deMime(String(headerData))); } } @@ -1229,19 +913,17 @@ EnigmailLog.DEBUG("persistentCrypto.jsm: getHeaderValue: '" + header + "'\n"); try { - if (header in mimeStruct.headers) { - if (typeof mimeStruct.headers[header] == "string") { - return mimeStruct.headers[header]; - } - else { + if (mimeStruct.headers.has(header)) { + let hdrVal = mimeStruct.headers.get(header); + if (typeof hdrVal == "string") { + return hdrVal; + } else { return mimeStruct.headers[header].join(" "); } - } - else { + } else { return ""; } - } - catch (ex) { + } catch (ex) { EnigmailLog.DEBUG("persistentCrypto.jsm: getHeaderValue: header not present\n"); return ""; } @@ -1279,62 +961,102 @@ return hdrs; } -function getContentType(shdr) { +function getContentType(mime) { try { - shdr = String(shdr); - return shdr.match(/([A-z-]+\/[A-z-]+)/)[1].toLowerCase(); - } - catch (e) { + if (mime && ("headers" in mime) && mime.headers.has("content-type")) { + return mime.headers.get("content-type").type.toLowerCase(); + } + } catch (e) { EnigmailLog.DEBUG("persistentCrypto.jsm: getContentType: " + e + "\n"); - return null; } + return null; } // return the content of the boundary parameter -function getBoundary(shdr) { +function getBoundary(mime) { try { - shdr = String(shdr); - return EnigmailMime.getBoundary(shdr); - } - catch (e) { + if (mime && ("headers" in mime) && mime.headers.has("content-type")) { + return mime.headers.get("content-type").get("boundary"); + } + } catch (e) { EnigmailLog.DEBUG("persistentCrypto.jsm: getBoundary: " + e + "\n"); - return null; } + return null; } -function getCharset(shdr) { +function getCharset(mime) { try { - shdr = String(shdr); - return EnigmailMime.getParameter(shdr, 'charset').toLowerCase(); - } - catch (e) { + if (mime && ("headers" in mime) && mime.headers.has("content-type")) { + let c = mime.headers.get("content-type").get("charset"); + if (c) return c.toLowerCase(); + } + } catch (e) { EnigmailLog.DEBUG("persistentCrypto.jsm: getCharset: " + e + "\n"); - return null; } + return null; } -function getProtocol(shdr) { +function getProtocol(mime) { try { - shdr = String(shdr); - return EnigmailMime.getProtocol(shdr).toLowerCase(); - } - catch (e) { + if (mime && ("headers" in mime) && mime.headers.has("content-type")) { + let c = mime.headers.get("content-type").get("protocol"); + if (c) return c.toLowerCase(); + } + } catch (e) { EnigmailLog.DEBUG("persistentCrypto.jsm: getProtocol: " + e + "\n"); - return ""; } + return ""; } -function getSMimeProtocol(shdr) { +function getTransferEncoding(mime) { try { - shdr = String(shdr); - return shdr.match(/smime-type="?([A-z0-9'()+_,-./:=?]+)"?/)[1].toLowerCase(); + if (mime && ("headers" in mime) && mime.headers._rawHeaders.has("content-transfer-encoding")) { + let c = mime.headers._rawHeaders.get("content-transfer-encoding")[0]; + if (c) return c.toLowerCase(); + } + } catch (e) { + EnigmailLog.DEBUG("persistentCrypto.jsm: getTransferEncoding: " + e + "\n"); } - catch (e) { - EnigmailLog.DEBUG("persistentCrypto.jsm: getSMimeProtocol: " + e + "\n"); - return ""; + return "8Bit"; +} + +function isAttachment(mime) { + try { + if (mime && ("headers" in mime)) { + if (mime.fullContentType.search(/^multipart\//i) === 0) return false; + if (mime.fullContentType.search(/^text\//i) < 0) return true; + + if (mime.headers.has("content-disposition")) { + let c = mime.headers.get("content-disposition")[0]; + if (c) { + if (c.search(/^attachment/i) === 0) { + return true; + } + } + } + } + } catch (x) {} + return false; +} + + +function getAttachmentName(mime) { + try { + if (mime && ("headers" in mime) && mime.headers.has("content-disposition")) { + let c = mime.headers.get("content-disposition")[0]; + if (c) { + if (c.search(/^attachment/i) === 0) { + return EnigmailMime.getParameter(c, "filename"); + } + } + } + } catch (e) { + EnigmailLog.DEBUG("persistentCrypto.jsm: getAttachmentName: " + e + "\n"); } + return null; } + function getPepSubject(mimeString) { EnigmailLog.DEBUG("persistentCrypto.jsm: getPepSubject()\n"); @@ -1354,8 +1076,7 @@ this.firstPlainText = true; } } - } - catch (ex) { + } catch (ex) { this.ct = ""; } }, @@ -1384,8 +1105,7 @@ try { let p = new jsmime.MimeParser(emitter, opt); p.deliverData(mimeString); - } - catch (ex) {} + } catch (ex) {} return subject; } @@ -1400,8 +1120,7 @@ try { EnigmailLog.DEBUG("persistentCrypto.jsm: deleting original message " + msgHdr.messageKey + "\n"); EnigmailStdlib.msgHdrsDelete([msgHdr]); - } - catch (e) { + } catch (e) { EnigmailLog.DEBUG("persistentCrypto.jsm: deletion failed. Error: " + e.toString() + "\n"); } }; diff -Nru enigmail-2.0.12+ds1/package/pgpmimeHandler.jsm enigmail-2.1.3+ds1/package/pgpmimeHandler.jsm --- enigmail-2.0.12+ds1/package/pgpmimeHandler.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/pgpmimeHandler.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 https://mozilla.org/MPL/2.0/. */ @@ -11,11 +10,8 @@ */ const { - classes: Cc, - interfaces: Ci, manager: Cm, results: Cr, - utils: Cu, Constructor: CC } = Components; Cm.QueryInterface(Ci.nsIComponentRegistrar); @@ -23,16 +19,16 @@ var EXPORTED_SYMBOLS = ["EnigmailPgpmimeHander"]; -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ -Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/mimeDecrypt.jsm"); /*global EnigmailMimeDecrypt: false */ -Cu.import("resource://enigmail/mimeVerify.jsm"); /*global EnigmailVerify: false */ -Cu.import("resource://enigmail/wksMimeHandler.jsm"); /*global EnigmailWksMimeHandler: false */ -Cu.import("resource://enigmail/mime.jsm"); /*global EnigmailMime: false */ -Cu.import("resource://enigmail/pEpDecrypt.jsm"); /*global EnigmailPEPDecrypt: false */ -Cu.import("resource://enigmail/pEpAdapter.jsm"); /*global EnigmailPEPAdapter: false */ -Cu.import("resource://enigmail/singletons.jsm"); /*global EnigmailSingletons: false */ +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailMimeDecrypt = ChromeUtils.import("chrome://enigmail/content/modules/mimeDecrypt.jsm").EnigmailMimeDecrypt; +const EnigmailVerify = ChromeUtils.import("chrome://enigmail/content/modules/mimeVerify.jsm").EnigmailVerify; +const EnigmailWksMimeHandler = ChromeUtils.import("chrome://enigmail/content/modules/wksMimeHandler.jsm").EnigmailWksMimeHandler; +const EnigmailMime = ChromeUtils.import("chrome://enigmail/content/modules/mime.jsm").EnigmailMime; +const EnigmailPEPDecrypt = ChromeUtils.import("chrome://enigmail/content/modules/pEpDecrypt.jsm").EnigmailPEPDecrypt; +const EnigmailPEPAdapter = ChromeUtils.import("chrome://enigmail/content/modules/pEpAdapter.jsm").EnigmailPEPAdapter; +const EnigmailSingletons = ChromeUtils.import("chrome://enigmail/content/modules/singletons.jsm").EnigmailSingletons; const PGPMIME_JS_DECRYPTOR_CONTRACTID = "@mozilla.org/mime/pgp-mime-js-decrypt;1"; const PGPMIME_JS_DECRYPTOR_CID = Components.ID("{7514cbeb-2bfd-4b2c-829b-1a4691fa0ac8}"); @@ -73,10 +69,10 @@ } UnknownProtoHandler.prototype = { - onStartRequest: function(request) { + onStartRequest: function(request, ctxt) { this.mimeSvc = request.QueryInterface(Ci.nsIPgpMimeProxy); if (!("outputDecryptedData" in this.mimeSvc)) { - this.mimeSvc.onStartRequest(null, null); + this.mimeSvc.onStartRequest(null, ctxt); } this.bound = EnigmailMime.getBoundary(this.mimeSvc.contentType); /* @@ -88,7 +84,16 @@ this.readMode = 0; }, - onDataAvailable: function(req, sup, stream, offset, count) { + onDataAvailable: function(p1, p2, p3, p4) { + if (EnigmailCompat.isMessageUriInPgpMime()) { + this.processData(p1, p2, p3, p4); + } + else { + this.processData(p1, null, p2, p3, p4); + } + }, + + processData: function (req, stream, offset, count) { if (count > 0) { inStream.init(stream); let data = inStream.read(count); @@ -118,6 +123,7 @@ let out = l.slice(startIndex, endIndex).join("\n") + "\n"; if ("outputDecryptedData" in this.mimeSvc) { + // TB >= 57 this.mimeSvc.outputDecryptedData(out, out.length); } else { @@ -131,7 +137,7 @@ onStopRequest: function() { if (!("outputDecryptedData" in this.mimeSvc)) { - this.mimeSvc.onStopRequest(null, null, 0); + this.mimeSvc.onStopRequest(null, 0); } } }; @@ -146,13 +152,21 @@ classDescription: "Enigmail JS Decryption Handler", classID: PGPMIME_JS_DECRYPTOR_CID, contractID: PGPMIME_JS_DECRYPTOR_CONTRACTID, - QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener]), + QueryInterface: EnigmailCompat.generateQI([Ci.nsIStreamListener]), inStream: Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream), - onStartRequest: function(request, uri) { + onStartRequest: function(request, ctxt) { let mimeSvc = request.QueryInterface(Ci.nsIPgpMimeProxy); let ct = mimeSvc.contentType; + let uri = null; + if ("messageURI" in mimeSvc) { + uri = mimeSvc.messageURI; + } + else { + uri = ctxt; + } + if (!EnigmailCore.getService()) { // Ensure Enigmail is initialized if (ct.search(/application\/(x-)?pkcs7-signature/i) > 0) { @@ -219,15 +233,15 @@ return null; }, - onDataAvailable: function(req, sup, stream, offset, count) {}, + onDataAvailable: function(req, stream, offset, count) {}, - onStopRequest: function(request, win, status) {}, + onStopRequest: function(request, status) {}, handleSmime: function(uri) { this.contentHandler = throwErrors; if (uri) { - uri = uri.QueryInterface(Ci.nsIURI).clone(); + uri = uri.QueryInterface(Ci.nsIURI); } let headerSink = EnigmailSingletons.messageReader; diff -Nru enigmail-2.0.12+ds1/package/prefs/defaultPrefs.js enigmail-2.1.3+ds1/package/prefs/defaultPrefs.js --- enigmail-2.0.12+ds1/package/prefs/defaultPrefs.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/prefs/defaultPrefs.js 2019-10-29 17:09:36.000000000 +0000 @@ -97,7 +97,7 @@ // list of keyservers to use -pref("extensions.enigmail.keyserver", "hkps://keys.openpgp.org, hkps://keys.mailvelope.com, hkps://hkps.pool.sks-keyservers.net"); +pref("extensions.enigmail.keyserver", "vks://keys.openpgp.org, 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); @@ -173,6 +173,9 @@ pref("extensions.enigmail.encryptToNews", false); pref("extensions.enigmail.warnOnSendingNewsgroups", true); +// holds the timestamp of the last check for GnuPG updates +pref("extensions.enigmail.gpgLastUpdate", "0"); + // set locale for GnuPG calls to en-US (Windows only) pref("extensions.enigmail.gpgLocaleEn", true); @@ -180,7 +183,7 @@ // pref("extensions.enigmail.usePGPMimeOption",1); -- OBSOLETE, see mail.identity.default.pgpMimeMode // Use gpg for keyserver operations (vs. Thunderbird) -pref("extensions.enigmail.useGpgKeysTool", true); +pref("extensions.enigmail.useGpgKeysTool", false); // show "conflicting rules" message (and remember selected state) pref("extensions.enigmail.warnOnRulesConflict", 0); @@ -206,7 +209,7 @@ // automatically download pepmda if it is available (without askin user) pref("extensions.enigmail.pEpAutoDownload", true); -// holds the last result of the last check for pEp updates +// holds the timestamp of the last check for pEp updates pref("extensions.enigmail.pEpLastUpdate", 0); // automatically update pEp? @@ -266,7 +269,6 @@ pref("mail.identity.default.pgpSignEncrypted", true); pref("mail.identity.default.defaultSigningPolicy", 0); pref("mail.identity.default.defaultEncryptionPolicy", 0); -pref("mail.identity.default.openPgpHeaderMode", 0); pref("mail.identity.default.openPgpUrlName", ""); pref("mail.identity.default.pgpMimeMode", true); pref("mail.identity.default.attachPgpKey", false); diff -Nru enigmail-2.0.12+ds1/package/prefs.jsm enigmail-2.1.3+ds1/package/prefs.jsm --- enigmail-2.0.12+ds1/package/prefs.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/prefs.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -10,15 +8,15 @@ var EXPORTED_SYMBOLS = ["EnigmailPrefs"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ + + + +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; const { Services -} = Cu.import("resource://gre/modules/Services.jsm"); +} = ChromeUtils.import("resource://gre/modules/Services.jsm"); const ENIGMAIL_PREFS_ROOT = "extensions.enigmail."; @@ -67,21 +65,26 @@ function setDefaultPrefs() { EnigmailLog.DEBUG("prefs.jsm: setDefaultPrefs()\n"); - Services.scriptloader.loadSubScript("resource://enigmail/preferences/defaultPrefs.js", {}, "UTF-8"); + Services.scriptloader.loadSubScript("chrome://enigmail/content/preferences/defaultPrefs.js", {}, "UTF-8"); let branch = p.defaultBranch; for (let key in gPrefs) { - let val = gPrefs[key]; - switch (typeof val) { - case "boolean": - branch.setBoolPref(key, val); - break; - case "number": - branch.setIntPref(key, val); - break; - case "string": - branch.setCharPref(key, val); - break; + try { + let val = gPrefs[key]; + switch (typeof val) { + case "boolean": + branch.setBoolPref(key, val); + break; + case "number": + branch.setIntPref(key, val); + break; + case "string": + branch.setCharPref(key, val); + break; + } + } + catch(ex) { + EnigmailLog.ERROR(`prefs.jsm: setDefaultPrefs(${key}: ERROR ${ex.toString()}\n`); } } } diff -Nru enigmail-2.0.12+ds1/package/protocolHandler.jsm enigmail-2.1.3+ds1/package/protocolHandler.jsm --- enigmail-2.0.12+ds1/package/protocolHandler.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/protocolHandler.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false, EnigmailCore: false, XPCOMUtils: false, EnigmailData: false, EnigmailLog: false */ -/*jshint -W097 */ /* * 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 @@ -10,19 +8,15 @@ var EXPORTED_SYMBOLS = ["EnigmailProtocolHandler"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.import("resource://enigmail/core.jsm"); -Cu.import("resource://enigmail/data.jsm"); -Cu.import("resource://enigmail/log.jsm"); -Cu.import("resource://enigmail/streams.jsm"); /*global EnigmailStreams: false */ -Cu.import("resource://enigmail/uris.jsm"); /*global EnigmailURIs: false */ -Cu.import("resource://enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailStreams = ChromeUtils.import("chrome://enigmail/content/modules/streams.jsm").EnigmailStreams; +const EnigmailURIs = ChromeUtils.import("chrome://enigmail/content/modules/uris.jsm").EnigmailURIs; +const EnigmailKeyRing = ChromeUtils.import("chrome://enigmail/content/modules/keyRing.jsm").EnigmailKeyRing; +const NetUtil = ChromeUtils.import("resource://gre/modules/NetUtil.jsm").NetUtil; -const NS_SIMPLEURI_CONTRACTID = "@mozilla.org/network/simple-uri;1"; const NS_ENIGMAILPROTOCOLHANDLER_CONTRACTID = "@mozilla.org/network/protocol;1?name=enigmail"; const NS_ENIGMAILPROTOCOLHANDLER_CID = Components.ID("{847b3a11-7ab1-11d4-8f02-006008948af5}"); const ASS_CONTRACTID = "@mozilla.org/appshell/appShellService;1"; @@ -50,7 +44,7 @@ nsIProtocolHandler.URI_NOAUTH | nsIProtocolHandler.URI_OPENING_EXECUTES_SCRIPT, - QueryInterface: XPCOMUtils.generateQI([nsIProtocolHandler]), + QueryInterface: EnigmailCompat.generateQI([nsIProtocolHandler]), newURI: function(aSpec, originCharset, aBaseURI) { EnigmailLog.DEBUG("protocolHandler.jsm: EnigmailProtocolHandler.newURI: aSpec='" + aSpec + "'\n"); @@ -58,12 +52,18 @@ // cut of any parameters potentially added to the URI; these cannot be handled if (aSpec.substr(0, 14) == "enigmail:dummy") aSpec = "enigmail:dummy"; - var uri = Cc[NS_SIMPLEURI_CONTRACTID].createInstance(Ci.nsIURI); + let uri; + + try { + uri = Cc["@mozilla.org/network/simple-uri;1"].createInstance(Ci.nsIURI); + } catch (x) { + uri = NetUtil.newURI("data:text/plain,enigmail"); + } + try { // TB <= 58 uri.spec = aSpec; - } - catch (x) { + } catch (x) { aSpec = aSpec.substr(9); let i = aSpec.indexOf("?"); try { @@ -72,18 +72,15 @@ if (i >= 0) { uri.query = aSpec.substr(i + 1); uri.pathQueryRef = aSpec.substr(0, i); - } - else { + } else { uri.pathQueryRef = aSpec; } - } - catch (ex) { + } catch (ex) { uri = uri.mutate().setScheme("enigmail").finalize(); if (i >= 0) { uri = uri.mutate().setQuery(aSpec.substr(i + 1)).finalize(); uri = uri.mutate().setPathQueryRef(aSpec.substr(0, i)).finalize(); - } - else { + } else { uri = uri.mutate().setPathQueryRef(aSpec).finalize(); } } @@ -93,7 +90,7 @@ return uri; }, - newChannel: function(aURI) { + newChannel: function(aURI, loadInfo) { EnigmailLog.DEBUG("protocolHandler.jsm: EnigmailProtocolHandler.newChannel: URI='" + aURI.spec + "'\n"); var messageId = EnigmailData.extractMessageId(aURI.spec); @@ -119,25 +116,24 @@ // do NOT delete the messageUriObj now from the list, this will be done once the message is unloaded (fix for bug 9730). - } - else if (mimeMessageId) { + } else if (mimeMessageId) { this.handleMimeMessage(mimeMessageId); - } - else { + } else { contentType = "text/plain"; contentCharset = ""; contentData = "Enigmail error: invalid URI " + aURI.spec; } - let channel = EnigmailStreams.newStringChannel(aURI, contentType, "UTF-8", contentData); + let channel = EnigmailStreams.newStringChannel(aURI, contentType, "UTF-8", contentData, loadInfo); + return channel; } if (aURI.spec == aURI.scheme + ":dummy") { // Dummy PKCS7 content (to access mimeEncryptedClass) - return EnigmailStreams.newStringChannel(aURI, "message/rfc822", "", gDummyPKCS7); + return EnigmailStreams.newStringChannel(aURI, "message/rfc822", "", gDummyPKCS7, loadInfo); } var winName, spec; @@ -145,25 +141,22 @@ // About Enigmail // winName = "about:"+enigmail; winName = "about:enigmail"; - spec = "chrome://enigmail/content/enigmailAbout.xul"; + spec = "chrome://enigmail/content/ui/enigmailAbout.xul"; - } - else if (aURI.spec == aURI.scheme + ":console") { + } else if (aURI.spec == aURI.scheme + ":console") { // Display enigmail console messages winName = "enigmail:console"; - spec = "chrome://enigmail/content/enigmailConsole.xul"; + spec = "chrome://enigmail/content/ui/enigmailConsole.xul"; - } - else if (aURI.spec == aURI.scheme + ":keygen") { + } else if (aURI.spec == aURI.scheme + ":keygen") { // Display enigmail key generation console winName = "enigmail:keygen"; - spec = "chrome://enigmail/content/enigmailKeygen.xul"; + spec = "chrome://enigmail/content/ui/enigmailKeygen.xul"; - } - else { + } else { // Display Enigmail about page winName = "about:enigmail"; - spec = "chrome://enigmail/content/enigmailAbout.xul"; + spec = "chrome://enigmail/content/ui/enigmailAbout.xul"; } var windowManager = Cc[WMEDIATOR_CONTRACTID].getService(Ci.nsIWindowMediator); @@ -179,8 +172,7 @@ if (recentWin) { recentWin.focus(); - } - else { + } else { var appShellSvc = Cc[ASS_CONTRACTID].getService(Ci.nsIAppShellService); var domWin = appShellSvc.hiddenDOMWindow; diff -Nru enigmail-2.0.12+ds1/package/rng.jsm enigmail-2.1.3+ds1/package/rng.jsm --- enigmail-2.0.12+ds1/package/rng.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/rng.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 @@ -9,22 +8,7 @@ const EXPORTED_SYMBOLS = ["EnigmailRNG"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/openpgp.jsm"); /*global EnigmailOpenPGP: false */ - -const SECURITY_RANDOM_GENERATOR = "@mozilla.org/security/random-generator;1"; - -let crypto = null; - -function getCrypto() { - if (crypto === null) { - crypto = EnigmailOpenPGP.enigmailFuncs.getCrypto(); // get the browser crypto API - } - return crypto; -} +Components.utils.importGlobalProperties(["crypto"]); /** * Create a string of random characters of the set A-Z a-z 0-9 with numChars length, @@ -46,7 +30,7 @@ const charMapLength = charMap.length; // 62 for the set A-Z a-z 0-9 let randNumArray = new Uint16Array(numChars); - getCrypto().getRandomValues(randNumArray); + crypto.getRandomValues(randNumArray); let randomString = ""; @@ -69,7 +53,7 @@ */ function generateRandomUint32() { let randomNumber = new Uint32Array(1); - getCrypto().getRandomValues(randomNumber); + crypto.getRandomValues(randomNumber); return randomNumber[0]; } diff -Nru enigmail-2.0.12+ds1/package/rules.jsm enigmail-2.1.3+ds1/package/rules.jsm --- enigmail-2.0.12+ds1/package/rules.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/rules.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false, EnigmailFuncs: false, EnigmailLog: false, EnigmailOS: false, EnigmailFiles: false, EnigmailApp: false */ -/*jshint -W097 */ /* * 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 @@ -10,24 +8,25 @@ var EXPORTED_SYMBOLS = ["EnigmailRules"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/funcs.jsm"); -Cu.import("resource://enigmail/log.jsm"); -Cu.import("resource://enigmail/os.jsm"); -Cu.import("resource://enigmail/files.jsm"); -Cu.import("resource://enigmail/app.jsm"); -Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ -Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ -Cu.import("resource://enigmail/dialog.jsm"); /*global EnigmailDialog: false */ + +/*EnigmailFuncs: false, : false, : false, : false, : false */ +const EnigmailFuncs = ChromeUtils.import("chrome://enigmail/content/modules/funcs.jsm").EnigmailFuncs; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailOS = ChromeUtils.import("chrome://enigmail/content/modules/os.jsm").EnigmailOS; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailApp = ChromeUtils.import("chrome://enigmail/content/modules/app.jsm").EnigmailApp; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; +const EnigmailDialog = ChromeUtils.import("chrome://enigmail/content/modules/dialog.jsm").EnigmailDialog; +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; + +const getKeyRing = EnigmailLazy.loader("enigmail/keyRing.jsm", "EnigmailKeyRing"); const NS_RDONLY = 0x01; const NS_WRONLY = 0x02; const NS_CREATE_FILE = 0x08; const NS_TRUNCATE = 0x20; -const DEFAULT_FILE_PERMS = 0x180; // equals 0600 +const DEFAULT_FILE_PERMS = 0o600; const rulesListHolder = { rulesList: null @@ -90,16 +89,14 @@ return EnigmailFiles.writeFileContents(rulesFile.path, domSerializer.serializeToString(rulesListHolder.rulesList.firstChild), DEFAULT_FILE_PERMS); - } - else { + } else { // empty rule list -> delete rules file try { rulesFile.remove(false); } catch (ex) {} return true; } - } - else { + } else { return false; } }, @@ -168,8 +165,7 @@ if (origFirstChild && (!appendToEnd)) { rulesListHolder.rulesList.firstChild.insertBefore(rule, origFirstChild); rulesListHolder.rulesList.firstChild.insertBefore(rulesListHolder.rulesList.createTextNode(EnigmailOS.isDosLike ? "\r\n" : "\n"), origFirstChild); - } - else { + } else { rulesListHolder.rulesList.firstChild.appendChild(rule); rulesListHolder.rulesList.firstChild.appendChild(rulesListHolder.rulesList.createTextNode(EnigmailOS.isDosLike ? "\r\n" : "\n")); } @@ -364,7 +360,7 @@ this.mapRuleToKeys(rule, openList, flags, addrKeysList, addrNoKeyList, false); } - // no negate rule handling (turned off in dialog) + // no negate rule handling (turned off in dialog) } catch (ex) { EnigmailLog.DEBUG("rules.jsm: mapAddrsToKeys(): ignore exception: " + ex.description + "\n"); } @@ -392,7 +388,7 @@ this.mapRuleToKeys(rule, openList, flags, addrKeysList, addrNoKeyList, true); } - // no negate rule handling (turned off in dialog) + // no negate rule handling (turned off in dialog) } catch (ex) { EnigmailLog.DEBUG("rules.jsm: mapAddrsToKeys(): ignore exception: " + ex.description + "\n"); } @@ -421,7 +417,7 @@ inputObj.toAddress = "{" + theAddr + "}"; inputObj.options = ""; inputObj.command = "add"; - window.openDialog("chrome://enigmail/content/enigmailSingleRcptSettings.xul", "", + window.openDialog("chrome://enigmail/content/ui/enigmailSingleRcptSettings.xul", "", "dialog,modal,centerscreen,resizable", inputObj, resultObj); if (resultObj.cancelled === true) { return false; @@ -431,7 +427,7 @@ this.mapRuleToKeys(resultObj, openList, flags, addrKeysList, addrNoKeyList, false); } - // no negate rule handling (turned off in dialog) + // no negate rule handling (turned off in dialog) } } } @@ -444,12 +440,11 @@ for (let idx = 1; idx < tmpList.length; ++idx) { if (tmpList[idx].keys) { matchedKeysObj.value += ", " + tmpList[idx].keys; - } - else { + } else { matchedKeysObj.value += ", " + tmpList[idx].addr; } } - // sort key list and make it unique? + // sort key list and make it unique? } // return value of NEW interface: @@ -459,8 +454,7 @@ matchedKeysObj.addrKeysList = addrKeysList; if (openList.length > 0) { matchedKeysObj.addrNoKeyList = addrNoKeyList.concat(openList); - } - else { + } else { matchedKeysObj.addrNoKeyList = addrNoKeyList; } @@ -497,20 +491,20 @@ if (isAutocryptEmail) { idx = ('{' + EnigmailConstants.AC_RULE_PREFIX + addr + '}').indexOf(ruleEmailElem); - } - else { + } else { idx = ('{' + addr + '}').indexOf(ruleEmailElem); } if (idx >= 0) { if (ruleEmailElem == rule.email) { EnigmailLog.DEBUG("rules.jsm: mapRuleToKeys(): for '" + addr + "' ('" + openList[openIndex].orig + "') found matching rule element '" + ruleEmailElem + "'\n"); - } - else { + } else { EnigmailLog.DEBUG("rules.jsm: mapRuleToKeys(): for '" + addr + "' ('" + openList[openIndex].orig + "') found matching rule element '" + ruleEmailElem + "' from '" + rule.email + "'\n"); } + + // process rule: // NOTE: rule.keyId might be: // - keys: => assign keys to all matching emails @@ -523,12 +517,19 @@ // warning (will turn off encryption) acknowledged // => then we only process the flags - // process sign/encrypt/ppgMime settings - flags.sign = this.combineFlagValues(flags.sign, Number(rule.sign)); - flags.encrypt = this.combineFlagValues(flags.encrypt, Number(rule.encrypt)); - flags.pgpMime = this.combineFlagValues(flags.pgpMime, Number(rule.pgpMime)); - if (rule.keyId) { + if (isAutocryptEmail) { + let keyObj = getKeyRing().getKeyById(rule.keyId); + if (keyObj) { + if (!(keyObj.getEncryptionValidity().keyValid)) { + keyObj = null; + deleteAutocryptRule(addr); + } + } + + if (!keyObj) continue; + } + // move found address from openAdresses to corresponding list (with keys added) let elem = openList.splice(openIndex, 1)[0]; --openIndex; // IMPORTANT because we remove element in the array we iterate on @@ -537,12 +538,17 @@ let ids = rule.keyId.replace(/[ ,;]+/g, ", "); elem.keys = ids; addrKeysList.push(elem); - } - else { + } else { // '.': no further rule processing and no key: addr was (finally) processed but without any key addrNoKeyList.push(elem); } } + + // process sign/encrypt/ppgMime settings + flags.sign = this.combineFlagValues(flags.sign, Number(rule.sign)); + flags.encrypt = this.combineFlagValues(flags.encrypt, Number(rule.encrypt)); + flags.pgpMime = this.combineFlagValues(flags.pgpMime, Number(rule.pgpMime)); + } } } @@ -585,6 +591,15 @@ // here, both values are 'maybe', which we return then return EnigmailConstants.ENIG_UNDEF; // maybe } +}; -}; +async function deleteAutocryptRule(emailAddr) { + const EnigmailAutocrypt = ChromeUtils.import("chrome://enigmail/content/modules/autocrypt.jsm").EnigmailAutocrypt; + + await EnigmailAutocrypt.deleteUser(emailAddr, "1"); + // make sure that gossip rule is marked as "imported" + await EnigmailAutocrypt.setKeyImported(null, emailAddr); + // try to apply gossip key + await EnigmailAutocrypt.importAutocryptKeys(emailAddr, true); +} \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/searchCallback.jsm enigmail-2.1.3+ds1/package/searchCallback.jsm --- enigmail-2.0.12+ds1/package/searchCallback.jsm 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/searchCallback.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,70 @@ +/* + * 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"; + +const EXPORTED_SYMBOLS = ["EnigmailSearchCallback"]; + +const EnigmailTimer = ChromeUtils.import("chrome://enigmail/content/modules/timer.jsm").EnigmailTimer; + + +var EnigmailSearchCallback = { + /** + * Set up a callback function on a textbox that tiggers an action. + * If ESC is pressed, the input field is emtpied; return triggers the action immediately. + * + * @param targetObj {XULElement}: the XUL element to observe + * @param timoeoutObj {object}: timeoutObj.value will hold the timeout ID + * @param actionCallback {function}: callback function that is called if something is typed + * @param timeoutMs {number}: delay triggering the function (in miliseconds) + */ + setup: function(targetObj, timeoutObj, actionCallback, timeoutMs = 200) { + + + function applyActionImmediately() { + if (timeoutObj.value) { + EnigmailTimer.clearTimeout(timeoutObj.value); + timeoutObj.value = null; + } + applyAction(); + } + + function applyAction() { + actionCallback(); + } + + timeoutObj.value = null; + + + targetObj.addEventListener('keypress', function onKeyPress(event) { + if (event.type === "keypress") { + if (event.keyCode === 27) { + // Escape key + if (event.target.value !== "") { + event.target.value = ""; + event.preventDefault(); + } + applyActionImmediately(); + + return; + } else if (event.keyCode === 10 || event.keyCode === 13) { + // return key + applyActionImmediately(); + event.preventDefault(); + return; + } + } + + if (!timeoutObj.value) { + timeoutObj.value = EnigmailTimer.setTimeout(function() { + timeoutObj.value = null; + applyAction(); + }, + timeoutMs); + } + }, true); + } +}; \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/send.jsm enigmail-2.1.3+ds1/package/send.jsm --- enigmail-2.0.12+ds1/package/send.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/send.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 @@ -10,17 +9,19 @@ var EXPORTED_SYMBOLS = ["EnigmailSend"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ -Cu.import("resource://enigmail/stdlib.jsm"); /*global EnigmailStdlib: false */ -Cu.import("resource://enigmail/funcs.jsm"); /*global EnigmailFuncs: false */ -Cu.import("resource://gre/modules/Services.jsm"); /*global Services: false */ -Cu.import("resource://enigmail/rng.jsm"); /*global EnigmailRNG: false */ -Cu.import("resource:///modules/mailServices.js"); /*global MailServices: false */ +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailStdlib = ChromeUtils.import("chrome://enigmail/content/modules/stdlib.jsm").EnigmailStdlib; +const EnigmailFuncs = ChromeUtils.import("chrome://enigmail/content/modules/funcs.jsm").EnigmailFuncs; +const Services = ChromeUtils.import("resource://gre/modules/Services.jsm").Services; +const EnigmailRNG = ChromeUtils.import("chrome://enigmail/content/modules/rng.jsm").EnigmailRNG; +var MailServices; +try { + MailServices = ChromeUtils.import("resource:///modules/MailServices.jsm").MailServices; +} +catch (x){ + MailServices = ChromeUtils.import("resource:///modules/mailServices.js").MailServices; +} var EnigmailSend = { /** @@ -39,7 +40,7 @@ try { tmpFile = EnigmailFiles.getTempDirObj(); tmpFile.append("message.eml"); - tmpFile.createUnique(0, 384); // == 0600, octal is deprecated + tmpFile.createUnique(0, 0o600); } catch (ex) { return false; @@ -94,7 +95,7 @@ * - returnReceipt (optional) Boolean: ask for a receipt * - receiptType (optional) Number: default: take from identity * - requestDsn (optional) Boolean: request a Delivery Status Notification - * - securityInfo (optional) + * - composeSecure (optional) (contains securityInfo for TB < 64) * * @param body: complete message source * @param callbackFunc: function(Boolean) - return true if message was sent successfully @@ -115,7 +116,14 @@ fields.returnReceipt = ("returnReceipt" in aParams) ? aParams.returnReceipt : identity.requestReturnReceipt; fields.receiptHeaderType = ("receiptType" in aParams) ? aParams.receiptType : identity.receiptHeaderType; fields.DSN = ("requestDsn" in aParams) ? aParams.requestDsn : identity.requestDSN; - if ("securityInfo" in aParams) fields.securityInfo = aParams.securityInfo; + if ("composeSecure" in aParams) { + if ("securityInfo" in fields) { + // TB < 64 + fields.securityInfo = aParams.securityInfo; + } + else + fields.composeSecure = aParams.composeSecure; + } fields.messageId = EnigmailRNG.generateRandomString(27) + "-enigmail"; body = "Message-Id: " + fields.messageId + "\r\n" + body; diff -Nru enigmail-2.0.12+ds1/package/singletons.jsm enigmail-2.1.3+ds1/package/singletons.jsm --- enigmail-2.0.12+ds1/package/singletons.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/singletons.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -11,7 +11,7 @@ // handle to most recent message reader window messageReader: null, - // information about the last PGP/MIME decrpyted message (pEp and mimeDecrypt) + // information about the last PGP/MIME decrypted message (pEp and mimeDecrypt) lastDecryptedMessage: {}, clearLastDecryptedMessage: function() { diff -Nru enigmail-2.0.12+ds1/package/socks5Proxy.jsm enigmail-2.1.3+ds1/package/socks5Proxy.jsm --- enigmail-2.0.12+ds1/package/socks5Proxy.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/socks5Proxy.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 @@ -10,13 +9,10 @@ const EXPORTED_SYMBOLS = ["EnigmailSocks5Proxy"]; const CC = Components.Constructor; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils:false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false*/ -Cu.import("resource://enigmail/lazy.jsm"); /*global EnigmailLazy: false */ + +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; const getEnigmailPrefs = EnigmailLazy.loader("enigmail/prefs.jsm", "EnigmailPrefs"); const CHECK_TOR_URI = "https://check.torproject.org/api/ip"; @@ -42,17 +38,27 @@ function buildListener(hasFoundTor, isDoneChecking) { EnigmailLog.DEBUG("socks5proxy.jsm: buildListener()\n"); - const listener = { - onStartRequest: function(request, context) {}, - onStopRequest: function(request, context, statusCode) { + let listener = { + onStartRequest: function(request) {}, + onStopRequest: function(request, statusCode) { isDoneChecking(); }, - onDataAvailable: function(request, context, inputStream, offset, count) { + QueryInterface: EnigmailCompat.generateQI(["nsIRequestObserver", "nsIStreamListener"]) + }; + + if (EnigmailCompat.isMessageUriInPgpMime()) { + // TB >= 67 + listener.onDataAvailable = function(request, inputStream, offset, count) { const response = createScriptableInputStream(inputStream).read(count); hasFoundTor(response.indexOf(EXPECTED_TOR_EXISTS_RESPONSE) !== -1); - }, - QueryInterface: XPCOMUtils.generateQI([Ci.nsIRequestObserver, Ci.nsIStreamListener]) - }; + }; + } else { + listener.onDataAvailable = function(request, ctxt, inputStream, offset, count) { + const response = createScriptableInputStream(inputStream).read(count); + hasFoundTor(response.indexOf(EXPECTED_TOR_EXISTS_RESPONSE) !== -1); + }; + } + return listener; } @@ -69,7 +75,7 @@ applyFilter: function(proxyService, uri, proxyInfo) { return proxyService.newProxyInfo("socks", getEnigmailPrefs().getPref(TOR_IP_ADDR_PREF), port, CONNECTION_FLAGS, SECONDS_TO_WAIT_FOR_CONNECTION, failoverProxy); }, - QueryInterface: XPCOMUtils.generateQI([Ci.nsIProtocolProxyFilter]) + QueryInterface: EnigmailCompat.generateQI(["nsIProtocolProxyFilter"]) }; } diff -Nru enigmail-2.0.12+ds1/package/sqliteDb.jsm enigmail-2.1.3+ds1/package/sqliteDb.jsm --- enigmail-2.0.12+ds1/package/sqliteDb.jsm 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/sqliteDb.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,193 @@ +/* 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"; + +/** + * Module that provides generic functions for the Enigmail SQLite database + */ + +var EXPORTED_SYMBOLS = ["EnigmailSqliteDb"]; + + + +const Cr = Components.results; + + +const Sqlite = ChromeUtils.import("resource://gre/modules/Sqlite.jsm").Sqlite; +const EnigmailTimer = ChromeUtils.import("chrome://enigmail/content/modules/timer.jsm").EnigmailTimer; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; + + +var EnigmailSqliteDb = { + /** + * Provide an sqlite conection object asynchronously, retrying if needed + * + * @return {Promise}: the Sqlite database object + */ + + openDatabase: function() { + EnigmailLog.DEBUG("sqliteDb.jsm: openDatabase()\n"); + return new Promise((resolve, reject) => { + openDatabaseConn(resolve, reject, 100, Date.now() + 10000); + }); + }, + + checkDatabaseStructure: async function() { + EnigmailLog.DEBUG(`sqliteDb.jsm: checkDatabaseStructure()\n`); + let conn; + try { + conn = await this.openDatabase(); + await checkAutocryptTable(conn); + await checkWkdTable(conn); + conn.close(); + EnigmailLog.DEBUG(`sqliteDb.jsm: checkDatabaseStructure - success\n`); + } + catch (ex) { + EnigmailLog.ERROR(`sqliteDb.jsm: checkDatabaseStructure: ERROR: ${ex}\n`); + if (conn) { + conn.close(); + } + } + } +}; + + +/** + * use a promise to open the Enigmail database. + * + * it's possible that there will be an NS_ERROR_STORAGE_BUSY + * so we're willing to retry for a little while. + * + * @param {function} resolve: function to call when promise succeeds + * @param {function} reject: function to call when promise fails + * @param {Number} waitms: Integer - number of milliseconds to wait before trying again in case of NS_ERROR_STORAGE_BUSY + * @param {Number} maxtime: Integer - unix epoch (in milliseconds) of the point at which we should give up. + */ +function openDatabaseConn(resolve, reject, waitms, maxtime) { + EnigmailLog.DEBUG("sqliteDb.jsm: openDatabaseConn()\n"); + Sqlite.openConnection({ + path: "enigmail.sqlite", + sharedMemoryCache: false + }). + then(connection => { + resolve(connection); + }). + catch(error => { + let now = Date.now(); + if (now > maxtime) { + reject(error); + return; + } + EnigmailTimer.setTimeout(function() { + openDatabaseConn(resolve, reject, waitms, maxtime); + }, waitms); + }); +} + + +/** + * Ensure that the database structure matches the latest version + * (table is available) + * + * @param connection: Object - SQLite connection + * + * @return {Promise} + */ +async function checkAutocryptTable(connection) { + try { + let exists = await connection.tableExists("autocrypt_keydata"); + EnigmailLog.DEBUG("sqliteDB.jsm: checkAutocryptTable - success\n"); + if (!exists) { + await createAutocryptTable(connection); + } + else { + let hasKeyRingInserted = false; + await connection.execute("pragma table_info('autocrypt_keydata');", {}, + function _onRow(row) { + let colname = row.getResultByName("name"); + if (colname === "keyring_inserted") hasKeyRingInserted = true; + }); + if (hasKeyRingInserted) return true; + + await connection.execute("alter table autocrypt_keydata add keyring_inserted text default '0';", {}, + function _onRow(row) {}); + let EnigmailAutocrypt = ChromeUtils.import("chrome://enigmail/content/modules/autocrypt.jsm").EnigmailAutocrypt; + EnigmailAutocrypt.updateAllImportedKeys(); + } + } + catch (error) { + EnigmailLog.DEBUG(`sqliteDB.jsm: checkAutocryptTable - error ${error}\n`); + throw error; + } + + return true; +} +/** + * Create the "autocrypt_keydata" table and the corresponding index + * + * @param connection: Object - SQLite connection + * + * @return {Promise} + */ +async function createAutocryptTable(connection) { + EnigmailLog.DEBUG("sqliteDB.jsm: createAutocryptTable()\n"); + + await connection.execute("create table autocrypt_keydata (" + + "email text not null, " + // email address of correspondent + "keydata text not null, " + // base64-encoded key as received + "fpr text, " + // fingerprint of key + "type text not null, " + // key type (1==OpenPGP, regular key. 1g == OpenPGP gossip) + "last_seen_autocrypt text, " + + "last_seen text not null, " + + "state text not null," + // timestamp of last mail received for the email/type combination + "keyring_inserted text default '0');" + ); + + EnigmailLog.DEBUG("sqliteDB.jsm: createAutocryptTable - index\n"); + await connection.execute("create unique index autocrypt_keydata_i1 on autocrypt_keydata(email, type)"); + + return null; +} + + + +/** + * Ensure that the database has the wkd_lookup_timestamp table. + * + * @param connection: Object - SQLite connection + * + * @return Promise + */ +async function checkWkdTable(connection) { + EnigmailLog.DEBUG("sqliteDB.jsm: checkWkdTable()\n"); + + try { + let exists = await connection.tableExists("wkd_lookup_timestamp"); + EnigmailLog.DEBUG("sqliteDB.jsm: checkWkdTable - success\n"); + if (!exists) { + await createWkdTable(connection); + } + } + catch (error) { + EnigmailLog.DEBUG("sqliteDB.jsm: checkWkdTable - error\n"); + throw (error); + } +} + +/** + * Create the "wkd_lookup_timestamp" table. + * + * @param connection: Object - SQLite connection + * + * @return Promise + */ +function createWkdTable(connection) { + EnigmailLog.DEBUG("sqliteDB.jsm: createWkdTable()\n"); + + return connection.execute( + "create table wkd_lookup_timestamp (" + + "email text not null primary key, " + // email address of correspondent + "last_seen integer);"); // timestamp of last mail received for the email/type combination +} diff -Nru enigmail-2.0.12+ds1/package/stdlib.jsm enigmail-2.1.3+ds1/package/stdlib.jsm --- enigmail-2.0.12+ds1/package/stdlib.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/stdlib.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 @@ -14,30 +13,69 @@ var EXPORTED_SYMBOLS = ["EnigmailStdlib"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/stdlib/compose.jsm"); -/* global composeInIframe: false, getEditorForIframe, - quoteMsgHdr: false, citeString, htmlToPlainText: false, simpleWrap, plainTextToHtml: false, replyAllParams, - determineComposeHtml: false, composeMessageTo, getSignatureContentsForAccount: false */ -Cu.import("resource://enigmail/stdlib/misc.jsm"); -/* global gIdentities: false, fillIdentities: false, getIdentities: false, getDefaultIdentity: false, getIdentityForEmail, - range: false, MixIn: false, combine: false, entries, NS_FAILED: false, NS_SUCCEEDED, dateAsInMessageList: false, escapeHtml: false, sanitize: false, parseMimeLine, - encodeUrlParameters: false, decodeUrlParameters, systemCharset, isOSX: false, isWindows: false, isAccel: false - hasConfiguredAccounts: false */ -Cu.import("resource://enigmail/stdlib/msgHdrUtils.jsm"); -/* global msgHdrToMessageBody: false, msgHdrToNeckoURL: false, msgHdrGetTags: false, msgUriToMsgHdr, - msgHdrGetUri: false, msgHdrFromNeckoUrl: false, msgHdrSetTags: false, msgHdrIsDraft: false, msgHdrIsSent: false, msgHdrIsArchive: false, msgHdrIsInbox: false, - msgHdrIsRss: false, msgHdrIsNntp: false, msgHdrIsJunk: false, msgHdrsMarkAsRead: false, msgHdrsArchive: false, msgHdrsDelete, - getMail3Pane: false, msgHdrGetHeaders: false, msgHdrsModifyRaw */ +const { + composeInIframe, + getEditorForIframe, + citeString, + htmlToPlainText, + simpleWrap, + plainTextToHtml, + replyAllParams, + determineComposeHtml, + composeMessageTo, + getSignatureContentsForAccount +} = ChromeUtils.import("chrome://enigmail/content/modules/stdlib/compose.jsm"); + +const { + gIdentities, + fillIdentities, + getIdentities, + getDefaultIdentity, + getIdentityForEmail, + hasConfiguredAccounts, + range, + MixIn, + combine, + entries, + dateAsInMessageList, + escapeHtml, + sanitize, + parseMimeLine, + encodeUrlParameters, + decodeUrlParameters, + systemCharset, + isOSX, + isWindows, + isAccel +} = ChromeUtils.import("chrome://enigmail/content/modules/stdlib/misc.jsm"); + +const { + msgHdrToMessageBody, + msgHdrToNeckoURL, + msgHdrGetTags, + msgUriToMsgHdr, + msgHdrGetUri, + msgHdrFromNeckoUrl, + msgHdrSetTags, + msgHdrIsDraft, + msgHdrIsSent, + msgHdrIsArchive, + msgHdrIsInbox, + msgHdrIsRss, + msgHdrIsNntp, + msgHdrIsJunk, + msgHdrsMarkAsRead, + msgHdrsArchive, + msgHdrsDelete, + getMail3Pane, + msgHdrGetHeaders, + msgHdrsModifyRaw +} = ChromeUtils.import("chrome://enigmail/content/modules/stdlib/msgHdrUtils.jsm"); var EnigmailStdlib = { // compose.jsm 'composeInIframe': composeInIframe, 'getEditorForIframe': getEditorForIframe, - 'quoteMsgHdr': quoteMsgHdr, 'citeString': citeString, 'htmlToPlainText': htmlToPlainText, 'simpleWrap': simpleWrap, @@ -58,8 +96,6 @@ 'MixIn': MixIn, 'combine': combine, 'entries': entries, - 'NS_FAILED': NS_FAILED, - 'NS_SUCCEEDED': NS_SUCCEEDED, 'dateAsInMessageList': dateAsInMessageList, 'escapeHtml': escapeHtml, 'sanitize': sanitize, @@ -92,4 +128,4 @@ 'getMail3Pane': getMail3Pane, 'msgHdrGetHeaders': msgHdrGetHeaders, 'msgHdrsModifyRaw': msgHdrsModifyRaw -}; +}; \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/streams.jsm enigmail-2.1.3+ds1/package/streams.jsm --- enigmail-2.0.12+ds1/package/streams.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/streams.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -10,14 +8,11 @@ var EXPORTED_SYMBOLS = ["EnigmailStreams"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -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 EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailTimer = ChromeUtils.import("chrome://enigmail/content/modules/timer.jsm").EnigmailTimer; +const Services = ChromeUtils.import("resource://gre/modules/Services.jsm").Services; +const NetUtil = ChromeUtils.import("resource://gre/modules/NetUtil.jsm").NetUtil; 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"; @@ -26,49 +21,22 @@ var EnigmailStreams = { /** - * Create a new channel from a URL. + * Create a new channel from a URL or URI. * - * @param url: String - URL specification + * @param url: String, nsIURI or nsIFile - URL specification * * @return: channel */ createChannel: function(url) { - let ioServ = Cc[IOSERVICE_CONTRACTID].getService(Ci.nsIIOService); + let c = NetUtil.newChannel({ + uri: url, + loadUsingSystemPrincipal: true + }); - 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; + return c; }, - /** - * Create a new channel from a URI. - * - * @param uri: Object - nsIURI - * - * @return: channel - */ - createChannelFromURI: function(uri) { - let ioServ = Cc[IOSERVICE_CONTRACTID].getService(Ci.nsIIOService); - let channel; - if ("newChannelFromURI2" in ioServ) { - // TB >= 48 - let loadingPrincipal = Services.scriptSecurityManager.getSystemPrincipal(); - channel = ioServ.newChannelFromURI2(uri, null, loadingPrincipal, null, 0, Ci.nsIContentPolicy.TYPE_DOCUMENT); - } - else { - channel = ioServ.newChannelFromURI(uri); - } - return channel; - }, /** * create an nsIStreamListener object to read String data from an nsIInputStream * @@ -80,17 +48,17 @@ newStringStreamListener: function(onStopCallback) { EnigmailLog.DEBUG("enigmailCommon.jsm: newStreamListener\n"); - return { + let listener = { data: "", inStream: Cc["@mozilla.org/binaryinputstream;1"].createInstance(Ci.nsIBinaryInputStream), _onStopCallback: onStopCallback, - QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener, Ci.nsIRequestObserver]), + QueryInterface: EnigmailCompat.generateQI([Ci.nsIStreamListener, Ci.nsIRequestObserver]), - onStartRequest: function(channel, ctxt) { + onStartRequest: function(channel) { // EnigmailLog.DEBUG("enigmailCommon.jsm: stringListener.onStartRequest\n"); }, - onStopRequest: function(channel, ctxt, status) { + onStopRequest: function(channel, status) { // EnigmailLog.DEBUG("enigmailCommon.jsm: stringListener.onStopRequest: "+ctxt+"\n"); this.inStream = null; var cbFunc = this._onStopCallback; @@ -99,15 +67,25 @@ EnigmailTimer.setTimeout(function _cb() { cbFunc(cbData); }); - }, + } + }; - onDataAvailable: function(req, sup, stream, offset, count) { - // get data from stream + if (EnigmailCompat.isMessageUriInPgpMime()) { + // TB >= 67 + listener.onDataAvailable = function(req, stream, offset, count) { // EnigmailLog.DEBUG("enigmailCommon.jsm: stringListener.onDataAvailable: "+count+"\n"); this.inStream.setInputStream(stream); this.data += this.inStream.readBytes(count); - } - }; + }; + } else { + listener.onDataAvailable = function(req, ctxt, stream, offset, count) { + // EnigmailLog.DEBUG("enigmailCommon.jsm: stringListener.onDataAvailable: "+count+"\n"); + this.inStream.setInputStream(stream); + this.data += this.inStream.readBytes(count); + }; + } + + return listener; }, /** @@ -117,12 +95,17 @@ * @contentType: String - the content type as specified in nsIChannel * @contentCharset: String - the character set; automatically determined if null * @data: String - the data to feed to the stream + * @loadInfo nsILoadInfo - loadInfo (optional) * * @return nsIChannel object */ - newStringChannel: function(uri, contentType, contentCharset, data) { + newStringChannel: function(uri, contentType, contentCharset, data, loadInfo) { EnigmailLog.DEBUG("enigmailCommon.jsm: newStringChannel\n"); + if (!loadInfo) { + loadInfo = createLoadInfo(); + } + const inputStream = Cc[NS_STRING_INPUT_STREAM_CONTRACTID].createInstance(Ci.nsIStringInputStream); inputStream.setData(data, -1); @@ -132,34 +115,27 @@ const newCharset = {}; const hadCharset = {}; let mimeType; - try { - // Gecko >= 43 - mimeType = netUtil.parseResponseContentType(contentType, newCharset, hadCharset); - } - catch (ex) { - // Gecko < 43 - mimeType = netUtil.parseContentType(contentType, newCharset, hadCharset); - } + mimeType = netUtil.parseResponseContentType(contentType, newCharset, hadCharset); contentCharset = newCharset.value; } - const isc = Cc[NS_INPUT_STREAM_CHNL_CONTRACTID].createInstance(Ci.nsIInputStreamChannel); + let isc = Cc[NS_INPUT_STREAM_CHNL_CONTRACTID].createInstance(Ci.nsIInputStreamChannel); + isc.QueryInterface(Ci.nsIChannel); isc.setURI(uri); + isc.loadInfo = loadInfo; isc.contentStream = inputStream; - const chan = isc.QueryInterface(Ci.nsIChannel); - if (contentType && contentType.length) chan.contentType = contentType; - if (contentCharset && contentCharset.length) chan.contentCharset = contentCharset; + if (contentType && contentType.length) isc.contentType = contentType; + if (contentCharset && contentCharset.length) isc.contentCharset = contentCharset; EnigmailLog.DEBUG("enigmailCommon.jsm: newStringChannel - done\n"); - return chan; + return isc; }, newFileChannel: function(uri, file, contentType, deleteOnClose) { EnigmailLog.DEBUG("enigmailCommon.jsm: newFileChannel for '" + file.path + "'\n"); - let inputStream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream); let behaviorFlags = Ci.nsIFileInputStream.CLOSE_ON_EOF; if (deleteOnClose) { @@ -169,17 +145,26 @@ const perm = 0; inputStream.init(file, ioFlags, perm, behaviorFlags); - const isc = Cc[NS_INPUT_STREAM_CHNL_CONTRACTID].createInstance(Ci.nsIInputStreamChannel); - + let isc = Cc[NS_INPUT_STREAM_CHNL_CONTRACTID].createInstance(Ci.nsIInputStreamChannel); + isc.QueryInterface(Ci.nsIChannel); + isc.contentDisposition = Ci.nsIChannel.DISPOSITION_ATTACHMENT; + isc.loadInfo = createLoadInfo(); isc.setURI(uri); isc.contentStream = inputStream; - const chan = isc.QueryInterface(Ci.nsIChannel); - if (contentType && contentType.length) chan.contentType = contentType; + if (contentType && contentType.length) isc.contentType = contentType; EnigmailLog.DEBUG("enigmailCommon.jsm: newStringChannel - done\n"); - return chan; + return isc; } - }; + +function createLoadInfo() { + let c = NetUtil.newChannel({ + uri: "chrome://enigmail/content/", + loadUsingSystemPrincipal: true + }); + + return c.loadInfo; +} diff -Nru enigmail-2.0.12+ds1/package/system.jsm enigmail-2.1.3+ds1/package/system.jsm --- enigmail-2.0.12+ds1/package/system.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/system.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* 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/. */ @@ -9,16 +7,16 @@ var EXPORTED_SYMBOLS = ["EnigmailSystem"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://gre/modules/ctypes.jsm"); /* global ctypes: false */ -Cu.import("resource://enigmail/os.jsm"); /* global EnigmailOS: false */ -Cu.import("resource://enigmail/data.jsm"); /* global EnigmailData: false */ -Cu.import("resource://enigmail/subprocess.jsm"); /* global subprocess: false */ -Cu.import("resource://enigmail/log.jsm"); /* global EnigmailLog: false */ -Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ + + + + +const ctypes = ChromeUtils.import("resource://gre/modules/ctypes.jsm").ctypes; +const EnigmailOS = ChromeUtils.import("chrome://enigmail/content/modules/os.jsm").EnigmailOS; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const subprocess = ChromeUtils.import("chrome://enigmail/content/modules/subprocess.jsm").subprocess; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; var gKernel32Dll = null; var gSystemCharset = null; @@ -133,7 +131,7 @@ if (localeFile.exists()) break; } - if (!localeFile.exists()) return "iso-8859-1"; + if (!localeFile.exists()) return "utf-8"; let output = ""; @@ -153,12 +151,12 @@ if (m && m.length > 2) { lc = m[2].replace(/"/g, ""); } - else return "iso-8859-1"; + else return "utf-8"; } let i = lc.search(/[.@]/); - if (i < 0) return "iso-8859-1"; + if (i < 0) return "utf-8"; lc = lc.substr(i + 1); diff -Nru enigmail-2.0.12+ds1/package/tests/Makefile enigmail-2.1.3+ds1/package/tests/Makefile --- enigmail-2.0.12+ds1/package/tests/Makefile 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/Makefile 2019-10-29 17:09:36.000000000 +0000 @@ -10,7 +10,7 @@ ifneq ($(TB_PATH),"") -UNITTEST = $(JSUNIT) main.js +UNITTEST = $(JSUNIT) endif diff -Nru enigmail-2.0.12+ds1/package/tests/armor-test.js enigmail-2.1.3+ds1/package/tests/armor-test.js --- enigmail-2.0.12+ds1/package/tests/armor-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/armor-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,4 @@ -/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false, Cc: false, Ci: false */ -/*jshint -W097 */ +/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: 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 @@ -10,8 +9,8 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); -testing("armor.jsm"); /*global EnigmailArmor: false */ -component("enigmail/constants.jsm"); /*global EnigmailConstants: false */ +testing("armor.jsm"); /*global EnigmailArmor: false, EnigmailConstants: false */ +const EnigmailFiles = component("enigmail/files.jsm").EnigmailFiles; test(function shouldLocateEnigmailArmoredBlock() { const text = " -----BEGIN PGP SIGNATURE-----\n" + @@ -105,3 +104,16 @@ Assert.ok("comment" in hdr); Assert.equal(hdr.comment, "GPGTools - https://gpgtools.org"); }); + + +test(function shouldSplitKeys() { + const publicKey1 = do_get_file("resources/dev-strike.asc", false); + const publicKey2 = do_get_file("resources/dev-tiger.asc", false); + + const pubKeyData = EnigmailFiles.readFile(publicKey1) + "\r\n" + EnigmailFiles.readFile(publicKey2); + + + let keyBlocks = EnigmailArmor.splitArmoredBlocks(pubKeyData); + + Assert.equal(keyBlocks.length, 2); +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/autoSetup-test.js enigmail-2.1.3+ds1/package/tests/autoSetup-test.js --- enigmail-2.0.12+ds1/package/tests/autoSetup-test.js 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/autoSetup-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,674 @@ +/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false */ +/*global EnigmailCore: false, EnigmailFiles: false, EnigmailLog: false, EnigmailPrefs: false */ +/*global setupTestAccounts: false, setupTestAccount: false, getCurrentTime: true */ +/* + * 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"; + +do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, addMacPaths: false, withEnigmail: false, withTestGpgHome: false*/ +TestHelper.loadDirectly("tests/mailHelper.js"); /*global MailHelper: false */ + +testing("autoSetup.jsm"); +/*global EnigmailAutoSetup: false, getMsgFolders: false, getStreamedMessage: false, getStreamedHeaders: false, checkHeaders: false, + EnigmailAutocrypt: false, EnigmailConstants: false, MailServices: false, EnigmailKeyRing: false, + EnigmailCompat: false*/ + + +const AC_HEADER = + `addr=dev-tiger@test.notreal; prefer-encrypt=mutual; keydata= +mQENBFdGIzkBCADKys5q0rYiTr/FYdoupmNAJ0o20XWuFp/V58qsnQAMcAY2pCB/ydx9Y7 +A80QjZPuVcE5QdROfvvkMXAA47ZxZrH79Kaqj11DS5XOgtLVtITGtWvrYqIFujxP42ICWB +h7LXUwrHfi93FX74ucXoWo/PZndbo+JBxc0ZsrHUdu24grTDuqLZQ8mRCx5U4tf+zEVIU6 +kXubFzq8aPSnjfEg6MhXxSRictjIBKM0Ez2QwZmh1vAEmvn0kr0VaJJ7xVRgIH1CgNh/WW +tbr0lrblKCkFkTFnQfslWvSEko+LqvwgBSKyKg8VtWbYftnBkn8FPbP5Brp3wYgBc/c7mr +LROqAFABEBAAG0ImRldi10aWdlciA8ZGV2LXRpZ2VyQHRlc3Qubm90cmVhbD6JATcEEwEI +ACEFAldGIzkCGwMFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQhDnhcEaXfEb3/gf/V0 +da3gXN5TNOsWZKj/fI2FhQBglJ2vlEamnppwtnWZGktdFZ1h6ymzQ9PY3IidbKctqs/QQW +KtIBVh5k02fvUe99nsFZmINcLeajdu7IqvKxtFBuEwZAA1Bw9dhM3JRQM8z+l+CtbFh6dV +ufU7q5vVEXciCkhdn172QYTMAXNYE4Tfh7eaEAOdRyFcwiAGZ826pOp7Al52frK+MtaXa9 +D2fRINlDXD9+IIR80sig2B4iBGeY+qAmE6bFuw7MtBya6uKupLjtAD/v48Z5wBYuU0jPld +4KH88IWksbQo1zW/O+1N7J1/U9ZGNwpvS+wtfyjlOpTS3YWGmY8sVturZqTrkBDQRXRiM5 +AQgAsDN5j4viE5E8H5N9cfzQ9ZO5BUk66yI2DVEeasqZWFCkRA+uFHcTF6YpCoSn4/Jsvq +vUWVh63uV5vdAiU9+4sNFT8nkP7zD0LQthFtgEXqNo11NR7yvDRT3TOAnGaa+bLyoU/SLX +zSwctZksrQjzQJVSohQNznhj95XH3UEsUydHqje7ljp7NHWAJx+Tlp2Yh6q060/gwh37zs +fdVbaVtjeaAYECX3z6L7JB4KBb9KGlmDmOMngVUuR8XWWE+LEx0m7B+kZ+vZhUOSDDomBP ++8jGJmXlcIt8+LIBq0NeXs/YINCc89saUPw/V6X/NFRkekKFzIprCzwhg0LWl8oXAwARAQ +ABiQEfBBgBCAAJBQJXRiM5AhsMAAoJEIQ54XBGl3xGUvEH/jVTBoRfJ8ohc4Ahal8TyIm8 +vdT/Ax/ddyyaLnCxkLFt0noBlA7062N1Fvv86Ts93EFrK9nF3g20gXKBKETo/vJRqtODIr +wtCMfzPbS/FkQweLtUDZXed0nq/Yaxk60H2HmWm+n9/126F3QIt7is0E3dY0e6DYJGRHnn ++lWnUs/8Ba16Zb/os3GgwEQwr4LPEty6CFQU2DNl5HmajeB1oEqmeDZ2f/y87GRpdCoTgu +dQiHMPdm2kPVbeAA6945W6Y2LSA5Hm+yS8s2dBs4+sEiW97owLz6vcak8Aw+7JFxL2JkoZ +uN28dueoVcFQw3uX0snoBXgo3LYsK71JoufrXhY=`; + +function createCopyListener(callback) { + return { + // nsIRequestObserver + OnStartCopy: function() {}, + OnProgress: function() {}, + SetMessageKey: function() {}, + GetMessageId: function() { + return ""; + }, + OnStopCopy: function() { + callback(); + } + }; +} + +function copyMailToFolder(emlPath, folder) { + return new Promise((resolve, reject) => { + var listener = createCopyListener(() => { + resolve(0); + }); + let emailFile = do_get_file(emlPath, false); + EnigmailCompat.copyFileToMailFolder(emailFile, folder, 0, null, listener, null); + }); +} + + +test(withTestGpgHome(withEnigmail(function determinePreviousInstallType_noAccount_Test() { + + getCurrentTime = function() { + return new Date('2018-07-22T17:00:00').getTime() / 1000; + }; + + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + + MailHelper.deleteAllAccounts(); + EnigmailAutoSetup.determinePreviousInstallType().then((returnMsgValue) => { + Assert.equal(returnMsgValue.value, EnigmailConstants.AUTOSETUP_NO_ACCOUNT); + inspector.exitNestedEventLoop(); + }).catch(err => { + Assert.ok(false); + inspector.exitNestedEventLoop(); + }); + + inspector.enterNestedEventLoop(0); + + MailHelper.init(); + setupTestAccounts("user1@enigmail-test.net"); +}))); + +//testing: createAutocryptKey +test(withTestGpgHome(withEnigmail(function keyGenTest() { + + EnigmailKeyRing.clearCache(); + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + + const userName = 'Test Name'; + const userEmail = 'testing@domain.invalid'; + const KEY_ID = "0x4F128BD42AEA7F1D732123954C83EE00FF0245BE"; + + EnigmailKeyRing.clearCache(); + + EnigmailKeyRing._generateKey = EnigmailKeyRing.generateKey; + + EnigmailKeyRing.generateKey = function(userName, comment, userEmail, expiry, keyLength, keyType, passphrase, generateObserver) { + let keyFile = do_get_file("resources/testing-domain.invalid.pub-sec", false); + + Assert.equal(keyType, "ECC"); + let exitCode = EnigmailKeyRing.importKeyFromFile(keyFile, {}, {}); + generateObserver.keyId = KEY_ID; + generateObserver.onStopRequest(exitCode); + }; + + EnigmailAutoSetup.createAutocryptKey(userName, userEmail).then((value) => { + let keys = EnigmailKeyRing.getAllSecretKeys(); + + EnigmailKeyRing.generateKey = EnigmailKeyRing._generateKey; + Assert.equal(value, KEY_ID); + Assert.equal(keys.length, 1); + Assert.equal(keys[0].userIds[0].userId, "Test Name "); + Assert.equal(keys[0].keySize, "4096"); + inspector.exitNestedEventLoop(); + }).catch(res => { + Assert.ok(false); + inspector.exitNestedEventLoop(); + }); + + inspector.enterNestedEventLoop(0); +}))); + +//testing: createAutocryptKey_error_Test +test(withTestGpgHome(withEnigmail(function keyGen_error_Test() { + + EnigmailKeyRing.clearCache(); + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + + EnigmailKeyRing.clearCache(); + EnigmailAutoSetup.createAutocryptKey(undefined, undefined).then((value) => { + Assert.equal(value, null); + inspector.exitNestedEventLoop(); + }).catch(res => { + Assert.ok(false); + inspector.exitNestedEventLoop(); + }); + + inspector.enterNestedEventLoop(0); +}))); + +//testing: processAutocryptHeader +test(function processAutocryptHeaderTest() { + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + + let date = new Date(); + date.setTime(Date.now()); // now + const sentDate = date.toUTCString(); + + let headerValue = { + msgHeaders: [{ + date: sentDate, + fromAddr: 'dev-tiger@test.notreal', + msgType: 'Autocrypt', + msgData: AC_HEADER + }] + }; + + var window = JSUnit.createStubWindow(); + EnigmailKeyRing.clearCache(); + + EnigmailAutoSetup.processAutocryptHeader(headerValue, window).then((value) => { + Assert.equal(value, 0); + return EnigmailAutocrypt.getOpenPGPKeyForEmail(["dev-tiger@test.notreal"]); + }).then((keys) => { + Assert.equal(keys.length, 1); + Assert.equal(keys[0].email, "dev-tiger@test.notreal"); + Assert.equal(keys[0].lastAutocrypt.toUTCString(), sentDate); + inspector.exitNestedEventLoop(); + }).catch(res => { + Assert.ok(false); + inspector.exitNestedEventLoop(); + }); + + inspector.enterNestedEventLoop(0); +}); + +//testing: processAutocryptHeader for Error +test(function processAutocryptHeader_error_Test() { + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + + let date = new Date(); + date.setTime(Date.now() - 5 * 86400 * 1000); // 5 days ago + const sentDate = date.toUTCString(); + + let headerValue = { + msgHeaders: [{ + date: sentDate, + fromAddr: '', + msgType: 'Autocrypt', + msgData: AC_HEADER + }] + }; + + var window = JSUnit.createStubWindow(); + EnigmailKeyRing.clearCache(); + + EnigmailAutoSetup.processAutocryptHeader(headerValue, window).then((value) => { + Assert.equal(value, 1); + inspector.exitNestedEventLoop(); + }); + + inspector.enterNestedEventLoop(0); +}); + +//testing: getMsgFolders +test(withTestGpgHome(withEnigmail(function getMsgFoldersTest() { + + MailHelper.cleanMailFolder(MailHelper.getRootFolder()); + const sourceFolder = MailHelper.createMailFolder("source-box"); + + var database1 = []; + getMsgFolders(sourceFolder, database1); + + Assert.equal(database1.length, 0); + + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + copyMailToFolder("resources/encrypted-email.eml", sourceFolder).then(() => { + inspector.exitNestedEventLoop(0); + }).catch(err => { + Assert.ok(false, "Error in copyMailToFolder: " + err); + inspector.exitNestedEventLoop(0); + }); + inspector.enterNestedEventLoop(0); + + Assert.equal(sourceFolder.getTotalMessages(false), 1); + + var database2 = []; + getMsgFolders(MailHelper.getRootFolder(), database2); + + Assert.equal(database2.length, 1); + +}))); + +//testing: getStreamedMessage +test(withTestGpgHome(withEnigmail(function getStreamedMessageTest() { + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + + MailHelper.cleanMailFolder(MailHelper.getRootFolder()); + + const rootFolder = MailHelper.getRootFolder(); + const sourceFolder = MailHelper.createMailFolder("source-box"); + copyMailToFolder("resources/encrypted-email-with-attachment.eml", sourceFolder).then(() => { + inspector.exitNestedEventLoop(0); + }).catch(err => { + Assert.ok(false, "Error in copyMailToFolder: " + err); + inspector.exitNestedEventLoop(0); + }); + inspector.enterNestedEventLoop(0); + + let msgheader = MailHelper.fetchFirstMessageHeaderIn(sourceFolder); + + getStreamedMessage(sourceFolder, msgheader).then((value) => { + Assert.notEqual(value, null); + Assert.equal(value.displayName, 'attachment.txt.pgp'); + inspector.exitNestedEventLoop(); + }).catch(err => { + Assert.ok(false); + inspector.exitNestedEventLoop(); + }); + + inspector.enterNestedEventLoop(0); +}))); + +//testing: getStreamedHeaders +test(withTestGpgHome(withEnigmail(function getStreamedHeadersTest() { + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + + MailHelper.cleanMailFolder(MailHelper.getRootFolder()); + + const rootFolder = MailHelper.getRootFolder(); + const sourceFolder = MailHelper.createMailFolder("source-box"); + copyMailToFolder("resources/encrypted-email.eml", sourceFolder).then(() => { + inspector.exitNestedEventLoop(0); + }).catch(err => { + Assert.ok(false, "Error in copyMailToFolder: " + err); + inspector.exitNestedEventLoop(0); + }); + inspector.enterNestedEventLoop(0); + + let msgheader = MailHelper.fetchFirstMessageHeaderIn(sourceFolder); + let msgURI = sourceFolder.getUriForMsg(msgheader); + let messenger = Components.classes["@mozilla.org/messenger;1"].createInstance(Ci.nsIMessenger); + + let mms = messenger.messageServiceFromURI(msgURI).QueryInterface(Ci.nsIMsgMessageService); + + getStreamedHeaders(msgURI, mms).then((value) => { + Assert.notEqual(value, null); + Assert.equal(value.subject, "Encrypted email"); + Assert.equal(value.date, "Tue, 09 Jun 2015 16:43:45 -0500"); + inspector.exitNestedEventLoop(); + }).catch(err => { + Assert.ok(false); + inspector.exitNestedEventLoop(); + }); + + inspector.enterNestedEventLoop(0); +}))); + +//testing: getStreamedHeaders Error +test(withTestGpgHome(withEnigmail(function getStreamedHeadersTest() { + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + + MailHelper.cleanMailFolder(MailHelper.getRootFolder()); + + const rootFolder = MailHelper.getRootFolder(); + const sourceFolder = MailHelper.createMailFolder("source-box"); + copyMailToFolder("resources/encrypted-email.eml", sourceFolder).then(() => { + inspector.exitNestedEventLoop(0); + }).catch(err => { + Assert.ok(false, "Error in copyMailToFolder: " + err); + inspector.exitNestedEventLoop(0); + }); + inspector.enterNestedEventLoop(0); + + let msgheader = MailHelper.fetchFirstMessageHeaderIn(sourceFolder); + let msgURI = sourceFolder.getUriForMsg(msgheader); + let messenger = Components.classes["@mozilla.org/messenger;1"].createInstance(Ci.nsIMessenger); + + let mms = undefined; + + getStreamedHeaders(msgURI, mms).then((value) => { + inspector.exitNestedEventLoop(); + }).catch(err => { + Assert.equal(Object.keys(err).length, 0); + inspector.exitNestedEventLoop(); + }); + + inspector.enterNestedEventLoop(0); +}))); + + +//testing: checkHeaders +test(withTestGpgHome(withEnigmail(function checkHeadersTest() { + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + + let returnMsgValue = { + value: EnigmailConstants.AUTOSETUP_NO_HEADER + }; + + let msgHeaders = []; + + MailHelper.cleanMailFolder(MailHelper.getRootFolder()); + + const rootFolder = MailHelper.getRootFolder(); + const sourceFolder = MailHelper.createMailFolder("source-box"); + copyMailToFolder("resources/encrypted-email.eml", sourceFolder).then(() => { + inspector.exitNestedEventLoop(0); + }).catch(err => { + Assert.ok(false, "Error in copyMailToFolder: " + err); + inspector.exitNestedEventLoop(0); + }); + inspector.enterNestedEventLoop(0); + + let msgAuthor = "tester@enigmail.org"; + let msgHeader1 = MailHelper.fetchFirstMessageHeaderIn(sourceFolder); + + let msgAccountManager = Cc["@mozilla.org/messenger/account-manager;1"].getService(Ci.nsIMsgAccountManager); + let accounts = msgAccountManager.accounts; + let account = accounts.queryElementAt(0, Ci.nsIMsgAccount); + + let msgURI1 = sourceFolder.getUriForMsg(msgHeader1); + let messenger1 = Components.classes["@mozilla.org/messenger;1"].createInstance(Ci.nsIMessenger); + let mms1 = messenger1.messageServiceFromURI(msgURI1).QueryInterface(Ci.nsIMsgMessageService); + + + getStreamedHeaders(msgURI1, mms1).then(async(value) => { + let returnValue = await checkHeaders(value, msgHeader1, msgAuthor, account.defaultIdentity.email, sourceFolder, returnMsgValue, msgHeaders); + Assert.notEqual(returnValue, null); + Assert.equal(returnValue.returnMsgValue.value, EnigmailConstants.AUTOSETUP_NO_HEADER); + Assert.equal(returnValue.msgHeaders.length, 0); + inspector.exitNestedEventLoop(); + }).catch(err => { + Assert.ok(false); + inspector.exitNestedEventLoop(); + }); + + inspector.enterNestedEventLoop(0); + + MailHelper.cleanMailFolder(MailHelper.getRootFolder()); + + const setupFolder = MailHelper.createMailFolder("setup-box"); + copyMailToFolder("resources/autocrypt-setup-message.eml", setupFolder).then(() => { + inspector.exitNestedEventLoop(0); + }).catch(err => { + Assert.ok(false, "Error in copyMailToFolder: " + err); + inspector.exitNestedEventLoop(0); + }); + inspector.enterNestedEventLoop(0); + + let msgHeader2 = MailHelper.fetchFirstMessageHeaderIn(setupFolder); + + let msgURI2 = setupFolder.getUriForMsg(msgHeader2); + let messenger2 = Components.classes["@mozilla.org/messenger;1"].createInstance(Ci.nsIMessenger); + let mms2 = messenger2.messageServiceFromURI(msgURI2).QueryInterface(Ci.nsIMsgMessageService); + + getStreamedHeaders(msgURI2, mms2).then(async(value) => { + let returnValue = await checkHeaders(value, msgHeader2, msgAuthor, account.defaultIdentity.email, setupFolder, returnMsgValue, msgHeaders); + Assert.notEqual(returnValue, null); + Assert.equal(returnValue.returnMsgValue.value, EnigmailConstants.AUTOSETUP_AC_SETUP_MSG); + Assert.equal(returnMsgValue.acSetupMessage.author, 'nobody'); + Assert.notEqual(returnMsgValue.attachment, null); + inspector.exitNestedEventLoop(); + }).catch(err => { + Assert.ok(false); + inspector.exitNestedEventLoop(); + }); + + inspector.enterNestedEventLoop(0); + + MailHelper.cleanMailFolder(MailHelper.getRootFolder()); + + const autocryptFolder = MailHelper.createMailFolder("autocrypt-box"); + copyMailToFolder("resources/encrypted-email-with-autocrypt.eml", autocryptFolder).then(() => { + inspector.exitNestedEventLoop(0); + }).catch(err => { + Assert.ok(false, "Error in copyMailToFolder: " + err); + inspector.exitNestedEventLoop(0); + }); + inspector.enterNestedEventLoop(0); + + let msgHeader3 = MailHelper.fetchFirstMessageHeaderIn(autocryptFolder); + + let msgURI3 = autocryptFolder.getUriForMsg(msgHeader3); + let messenger3 = Components.classes["@mozilla.org/messenger;1"].createInstance(Ci.nsIMessenger); + let mms3 = messenger3.messageServiceFromURI(msgURI3).QueryInterface(Ci.nsIMsgMessageService); + + let msgAuthor2 = account.defaultIdentity.email; + + getStreamedHeaders(msgURI3, mms3).then(async(value) => { + let returnValue = await checkHeaders(value, msgHeader3, msgAuthor2, account.defaultIdentity.email, autocryptFolder, returnMsgValue, msgHeaders); + Assert.notEqual(returnValue, null); + Assert.equal(returnValue.msgHeaders.length, 1); + Assert.equal(returnValue.msgHeaders[0].fromAddr, msgAuthor2); + inspector.exitNestedEventLoop(); + }).catch(err => { + Assert.ok(false); + inspector.exitNestedEventLoop(); + }); + + inspector.enterNestedEventLoop(0); + + MailHelper.cleanMailFolder(MailHelper.getRootFolder()); + +}))); + +//testing: determinePreviousInstallType +test(withTestGpgHome(withEnigmail(function determinePreviousInstallTypeTest() { + + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + + const rootFolder = MailHelper.getRootFolder(); + const sourceFolder = MailHelper.createMailFolder("source-box"); + copyMailToFolder("resources/encrypted-email.eml", sourceFolder).then(() => { + inspector.exitNestedEventLoop(0); + }).catch(err => { + Assert.ok(false, "Error in copyMailToFolder: " + err); + inspector.exitNestedEventLoop(0); + }); + inspector.enterNestedEventLoop(0); + + EnigmailAutoSetup.determinePreviousInstallType().then((returnMsgValue) => { + Assert.equal(returnMsgValue.value, EnigmailConstants.AUTOSETUP_NO_HEADER); + inspector.exitNestedEventLoop(); + }).catch(err => { + Assert.ok(false); + inspector.exitNestedEventLoop(); + }); + + inspector.enterNestedEventLoop(0); + + MailHelper.cleanMailFolder(MailHelper.getRootFolder()); + + const autocryptFolder = MailHelper.createMailFolder("autocrypt-box"); + copyMailToFolder("resources/encrypted-email-with-autocrypt.eml", autocryptFolder).then(() => { + inspector.exitNestedEventLoop(0); + }).catch(err => { + Assert.ok(false, "Error in copyMailToFolder: " + err); + inspector.exitNestedEventLoop(0); + }); + inspector.enterNestedEventLoop(0); + + EnigmailAutoSetup.determinePreviousInstallType().then((returnMsgValue) => { + Assert.equal(returnMsgValue.value, EnigmailConstants.AUTOSETUP_NO_HEADER); + inspector.exitNestedEventLoop(0); + }).catch(err => { + Assert.ok(false); + inspector.exitNestedEventLoop(0); + }); + inspector.enterNestedEventLoop(0); + + let acc2 = setupTestAccount("Unit Test Account 2", "dummy2", "testing@domain.invalid"); + let inbox = acc2.incomingServer.rootFolder.getFolderWithFlags(Components.interfaces.nsMsgFolderFlags.Inbox); + + copyMailToFolder("resources/email-acc2-pEp-message.eml", inbox).then(() => { + inspector.exitNestedEventLoop(0); + }).catch(err => { + Assert.ok(false, "Error in copyMailToFolder: " + err); + inspector.exitNestedEventLoop(0); + }); + inspector.enterNestedEventLoop(0); + + /* global do_print: false */ + do_print("determine previous intall type..."); + + EnigmailAutoSetup.determinePreviousInstallType().then((returnMsgValue) => { + Assert.equal(returnMsgValue.value, EnigmailConstants.AUTOSETUP_PEP_HEADER); + inspector.exitNestedEventLoop(0); + }).catch(err => { + Assert.ok(false); + inspector.exitNestedEventLoop(0); + }); + + inspector.enterNestedEventLoop(0); + + MailHelper.cleanMailFolder(MailHelper.getRootFolder()); + + copyMailToFolder("resources/autocrypt-setup-message.eml", inbox).then(() => { + inspector.exitNestedEventLoop(0); + }).catch(err => { + Assert.ok(false, "Error in copyMailToFolder: " + err); + inspector.exitNestedEventLoop(0); + }); + inspector.enterNestedEventLoop(0); + + EnigmailAutoSetup.determinePreviousInstallType().then((returnMsgValue) => { + Assert.equal(returnMsgValue.value, EnigmailConstants.AUTOSETUP_AC_SETUP_MSG); + inspector.exitNestedEventLoop(0); + }).catch(err => { + Assert.ok(false); + inspector.exitNestedEventLoop(0); + }); + + inspector.enterNestedEventLoop(0); + + //MailHelper.cleanMailFolder(MailHelper.getRootFolder()); +}))); + +//testing: performAutocryptSetup +test(withTestGpgHome(withEnigmail(function performAutocryptSetupTest() { + EnigmailKeyRing.clearCache(); + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + + MailHelper.cleanMailFolder(MailHelper.getRootFolder()); + + const rootFolder = MailHelper.getRootFolder(); + const sourceFolder = MailHelper.createMailFolder("source-box"); + copyMailToFolder("resources/autocrypt-setup-message-2.eml", sourceFolder).then(() => { + inspector.exitNestedEventLoop(0); + }).catch(err => { + Assert.ok(false, "Error in copyMailToFolder: " + err); + inspector.exitNestedEventLoop(0); + }); + inspector.enterNestedEventLoop(0); + + let msgheader = MailHelper.fetchFirstMessageHeaderIn(sourceFolder); + let msgURI = sourceFolder.getUriForMsg(msgheader); + let messenger = Components.classes["@mozilla.org/messenger;1"].createInstance(Ci.nsIMessenger); + + getStreamedMessage(sourceFolder, msgheader).then((value) => { + Assert.notEqual(value, null); + let headervalue = { + 'acSetupMessage': msgheader, + 'attachment': value + }; + + var passwordWindow = JSUnit.createStubWindow(); + var confirmWindow = JSUnit.createStubWindow(); + + var confirmWindowDocument = passwordWindow.document; + var passwordWindowDocument = confirmWindow.document; + + passwordWindow.openDialog = function(arg1, arg2, arg3, arg4) { + const pass = "6460-5183-7821-0632-0177-4451-8821-9031-7887"; + arg4.password = pass; + return arg4.password; + }; + + confirmWindow.openDialog = function() { + inspector.exitNestedEventLoop(); + return null; + }; + + EnigmailAutoSetup.performAutocryptSetup(headervalue, passwordWindow, confirmWindow); + + }).catch(err => { + Assert.ok(false, `got exception: ${err}`); + inspector.exitNestedEventLoop(); + }); + + inspector.enterNestedEventLoop(0); + + let keys = EnigmailKeyRing.getKeyById("0xB3A85460D9D9CC47"); + Assert.notEqual(keys, null, "keys must not be null"); + Assert.equal(keys.keyId, "B3A85460D9D9CC47"); + + MailHelper.cleanMailFolder(MailHelper.getRootFolder()); + +}))); + +//testing: performAutocryptSetup +test(withTestGpgHome(withEnigmail(function performAutocryptSetup_wrongPassword_Test() { + EnigmailKeyRing.clearCache(); + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + + MailHelper.cleanMailFolder(MailHelper.getRootFolder()); + + const rootFolder = MailHelper.getRootFolder(); + const sourceFolder = MailHelper.createMailFolder("source-box"); + copyMailToFolder("resources/autocrypt-setup-message-2.eml", sourceFolder).then(() => { + inspector.exitNestedEventLoop(0); + }).catch(err => { + Assert.ok(false, "Error in copyMailToFolder: " + err); + inspector.exitNestedEventLoop(0); + }); + inspector.enterNestedEventLoop(0); + + let msgheader = MailHelper.fetchFirstMessageHeaderIn(sourceFolder); + let msgURI = sourceFolder.getUriForMsg(msgheader); + let messenger = Components.classes["@mozilla.org/messenger;1"].createInstance(Ci.nsIMessenger); + + getStreamedMessage(sourceFolder, msgheader).then((value) => { + Assert.notEqual(value, null); + let headervalue = { + 'acSetupMessage': msgheader, + 'attachment': value + }; + + var passwordWindow = JSUnit.createStubWindow(); + var confirmWindow = JSUnit.createStubWindow(); + + passwordWindow.document = JSUnit.createDOMDocument(); + confirmWindow.document = JSUnit.createDOMDocument(); + + var confirmWindowDocument = passwordWindow.document; + var passwordWindowDocument = confirmWindow.document; + + passwordWindow.openDialog = function(arg1, arg2, arg3, arg4) { + const pass = "6460-5183-7821-0632-0177-4451-8821-9031-7888"; + arg4.password = pass; + return arg4.password; + }; + + confirmWindow.openDialog = function() { + inspector.exitNestedEventLoop(); + return null; + }; + + EnigmailAutoSetup.performAutocryptSetup(headervalue, passwordWindow, confirmWindow); + + }).catch(err => { + inspector.exitNestedEventLoop(); + }); + + inspector.enterNestedEventLoop(0); + + + let keys = EnigmailKeyRing.getKeyById("B3A85460D9D9CC47"); + Assert.equal(keys, null); + + MailHelper.cleanMailFolder(MailHelper.getRootFolder()); +}))); diff -Nru enigmail-2.0.12+ds1/package/tests/autocrypt-test.js enigmail-2.1.3+ds1/package/tests/autocrypt-test.js --- enigmail-2.0.12+ds1/package/tests/autocrypt-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/autocrypt-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,4 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false */ -/*global dump: 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 @@ -11,9 +10,8 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /* global setupTestAccounts: false, withTestGpgHome: false, withEnigmail: false, component: false */ -testing("autocrypt.jsm"); /*global EnigmailAutocrypt: false */ -component("enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ -component("enigmail/stdlib.jsm"); /* global EnigmailStdlib: false */ +testing("autocrypt.jsm"); /*global EnigmailAutocrypt: false, EnigmailKeyRing: false, EnigmailStdlib: false, EnigmailSqliteDb: false */ +const Sqlite = ChromeUtils.import("resource://gre/modules/Sqlite.jsm").Sqlite; const pubkey1 = `mQENBFdGIzkBCADKys5q0rYiTr/FYdoupmNAJ0o20XWuFp/V58qsnQAMcAY2pCB/ydx9Y7 @@ -90,23 +88,26 @@ /* global Sqlite */ test(function prepareDb() { + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + // Drop autocrypt_keydata table (if it exists) - do_test_pending(); - Sqlite.openConnection({ - path: "enigmail.sqlite", - sharedMemoryCache: false - }). - then(connection => { - connection.execute("drop table autocrypt_keydata;").then(ok => { + async function doPreparation() { + let connection = await Sqlite.openConnection({ + path: "enigmail.sqlite", + sharedMemoryCache: false + }); + try { + await connection.execute("drop table autocrypt_keydata;"); connection.close(); - dump("dropped table\n"); - do_test_finished(); - }).catch(err => { + } catch (err) { connection.close(); - do_test_finished(); - }); - }); - JSUnit.waitForAsyncTest(); // wait until that's done before starting the next test + } + await EnigmailSqliteDb.checkDatabaseStructure(); + inspector.exitNestedEventLoop(0); + } + + doPreparation(); + inspector.enterNestedEventLoop(0); }); @@ -178,7 +179,7 @@ let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); let id = EnigmailStdlib.getIdentityForEmail("strike.devtest@gmail.com").identity; - Assert.equal(id.email, "strike.devtest@gmail.com"); + Assert.equal(id.email, "strike.devtest@gmail.com", "ID OK"); EnigmailAutocrypt.createSetupMessage(id).then(res => { Assert.ok(res); @@ -193,9 +194,9 @@ inspector.exitNestedEventLoop(); }).catch(err => { - Assert.equal(err, 0); + Assert.equal(err, 0, "this should not happen"); inspector.exitNestedEventLoop(); }); inspector.enterNestedEventLoop(0); -}))); +}))); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/core-test.js enigmail-2.1.3+ds1/package/tests/core-test.js --- enigmail-2.0.12+ds1/package/tests/core-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/core-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,7 +1,5 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, withTestGpgHome:false */ -/*global withEnigmail: false, EnigmailCore: false, Enigmail: false, component: false, Cc: false, Ci: false, withEnvironment: false, nsIEnvironment: false, Ec: false, EnigmailPrefs: false, EnigmailOS: false, EnigmailArmor: false, withLogFiles: false, assertLogContains: false, assertLogDoesNotContain: false */ -/*jshint -W120 */ -/*jshint -W097 */ +/*global withEnigmail: false, EnigmailCore: false, Enigmail: false, component: false, withEnvironment: false, nsIEnvironment: false, Ec: false, getEnigmailPrefs: false, EnigmailOS: false, EnigmailArmor: false, withLogFiles: false, assertLogContains: false, assertLogDoesNotContain: 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 @@ -13,10 +11,8 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); testing("core.jsm"); -component("enigmail/prefs.jsm"); -//component("enigmail/core.jsm"); -component("enigmail/log.jsm"); /*global EnigmailLog: false */ -component("enigmail/files.jsm"); /*global EnigmailFiles: false */ +const EnigmailLog = component("enigmail/log.jsm").EnigmailLog; +const EnigmailFiles = component("enigmail/files.jsm").EnigmailFiles; function newEnigmail(f) { var oldEnigmail = EnigmailCore.getEnigmailService(); @@ -24,15 +20,14 @@ var enigmail = new Enigmail(); EnigmailCore.setEnigmailService(enigmail); f(enigmail); - } - finally { + } finally { EnigmailCore.setEnigmailService(oldEnigmail); } } // testing: initialize test(function initializeWillPassEnvironmentIfAskedTo() { - EnigmailPrefs.setPref('keyRefreshOn', true); + getEnigmailPrefs().setPref('keyRefreshOn', true); var window = JSUnit.createStubWindow(); withEnvironment({ "ENIGMAIL_PASS_ENV": "STUFF:BLARG", @@ -46,7 +41,7 @@ }); test(function initializeWillNotPassEnvironmentsNotAskedTo() { - EnigmailPrefs.setPref('keyRefreshOn', true); + getEnigmailPrefs().setPref('keyRefreshOn', true); var window = JSUnit.createStubWindow(); var environment = Cc["@mozilla.org/process/environment;1"].getService(nsIEnvironment); environment.set("ENIGMAIL_PASS_ENV", "HOME"); @@ -58,7 +53,7 @@ }); test(function initializeWillNotSetEmptyEnvironmentValue() { - EnigmailPrefs.setPref('keyRefreshOn', true); + getEnigmailPrefs().setPref('keyRefreshOn', true); var window = JSUnit.createStubWindow(); var environment = Cc["@mozilla.org/process/environment;1"].getService(nsIEnvironment); environment.set("APPDATA", ""); @@ -66,4 +61,4 @@ enigmail.initialize(window, ""); Assert.assertArrayNotContains(EnigmailCore.getEnvList(), "APPDATA="); }); -}); +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/decryption-test.js enigmail-2.1.3+ds1/package/tests/decryption-test.js --- enigmail-2.0.12+ds1/package/tests/decryption-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/decryption-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,4 @@ -/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false, Cc: false, Ci: false */ -/*jshint -W097 */ +/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: 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 @@ -10,10 +9,9 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, withTestGpgHome: false */ -testing("decryption.jsm"); /*global EnigmailDecryption: false */ -component("enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ -component("enigmail/armor.jsm"); /*global EnigmailArmor: false */ -component("enigmail/constants.jsm"); /*global EnigmailConstants: false */ +testing("decryption.jsm"); +/*global EnigmailDecryption: false, EnigmailArmor: false, EnigmailConstants: false, +EnigmailKeyRing: false */ test(withTestGpgHome(withEnigmail(function shouldDecryptMessage() { let secretKeyFile = do_get_file("resources", false); diff -Nru enigmail-2.0.12+ds1/package/tests/dns-test.js enigmail-2.1.3+ds1/package/tests/dns-test.js --- enigmail-2.0.12+ds1/package/tests/dns-test.js 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/dns-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,189 @@ +/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: 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("dns.jsm"); + +/*global EnigmailDns: false, gHandler: true, gResolverExecutable: true */ + +/*global DigHandler: false, HostHandler: false, NsLookupHandler: false, NsLookupHandler_Windows: false, GenericHandler: false */ + +test(function testDig() { + let h = new DigHandler(null); + h.recordType = "MX"; + h.hostName = "enigmail.net"; + + let a = h.getCmdArgs(); + Assert.equal(a.join(" "), "-t MX +short enigmail.net", "dig parameters don't match"); + + let stdoutData = "10 mx2.mail.hostpoint.ch.\n10 mx1.mail.hostpoint.ch.\n"; + + let srv = h.parseResult(stdoutData); + Assert.equal(srv.join("|"), "mx2.mail.hostpoint.ch|mx1.mail.hostpoint.ch"); + + h.recordType = "SRV"; + stdoutData = "10 100 4711 t1.enigmail.net.\n10 100 4712 t2.enigmail.net.\n"; + + srv = h.parseResult(stdoutData); + Assert.equal(srv.join("|"), "t1.enigmail.net:4711|t2.enigmail.net:4712"); +}); + +test(function testHost() { + let h = new HostHandler(null); + h.recordType = "MX"; + h.hostName = "enigmail.net"; + + let a = h.getCmdArgs(); + Assert.equal(a.join(" "), "-t MX enigmail.net", "host parameters don't match"); + + let stdoutData = "enigmail.net mail is handled by 10 mx2.mail.hostpoint.ch.\nenigmail.net mail is handled by 10 mx1.mail.hostpoint.ch.\n"; + + let srv = h.parseResult(stdoutData); + Assert.equal(srv.join("|"), "mx2.mail.hostpoint.ch|mx1.mail.hostpoint.ch"); + + h.recordType = "SRV"; + stdoutData = "enigmail.net has SRV record 10 100 4711 t1.enigmail.net.\nenigmail.net has SRV record 10 100 4712 t2.enigmail.net.\n"; + + srv = h.parseResult(stdoutData); + Assert.equal(srv.join("|"), "t1.enigmail.net:4711|t2.enigmail.net:4712"); + +}); + +test(function testNsLookup() { + let h = new NsLookupHandler(null); + h.recordType = "MX"; + h.hostName = "enigmail.net"; + + let a = h.getCmdArgs(); + Assert.equal(a.join(" "), "-type=MX enigmail.net", "nslookup parameters don't match"); + + let stdoutData = + `Server: 172.17.28.1 +Address: 172.17.28.1#53 + +Non-authoritative answer: +enigmail.net\tmail exchanger = 10 mx2.mail.hostpoint.ch. +enigmail.net\tmail exchanger = 10 mx1.mail.hostpoint.ch. + +Authoritative answers can be found from: +. nameserver = h.root-servers.net. +. nameserver = g.root-servers.net. +. nameserver = d.root-servers.net. +`; + + let srv = h.parseResult(stdoutData); + Assert.equal(srv.join("|"), "mx2.mail.hostpoint.ch|mx1.mail.hostpoint.ch"); + + h.recordType = "SRV"; + stdoutData = + `Server: 172.17.28.1 +Address: 172.17.28.1#53 + +Non-authoritative answer: +_http._tcp.enigmail.net service = 10 100 4711 t1.enigmail.net. +_http._tcp.enigmail.net service = 10 100 4712 t2.enigmail.net. + +Authoritative answers can be found from: +enigmail.net nameserver = example1.invalid. +enigmail.net nameserver = example1.invalid. +`; + + srv = h.parseResult(stdoutData); + Assert.equal(srv.join("|"), "t1.enigmail.net:4711|t2.enigmail.net:4712"); +}); + + +test(function testNsLookupWin() { + let h = new NsLookupHandler_Windows(null); + h.recordType = "MX"; + h.hostName = "enigmail.net"; + + let a = h.getCmdArgs(); + Assert.equal(a.join(" "), "-type=MX enigmail.net", "nslookup parameters don't match"); + + let stdoutData = + `Server: UnKnown +Address: 172.17.28.1 + +enigmail.net\tMX preference = 10, mail exchanger = mx2.mail.hostpoint.ch +enigmail.net\tMX preference = 10, mail exchanger = mx1.mail.hostpoint.ch + +(root) nameserver = c.root-servers.net +(root) nameserver = a.root-servers.net +`; + + let srv = h.parseResult(stdoutData); + Assert.equal(srv.join("|"), "mx2.mail.hostpoint.ch|mx1.mail.hostpoint.ch"); + + h.recordType = "SRV"; + stdoutData = + `Server: UnKnown +Address: 172.17.28.1 + +wkd.enigmail.org SRV service location: +\tpriority = 100 +\tweight = 100 +\tport = 4711 +\tsvr hostname = t1.enigmail.net +wkd.enigmail.org SRV service location: +\tpriority = 100 +\tweight = 100 +\tport = 4712 +\tsvr hostname = t2.enigmail.net + +(root) nameserver = i.root-servers.net +(root) nameserver = h.root-servers.net +(root) nameserver = k.root-servers.net +`; + + srv = h.parseResult(stdoutData); + Assert.equal(srv.join("|"), "t1.enigmail.net:4711|t2.enigmail.net:4712"); +}); +test(function testExecute() { + class TestHandler extends GenericHandler { + constructor() { + let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); + + let plPath = env.get("PL_PATH"); + Assert.ok(plPath.length > 0, "PL_PATH length is > 0"); + if (plPath.length === 0) throw "perl path undefined"; + + var pl = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); + pl.initWithPath(plPath); + if (!pl.exists()) + throw "Could not locate the perl executable"; + + super(plPath); + this.handlerType = "test"; + } + + getCmdArgs() { + let tinyPl = do_get_file("resources/tiny.pl", false); + return [tinyPl.path]; + } + + parseResult(stdoutData) { + Assert.equal(stdoutData.search(/^OK/), 0); + return 0; + } + } + + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + + gHandler = TestHandler; + EnigmailDns.lookup("mx", "enigmail.net").then(x => { + inspector.exitNestedEventLoop(); + }).catch(x => { + Assert.ok(false, `Got exception ${x}`); + inspector.exitNestedEventLoop(); + }); + + inspector.enterNestedEventLoop(0); +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/encryption-test.js enigmail-2.1.3+ds1/package/tests/encryption-test.js --- enigmail-2.0.12+ds1/package/tests/encryption-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/encryption-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,4 @@ -/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false, Cc: false, Ci: false */ -/*jshint -W097 */ +/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: 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 @@ -10,11 +9,8 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, withTestGpgHome: false */ -testing("encryption.jsm"); /*global EnigmailEncryption: false */ -component("enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ -component("enigmail/armor.jsm"); /*global EnigmailArmor: false */ -component("enigmail/locale.jsm"); /*global EnigmailLocale: false */ -component("enigmail/constants.jsm"); /*global EnigmailConstants: false */ +testing("encryption.jsm"); /*global EnigmailEncryption: false, EnigmailLocale: false, EnigmailKeyRing: false, EnigmailConstants: false */ +const EnigmailArmor = component("enigmail/armor.jsm").EnigmailArmor; test(withTestGpgHome(withEnigmail(function shouldSignMessage() { const secretKey = do_get_file("resources/dev-strike.sec", false); @@ -45,7 +41,8 @@ Assert.equal("SIGNED MESSAGE", blockType); let r = EnigmailEncryption.determineOwnKeyUsability(EnigmailConstants.SEND_SIGNED, "strike.devtest@gmail.com"); - Assert.equal(r.keyId, "65537E212DC19025AD38EDB2781617319CE311C4"); + Assert.ok(r.keyId === "A3EC002971E33E6A7DAC481B7A1F45055AAFFACB" ||   + r.keyId === "65537E212DC19025AD38EDB2781617319CE311C4"); EnigmailKeyRing.importKeyFromFile(revocationCert, errorMsgObj, importedKeysObj); r = EnigmailEncryption.determineOwnKeyUsability(EnigmailConstants.SEND_SIGNED, "0x65537E212DC19025AD38EDB2781617319CE311C4"); @@ -54,9 +51,11 @@ test(withTestGpgHome(withEnigmail(function shouldEncryptMessage() { 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 parentWindow = JSUnit.createStubWindow(); const plainText = "Hello there!"; const strikeAccount = "strike.devtest@gmail.com"; @@ -74,7 +73,7 @@ errorMsgObj ); Assert.equal(0, exitCodeObj.value); - Assert.equal(0, errorMsgObj.value); + Assert.equal("", errorMsgObj.value); Assert.equal(true, (statusFlagObj.value & EnigmailConstants.END_ENCRYPTION) !== 0); const blockType = EnigmailArmor.locateArmoredBlock(encryptResult, 0, "", {}, {}, {}); Assert.equal("MESSAGE", blockType); @@ -84,12 +83,8 @@ }))); test(withTestGpgHome(withEnigmail(function shouldGetErrorReason() { - let r = EnigmailEncryption.determineOwnKeyUsability(EnigmailConstants.SEND_SIGNED, "strike.devtest@gmail.com"); - let expected = EnigmailLocale.getString("keyRing.noSecretKey", ["anonymous strike ", "0x781617319CE311C4"]) + "\n"; - Assert.equal(r.errorMsg, expected); - - r = EnigmailEncryption.determineOwnKeyUsability(EnigmailConstants.SEND_SIGNED | EnigmailConstants.SEND_ENCRYPTED, "nobody@notfound.net"); - expected = EnigmailLocale.getString("errorOwnKeyUnusable", "nobody@notfound.net"); + let r = EnigmailEncryption.determineOwnKeyUsability(EnigmailConstants.SEND_SIGNED | EnigmailConstants.SEND_ENCRYPTED, "nobody@notfound.net"); + let expected = EnigmailLocale.getString("errorOwnKeyUnusable", "nobody@notfound.net"); Assert.equal(r.errorMsg, expected); }))); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/errorHandling-test.js enigmail-2.1.3+ds1/package/tests/errorHandling-test.js --- enigmail-2.0.12+ds1/package/tests/errorHandling-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/errorHandling-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,7 +1,6 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false */ /*global decryptionFailed: false, newContext: false, detectForgedInsets: false */ /*global component: false */ -/*jshint -W097 */ /* * 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 @@ -12,9 +11,7 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withTestGpgHome: false */ -testing("errorHandling.jsm"); /*global EnigmailErrorHandling: false, Ci: false */ -component("enigmail/locale.jsm"); /*global EnigmailLocale: false */ -component("enigmail/constants.jsm"); /*global EnigmailConstants: false */ +testing("errorHandling.jsm"); /*global EnigmailErrorHandling: false, EnigmailConstants: false, EnigmailLocale: false */ test(function decryptionFailedWillSetDecryptionFailedFlag() { var context = {}; @@ -204,4 +201,4 @@ Assert.ok((retStatusObj.statusFlags & EnigmailConstants.DISPLAY_MESSAGE) !== 0); Assert.assertContains(retStatusObj.statusMsg, EnigmailLocale.getString("errorHandling.pinentryError")); -}); +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/execution-test.js enigmail-2.1.3+ds1/package/tests/execution-test.js --- enigmail-2.0.12+ds1/package/tests/execution-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/execution-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,4 @@ -/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false, Cc: false, Ci: false */ -/*jshint -W097 */ +/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: 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 @@ -11,8 +10,8 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, withTestGpgHome: false */ testing("execution.jsm"); /*global EnigmailExecution: false */ -component("enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ -component("enigmail/gpg.jsm"); /*global EnigmailGpg: false */ +const EnigmailGpgAgent = component("enigmail/gpgAgent.jsm").EnigmailGpgAgent; +const EnigmailGpg = component("enigmail/gpg.jsm").EnigmailGpg; test(withTestGpgHome(withEnigmail(function shouldExecCmd() { const command = EnigmailGpgAgent.agentPath; @@ -40,4 +39,4 @@ Assert.assertContains(output, ":user ID packet:"); Assert.assertContains(output, ":signature packet:"); Assert.assertContains(output, ":public sub key packet:"); -}))); +}))); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/expiry-test.js enigmail-2.1.3+ds1/package/tests/expiry-test.js --- enigmail-2.0.12+ds1/package/tests/expiry-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/expiry-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,6 +1,5 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false */ -/*global do_test_finished: false, component: false, Cc: false, Ci: false, setupTestAccounts: false */ -/*jshint -W097 */ +/*global do_test_finished: false, component: false, setupTestAccounts: 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 @@ -11,16 +10,14 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, withTestGpgHome: false */ -testing("keyUsability.jsm"); /*global EnigmailKeyUsability: false */ -component("enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ -component("enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -component("enigmail/locale.jsm"); /*global EnigmailLocale: false */ +testing("keyUsability.jsm"); /*global EnigmailKeyUsability: false, EnigmailLocale: false, EnigmailPrefs: false */ +const EnigmailKeyRing = component("enigmail/keyRing.jsm").EnigmailKeyRing; -/*global Math: false, Date: false, uniqueKeyList: false, DAY: false */ +/*global uniqueKeyList: false, DAY: false */ setupTestAccounts(); -test(function shouldCheckKeyExpiry() { +test(withTestGpgHome(withEnigmail(function shouldCheckKeyExpiry() { EnigmailKeyRing.clearCache(); let keyListObj = EnigmailKeyRing.getAllKeys(); @@ -42,6 +39,7 @@ Assert.equal(b.length, 3); keyListObj.keySortList.push(1); // ensure that key list is not reloaded + keyListObj.keyList = []; keyListObj.keyList.push(createKeyObj("ABCDEF0123456789", "user1@enigmail-test.net", now + DAY * 5, true)); keyListObj.keyList.push(createKeyObj("DBCDEF0123456789", "user2@enigmail-test.net", now - DAY * 5, true)); keyListObj.keyList.push(createKeyObj("EBCDEF0123456789", "user2@enigmail-test.net", now + DAY * 100, true)); @@ -60,14 +58,15 @@ k = EnigmailKeyUsability.getExpiryForKeySpec(["user1@enigmail-test.net", "user2@enigmail-test.net", "user5@enigmail-test.net"], 10); Assert.equal(k.map(getKeyId).join(" "), "ABCDEF0123456789 ACCDEF0123456789"); -}); +}))); test(function shouldCheckKeySpecs() { let a = EnigmailKeyUsability.getKeysSpecForIdentities(); + Assert.equal(a.length, 3); Assert.equal(a.join(" "), "ABCDEF0123456789 user2@enigmail-test.net user4@enigmail-test.net"); }); -test(function shouldGetNewlyExpiredKeys() { +test(withTestGpgHome(withEnigmail(function shouldGetNewlyExpiredKeys() { EnigmailPrefs.setPref("keyCheckResult", ""); EnigmailPrefs.setPref("warnKeyExpiryNumDays", 10); let a = EnigmailKeyUsability.getNewlyExpiredKeys(); @@ -90,9 +89,9 @@ a = EnigmailKeyUsability.getNewlyExpiredKeys(); Assert.equal(a.length, 0); -}); +}))); -test(function shouldDoKeyExpiryCheck() { +test(withTestGpgHome(withEnigmail(function shouldDoKeyExpiryCheck() { EnigmailPrefs.setPref("keyCheckResult", ""); EnigmailPrefs.setPref("warnKeyExpiryNumDays", 101); @@ -110,7 +109,7 @@ EnigmailPrefs.setPref("warnKeyExpiryNumDays", 10); str = EnigmailKeyUsability.keyExpiryCheck(); Assert.equal(str, ""); -}); +}))); function getKeyId(key) { return key.keyId; @@ -153,4 +152,4 @@ return this.fpr; } }; -} +} \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/files-test.js enigmail-2.1.3+ds1/package/tests/files-test.js --- enigmail-2.0.12+ds1/package/tests/files-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/files-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,6 +1,5 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false */ -/*global EnigmailCore: false, Cc: false, Ci: false, EnigmailFiles: false, EnigmailLog: false, EnigmailPrefs: false */ -/*global Components: false */ +/*global EnigmailCore: false, EnigmailFiles: false, EnigmailLog: false, EnigmailPrefs: 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 @@ -11,8 +10,7 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, addMacPaths: false */ -testing("files.jsm"); -component("enigmail/os.jsm"); /*global EnigmailOS: false */ +testing("files.jsm"); /* global EnigmailOS: false */ // testing: readFile test(function readFileReturnsContentOfExistingFile() { @@ -56,10 +54,9 @@ Assert.equal(0, EnigmailFiles.ensureWritableDirectory(md, 0x1C0)); try { - md.permissions = 0; + md.permissions = 0x1C0; Assert.equal(0, EnigmailFiles.ensureWritableDirectory(md, 0x1C0)); - } - catch (x) { + } catch (x) { // don't try if permissions cannot be modified } @@ -70,7 +67,10 @@ md.remove(false); let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); - if (env.get("USER") !== "root") { + + if (env.get("USER") !== "root" && (!EnigmailOS.isDosLike)) { + // these two test cases don't work as expected if the test is run with root permissions + md.initWithPath("/does/not/exist"); Assert.equal(1, EnigmailFiles.ensureWritableDirectory(md, 0x1C0)); @@ -78,10 +78,9 @@ let envS = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); let sysRoot = envS.get("SystemRoot"); md.initWithPath(sysRoot); - } - else + } else md.initWithPath("/"); Assert.equal(2, EnigmailFiles.ensureWritableDirectory(md, 0x1C0)); } -}); +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/filters-test.js enigmail-2.1.3+ds1/package/tests/filters-test.js --- enigmail-2.0.12+ds1/package/tests/filters-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/filters-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,6 +1,5 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false */ -/*global EnigmailCore: false, Cc: false, Ci: false, EnigmailFiles: false, EnigmailLog: false, EnigmailPrefs: false */ -/*global Components: false */ +/*global EnigmailCore: false, EnigmailFiles: false, EnigmailLog: false, EnigmailPrefs: 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 @@ -12,7 +11,7 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, addMacPaths: false */ testing("filters.jsm"); /* global JsmimeEmitter: false, EnigmailFilters: false, processIncomingMail: false */ -component("enigmail/files.jsm"); /* global EnigmailFiles: false */ +const EnigmailFiles = component("enigmail/files.jsm").EnigmailFiles; // testing: JsmimeEmitter test(function mimeEmitterBasicTest() { @@ -82,8 +81,7 @@ Assert.equal(rawMessageData, testString); let ct = msg.headers.contentType.type; Assert.equal(ct, "text/plain"); - } - catch (ex) { + } catch (ex) { Assert.equal(ex.toString(), ""); } do_test_finished(); @@ -99,6 +97,10 @@ do_test_pending(); - var fileUri = ioService.newFileURI(md); - processIncomingMail(fileUri.spec, true); -}); + try { + processIncomingMail(md, true); + } catch (ex) { + Assert.ok(false, "processIncomingMail: exception " + ex.toString()); + do_test_finished(); + } +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/funcs-test.js enigmail-2.1.3+ds1/package/tests/funcs-test.js --- enigmail-2.0.12+ds1/package/tests/funcs-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/funcs-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,6 +1,6 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, EnigmailApp: false */ -/*global EnigmailFuncs: false, rulesListHolder: false, EC: false */ -/*jshint -W097 */ +/*global EnigmailFuncs: false, rulesListHolder: false, EC: false, setupTestAccounts: 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 @@ -21,6 +21,8 @@ } }; +setupTestAccounts("tester@enigmail.org"); + test(function stripEmail() { EnigmailFuncsTests.testStripEmail("some stuff ", "a@b.de"); @@ -98,3 +100,30 @@ Assert.equal(e, 0); }); + +test(function testGetOwnEmailAddresses() { + let r = EnigmailFuncs.getOwnEmailAddresses(); + + const expectedResult = [ + "tester@enigmail.org", + "user2@enigmail-test.net", + "user3@enigmail-test.net", + "user4@enigmail-test.net" + ]; + + for (let i of expectedResult) { + Assert.ok(i in r, `${i} is not in own emails`); + } +}); + +test(function testGetNumberOfRecipients() { + + let compFields = { + to: "tester@enigmail.org, another.tester@enigmail.org", + cc: "user4@enigmail-test.net, Peter " + }; + + let n = EnigmailFuncs.getNumberOfRecipients(compFields); + Assert.equal(n, 2, "number of recipients"); + +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/gnupg-keylist-test.js enigmail-2.1.3+ds1/package/tests/gnupg-keylist-test.js --- enigmail-2.0.12+ds1/package/tests/gnupg-keylist-test.js 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/gnupg-keylist-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,84 @@ +/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, */ +/*global resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: 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/. + */ + +/* eslint no-useless-concat: 0*/ +"use strict"; + +/*global EnigmailFiles: false */ +do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, withTestGpgHome: false */ + +/*createAndSortKeyList: false, Number: false */ + +testing("cryptoAPI/gnupg-keylist.jsm"); /*global appendKeyItems: false, EnigmailTrust: false, EnigmailLocale: false */ + +test(function shouldCreateKeyListObject() { + // from: gpg2 --charset utf-8 --display-charset utf-8 --batch --no-tty --status-fd 2 --with-fingerprint --fixed-list-mode --with-colons --list-keys + let pubKeyInfo = [ + // user with trust level "o" (unknown) + "tru::1:1443339321:1451577200:3:1:5", + // Key 1 + "pub:o:4096:1:DEF9FC808A3FF001:1388513885:1546188604::u:::scaESCA:", + "fpr:::::::::EA25EF48BF2001E41FAB0C1CDEF9FC808A3FF001:", + "uid:o::::1389038412::44F73158EF0F47E4595B1FD8EC740519DE24B994::A User ID with CAPITAL letters :", + "uid:-::::1389038405::3FC8999BDFF08EF4210026D3F1C064C072517376::A second User ID with CAPITAL letters :", + "sub:o:4096:1:E2DEDFFB80C14584:1388513885:1546188604:::::e:", + "sub:o:3072:1:AB908C90BED8AC3E:1388513886:1746188604:::::c:", + // Key 2 + "pub:-:2048:1:8439E17046977C46:1464214329:::-:::scESC::::::23::0:", + "fpr:::::::::8C140834F2D683E9A016D3098439E17046977C46:", + "uid:-::::1464214329::6D3876B55C560A589EDF6CC109B4A9DCB50614D6::dev-tiger ::::::::::0:", + "sub:-:2048:1:55927D0F0E5A9DF5:1464214329::::::e::::::23:", + "fpr:::::::::BB5227C62D575DC0857AFC2755927D0F0E5A9DF5:" + ]; + + // from: gpg2 --charset utf-8 --display-charset utf-8 --batch --no-tty --status-fd 2 --with-fingerprint --fixed-list-mode --with-colons --list-secret-keys + let secKeyInfo = [ + // Key 3 (does not exist on pubkey list) + "sec:u:3072:1:D59E3B46243D2AA4:1530205118:::u:::cESC:::+:::23::0:", + "fpr:::::::::09933176C72A34576C1EB444D59E3B46243D2AA4:", + "grp:::::::::AFF4F764AF0A9B1A5A1EC6C2DB5749C848252033:", + "uid:u::::1530205118::18B030504D1756B186D2EF8642F53EFA63B14148::Something ::::::::::0:", + "ssb:u:3072:1:BA3C01011F0EECD2:1530205137::::::s:::+:::23:", + "fpr:::::::::0A82F10C8E14AE909176F8DABA3C01011F0EECD2:", + "grp:::::::::EDA4C757CE3587DC8CE677A032397F21F9930319:", + "ssb:u:3072:1:3AB1459E2DABC99A:1530205155::::::e:::+:::23:", + "fpr:::::::::0EF326B8FFA4A6564650E4763AB1459E2DABC99A:", + "grp:::::::::7EA9BAC4F20EB5CA23DD3D55A55377D2307035AC:", + // Key 1 (exists on pubkey list) + "sec::4096:1:DEF9FC808A3FF001:1388513885:1546188604:::::::::", + "fpr:::::::::EA25EF48BF2001E41FAB0C1CDEF9FC808A3FF001:", + "uid:::::::44F73158EF0F47E4595B1FD8EC740519DE24B994::a user id with no capital letters :", + "uid:::::::3FC8999BDFF08EF4210026D3F1C064C072517376::A second User ID with CAPITAL letters :", + "ssb::4096:1:E2DEDFFB80C14584:1388513885::::::::::" + ]; + + let keyListObj = { + keys: [], + index: [] + }; + appendKeyItems(pubKeyInfo, keyListObj); + appendKeyItems(secKeyInfo, keyListObj); + + Assert.notEqual(keyListObj.keys.length, 0); + Assert.equal(keyListObj.keys[0].userId, "A User ID with CAPITAL letters "); + Assert.equal(keyListObj.keys[0].keyId, "DEF9FC808A3FF001"); + Assert.equal(keyListObj.keys[0].fpr, "EA25EF48BF2001E41FAB0C1CDEF9FC808A3FF001"); + Assert.ok(keyListObj.keys[0].secretAvailable); + Assert.equal(keyListObj.keys[0].subKeys.length, 2); + Assert.equal(keyListObj.keys[0].subKeys[1].keyUseFor, "c"); + Assert.equal(keyListObj.keys[0].userIds.length, 2); + Assert.equal(keyListObj.keys[0].userIds[1].keyTrust, "-"); + Assert.equal(keyListObj.index.DEF9FC808A3FF001.userId, "A User ID with CAPITAL letters "); + Assert.equal(keyListObj.keys[1].keyId, "8439E17046977C46"); + Assert.equal(keyListObj.index["8439E17046977C46"].userId, "dev-tiger "); + Assert.equal(keyListObj.keys[1].secretAvailable, undefined); + Assert.equal(keyListObj.keys[2].fpr, "09933176C72A34576C1EB444D59E3B46243D2AA4"); + Assert.ok(keyListObj.keys[2].secretAvailable); + Assert.equal(keyListObj.keys[2].userId, "Something "); +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/gpg-test.js enigmail-2.1.3+ds1/package/tests/gpg-test.js --- enigmail-2.0.12+ds1/package/tests/gpg-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/gpg-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,6 +1,5 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false */ /*global TestHelper: false, withEnvironment: false, nsIWindowsRegKey: true */ -/*jshint -W097 */ /* * 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 @@ -10,15 +9,16 @@ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); -/*global TestHelper: false, withEnvironment: false, withEnigmail: false, component: false, withTestGpgHome: false, osUtils: false */ +/*global withEnigmail: false, component: false, withTestGpgHome: false, osUtils: false */ +/*global MINIMUM_GPG_VERSION: false */ testing("gpg.jsm"); /*global EnigmailGpg: false, getGpgFeature: false, lazyEnv: true, usesDirmngr: false, dirmngrConfiguredWithTor: false */ -component("enigmail/execution.jsm"); /*global EnigmailExecution: false, MINIMUM_GPG_VERSION: false */ -component("enigmail/subprocess.jsm"); /*global subprocess: false */ -component("enigmail/files.jsm"); /*global EnigmailFiles: false */ -component("enigmail/os.jsm"); /*global EnigmailOS: false */ -component("enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ -component("enigmail/versioning.jsm"); /*global EnigmailVersioning: false */ +const EnigmailExecution = component("enigmail/execution.jsm").EnigmailExecution; +const subprocess = component("enigmail/subprocess.jsm").subprocess; +const EnigmailFiles = component("enigmail/files.jsm").EnigmailFiles; +const EnigmailOS = component("enigmail/os.jsm").EnigmailOS; +const EnigmailGpgAgent = component("enigmail/gpgAgent.jsm").EnigmailGpgAgent; +const EnigmailVersioning = component("enigmail/versioning.jsm").EnigmailVersioning; function withStubFormatCmdLine(f) { return function() { @@ -247,4 +247,4 @@ const output = EnigmailGpg.getGpgFeature("version-supported"); Assert.equal(output, undefined); }); -}); +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/gpgAgent-test.js enigmail-2.1.3+ds1/package/tests/gpgAgent-test.js --- enigmail-2.0.12+ds1/package/tests/gpgAgent-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/gpgAgent-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,6 +1,5 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false */ /*global TestHelper: false, withEnvironment: false, nsIWindowsRegKey: true */ -/*jshint -W097 */ /* * 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 @@ -10,12 +9,10 @@ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); -/*global TestHelper: false, withEnvironment: false, withEnigmail: false, component: false, - withTestGpgHome: false, osUtils: false, EnigmailFiles */ +/*global withEnigmail: false, component: false, withTestGpgHome: false, osUtils: false, EnigmailFiles */ -testing("gpgAgent.jsm"); /*global EnigmailGpgAgent: false, EnigmailOS: false, getHomedirFromParam: false */ -component("enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -component("enigmail/gpg.jsm"); /*global EnigmailGpg: false */ +testing("gpgAgent.jsm"); /*global EnigmailGpgAgent: false, EnigmailOS: false, getHomedirFromParam: false, EnigmailPrefs: false */ +const EnigmailGpg = component("enigmail/gpg.jsm").EnigmailGpg; // testing: determineGpgHomeDir // environment: GNUPGHOME @@ -58,8 +55,7 @@ resetting(EnigmailOS, 'getWinRegistryString', function(a, b, c) { if (a === "Software\\GNU\\GNUPG" && b === "HomeDir" && c === "foo bar") { return "\\foo\\bar\\gnupg"; - } - else { + } else { return "\\somewhere\\else"; } }, function() { @@ -228,4 +224,4 @@ hd = getHomedirFromParam('--opt1 --homedir "C:\\My Path\\is\\Very \\"long 2\\"" --opt2 "Some \\"more\\" fun"'); Assert.equal(hd, 'C:\\My Path\\is\\Very \\"long 2\\"'); -}); +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/initialize.js enigmail-2.1.3+ds1/package/tests/initialize.js --- enigmail-2.0.12+ds1/package/tests/initialize.js 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/initialize.js 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,15 @@ +/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false */ +/*global EnigmailCore: false, EnigmailFiles: false, EnigmailLog: false, EnigmailPrefs: false */ +/*global setupTestAccounts: false, setupTestAccount: false, getCurrentTime: true */ +/* + * 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"; + +do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, addMacPaths: false, withEnigmail: false, withTestGpgHome: false*/ +TestHelper.loadDirectly("tests/mailHelper.js"); /*global MailHelper: false */ + +MailHelper.deleteAllAccounts(); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/installGnuPG-test.js enigmail-2.1.3+ds1/package/tests/installGnuPG-test.js --- enigmail-2.0.12+ds1/package/tests/installGnuPG-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/installGnuPG-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,6 +1,5 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false */ -/*global do_test_finished: false, component: false, Cc: false, Ci: false, setupTestAccounts: false */ -/*jshint -W097 */ +/*global do_test_finished: false, component: false, setupTestAccounts: 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 @@ -17,7 +16,7 @@ test(function shouldCheckHashSum() { let inst = new Installer(null); inst.installerFile = do_get_file("resources/dev-strike.asc", false); - inst.hash = "15bc9d49f716dfb467c4e69241e4161df4aa3004ab0a21cd616fb2f4e46f0cd3"; // SHA256 sum of installerFile + inst.hash = "918f29289544d619fde087c98c35c7b39ca46616f00578fd90574cb78f15a85b"; // SHA256 sum of installerFile Assert.ok(inst.checkHashSum()); }); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/key-test.js enigmail-2.1.3+ds1/package/tests/key-test.js --- enigmail-2.0.12+ds1/package/tests/key-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/key-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,6 +1,5 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, */ -/*global Components: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false, Cc: false, Ci: false */ -/*jshint -W097 */ +/*global resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: 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 @@ -11,11 +10,9 @@ "use strict"; /*global EnigmailFiles: false */ -do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, withTestGpgHome: false, getKeyListEntryOfKey: false, gKeyListObj: true */ +do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, withTestGpgHome: false, gKeyListObj: true */ -testing("key.jsm"); /*global EnigmailKey: false */ -component("enigmail/files.jsm"); /*global EnigmailFiles: false */ -component("enigmail/openpgp.jsm"); /*global EnigmailOpenPGP: false */ +testing("key.jsm"); /*global EnigmailKey: false, EnigmailOpenPGP: false */ //EnigmailOpenPGP.initialize(); // make sure OpenPGP is initialized and available test(function shouldGetKeyDetails() { @@ -51,11 +48,6 @@ const pubKeyData = EnigmailFiles.readFile(publicKey1) + "\r\n" + EnigmailFiles.readFile(publicKey2); - - let keyBlocks = EnigmailKey.splitArmoredBlocks(pubKeyData); - - Assert.equal(keyBlocks.length, 2); - let keyList = EnigmailKey.getKeyListFromKeyBlock(pubKeyData, {}); Assert.equal(keyList.length, 2); @@ -256,4 +248,4 @@ Assert.equal(k.id, "781617319CE311C4"); Assert.ok(!k.isSecret); Assert.equal(k.name, "anonymous strike "); -}); +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/keyEditor-test.js enigmail-2.1.3+ds1/package/tests/keyEditor-test.js --- enigmail-2.0.12+ds1/package/tests/keyEditor-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/keyEditor-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,6 +1,5 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, withTestGpgHome:false */ -/*global Ec: false, Cc: false, Ci: false, do_print: false, EnigmailCore: false, EnigmailKeyEditor: false, Components: false, component: false, EnigmailPrefs: false, EnigmailExecution: false */ -/*jshint -W097 */ +/*global Ec: false, do_print: false, EnigmailCore: false, EnigmailKeyEditor: false, component: false, EnigmailPrefs: false, EnigmailExecution: 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 @@ -11,9 +10,8 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false */ -testing("keyEditor.jsm"); /*global editKey: false */ -component("enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ -component("enigmail/time.jsm"); /*global EnigmailTime: false */ +testing("keyEditor.jsm"); /*global editKey: false, EnigmailKeyRing: false */ +var EnigmailTime = component("enigmail/time.jsm").EnigmailTime; test(withTestGpgHome(withEnigmail(function shouldEditKey() { importKeys(); @@ -137,4 +135,4 @@ var publicImportResult = EnigmailKeyRing.importKeyFromFile(publicKey, errorMsgObj, importedKeysObj); var secretImportResult = EnigmailKeyRing.importKeyFromFile(secretKey, errorMsgObj, importedKeysObj); return [publicImportResult, secretImportResult]; -} +} \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/keyObj-test.js enigmail-2.1.3+ds1/package/tests/keyObj-test.js --- enigmail-2.0.12+ds1/package/tests/keyObj-test.js 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/keyObj-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,55 @@ +/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, */ +/*global resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: 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/. + */ + +/* eslint no-useless-concat: 0*/ +"use strict"; + +do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, withTestGpgHome: false, gKeyListObj: true */ + +/*global createAndSortKeyList: false */ +const EnigmailGpg = component("enigmail/gpg.jsm").EnigmailGpg; +const EnigmailKeyRing = component("enigmail/keyRing.jsm").EnigmailKeyRing; + +testing("keyObj.jsm"); /*global EnigmailKeyObj: false */ + +test(withTestGpgHome(withEnigmail(function shouldExportMinimalSubkey() { + const publicKey = do_get_file("resources/multi-uid.asc", false); + const errorMsgObj = {}; + const importedKeysObj = {}; + const importResult = EnigmailKeyRing.importKeyFromFile(publicKey, errorMsgObj, importedKeysObj); + + Assert.assertContains(importedKeysObj.value, "ADC49530CB6B132412D856107F1568CB8997F7BA"); + Assert.equal(importResult, 0, errorMsgObj); + + const keyObj = EnigmailKeyRing.getKeyById("0x7F1568CB8997F7BA"); + Assert.assertContains(keyObj.userId, "alice@example.invalid"); + + if (EnigmailGpg.getGpgFeature("export-specific-uid")) { + // only perform test if GnuPG 2.2.9+ is available + let minKey = keyObj.getMinimalPubKey("bob@somewhere.invalid"); + Assert.equal(minKey.exitCode, 0); + + Assert.equal(minKey.keyData.substr(0, 50), "mQGNBFub08oBDACmb04i4u8xUV1ADbnbN5l83mpr70OyWVJb5E"); + Assert.equal(minKey.keyData.substr(-50, 50), "p9TFNKjguUrrGrVnmnmy/YoGTJWuGqrZy8kcC3LCjg0k2mV0M="); + } + + EnigmailGpg.agentVersion = "2.2.1"; + Assert.ok(!EnigmailGpg.getGpgFeature("export-specific-uid")); + + let minKey = keyObj.getMinimalPubKey("bob@somewhere.invalid"); + Assert.equal(minKey.exitCode, 0); + Assert.equal(minKey.keyData.substr(3, 50), "NBFub08oBDACmb04i4u8xUV1ADbnbN5l83mpr70OyWVJb5ElIc"); + Assert.ok(minKey.keyData.substr(-50, 50) == "1MU0qOC5SusatWeaebL9igZMla4aqtnLyRwLcsKODSTaZXQw==" || + minKey.keyData.substr(-50, 50) == "p9TFNKjguUrrGrVnmnmy/YoGTJWuGqrZy8kcC3LCjg0k2mV0M=", "min key matches"); + + minKey = keyObj.getMinimalPubKey("does@not.exist"); + Assert.equal(minKey.exitCode, 0); + + Assert.equal(minKey.keyData.substr(0, 50), "xsDNBFub08oBDACmb04i4u8xUV1ADbnbN5l83mpr70OyWVJb5E"); + Assert.equal(minKey.keyData.substr(-50, 50), "1MU0qOC5SusatWeaebL9igZMla4aqtnLyRwLcsKODSTaZXQw=="); +}))); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/keyRefreshService-test.js enigmail-2.1.3+ds1/package/tests/keyRefreshService-test.js --- enigmail-2.0.12+ds1/package/tests/keyRefreshService-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/keyRefreshService-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,5 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, test: false, Assert: false, resetting: false */ -/*global Cc: false, Ci: false, testing: false, component: false*/ +/*global testing: false, component: 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 @@ -10,20 +10,16 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, withEnigmail: false, withTestGpgHome: false, withLogFiles: false, assertLogContains: false, assertLogDoesNotContain: false, withPreferences: false */ -testing("keyRefreshService.jsm"); /*global EnigmailKeyRefreshService: false, calculateMaxTimeForRefreshInMilliseconds, HOURS_PER_WEEK_ENIGMAIL_IS_ON_PREF, calculateWaitTimeInMilliseconds, startWith, ONE_HOUR_IN_MILLISEC, refreshWith, refreshKey: false, getRandomKeyId: false, setupNextRefresh: false */ - -component("enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ -component("enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -component("enigmail/rng.jsm"); /*global EnigmailRNG: false */ -component("enigmail/keyserverUris.jsm"); /*global EnigmailKeyserverURIs: false */ +testing("keyRefreshService.jsm"); +/*global EnigmailKeyRefreshService: false, calculateMaxTimeForRefreshInMilliseconds, HOURS_PER_WEEK_ENIGMAIL_IS_ON_PREF, calculateWaitTimeInMilliseconds, startWith, ONE_HOUR_IN_MILLISEC, refreshWith, refreshKey: false, getRandomKeyId: false, setupNextRefresh: false, +EnigmailKeyRing: false, EnigmailPrefs: false, EnigmailRNG: false, EnigmailKeyserverURIs: false */ function withKeys(f) { return function() { try { EnigmailKeyRing.clearCache(); f(); - } - finally { + } finally { EnigmailKeyRing.clearCache(); } }; @@ -135,23 +131,30 @@ } }; + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + const keyserver = { refreshWasCalled: false, - refresh: function(keyId) { + download: function(keyId) { Assert.equal(keyId, expectedKeyId); keyserver.refreshWasCalled = true; } }; - refreshWith(keyserver, timer, false); + refreshWith(keyserver, timer, false).then(res => { + Assert.equal(keyserver.refreshWasCalled, false, "keyserver.refresh was called and shouldn't have been"); + Assert.equal(timer.initWithCallbackWasCalled, true, "timer.initWithCallback was not called"); + inspector.exitNestedEventLoop(); + }); + inspector.enterNestedEventLoop(0); + + refreshWith(keyserver, timer, true).then(res => { + Assert.equal(keyserver.refreshWasCalled, true, "keyserver.refresh was not called"); + Assert.equal(timer.initWithCallbackWasCalled, true, "timer.initWithCallback was not called"); + inspector.exitNestedEventLoop(); + }); + inspector.enterNestedEventLoop(0); - Assert.equal(keyserver.refreshWasCalled, false, "keyserver.refresh was called and shouldn't have been"); - Assert.equal(timer.initWithCallbackWasCalled, true, "timer.initWithCallback was not called"); - - refreshWith(keyserver, timer, true); - - Assert.equal(keyserver.refreshWasCalled, true, "keyserver.refresh was not called"); - Assert.equal(timer.initWithCallbackWasCalled, true, "timer.initWithCallback was not called"); }); })))); @@ -233,4 +236,4 @@ EnigmailKeyRefreshService.start(keyserver); assertLogContains(keyRefreshStartMessage); }); -}))); +}))); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/keyRing-test.js enigmail-2.1.3+ds1/package/tests/keyRing-test.js --- enigmail-2.0.12+ds1/package/tests/keyRing-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/keyRing-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,6 +1,5 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, */ -/*global Components: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false, Cc: false, Ci: false */ -/*jshint -W097 */ +/*global resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: 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 @@ -11,15 +10,13 @@ "use strict"; /*global EnigmailFiles: false */ -do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, withTestGpgHome: false, getKeyListEntryOfKey: false, gKeyListObj: true, withLogFiles: false */ +do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, withTestGpgHome: false, gKeyListObj: true */ -component("enigmail/trust.jsm"); /*global EnigmailTrust: false */ -component("enigmail/locale.jsm"); /*global EnigmailLocale: false */ -component("enigmail/log.jsm"); /*global EnigmailLog: false */ +let GnuPGKeyList = {}; +do_load_module("chrome://enigmail/content/modules/cryptoAPI/gnupg-keylist.jsm", GnuPGKeyList); /*global appendKeyItems: false */ +/*global createAndSortKeyList: false */ -/*global getUserIdList: false, createAndSortKeyList: false, Number: false */ - -testing("keyRing.jsm"); /*global EnigmailKeyRing: false */ +testing("keyRing.jsm"); /*global EnigmailKeyRing: false, EnigmailTrust: false, EnigmailLocale: false */ test(withTestGpgHome(withEnigmail(function shouldImportFromFileAndGetKeyDetails() { const publicKey = do_get_file("resources/dev-strike.asc", false); @@ -32,29 +29,6 @@ Assert.assertContains(keyDetails, "strike.devtest@gmail.com"); }))); -test(withTestGpgHome(withEnigmail(function shouldGetKeyListEntryOfKey() { - const publicKey = do_get_file("resources/dev-strike.asc", false); - const importResult = EnigmailKeyRing.importKeyFromFile(publicKey, {}, {}); - const keyDetails = getKeyListEntryOfKey("0xD535623BB60E9E71"); - - - // Output from GnuPG varies sligtly between different versions (new output data is added - // at the end of the list). Therefore each line is only compared to the length provided below - let expectedListing = [ - "pub:-:4096:1:781617319CE311C4:1430756251:::-:::scESC:", - "fpr:::::::::65537E212DC19025AD38EDB2781617319CE311C4:", - "uid:-::::1557592308::DB54FB278F6AE719DE0DE881B17D4C762F5752A9::anonymous strike :", - "sub:-:4096:1:D535623BB60E9E71:1430756251::::::e:" - ]; - - let keyDetList = keyDetails.split(/\n\r?/); - - for (let i = 0; i < expectedListing.length; i++) { - Assert.equal(keyDetList[i].substr(0, expectedListing[i].length), expectedListing[i]); - } - -}))); - test(withTestGpgHome(withEnigmail(function shouldGetKeyFunctions() { const publicKey = do_get_file("resources/dev-strike.asc", false); @@ -77,6 +51,7 @@ // search for fingerprint k = EnigmailKeyRing.getKeyById("65537E212DC19025AD38EDB2781617319CE311C4"); Assert.equal(k.fpr, "65537E212DC19025AD38EDB2781617319CE311C4"); + Assert.equal(k._sigList, null); let s = k.signatures; @@ -96,18 +71,6 @@ Assert.equal(ka.length, 2); }))); -test(withTestGpgHome(withEnigmail(function shouldGetUserIdList() { - const publicKey = do_get_file("resources/dev-strike.asc", false); - const secretKey = do_get_file("resources/dev-strike.sec", false); - EnigmailKeyRing.importKeyFromFile(publicKey, {}, {}); - EnigmailKeyRing.importKeyFromFile(secretKey, {}, {}); - let l = null; - l = getUserIdList(false, {}, {}, {}); - Assert.notEqual(l, null); - l = getUserIdList(true, {}, {}, {}); - Assert.notEqual(l, null); -}))); - test(withTestGpgHome(withEnigmail(function shouldCleanupClearCache() { const publicKey = do_get_file("resources/dev-strike.asc", false); const secretKey = do_get_file("resources/dev-strike.sec", false); @@ -137,19 +100,19 @@ "\n" + "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" + @@ -160,20 +123,20 @@ "\n" + "M7mU7NNYjocEmXWExq97aXS+3AE8utFttGHLpnvsE18T1rbDtjhoV6yGMSlbETxt" + "\n" + "AjIysEZpFqJDaWleYDpdhnFDzE5R+y2wBHVMz4luhckO5PD5iFpVrZbtn9HN202d" + "\n" + "qFYIKOm0WrrQO6CAvAAaeOvkdy2kuDC8tUoJ4N9TydyHMKQvseKSHYsLvJJRH9XM" + - "\n" + "5FqD9OSPFhFHABEBAAGJAjYEGAEKACACGwwWIQRlU34hLcGQJa047bJ4FhcxnOMR" + - "\n" + "xAUCXNb5GQAKCRB4FhcxnOMRxC5aD/9ibGiHb2c4ZKL0FBPZ5kPrBAWmxhXWEILc" + - "\n" + "Y2J/NZn3QeXbBnfA7NBs8vpjPjSazz/I+eOEKNZ07oq35EARG/v9X3JYu60q+Bo9" + - "\n" + "557W3K2csFAxSGzHz1EyPiYMVb/p8+R+3WK7QlVffc4+8lLCal+tTjwCVCmtWHsg" + - "\n" + "Kh2ctZVmeiP+ovJ7gjfVdNO6KRceOU25ZzEWoh4t0/K6Hmshcjtwt/43Nlg3GywA" + - "\n" + "QJq+lj3s5Lgm1mXdrktZV1iszu72aBFxH+qi66AjPk/kTabNJ7OxNca+5+v6Smwi" + - "\n" + "N3/9goW1VyLt7wV2YWpAE+ihq86U+efRseml9WFicOOBDL9ivwVVi5XUy1RS56Qk" + - "\n" + "o81Uolc1my/FZ75EGrdpORVXt8Uus/oNaX7LY2rKXSA3NzOIgtmfJzRkREsP6Uuf" + - "\n" + "w2npZFWCuPVtttw5I9n+EEcuSGvyEREtv8LpUlUIksJ5M+Mhxje7O94XPqHrPozK" + - "\n" + "fPwAuFygazVGCPvbZQohsHRKsq93a2T4gQ32Fo2SQLnY3+wh3qt1cnj29Hla9HVt" + - "\n" + "yPcvcN/nAC5IJkbrp8SV8zKSYBiwEcs1nc3Nan1byo8m1Up4+HlAyz70oMzUHThd" + - "\n" + "Znr5k9Xl24h14LlZfk450yj6CvVFilhH8wwQ7WRSzqAhTp6i/N9KXUHOczdXf7Zt" + - "\n" + "J14nd8wqFA==" + - "\n" + "=Hflu" + + "\n" + "5FqD9OSPFhFHABEBAAGJAjYEGAEIACACGwwWIQRlU34hLcGQJa047bJ4FhcxnOMR" + + "\n" + "xAUCW1X6FAAKCRB4FhcxnOMRxECYEACaDw6JFqgdHI5pH7pkRae9Vif63Ot7XEmS" + + "\n" + "xUGpoj/qbzZy+cm9lEfcOHC9cihFa0EwG1WpFUyuzl8z8f6nulJ2vi5unC007D8y" + + "\n" + "T5kwL7vaQ+gd1JtcPny3J6qRaNxY2KhlkkLFYFLSnpt/ye0S/HuCH7RjG1lYHga9" + + "\n" + "KULqYB+pdpFmfmPy6ogpHHaKQuYf/y9yRyylml/rjdRTWOzCa8L6y2y63y8mkcEZ" + + "\n" + "vUJ/WWAzCmka/w43uv3fPrui7wzMLDeCkSEomboax9bgTqqt9/ZNP9H0ja7XUNIj" + + "\n" + "HT8zn+h8YkjCHAupHRIltx7ZPaisZiz6RA/iwIE+rtkrYEOyCLsaHT+iXMsPFXLY" + + "\n" + "PMgR1usJqg2M3CzVdGmjXl0/ZZzo4a+wKzkRCnA1K4ZsJ/Py24QfqNIw8Jysab86" + + "\n" + "SVSpGq3YbDIuKI/6I5CSL36WlfDcsvypr6MvE7X59otGj+1qzmlHuscL95EchJAN" + + "\n" + "RJbTW1/IHw2VMqQhRMTBKftrMediC/xP9xtl4U3D8Wybk+ghQdwuW9x3SW9H8Dol" + + "\n" + "gzBI3fdHTevZCuJJFdXhmEyEa2eEcRioc/3zaAHGThE+8SnsA8IuuqALT43w3b14" + + "\n" + "LizcmRWQcBnH5+PlhXYf3/nAlEnXD6TCZrOGlNCzLTWQTBLg1kw97xS/PQyCg24X" + + "\n" + "snHSt1DRJA==" + + "\n" + "=I9l9" + "\n" + "-----END PGP PUBLIC KEY BLOCK-----" + "\n" + "-----BEGIN PGP PRIVATE KEY BLOCK-----" + "\n" + @@ -188,48 +151,48 @@ "\n" + "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" + @@ -240,47 +203,47 @@ "\n" + "hwSZdYTGr3tpdL7cATy60W20Ycume+wTXxPWtsO2OGhXrIYxKVsRPG0CMjKwRmkW" + "\n" + "okNpaV5gOl2GcUPMTlH7LbAEdUzPiW6FyQ7k8PmIWlWtlu2f0c3bTZ2oVggo6bRa" + "\n" + "utA7oIC8ABp46+R3LaS4MLy1Sgng31PJ3IcwpC+x4pIdiwu8klEf1czkWoP05I8W" + - "\n" + "EUcAEQEAAf4HAwI25oIFjb2KSf83GqZT0bDGDDuLAmJDv1MPOMSgLb1gRGWzyeWC" + - "\n" + "1+KXC/by4JP2zXbaLffFFLHg5Bfv+LHghnXPdZ/NoDKPR0tdnqiqP+9JNhAgOpZl" + - "\n" + "RP0sL9sNiCWn6Kx5bmMIvOi5yaCabZIbYVwMnx+3jTEgN3SBYa1T92MuqLQP6J5A" + - "\n" + "kJ2rF/QWx3Q/BOduS3/qjlUDbilDtrMogU9o//Sui/veAK+fjrCMcaq3f4AUKV8A" + - "\n" + "84E8C3l9OlyqCmM3SWO/69/fu+s+0DhPT67dPJykAoq97x9LfG7GSOk/3WIYXVfT" + - "\n" + "5Kuf88E0aYIb7BkOSBvz7LtJOWTgnBwSJyWlb6sRMMLb4hWHPehNc4UdXcaBxU4b" + - "\n" + "BSbtXBHpuLEeoOh4gqVisY901OOUERsFJqt5xe9CciTbwVXqkaU6Ofj0HBfLiUyZ" + - "\n" + "R6cIYCBEK+C6SfYaUUn98gOGx/b9dtzJM8fyDYdYaC6CS01BvyPglzBOXkCyh9r7" + - "\n" + "/sMm6JKeMXUNI86BqztfYyLVBgKHE5L88dfgQtUd+morUaK3iBvIrBpFUllDsUcp" + - "\n" + "03I1kX/8ZFJMqoqHOhzk0gYrJjkV6dvV4w+DrA0nelZjoWvER/Rf5lU5495RI3A1" + - "\n" + "64DLSPW/N6fyQZnnf0noJjwZBVO0U3q8f2fBWY8EgZrlvxS7K5yVlwFNc/YRLSwx" + - "\n" + "Qmitt8ZSaUs+J9vBkz1w7xJegSjReb1aGasNg+Rt89RKQQGFwIk0YVZQUcKyLgA2" + - "\n" + "5xQ1CC2N9z4du+B2Iwb+smq4DJEzg4/fo5ZDqWN165zAToqzmKE2+rR5q5Ix6gqQ" + - "\n" + "RUwMu/TY/mNwnIOuGMWGZMZ+F0IiwwxgopjMjMqaOmp9pwDlOoTEvvXcWDvBTejX" + - "\n" + "A+X5efeTOWd+7FgY4KsYV1j07YnxYKvnHvnE6qtl5qi5GFxEbr6L7T1jTG5GJAfS" + - "\n" + "cBQadQej47UF5lCZz81HN2MhoYDI8MlbvssrQuCQjtg+SHpoxPanoEkANZ9NoSg5" + - "\n" + "jLztpUD726s0ygBVVasTv/DpdEyrQ4qEiL8RezPwHoKmXg0hCT3ocS567Ye9/SFT" + - "\n" + "4vxFkbryqYDsiKntA2osbz+eHhjtIIMqNJuyqT/WWwi3HOQ0C/SfDDKAmev3RtWb" + - "\n" + "HCG4fJnEuSE4pZ3GuBaeIaNjRbb1Hdj57k3Wg2mUC9HEQDGXhSoVPrEl6dLDbNF8" + - "\n" + "0sNBBjdjmjchidiBaSBiN2WqBRcwq7t5xnr0iRXX4v/N6qPzqkkzojP24Qn2FANS" + - "\n" + "Lz+pDW/sAsa8hz8Wn67CE9SVVEMfCk64xxA+npmEjBBapP7cbVzw7zOQTCJiVD+M" + - "\n" + "rKjxJqzppp90VHhdoyF4xfZ+iB9D1ehteGJBIGRpouaQmfxQHhk5/h8UOX3kJTrl" + - "\n" + "mLfzNlMwUVrxRhREE1ycbne0pkpblvlg5ZuVugbFF7iKLvaJeOz73IPbcRpnFfFt" + - "\n" + "fsi6jcflDi9ZO9Nm2kPsGZL9yF8dzb/RTY7e9W4m0hXUtTeAWJmpah6Z0Dp1IYU8" + - "\n" + "wmypqiBqunpX8tZWlDc9a3UDAfp3aN2I1E7wvqf25cD7ZoipVJcOUcE+sfAERsLO" + - "\n" + "clSAbf4YO94Q1VD5Po+tlULmRWEsxlCZPfg2OSyFFSe2D3Y7N5fztuKfOUbyZjoh" + - "\n" + "rTHoCMOIeAs/R74/6Rq8f1kRsd7fmlDzhw5X89yccgYv+YfFrJrhkRUo9xNE6aW4" + - "\n" + "38o3seR1U5lWEr4yogPJ+tglEUamXr50RuFX/e49x1FHUpNCx3ES4B9hQV+myvMZ" + - "\n" + "iQI2BBgBCgAgAhsMFiEEZVN+IS3BkCWtOO2yeBYXMZzjEcQFAlzW+RkACgkQeBYX" + - "\n" + "MZzjEcQuWg//Ymxoh29nOGSi9BQT2eZD6wQFpsYV1hCC3GNifzWZ90Hl2wZ3wOzQ" + - "\n" + "bPL6Yz40ms8/yPnjhCjWdO6Kt+RAERv7/V9yWLutKvgaPeee1tytnLBQMUhsx89R" + - "\n" + "Mj4mDFW/6fPkft1iu0JVX33OPvJSwmpfrU48AlQprVh7ICodnLWVZnoj/qLye4I3" + - "\n" + "1XTTuikXHjlNuWcxFqIeLdPyuh5rIXI7cLf+NzZYNxssAECavpY97OS4JtZl3a5L" + - "\n" + "WVdYrM7u9mgRcR/qouugIz5P5E2mzSezsTXGvufr+kpsIjd//YKFtVci7e8FdmFq" + - "\n" + "QBPooavOlPnn0bHppfVhYnDjgQy/Yr8FVYuV1MtUUuekJKPNVKJXNZsvxWe+RBq3" + - "\n" + "aTkVV7fFLrP6DWl+y2Nqyl0gNzcziILZnyc0ZERLD+lLn8Np6WRVgrj1bbbcOSPZ" + - "\n" + "/hBHLkhr8hERLb/C6VJVCJLCeTPjIcY3uzveFz6h6z6Mynz8ALhcoGs1Rgj722UK" + - "\n" + "IbB0SrKvd2tk+IEN9haNkkC52N/sId6rdXJ49vR5WvR1bcj3L3Df5wAuSCZG66fE" + - "\n" + "lfMykmAYsBHLNZ3NzWp9W8qPJtVKePh5QMs+9KDM1B04XWZ6+ZPV5duIdeC5WX5O" + - "\n" + "OdMo+gr1RYpYR/MMEO1kUs6gIU6eovzfSl1BznM3V3+2bSdeJ3fMKhQ=" + - "\n" + "=HPTr" + + "\n" + "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" + + "\n" + "=oVjy" + "\n" + "-----END PGP PRIVATE KEY BLOCK-----", null, {}); const keyDetails = EnigmailKeyRing.getValidUids("0xD535623BB60E9E71").join("\n"); @@ -291,75 +254,27 @@ // uses the key listing from shouldGetKeyValidityErrors let key = EnigmailKeyRing.getKeyById("D535623BB60E9E71"); - let pubKey = key.getMinimalPubKey("strike.devtest@gmail.com"); + // this test is crucial as it depends on openpgp.js internal functions + let pubKey = key.getMinimalPubKey(); Assert.equal(pubKey.exitCode, 0); - Assert.equal(pubKey.keyData.substr(0, 192), - "mQINBFVHm5sBEACs94Ln+RMdeyBpWQtTZ/NZnwntsB10Wd3HTgo5sdA/OOFOJrWe" + - "tJfAZ/HRxiSu1bwRaFVC8p061ftTbxf8bsdfsykYJQQqPODfcO0/oY2n/Z93ya8K" + - "TzjXR3qBQ1P7f5x71yeuo7Zrj7B0G44Xjfy+1L0eka9paBqmm3U5cUew5wSr772L"); - - Assert.equal(pubKey.keyData.substr(-52), - "CvVFilhH8wwQ7WRSzqAhTp6i/N9KXUHOczdXf7ZtJ14nd8wqFA=="); - - Assert.equal(pubKey.keyData.length, 3020); - - - + Assert.equal(pubKey.keyData.substr(3, 126), + "NBFVHm5sBEACs94Ln+RMdeyBpWQtTZ/NZnwntsB10Wd3HTgo5sdA/OOFOJrWetJ" + + "fAZ/HRxiSu1bwRaFVC8p061ftTbxf8bsdfsykYJQQqPODfcO0/oY2n/Z93ya8KT"); + + if (pubKey.keyData.length === 3020) { + Assert.equal(pubKey.keyData.substr(-52), + "lEnXD6TCZrOGlNCzLTWQTBLg1kw97xS/PQyCg24XsnHSt1DRJA=="); + } else if (pubKey.keyData.length === 3080) { + Assert.equal(pubKey.keyData.substr(-52), + "wJRJ1w+kwmazhpTQsy01kEwS4NZMPe8Uvz0MgoNuF7Jx0rdQ0SQ="); + } else { + Assert.ok(false, "pubkey.keyData.length neither 3020 nor 3080"); + } }))); -test(function shouldCreateKeyListObject() { - // from: "P:\Program Files (x86)\GNU\GnuPG\pub\gpg2.exe" --charset utf-8 --display-charset utf-8 --batch --no-tty --status-fd 2 --with-fingerprint --fixed-list-mode --with-colons --list-keys - let keyInfo = [ - // user with trust level "o" (unknown) - "tru::1:1443339321:1451577200:3:1:5", - "pub:o:4096:1:DEF9FC808A3FF001:1388513885:1546188604::u:::scaESCA:", - "fpr:::::::::EA25EF48BF2001E41FAB0C1CDEF9FC808A3FF001:", - "uid:o::::1389038412::44F73158EF0F47E4595B1FD8EC740519DE24B994::A User ID with CAPITAL letters :", - "uid:o::::1389038405::3FC8999BDFF08EF4210026D3F1C064C072517376::A second User ID with CAPITAL letters :", - "sub:o:4096:1:E2DEDFFB80C14584:1388513885:1546188604:::::e:" - ]; - - // from: "P:\Program Files (x86)\GNU\GnuPG\pub\gpg2.exe" --charset utf-8 --display-charset utf-8 --batch --no-tty --status-fd 2 --with-fingerprint --fixed-list-mode --with-colons --list-secret-keys - let secKeyInfo = [ - "sec::4096:1:DEF9FC808A3FF001:1388513885:1546188604:::::::::", - "fpr:::::::::EA25EF48BF2001E41FAB0C1CDEF9FC808A3FF001:", - "uid:::::::44F73158EF0F47E4595B1FD8EC740519DE24B994::A User ID with CAPITAL letters :", - "uid:::::::3FC8999BDFF08EF4210026D3F1C064C072517376::A second User ID with CAPITAL letters :", - "ssb::4096:1:E2DEDFFB80C14584:1388513885::::::::::" - ]; - - createAndSortKeyList(keyInfo, secKeyInfo, - "validity", // sorted acc. to key validity - -1); // descending - - let keyListObj = gKeyListObj; - Assert.notEqual(keyListObj, null); - Assert.notEqual(keyListObj.keySortList, null); - Assert.notEqual(keyListObj.keySortList.length, null); - Assert.equal(keyListObj.keySortList.length, 1); - Assert.equal(keyListObj.keySortList[0].userId, "a user id with capital letters "); - Assert.equal(keyListObj.keySortList[0].keyId, "DEF9FC808A3FF001"); - Assert.notEqual(keyListObj.keyList, null); - Assert.equal(keyListObj.keyList[keyListObj.keySortList[0].keyNum].userId, "A User ID with CAPITAL letters "); - - const TRUSTLEVELS_SORTED = EnigmailTrust.trustLevelsSorted(); - let minTrustLevelIndex = TRUSTLEVELS_SORTED.indexOf("?"); - let details = {}; - let key = EnigmailKeyRing.getValidKeyForRecipient("user1@enigmail-test.de", minTrustLevelIndex, details); - Assert.notEqual(key, null); - Assert.equal(key, "DEF9FC808A3FF001"); - - minTrustLevelIndex = TRUSTLEVELS_SORTED.indexOf("f"); - details = {}; - key = EnigmailKeyRing.getValidKeyForRecipient("user1@enigmail-test.de", minTrustLevelIndex, details); - Assert.equal(key, null); - Assert.notEqual(details.msg, null); -}); - - test(withTestGpgHome(withEnigmail(function shouldExportKey() { const publicKey = do_get_file("resources/dev-strike.asc", false); const secretKey = do_get_file("resources/dev-strike.sec", false); @@ -368,15 +283,14 @@ EnigmailKeyRing.getAllKeys(); let pub = EnigmailKeyRing.extractKey(false, "0x781617319CE311C4", null, {}, {}).replace(/\r\n/g, "\n"); - Assert.equal(pub.substr(-50), "d8wqFA==\n=Hflu\n-----END PGP PUBLIC KEY BLOCK-----\n"); + Assert.equal(pub.substr(-50), "t1DRJA==\n=I9l9\n-----END PGP PUBLIC KEY BLOCK-----\n"); let pubAndSec = EnigmailKeyRing.extractKey(true, "strike.devtest@gmail.com", null, {}, {}).replace(/\r\n/g, "\n"); Assert.equal(pubAndSec.substr(-37), "\n-----END PGP PRIVATE KEY BLOCK-----\n"); - Assert.equal(pubAndSec.split(/\n/).length, 160); + Assert.equal(pubAndSec.split(/\n/).length, 161); }))); - const KeyRingHelper = { loadTestKeyList: function() { const pkFile = do_get_file("resources/pub-keys.asc", false); @@ -389,7 +303,14 @@ testKeyList.push(row); } } - createAndSortKeyList(testKeyList, [], + + let keyList = { + keys: [], + index: [] + }; + GnuPGKeyList.appendKeyItems(testKeyList, keyList); + + createAndSortKeyList(keyList.keys, "validity", // sorted acc. to key validity -1); // descending @@ -619,7 +540,15 @@ // NO Key 3 ]; - createAndSortKeyList(keyInfo, secKeyInfo, + let keyList = { + keys: [], + index: [] + }; + + GnuPGKeyList.appendKeyItems(keyInfo, keyList); + GnuPGKeyList.appendKeyItems(secKeyInfo, keyList); + + createAndSortKeyList(keyList.keys, "validity", // sorted acc. to key validity -1); // descending @@ -664,135 +593,4 @@ Assert.equal(cp.fprFormatted, "EA25 EF48 BF20 01E4 1FAB 0C1C DEF9 FC80 8A3F F001"); Assert.equal(cp.getEncryptionValidity().keyValid, false); -}); - - -test(withLogFiles(withTestGpgHome(withEnigmail(function shouldImportFromFileAndGetKeyDetails() { - const publicKey = do_get_file("resources/filterable-key.asc", false); - const errorMsgObj = {}; - const importedKeysObj = {}; - const importResult = EnigmailKeyRing.importKeyFromFile(publicKey, errorMsgObj, importedKeysObj); - Assert.assertContains(importedKeysObj.value, "CC68572FE740754B38D758D1227073A53A6FA857"); - Assert.equal(importResult, 0, errorMsgObj); - const output = { - "alice@example.org": "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", - "alice@example.net": "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" - }; - - let keyOut = EnigmailKeyRing.getKeyById("CC68572FE740754B38D758D1227073A53A6FA857"); - for (var address in output) { - let k = keyOut.getMinimalPubKey(address); - Assert.equal(k.exitCode, 0); - Assert.equal(k.errorMsg, ""); - EnigmailLog.DEBUG(" -> address: " + address + - "\n -> wanted: " + output[address] + - "\n -> got: " + k.keyData + - "\n"); - - Assert.equal(k.keyData, output[address]); - } -})))); \ No newline at end of file +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/keyserver-test.js enigmail-2.1.3+ds1/package/tests/keyserver-test.js --- enigmail-2.0.12+ds1/package/tests/keyserver-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/keyserver-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,5 @@ -/*global test:false, component: false, testing: false, Assert: false, do_load_module: false, do_get_cwd: false */ +/*global test:false, component: false, testing: false, Assert: false, do_load_module: false, do_get_cwd: false, do_get_file: false + do_test_finished: false: do_test_pending: 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 @@ -7,14 +8,11 @@ "use strict"; -do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withPreferences: false, resetting: false, withEnvironment: false, withEnigmail: false, withTestGpgHome: false, getKeyListEntryOfKey: false, gKeyListObj: true */ +do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withPreferences: false, resetting: false, withEnvironment: false, withEnigmail: false, withTestGpgHome: false, gKeyListObj: true */ -testing("keyserver.jsm"); /*global validKeyserversExist: false, currentProxyModule: true, Ci, executeRefresh: false, gpgRequest: false, requestOverTorWithSocks: false, requestOverTorWithHelper: false, build: false, buildRequests: false parseKeyserverUrl: false */ -component("enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -component("enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ -component("enigmail/gpg.jsm"); /*global EnigmailGpg: false */ -component("enigmail/locale.jsm"); /*global EnigmailLocale: false */ -component("enigmail/constants.jsm"); /*global EnigmailConstants: false */ +testing("keyserver.jsm"); +/*global false parseKeyserverUrl: false, accessHkpInternal: false, accessKeyBase: false, accessGnuPG: false +EnigmailPrefs: false, EnigmailKeyRing: false, EnigmailConstants: false, EnigmailLocale: false */ function setupKeyserverPrefs(keyservers, autoOn) { EnigmailPrefs.setPref("keyserver", keyservers); @@ -26,639 +24,288 @@ return (path.search(/^gpg/i) === 0); } -function torNotAvailableProperties() { - return { - isAvailable: false, - useTorMode: false, - socks: null, - helper: null - }; -} +test(function testParseUrl() { + let srv = "abc.de.fg"; + const HKP = "hkp"; + const HKP_PORT = "11371"; + let r = parseKeyserverUrl(srv); -test(function setupRequestWithTorHelper() { - const torArgs = ["--user", "randomUser", "--pass", "randomPassword", "/usr/bin/gpg2"]; - const torProperties = { - command: { - path: "/usr/bin/torsocks" - }, - args: torArgs, - envVars: ["TORSOCKS_USERNAME=abc", "TORSOCKS_PASSWORD=def"] - }; - const expectedArgs = torArgs - .concat(EnigmailGpg.getStandardArgs(true)) - .concat(["--keyserver", "hkps://keyserver.1:443"]) - .concat(["--recv-keys", "1234"]); - const action = EnigmailConstants.DOWNLOAD_KEY; - - const request = requestOverTorWithHelper("1234", "hkps://keyserver.1:443", torProperties, action); - - Assert.equal(request.command.path, "/usr/bin/torsocks"); - Assert.deepEqual(request.args, expectedArgs); - Assert.deepEqual(request.envVars, torProperties.envVars); -}); + Assert.equal(r.host, srv); + Assert.equal(r.protocol, HKP); + Assert.equal(r.port, HKP_PORT); -test(function setupRequestWithTorHelperWithEnvVariables() { - const torArgs = ["--user", "randomUser", "--pass", "randomPassword", "/usr/bin/gpg2"]; - const torProperties = { - command: { - path: "/usr/bin/torsocks" - }, - args: torArgs, - envVars: ["TORSOCKS_USERNAME=abc", "TORSOCKS_USERNAME=def"] - }; + r = parseKeyserverUrl("hkps://" + srv); + Assert.equal(r.host, srv); + Assert.equal(r.protocol, "hkps"); + Assert.equal(r.port, "443"); - const expectedArgs = torArgs - .concat(EnigmailGpg.getStandardArgs(true)) - .concat(["--keyserver", "hkps://keyserver.1:443"]) - .concat(["--recv-keys", "1234"]); - const action = EnigmailConstants.DOWNLOAD_KEY; - - const request = requestOverTorWithHelper("1234", "hkps://keyserver.1:443", torProperties, action); - - Assert.equal(request.command.path, "/usr/bin/torsocks"); - Assert.deepEqual(request.args, expectedArgs); - Assert.deepEqual(request.envVars, torProperties.envVars); + r = parseKeyserverUrl("ldap://" + srv + ":765"); + Assert.equal(r.host, srv); + Assert.equal(r.protocol, "ldap"); + Assert.equal(r.port, "765"); }); -test(withTestGpgHome(withEnigmail(function setupRequestWithTorGpgProxyArguments() { - const gpgProxyArgs = ["socks5h://randomUser:randomPassword@127.0.0.1:9050"]; - const torProperties = { - command: "gpg", - args: gpgProxyArgs, - envVars: [] - }; - const expectedGpgProxyArgs = ["--keyserver-options", "http-proxy=socks5h://randomUser:randomPassword@127.0.0.1:9050"]; - const expectedArgs = EnigmailGpg.getStandardArgs(true) - .concat(["--keyserver", "hkps://keyserver.1:443"]) - .concat(expectedGpgProxyArgs) - .concat(["--recv-keys", "1234"]); - const action = EnigmailConstants.DOWNLOAD_KEY; +test(function testHkpCreateRequestUrl() { + let r = accessHkpInternal.createRequestUrl("hkps://example.com", EnigmailConstants.DOWNLOAD_KEY, "12345678"); + Assert.equal(r.method, "GET"); + Assert.equal(r.url, "https://example.com:443/pks/lookup?search=0x12345678&op=get&options=mr"); + + r = accessHkpInternal.createRequestUrl("example.com", EnigmailConstants.SEARCH_KEY, "abc"); + Assert.equal(r.method, "GET"); + Assert.equal(r.url, "http://example.com:11371/pks/lookup?search=abc&fingerprint=on&op=index&options=mr"); + + r = accessHkpInternal.createRequestUrl("example.com", EnigmailConstants.UPLOAD_KEY, "abc"); + Assert.equal(r.method, "POST"); + Assert.equal(r.url, "http://example.com:11371/pks/add"); +}); + +test(withTestGpgHome(withEnigmail(function testAccessKeyServer() { + // overwrite createRequestUrl to get local files + accessHkpInternal.createRequestUrl = function(keyserver, actionFlag, searchTerm) { + let fn = ""; + let method = "GET"; + let allowNonExist = false; + + switch (actionFlag) { + case EnigmailConstants.DOWNLOAD_KEY: + fn = "dev-strike.asc"; + break; + case EnigmailConstants.SEARCH_KEY: + fn = "hkp-listing.txt"; + break; + case EnigmailConstants.UPLOAD_KEY: + fn = "test-upload.txt"; + method = "PUT"; + allowNonExist = true; + break; + } - const request = requestOverTorWithSocks("1234", "hkps://keyserver.1:443", torProperties, action); + let file = do_get_file("resources/" + fn, allowNonExist); + let ioServ = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); + let fileUri = ioServ.newFileURI(file); + + return { + url: fileUri.spec, + method: method + }; + }; + + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + + accessHkpInternal.download("781617319CE311C4", "dummy").then(res => { + Assert.equal(res.keyList.length, 1); + Assert.equal(res.result, 0); + Assert.equal(res.keyList[0], "65537E212DC19025AD38EDB2781617319CE311C4"); + + let o = EnigmailKeyRing.getKeyById("0x781617319CE311C4"); + Assert.notEqual(o, null); + Assert.equal(o.fpr, "65537E212DC19025AD38EDB2781617319CE311C4"); + + let data = accessHkpInternal.buildHkpPayload(EnigmailConstants.UPLOAD_KEY, "0x781617319CE311C4"); + Assert.equal(data.replace(/%0D%0A/g, "%0A").substr(0, 75), "keytext=-----BEGIN%20PGP%20PUBLIC%20KEY%20BLOCK-----%0A%0AmQINBFVHm5sBEACs9"); + + return accessHkpInternal.search("anything", "dummy"); + }).then(res => { + Assert.equal(res.result, 0); + Assert.equal(res.pubKeys.length, 3); + Assert.equal(res.pubKeys[0].keyId, "CCCCCCCCCCCCCCCCCCCCCCCC0003AAAA00010001"); + Assert.equal(res.pubKeys[1].keyId, "CCCCCCCCCCCCCCCCCCCCCCCC0004AAAA00010001"); + Assert.equal(res.pubKeys[1].created, "2017-12-30"); + Assert.equal(res.pubKeys[1].uid[1], "User Three "); + Assert.equal(res.pubKeys[2].keyId, "CCCCCCCCCCCCCCCCCCCCCCCC0005AAAA00010001"); + Assert.equal(res.pubKeys[2].status, "r"); + + return accessHkpInternal.upload("0x781617319CE311C4", "dummy"); + }).then(res => { + Assert.ok(false); + + inspector.exitNestedEventLoop(); + }).catch(res => { + Assert.equal(res.result, EnigmailConstants.KEYSERVER_ERR_SERVER_UNAVAILABLE); // this is bound to fail ;-) + inspector.exitNestedEventLoop(); + }); - Assert.ok(isGpgExecutable(request.command.path)); - Assert.deepEqual(request.args, expectedArgs); + inspector.enterNestedEventLoop(0); }))); -test(function testBuildNormalRequestWithStandardArgs() { - const refreshKeyArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--recv-keys", "1234"]); - const protocol = "hkps://keyserver.1:443"; - const action = EnigmailConstants.DOWNLOAD_KEY; - const useTor = false; - - const request = gpgRequest("1234", protocol, action, useTor); - - Assert.ok(isGpgExecutable(request.command.path)); - Assert.deepEqual(request.args, refreshKeyArgs); - Assert.equal(request.usingTor, false); +test(function testKeybaseCreateRequestUrl() { + let r = accessKeyBase.createRequestUrl(EnigmailConstants.DOWNLOAD_KEY, "Dev Test"); + Assert.equal(r.method, "GET"); + Assert.equal(r.url, "https://keybase.io/_/api/1.0/user/lookup.json?key_fingerprint=" + escape("Dev Test") + "&fields=public_keys"); + + r = accessKeyBase.createRequestUrl(EnigmailConstants.SEARCH_KEY, "abc"); + Assert.equal(r.method, "GET"); + Assert.equal(r.url, "https://keybase.io/_/api/1.0/user/autocomplete.json?q=abc"); + + try { + accessKeyBase.createRequestUrl(EnigmailConstants.UPLOAD_KEY, "abc"); + Assert.ok(false); + } catch (ex) { + Assert.ok(true); + } }); -test(function testBuildNormalRequestOverTorWithStandardArgs() { - const refreshKeyArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--recv-keys", "1234"]); - const protocol = "hkps://keyserver.1:443"; - const action = EnigmailConstants.DOWNLOAD_KEY; - const useTor = true; - - const request = gpgRequest("1234", protocol, action, useTor); - - Assert.ok(isGpgExecutable(request.command.path)); - Assert.deepEqual(request.args, refreshKeyArgs); - Assert.equal(request.isDownload, true); - Assert.equal(request.usingTor, true); -}); - -test(withEnigmail(function createsRegularRequests_whenUserDoesNotWantTor() { - setupKeyserverPrefs("keyserver.1", true); - const tor = { - torProperties: function() { - return { - helper: null, - socks: null, - useTorMode: false, - isAvailable: false - }; - }, - isRequired: function() { - return false; - }, - isPreferred: function() { - return false; - }, - getTorNotAvailableProperties: torNotAvailableProperties - }; - const expectedKeyId = "1234"; - - const refreshAction = EnigmailConstants.DOWNLOAD_KEY; - const requests = buildRequests(expectedKeyId, refreshAction, tor); - - Assert.equal(requests[0].command, EnigmailGpgAgent.agentPath); - Assert.equal(requests[0].usingTor, false); - Assert.deepEqual(requests[0].args, EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--recv-keys", expectedKeyId])); - - Assert.equal(requests[1].command, EnigmailGpgAgent.agentPath); - Assert.equal(requests[1].usingTor, false); - Assert.deepEqual(requests[1].args, EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkp://keyserver.1:11371", "--recv-keys", expectedKeyId])); -})); - -test(withEnigmail(function createsRequestsWithTorAndWithoutTor_whenTorExistsOverHelperAndSocksArguments(enigmail) { - setupKeyserverPrefs("keyserver.1", true); - const keyId = "1234"; - const torArgs = ["--user", "randomUser", "--pass", "randomPassword", "/usr/bin/gpg2"]; - const socksArgs = "socks5-hostname://someUser:somePass@127.0.0.1:9050"; - - const socks5HkpsArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--keyserver-options", "http-proxy=" + socksArgs, "--recv-keys", keyId]); - const hkpsArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--recv-keys", keyId]); - - const hkpArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkp://keyserver.1:11371", "--recv-keys", keyId]); - const tor = { - torProperties: function() { - return { - helper: { - command: { - path: "/usr/bin/torsocks" - }, - args: torArgs, - envVars: [] - }, - socks: null, - isAvailable: true - }; - }, - isRequired: function(action) { - return false; - }, - isPreferred: function(action) { - return true; - }, - getTorNotAvailableProperties: torNotAvailableProperties - }; - - const refreshAction = EnigmailConstants.DOWNLOAD_KEY; - const requests = buildRequests(keyId, refreshAction, tor); - - Assert.equal(requests.length, 4); - - Assert.equal(requests[0].command.path, "/usr/bin/torsocks"); - Assert.deepEqual(requests[0].args, torArgs.concat(hkpsArgs)); - Assert.equal(requests[1].command.path, "/usr/bin/torsocks"); - Assert.deepEqual(requests[1].args, torArgs.concat(hkpArgs)); - - Assert.ok(isGpgExecutable(requests[2].command.path)); - Assert.deepEqual(requests[2].args, hkpsArgs); - - Assert.ok(isGpgExecutable(requests[3].command.path)); - Assert.deepEqual(requests[3].args, hkpArgs); -})); - -test(withEnigmail(function createsRequestsWithTorAndWithoutTor_whenTorExistsOverSocksOnly(enigmail) { - setupKeyserverPrefs("keyserver.1", true); - const keyId = "1234"; - const torArgs = ["--user", "randomUser", "--pass", "randomPassword", "/usr/bin/gpg2"]; - const socksArgs = "socks5-hostname://someUser:somePass@127.0.0.1:9050"; - - const socks5HkpsArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--keyserver-options", "http-proxy=" + socksArgs, "--recv-keys", keyId]); - const hkpsArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--recv-keys", keyId]); - - const socks5HkpArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkp://keyserver.1:11371", "--keyserver-options", "http-proxy=" + socksArgs, "--recv-keys", keyId]); - const hkpArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkp://keyserver.1:11371", "--recv-keys", keyId]); - const tor = { - torProperties: function() { - return { - helper: { - command: { - path: "/usr/bin/torsocks" - }, - args: torArgs, - envVars: [] - }, - socks: { - command: "gpg", - args: socksArgs, - envVars: [] - }, - isAvailable: true - }; - }, - isRequired: function(action) { - return false; - }, - isPreferred: function(action) { - return true; - }, - getTorNotAvailableProperties: torNotAvailableProperties - }; - - const refreshAction = EnigmailConstants.DOWNLOAD_KEY; - const requests = buildRequests(keyId, refreshAction, tor); - - Assert.equal(requests.length, 6); - - Assert.equal(requests[0].command.path, "/usr/bin/torsocks"); - Assert.deepEqual(requests[0].args, torArgs.concat(hkpsArgs)); - - Assert.ok(isGpgExecutable(requests[1].command.path)); - Assert.deepEqual(requests[1].args, socks5HkpsArgs); - - Assert.equal(requests[2].command.path, "/usr/bin/torsocks"); - Assert.deepEqual(requests[2].args, torArgs.concat(hkpArgs)); - - Assert.ok(isGpgExecutable(requests[3].command.path)); - Assert.deepEqual(requests[3].args, socks5HkpArgs); - - Assert.ok(isGpgExecutable(requests[4].command.path)); - Assert.deepEqual(requests[4].args, hkpsArgs); - - Assert.ok(isGpgExecutable(requests[4].command.path)); - Assert.deepEqual(requests[5].args, hkpArgs); -})); - -test(withEnigmail(function createsNormalRequests_whenTorDoesntExist() { - setupKeyserverPrefs("keyserver.1", true); - const keyId = "1234"; - const hkpsArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--recv-keys", keyId]); - const hkpArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkp://keyserver.1:11371", "--recv-keys", keyId]); - const tor = { - torProperties: function() { - return { - helper: null, - socks: null, - useTorMode: false, - isAvailable: false - }; - }, - isRequired: function() { - return false; - }, - isPreferred: function() { - return true; - }, - getTorNotAvailableProperties: torNotAvailableProperties - }; - const refreshAction = EnigmailConstants.DOWNLOAD_KEY; - const requests = buildRequests(keyId, refreshAction, tor); +test(withTestGpgHome(withEnigmail(function testAccessKeybase() { + // overwrite createRequestUrl to get local files + accessKeyBase.createRequestUrl = function(actionFlag, searchTerm) { + let fn = ""; + let method = "GET"; + let allowNonExist = false; + + switch (actionFlag) { + case EnigmailConstants.DOWNLOAD_KEY: + fn = "keybase-download.txt"; + break; + case EnigmailConstants.SEARCH_KEY: + fn = "keybase-search.txt"; + break; + } - Assert.equal(requests.length, 2); + let file = do_get_file("resources/" + fn, allowNonExist); + let ioServ = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); + let fileUri = ioServ.newFileURI(file); + + return { + url: fileUri.spec, + method: method + }; + }; + + let o = EnigmailKeyRing.getKeyById("0x8439E17046977C46"); + Assert.equal(o, null); + + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + + accessKeyBase.search("anything", "dummy").then(res => { + Assert.equal(res.result, 0); + Assert.equal(res.pubKeys.length, 3); + Assert.equal(res.pubKeys[0].keyId, "1234567890ABCDEF1234567890ABCDEF12345678"); + Assert.equal(res.pubKeys[1].keyId, "ABCDEF0123456780000000000000000012345678"); + Assert.equal(res.pubKeys[1].created, ""); + Assert.equal(res.pubKeys[1].uid[0], "devtiger (Dev Tiger)"); + Assert.equal(res.pubKeys[2].keyId, "9876543210111111111BBBBBBBBCCCCCCCAAAAAA"); + Assert.equal(res.pubKeys[2].status, ""); + + return accessKeyBase.download("0x8439E17046977C46", "dummy"); + }).then(res => { + Assert.equal(res.keyList.length, 1); + Assert.equal(res.result, 0); + + let o = EnigmailKeyRing.getKeyById("0x8439E17046977C46"); + Assert.notEqual(o, null); + Assert.equal(o.fpr, "8C140834F2D683E9A016D3098439E17046977C46"); + + inspector.exitNestedEventLoop(); + }).catch(res => { + Assert.ok(false); + inspector.exitNestedEventLoop(); + }); - Assert.ok(isGpgExecutable(requests[0].command.path)); - Assert.deepEqual(requests[0].args, hkpsArgs); + inspector.enterNestedEventLoop(0); +}))); - Assert.ok(isGpgExecutable(requests[1].command.path)); - Assert.deepEqual(requests[1].args, hkpArgs); -})); - -test(withEnigmail(function createsNormalRequests_whenTorUsesNormal() { - setupKeyserverPrefs("keyserver.1", true); - const keyId = "1234"; - const hkpsArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--recv-keys", keyId]); - const hkpArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkp://keyserver.1:11371", "--recv-keys", keyId]); - const tor = { - torProperties: function() { - return { - helper: null, - socks: null, - useTorMode: true, - isAvailable: true - }; - }, - isRequired: function() { - return false; - }, - isPreferred: function() { - return true; - }, - getTorNotAvailableProperties: torNotAvailableProperties - }; - const refreshAction = EnigmailConstants.DOWNLOAD_KEY; - const requests = buildRequests(keyId, refreshAction, tor); - Assert.equal(requests.length, 2); +test(withTestGpgHome(withEnigmail(function testAccessGnuPG() { + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); - Assert.ok(isGpgExecutable(requests[0].command.path)); - Assert.deepEqual(requests[0].args, hkpsArgs); - Assert.ok(isGpgExecutable(requests[1].command.path)); - Assert.deepEqual(requests[1].args, hkpArgs); -})); - - -test(withEnigmail(function createsRequestsWithOnlyTor_whenTorIsRequired(enigmail) { - setupKeyserverPrefs("keyserver.1", true); - const keyId = "1234"; - const torArgs = ["--user", "randomUser", "--pass", "randomPassword", "/usr/bin/gpg2"]; - const socksArgs = "socks5-hostname://someUser:somePass@127.0.0.1:9050"; - - const socks5HkpsArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--keyserver-options", "http-proxy=" + socksArgs, "--recv-keys", keyId]); - const hkpsArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkps://keyserver.1:443", "--recv-keys", keyId]); - - const socks5HkpArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkp://keyserver.1:11371", "--keyserver-options", "http-proxy=" + socksArgs, "--recv-keys", keyId]); - const hkpArgs = EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkp://keyserver.1:11371", "--recv-keys", keyId]); - const tor = { - torProperties: function() { - return { - helper: { - command: { - path: "/usr/bin/torsocks" - }, - args: torArgs, - envVars: [] - }, - socks: { - command: "gpg", - args: socksArgs, - envVars: [] - }, - isAvailable: true, - useTorMode: false + // overwrite accessKeyServer to mock it + accessGnuPG.accessKeyServer = function(actionFlag, keyserver, keyId, listener) { + return new Promise((resolve) => { + let retObj = { + exitCode: 0, + stdoutData: "", + stderrData: "", + errorMsg: "", + statusFlags: 0, + statusMsg: "", + blockSeparation: "", + isKilled: 0 }; - }, - isRequired: function(action) { - return true; - }, - isPreferred: function(action) { - return true; - }, - getTorNotAvailableProperties: torNotAvailableProperties - }; - const refreshAction = EnigmailConstants.DOWNLOAD_KEY; - const requests = buildRequests(keyId, refreshAction, tor); + switch (actionFlag) { + case EnigmailConstants.DOWNLOAD_KEY: + if (keyId == "ok") { + retObj.stderrData = + `[GNUPG:] KEY_CONSIDERED 8C140834F2D683E9A016D3098439E17046977C46 0 +[GNUPG:] KEY_CONSIDERED 8C140834F2D683E9A016D3098439E17046977C46 0 +[GNUPG:] IMPORT_OK 0 8C140834F2D683E9A016D3098439E17046977C46 +[GNUPG:] IMPORT_OK 0 ABCDEF0123456780000000000000000012345678 +[GNUPG:] KEY_CONSIDERED 8C140834F2D683E9A016D3098439E17046977C46 0 +[GNUPG:] IMPORT_RES 2 0 0 0 2 0 0 0 0 0 0 0 0 0 0`; + retObj.statusMsg = retObj.stderrData.replace(/^\[GNUPG: \] /mg, ""); + } + break; + case EnigmailConstants.SEARCH_KEY: + if (keyId == "ok") { + retObj.stdoutData = + `info:1:3 +pub:CCCCCCCCCCCCCCCCCCCCCCCC0003AAAA00010001:1:2048:1516625442:: +uid:Test User :1516625444:: +pub:CCCCCCCCCCCCCCCCCCCCCCCC0004AAAA00010001:1:4096:1514659468:: +uid:User Two :1514659471:: +uid:User Three :1514679471:: +pub:CCCCCCCCCCCCCCCCCCCCCCCC0005AAAA00010001:1:4096:1510762768:1668442768:r +uid:Revoked User :1510762768:: +uat:::: +uat::::`; + } else { + retObj.stderrData = "[GNUPG:] FAILURE search-keys 167772380\n"; + } + break; + case EnigmailConstants.UPLOAD_KEY: + if (keyId == "ok") { + retObj.stderrData = "[GNUPG:] EXPORTED ABCDEF0123456780000000000000000012345678\n"; + } else { + retObj.stderrData = "[GNUPG:] ERROR keyserver_send 167804953\n[GNUPG:] FAILURE send-keys 167804953\n"; + } - Assert.equal(requests.length, 4); + } - Assert.equal(requests[0].command.path, "/usr/bin/torsocks"); - Assert.deepEqual(requests[0].args, torArgs.concat(hkpsArgs)); - - Assert.ok(isGpgExecutable(requests[1].command.path)); - Assert.deepEqual(requests[1].args, socks5HkpsArgs); - - Assert.equal(requests[2].command.path, "/usr/bin/torsocks"); - Assert.deepEqual(requests[2].args, torArgs.concat(hkpArgs)); - - Assert.ok(isGpgExecutable(requests[3].command.path)); - Assert.deepEqual(requests[3].args, socks5HkpArgs); -})); - -test(withEnigmail(function returnNoRequests_whenTorIsRequiredButNotAvailable() { - setupKeyserverPrefs("keyserver.1, keyserver.2", true); - EnigmailPrefs.setPref("downloadKeyRequireTor", true); - const tor = { - torProperties: function() { - return { - socks: null, - helper: null, - isAvailable: false, - useTorMode: false - }; - }, - isRequired: function() { - return true; - }, - isPreferred: function() { - return true; - }, - getTorNotAvailableProperties: torNotAvailableProperties - }; - - const refreshAction = EnigmailConstants.DOWNLOAD_KEY; - const requests = buildRequests("1234", refreshAction, tor); - Assert.equal(requests.length, 0); -})); - -function setupAgentPathAndRequest(enigmail) { - withEnvironment({}, function(e) { - resetting(EnigmailGpgAgent, "agentPath", "/usr/bin/gpg-agent", function() { - enigmail.environment = e; + resolve(retObj); }); - }); - return { - command: EnigmailGpgAgent.agentPath, - envVars: [], - args: EnigmailGpg.getStandardArgs(true).concat(["--keyserver", "hkp://keyserver.1:11371", "--recv-keys", "1234"]) - }; -} - -test(withEnigmail(function executeReportsFailure_whenReceivingConfigurationError(enigmail) { - const simpleRequest = setupAgentPathAndRequest(enigmail); - const subproc = { - callWasCalled: false, - call: function(proc) { - subproc.callWasCalled = true; - proc.stderr("gpg: keyserver receive failed: Configuration error\n"); - proc.done(2); - return { - wait: function() {} - }; - } - }; - - const result = executeRefresh(simpleRequest, subproc); - Assert.equal(result, false); -})); - -test(withEnigmail(function executeReportsSuccess_whenReceivingImportSuccessful(enigmail) { - const simpleRequest = setupAgentPathAndRequest(enigmail); - const subproc = { - callWasCalled: false, - call: function(proc) { - subproc.callWasCalled = true; - proc.stderr("[GNUPG:] IMPORT_OK "); - proc.stderr("gpg: requesting key KEYID from hkps server keyserver.1\n"); - proc.stderr("gpg: key KEYID: public key KEYOWNER imported\n"); - proc.stderr("gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model\n"); - proc.stderr("gpg: depth: 0 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2u\n" + - "gpg: Total number processed: 1\n" + - "gpg: imported: 1 (RSA: 1)\n"); - proc.done(0); - return { - wait: function() {} - }; - } }; - const result = executeRefresh(simpleRequest, subproc); - Assert.equal(result, true); -})); - -test(function testBasicNormalQuery() { - const actionflags = EnigmailConstants.REFRESH_KEY; - const keyserver = "keyserver0005"; - const searchterms = ""; - const errormsgobj = {}; - currentProxyModule = { - getHttpProxy: function() { - return null; + async function doTest() { + try { + let res = await accessGnuPG.download("ok", null, null); + Assert.equal(res.keyList.length, 2); + Assert.equal(res.keyList[1], "ABCDEF0123456780000000000000000012345678"); + Assert.equal(res.result, 0); + + res = await accessGnuPG.search("ok", null, null); + Assert.equal(res.pubKeys.length, 3); + } catch (ex) { + Assert.ok(false); } - }; - - const expectedArgs = EnigmailGpg.getStandardArgs(true) - .concat("--keyserver") - .concat("keyserver0005") - .concat("--refresh-keys"); - - const keyRequest = build(actionflags, keyserver, searchterms, errormsgobj); - - Assert.deepEqual(keyRequest.args, expectedArgs); - Assert.equal(keyRequest.inputData, null); - Assert.equal(keyRequest.isDownload, true); - Assert.equal(errormsgobj.value, null); -}); - -test(function testBasicNormalQueryWithHTTPPRoxy() { - const actionflags = EnigmailConstants.REFRESH_KEY; - const keyserver = "keyserver0005"; - const searchterms = "1"; - const errormsgobj = {}; - currentProxyModule = { - getHttpProxy: function() { - return "someHttpProxy"; - } - }; - - const expectedArgs = EnigmailGpg.getStandardArgs(true) - .concat("--keyserver") - .concat("keyserver0005") - .concat("--keyserver-options") - .concat("http-proxy=someHttpProxy") - .concat("--refresh-keys"); - - const keyRequest = build(actionflags, keyserver, searchterms, errormsgobj); - - Assert.deepEqual(keyRequest.args, expectedArgs); - Assert.equal(keyRequest.inputData, null); - Assert.equal(keyRequest.isDownload, true); - Assert.equal(errormsgobj.value, null); -}); - -test(function testBasicNormalQueryWithInputData() { - const actionflags = EnigmailConstants.SEARCH_KEY; - const keyserver = "keyserver0005"; - const searchterms = "1"; - const errormsgobj = {}; - currentProxyModule = { - getHttpProxy: function() { - return null; - } - }; - - const expectedArgs = EnigmailGpg.getStandardArgs(false) - .concat(["--command-fd", "0", "--fixed-list", "--with-colons"]) - .concat("--keyserver") - .concat("keyserver0005") - .concat("--search-keys") - .concat("1"); - - const keyRequest = build(actionflags, keyserver, searchterms, errormsgobj); - - Assert.deepEqual(keyRequest.args, expectedArgs); - Assert.equal(keyRequest.inputData, "quit\n"); - Assert.equal(keyRequest.isDownload, false); - Assert.equal(errormsgobj.value, null); -}); - -test(function testNormalReceiveKeyQuery() { - const actionflags = EnigmailConstants.DOWNLOAD_KEY; - const keyserver = "keyserver0005"; - const searchterms = "0001"; - const errormsgobj = {}; - currentProxyModule = { - getHttpProxy: function() { - return null; - } - }; - - const expectedArgs = EnigmailGpg.getStandardArgs(true) - .concat("--keyserver") - .concat("keyserver0005") - .concat("--recv-keys") - .concat("0001"); - - const keyRequest = build(actionflags, keyserver, searchterms, errormsgobj); - - Assert.deepEqual(keyRequest.args, expectedArgs); - Assert.equal(keyRequest.inputData, null); - Assert.equal(keyRequest.isDownload, true); - Assert.equal(errormsgobj.value, null); -}); - -test(function testNormalUploadKeyRequest() { - const actionflags = EnigmailConstants.UPLOAD_KEY; - const keyserver = "keyserver0005"; - const searchterms = "0001"; - const errormsgobj = {}; - currentProxyModule = { - getHttpProxy: function() { - return null; - } - }; - - const expectedArgs = EnigmailGpg.getStandardArgs(true) - .concat("--keyserver") - .concat("keyserver0005") - .concat("--send-keys") - .concat("0001"); - - const keyRequest = build(actionflags, keyserver, searchterms, errormsgobj); - - Assert.deepEqual(keyRequest.args, expectedArgs); - Assert.equal(keyRequest.inputData, null); - Assert.equal(keyRequest.isDownload, false); - Assert.equal(errormsgobj.value, null); -}); -test(function testErrorQueryWithNoKeyserver() { - const actionflags = EnigmailConstants.UPLOAD_KEY; - const keyserver = null; - const searchterms = "0001"; - const errormsgobj = {}; - currentProxyModule = { - getHttpProxy: function() { - return null; + try { + let res = await accessGnuPG.search("error", null, null); + Assert.ok(false); + } catch (ex) { + Assert.equal(ex.result, EnigmailConstants.KEYSERVER_ERR_SERVER_UNAVAILABLE); + Assert.equal(ex.errorDetails, EnigmailLocale.getString("keyserver.error.unavailable")); } - }; - - const result = build(actionflags, keyserver, searchterms, errormsgobj); - - Assert.equal(result, null); - Assert.equal(errormsgobj.value, EnigmailLocale.getString("failNoServer")); -}); -test(function testErrorSearchQueryWithNoID() { - const actionflags = EnigmailConstants.SEARCH_KEY; - const keyserver = "keyserver0005"; - const searchterms = null; - const errormsgobj = {}; - currentProxyModule = { - getHttpProxy: function() { - return null; + try { + let res = await accessGnuPG.upload("ok", null, null); + Assert.equal(res.keyList.length, 1); + Assert.equal(res.result, 0); + + res = await accessGnuPG.search("ok", null, null); + Assert.equal(res.pubKeys.length, 3); + + res = await accessGnuPG.search("error", null, null); + Assert.ok(false); + } catch (ex) { + Assert.equal(ex.result, 5); } - }; - const result = build(actionflags, keyserver, searchterms, errormsgobj); - - Assert.equal(result, null); - Assert.equal(errormsgobj.value, EnigmailLocale.getString("failNoID")); -}); + inspector.exitNestedEventLoop(); + } -test(function testParseUrl() { - let srv = "abc.de.fg"; - const HKP = "hkp"; - const HKP_PORT = "11371"; - let r = parseKeyserverUrl(srv); - - Assert.equal(r.host, srv); - Assert.equal(r.protocol, HKP); - Assert.equal(r.port, HKP_PORT); - - r = parseKeyserverUrl("hkps://" + srv); - Assert.equal(r.host, srv); - Assert.equal(r.protocol, "hkps"); - Assert.equal(r.port, "443"); - - r = parseKeyserverUrl("ldap://" + srv + ":765"); - Assert.equal(r.host, srv); - Assert.equal(r.protocol, "ldap"); - Assert.equal(r.port, "765"); - -}); + doTest(); + inspector.enterNestedEventLoop(0); +}))); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/keyserverUris-test.js enigmail-2.1.3+ds1/package/tests/keyserverUris-test.js --- enigmail-2.0.12+ds1/package/tests/keyserverUris-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/keyserverUris-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -7,12 +7,11 @@ "use strict"; -do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper:false, resetting, withEnvironment, getKeyListEntryOfKey: false, gKeyListObj: true, withPreferences: false */ +do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper:false, resetting, withEnvironment, gKeyListObj: true, withPreferences: false */ -testing("keyserverUris.jsm"); /*global isValidProtocol: false, validKeyserversExist: false, buildKeyserverUris: false */ - -component("enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -component("enigmail/os.jsm"); /*global EnigmailOS: false */ +testing("keyserverUris.jsm"); +/*global isValidProtocol: false, validKeyserversExist: false, buildKeyserverUris: false, +EnigmailPrefs: false, EnigmailOS: false */ function setupKeyserverPrefs(keyservers, autoOn) { EnigmailPrefs.setPref("keyserver", keyservers); @@ -76,7 +75,7 @@ const keyserverUris = buildKeyserverUris(); Assert.equal(keyserverUris.length, 2); - Assert.equal(keyserverUris[0], "hkps.pool.sks-keyservers.net"); + Assert.equal(keyserverUris[0], "hkps://hkps.pool.sks-keyservers.net:443"); Assert.equal(keyserverUris[1], "hkp://pool.sks-keyservers.net:11371"); }); })); @@ -99,7 +98,7 @@ const keyserverUris = buildKeyserverUris(); Assert.equal(keyserverUris.length, 1); - Assert.equal(keyserverUris[0], "hkps.pool.sks-keyservers.net"); + Assert.equal(keyserverUris[0], "hkps://hkps.pool.sks-keyservers.net:443"); }); })); @@ -157,4 +156,4 @@ test(withPreferences(function considerLowerCaseAndCapitalSchemesLegitimate() { Assert.equal(isValidProtocol("HkP://domain"), true); -})); +})); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/log-test.js enigmail-2.1.3+ds1/package/tests/log-test.js --- enigmail-2.0.12+ds1/package/tests/log-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/log-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,4 @@ -/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false, Cc: false, Ci: false */ -/*jshint -W097 */ +/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: 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 @@ -10,8 +9,7 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); -testing("log.jsm"); /*global EnigmailLog: false */ -component("enigmail/files.jsm"); /*global EnigmailFiles: false */ +testing("log.jsm"); /*global EnigmailLog: false, EnigmailFiles: false */ test(function shouldCreateLogFile() { EnigmailLog.setLogDirectory(do_get_cwd().path); @@ -22,12 +20,11 @@ EnigmailFiles.initPath(localFile, filePath); try { Assert.equal(localFile.exists(), true); - } - finally { + } finally { EnigmailLog.onShutdown(); if (localFile.exists()) { localFile.remove(false); } EnigmailLog.createLogFiles(); } -}); +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/mailHelper.js enigmail-2.1.3+ds1/package/tests/mailHelper.js --- enigmail-2.0.12+ds1/package/tests/mailHelper.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/mailHelper.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,4 @@ -/*global do_load_module: false, do_get_cwd: false, component: false, do_get_file: false, Components: false */ -/*jshint -W097 */ +/*global do_load_module: false, do_get_cwd: false, component: false, do_get_file: 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 @@ -8,17 +7,23 @@ "use strict"; -component("/modules/mailServices.js"); /*global MailServices: false */ -component("enigmail/files.jsm"); /*global EnigmailFiles: false */ -component("/modules/iteratorUtils.jsm"); +var MailServices; +try { + MailServices = component("/modules/MailServices.jsm").MailServices; +} +catch (x){ + MailServices = component("/modules/MailServices.js").MailServices; +} + +var EnigmailFiles = component("enigmail/files.jsm").EnigmailFiles; +//component("/modules/iteratorUtils.jsm"); const MailHelper = { init: function() { if (!MailHelper.initialized) { try { MailServices.accounts.createLocalMailAccount(); - } - catch (ex) { + } catch (ex) { // This will fail if someone already called this. } @@ -39,6 +44,16 @@ } }, + deleteAllAccounts: function() { + let ac = MailServices.accounts.accounts; + for (let i = 0; i < ac.length; i++) { + let aAccount = ac.queryElementAt(i, Components.interfaces.nsIMsgAccount); + MailServices.accounts.removeAccount(aAccount, true); + } + + MailHelper.initialized = false; + }, + getRootFolder: function() { MailHelper.init(); return MailHelper.rootFolder; @@ -71,8 +86,7 @@ let enumerator = msgDb.EnumerateMessages(); if (enumerator.hasMoreElements()) { return enumerator.getNext().QueryInterface(Components.interfaces.nsIMsgDBHdr); - } - else + } else return null; } }; diff -Nru enigmail-2.0.12+ds1/package/tests/main.js enigmail-2.1.3+ds1/package/tests/main.js --- enigmail-2.0.12+ds1/package/tests/main.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/main.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,4 @@ -/*global do_subtest: false, Components: false */ +/*global do_subtest: 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 @@ -8,31 +8,35 @@ "use strict"; function execTest(filename) { - const Cc = Components.classes; - const Ci = Components.interfaces; + + let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); let testcases = env.get("JS_TEST"); if (testcases && testcases.length > 0) { if (testcases.search(filename) >= 0) do_subtest(filename); - } - else + } else do_subtest(filename); } +execTest("initialize.js"); +execTest("funcs-test.js"); +execTest("gpgAgent-test.js"); +execTest("autocrypt-test.js"); execTest("armor-test.js"); execTest("data-test.js"); execTest("system-test.js"); execTest("decryption-test.js"); -execTest("persistentCrypto-test.js"); +execTest("verify-test.js"); execTest("errorHandling-test.js"); execTest("encryption-test.js"); -execTest("gpgAgent-test.js"); execTest("core-test.js"); execTest("files-test.js"); execTest("streams-test.js"); +execTest("gnupg-keylist-test.js"); execTest("key-test.js"); +execTest("keyObj-test.js"); execTest("keyRing-test.js"); execTest("keyEditor-test.js"); execTest("keyserver-test.js"); @@ -43,7 +47,6 @@ execTest("os-test.js"); execTest("prefs-test.js"); execTest("rules-test.js"); -execTest("funcs-test.js"); execTest("mimeDecrypt-test.js"); execTest("expiry-test.js"); execTest("installGnuPG-test.js"); @@ -51,8 +54,9 @@ execTest("tor-test.js"); execTest("versioning-test.js"); execTest("rng-test.js"); +execTest("dns-test.js"); execTest("filters-test.js"); execTest("webKey-test.js"); -execTest("autocrypt-test.js"); - -// execTest("pep-test.js"); // not yet enabled +execTest("openpgpjs-test.js"); +execTest("autoSetup-test.js"); +execTest("persistentCrypto-test.js"); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/mime-test.js enigmail-2.1.3+ds1/package/tests/mime-test.js --- enigmail-2.0.12+ds1/package/tests/mime-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/mime-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -31,14 +31,14 @@ }); -const msg1 = 'Content-Type: multipart/mixed; boundary="OuterBoundary"\r\n' + +const msg1 = 'Content-Type: multipart/mixed; boundary="OuterBoundary";\r\n' + + ' protected-headers="v1"\r\n' + 'References: \r\n' + 'Subject: Outer hidden subject\r\n' + '\r\n' + '--OuterBoundary\r\n' + 'Content-Transfer-Encoding: base64\r\n' + 'Content-Type: text/rfc822-headers; charset="us-ascii";\r\n' + - ' protected-headers="v1,<12345678@enigmail-test.net>"\r\n' + 'Content-Disposition: inline\r\n' + '\r\n' + 'U3ViamVjdDogVGhlIGhpZGRlbiBzdWJqZWN0CkRhdGU6IFN1biwgMjEgSnVuIDIwMTUgMT\r\n' + @@ -78,14 +78,15 @@ test(function extractProtectedHeadersTest() { var r = EnigmailMime.extractProtectedHeaders(msg1); + //Assert.equal(r, 0); var expected = msg2; var got = r.startPos; - Assert.equal(got, 117, "startPos of removed data"); + Assert.equal(got, 144, "startPos of removed data"); got = r.endPos; - Assert.equal(got, 767, "endPos of removed data"); + Assert.equal(got, 739, "endPos of removed data"); got = r.newHeaders.subject; expected = "The hidden subject"; diff -Nru enigmail-2.0.12+ds1/package/tests/mimeDecrypt-test.js enigmail-2.1.3+ds1/package/tests/mimeDecrypt-test.js --- enigmail-2.0.12+ds1/package/tests/mimeDecrypt-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/mimeDecrypt-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,5 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false */ -/*jshint -W097 */ +/*global component: false, withEnigmail: false withTestGpgHome: 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 @@ -8,7 +8,8 @@ "use strict"; -var EnigmailMime = { +/*global EnigmailMime: true, EnigmailVerify: true */ +var overwriteEnigmailMime = { extractProtectedHeaders: function(str) { return { startPos: 10, @@ -22,10 +23,88 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); -testing("mimeDecrypt.jsm"); /* global EnigmailMimeDecrypt: false */ +testing("mimeDecrypt.jsm"); /* global EnigmailMimeDecrypt: false, EnigmailSingletons: false, EnigmailCompat: false */ +const EnigmailFiles = component("enigmail/files.jsm").EnigmailFiles; +const EnigmailKeyRing = component("enigmail/keyRing.jsm").EnigmailKeyRing; + +test(withTestGpgHome(withEnigmail(function processPgpMimeMsg() { + const secKey = do_get_file("resources/dev-strike.sec", false); + const importedKeysObj = {}; + const importResult = EnigmailKeyRing.importKeyFromFile(secKey, {}, importedKeysObj); + + let k = EnigmailKeyRing.getKeyById("0x781617319CE311C4"); + Assert.ok(k !== null); + + let msgFile = do_get_file("resources/pgpMime-msg.eml", false); + let msgTxt = EnigmailFiles.readFile(msgFile); + + let i = msgTxt.search(/\n\n/); + Assert.ok(i > 0); + msgTxt = msgTxt.substr(i + 2); + + let dataArr = msgTxt.split(/\n/); + + let dec = EnigmailMimeDecrypt.newPgpMimeHandler(); + EnigmailVerify.lastMsgWindow = 1; + EnigmailVerify.lastMsgUri = null; + + + EnigmailSingletons.messageReader = { + processDecryptionResult: function(uri, funcName, jsonString, mimePartNumber) { + Assert.equal(uri.spec, "test"); + Assert.equal(funcName, "modifyMessageHeaders"); + Assert.equal(jsonString, "{}"); + Assert.equal(mimePartNumber, "1"); + }, + updateSecurityStatus: function(msgUriSpec, exitCode, statusFlags, keyId, userId, sigDetails, + errorMsg, blockSeparation, uri, jsonStr, mimePartNumber) { + Assert.equal(msgUriSpec, null); + Assert.equal(keyId, "65537E212DC19025AD38EDB2781617319CE311C4"); + Assert.equal(userId, "anonymous strike "); + let s = JSON.parse(jsonStr); + Assert.ok("encryptedTo" in s); + Assert.equal(mimePartNumber, "1"); + } + }; + + let pgpMimeProxy = { + QueryInterface: EnigmailCompat.generateQI(["nsIPgpMimeProxy"]), + mimePart: "1", + contentType: 'multipart/encrypted; protocol="application/pgp-encrypted"; boundary="DELIMITER"', + outputDecryptedData: function(data, dataLen) { + Assert.equal(dataLen, 15, "data length matches"); + Assert.equal(data, "This is a test\n", "data matches"); + } + }; + + let inputStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); + + let testUri = { + QueryInterface: EnigmailCompat.generateQI(["nsIURI"]), + schemeIs: function() { + return true; + }, + pathQueryRef: "test", + spec: "test" + }; + + dec.onStartRequest(pgpMimeProxy, testUri); + for (i = 0; i < dataArr.length; i++) { + let s = dataArr[i] + "\r\n"; + inputStream.setData(s, s.length); + if (EnigmailCompat.isMessageUriInPgpMime()) { + // TB >= 67 + dec.onDataAvailable(null, inputStream, 0, s.length); + } else + dec.onDataAvailable(null, null, inputStream, 0, s.length); + } + + dec.onStopRequest(null, null); +}))); test(function extractEncryptedHeadersTest() { + EnigmailMime = overwriteEnigmailMime; var dec = EnigmailMimeDecrypt.newPgpMimeHandler(); dec.decryptedData = 'This is a Hello World example'; diff -Nru enigmail-2.0.12+ds1/package/tests/openpgpjs-test.js enigmail-2.1.3+ds1/package/tests/openpgpjs-test.js --- enigmail-2.0.12+ds1/package/tests/openpgpjs-test.js 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/openpgpjs-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,77 @@ +/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false */ +/*global do_test_pending: false, do_test_finished: 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"; + +do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); + +testing("cryptoAPI/openpgp-js.js"); /*global getOpenPGPjsAPI: false */ + +test(function testGetStrippedKey() { + const cApi = getOpenPGPjsAPI(); + + const pubKey = "-----BEGIN PGP PUBLIC KEY BLOCK-----" + + "\n" + + "\n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" + + "\nsnHSt1DRJA==" + + "\n=I9l9" + + "\n-----END PGP PUBLIC KEY BLOCK-----"; + + let minKey = cApi.sync(cApi.getStrippedKey(pubKey)); + let got = btoa(String.fromCharCode.apply(null, minKey)); + Assert.equal(got.substr(0, 127), "xsFNBFVHm5sBEACs94Ln+RMdeyBpWQtTZ/NZnwntsB10Wd3HTgo5sdA/OOFOJrWetJfAZ/HRxiSu1bwRaFVC8p061ftTbxf8bsdfsykYJQQqPODfcO0/oY2n/Z93ya8"); + Assert.equal(got.substr(-127), "QriSRXV4ZhMhGtnhHEYqHP982gBxk4RPvEp7APCLrqgC0+N8N29eC4s3JkVkHAZx+fj5YV2H9/5wJRJ1w+kwmazhpTQsy01kEwS4NZMPe8Uvz0MgoNuF7Jx0rdQ0SQ="); + Assert.equal(got.length, 3080); +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/os-test.js enigmail-2.1.3+ds1/package/tests/os-test.js --- enigmail-2.0.12+ds1/package/tests/os-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/os-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,6 +1,5 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false */ /*global TestHelper: false, withEnvironment: false */ -/*jshint -W097 */ /* * 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 @@ -9,11 +8,11 @@ "use strict"; -do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, withEnigmail: false, component: false, withTestGpgHome: false, osUtils: false */ +do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, component: false, withTestGpgHome: false, osUtils: false */ testing("os.jsm"); /*global EnigmailOS: false, operatingSystem: true, isMac: false, isDosLike: false, isWin32: false */ -component("enigmail/execution.jsm"); /*global EnigmailExecution: false */ +var EnigmailExecution = component("enigmail/execution.jsm").EnigmailExecution; function withOS(os, f) { return function() { @@ -21,8 +20,7 @@ operatingSystem = os; try { f(); - } - finally { + } finally { operatingSystem = oldOs; } }; @@ -54,4 +52,4 @@ test(withOS("Darwin", function shouldNotBeDosLikeWhenSystemIsMac() { Assert.equal(isDosLike(), false); -})); +})); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/pEp-test.js enigmail-2.1.3+ds1/package/tests/pEp-test.js --- enigmail-2.0.12+ds1/package/tests/pEp-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/pEp-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,4 @@ -/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false, Cc: false, Ci: false */ +/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false */ /*global dump: false */ /* * This Source Code Form is subject to the terms of the Mozilla Public @@ -11,7 +11,7 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global withEnigmail: false, withTestGpgHome: false */ testing("pEp.jsm"); /*global EnigmailpEp: false */ -component("enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ +var EnigmailKeyRing = component("enigmail/keyRing.jsm").EnigmailKeyRing; test(withTestGpgHome(withEnigmail(function shouldEncryptMessage() { diff -Nru enigmail-2.0.12+ds1/package/tests/persistentCrypto-test.js enigmail-2.1.3+ds1/package/tests/persistentCrypto-test.js --- enigmail-2.0.12+ds1/package/tests/persistentCrypto-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/persistentCrypto-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,6 +1,4 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false */ -/*global Cc: false, Ci: false, Components: false */ -/*jshint -W097 */ /* * 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 @@ -12,11 +10,10 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, component: false, withTestGpgHome: false, withEnigmail: false */ TestHelper.loadDirectly("tests/mailHelper.js"); /*global MailHelper: false */ -testing("persistentCrypto.jsm"); /*global EnigmailPersistentCrypto: false, Promise: false */ -component("enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ -/*global msgHdrToMimeMessage: false, MimeMessage: false, MimeContainer: false */ -component("enigmail/glodaMime.jsm"); -component("enigmail/streams.jsm"); /*global EnigmailStreams: false */ +testing("persistentCrypto.jsm"); /*global EnigmailPersistentCrypto: false, EnigmailMime: false */ +var EnigmailKeyRing = component("enigmail/keyRing.jsm").EnigmailKeyRing; +/*global MsgHdrToMimeMessage: false, MimeMessage: false, MimeContainer: false, EnigmailStreams: false, + EnigmailCompat: false */ const inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); @@ -72,7 +69,7 @@ loadSecretKey(); MailHelper.cleanMailFolder(MailHelper.rootFolder); const sourceFolder = MailHelper.createMailFolder("source-box"); - MailHelper.loadEmailToMailFolder("resources/encrypted-email.eml", sourceFolder); + MailHelper.loadEmailToMailFolder("resources/encrypted-pgpmime-email.eml", sourceFolder); const header = MailHelper.fetchFirstMessageHeaderIn(sourceFolder); const targetFolder = MailHelper.createMailFolder("target-box"); @@ -87,19 +84,26 @@ const dispatchedHeader = MailHelper.fetchFirstMessageHeaderIn(targetFolder); Assert.ok(dispatchedHeader !== null); + + let msgUriSpec = dispatchedHeader.folder.getUriForMsg(dispatchedHeader); + let urlObj = EnigmailCompat.getUrlFromUriSpec(msgUriSpec); + do_test_pending(); - msgHdrToMimeMessage( - dispatchedHeader, - null, - function(header, mime) { - Assert.ok(!mime.isEncrypted); - Assert.assertContains(mime.parts[0].body, "This is encrypted"); + EnigmailMime.getMimeTreeFromUrl( + urlObj.spec, + true, + function(mimeTree) { + Assert.equal(mimeTree.subParts.length, 1); + if (mimeTree.subParts.length > 0) { + Assert.assertContains(mimeTree.subParts[0].body, "This message is encrypted"); + } do_test_finished(); }, false ); }))); + test(withTestGpgHome(withEnigmail(function messageWithAttachemntIsMovedAndDecrypted() { loadSecretKey(); loadPublicKey(); @@ -119,16 +123,60 @@ const dispatchedHeader = MailHelper.fetchFirstMessageHeaderIn(targetFolder); Assert.ok(dispatchedHeader !== null); + let msgUriSpec = dispatchedHeader.folder.getUriForMsg(dispatchedHeader); + let urlObj = EnigmailCompat.getUrlFromUriSpec(msgUriSpec); + + do_test_pending(); + EnigmailMime.getMimeTreeFromUrl( + urlObj.spec, + true, + function(mimeTree) { + Assert.assertContains(mimeTree.subParts[0].body, "This is encrypted"); + Assert.equal(mimeTree.subParts.length, 2); + if (mimeTree.subParts.length >= 2) { + Assert.assertContains(mimeTree.subParts[1].body, "This is an attachment."); + } + do_test_finished(); + }, + false + ); +}))); + +test(withTestGpgHome(withEnigmail(function messageWithAttachemntIsMovedAndReEncrypted() { + loadSecretKey(); + loadPublicKey(); + MailHelper.cleanMailFolder(MailHelper.getRootFolder()); + const sourceFolder = MailHelper.createMailFolder("source-box"); + MailHelper.loadEmailToMailFolder("resources/encrypted-email-with-attachment.eml", sourceFolder); + + const header = MailHelper.fetchFirstMessageHeaderIn(sourceFolder); + const targetFolder = MailHelper.createMailFolder("target-box"); + const move = true; + copyListener.OnStopCopy = function(statusCode) { + inspector.exitNestedEventLoop(); + }; + + let keyObj = EnigmailKeyRing.getKeyById("0x65537E212DC19025AD38EDB2781617319CE311C4"); + EnigmailPersistentCrypto.dispatchMessages([header], targetFolder.URI, copyListener, move, keyObj); + inspector.enterNestedEventLoop(0); + + const dispatchedHeader = MailHelper.fetchFirstMessageHeaderIn(targetFolder); + Assert.ok(dispatchedHeader !== null); + + let msgUriSpec = dispatchedHeader.folder.getUriForMsg(dispatchedHeader); + let urlObj = EnigmailCompat.getUrlFromUriSpec(msgUriSpec); + do_test_pending(); - msgHdrToMimeMessage( - dispatchedHeader, - null, - function(header, mime) { - Assert.ok(!mime.isEncrypted); - Assert.assertContains(mime.parts[0].parts[0].body, "This is encrypted"); - const atts = extractAttachments(mime); - Assert.ok(!atts[0].isEncrypted); - Assert.assertContains(atts[0].body, "This is an attachment."); + EnigmailMime.getMimeTreeFromUrl( + urlObj.spec, + true, + function(mimeTree) { + Assert.assertContains(mimeTree.headers._rawHeaders.get("content-type")[0], "multipart/encrypted"); + Assert.assertContains(mimeTree.subParts[0].body, "Version: 1"); + Assert.equal(mimeTree.subParts.length, 2); + if (mimeTree.subParts.length >= 2) { + Assert.assertContains(mimeTree.subParts[1].body, "---BEGIN PGP MESSAGE---"); + } do_test_finished(); }, false @@ -151,7 +199,7 @@ const p = new Promise(function(resolve, reject) { const iOService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); const uri = iOService.newURI(url, null, null); - const attChannel = EnigmailStreams.createChannelFromURI(uri); + const attChannel = EnigmailStreams.createChannel(uri); const listener = EnigmailStreams.newStringStreamListener(function(data) { result = data; inspector.exitNestedEventLoop(); diff -Nru enigmail-2.0.12+ds1/package/tests/prefs-test.js enigmail-2.1.3+ds1/package/tests/prefs-test.js --- enigmail-2.0.12+ds1/package/tests/prefs-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/prefs-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,4 @@ -/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false, Cc: false, Ci: false */ -/*jshint -W097 */ +/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: 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 @@ -16,4 +15,4 @@ const prefName = "mypref"; EnigmailPrefs.setPref(prefName, "yourpref"); Assert.equal("yourpref", EnigmailPrefs.getPref(prefName)); -}); +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/resources/attachment.txt enigmail-2.1.3+ds1/package/tests/resources/attachment.txt --- enigmail-2.0.12+ds1/package/tests/resources/attachment.txt 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/resources/attachment.txt 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1 @@ +This is an attachment. diff -Nru enigmail-2.0.12+ds1/package/tests/resources/attachment.txt.asc enigmail-2.1.3+ds1/package/tests/resources/attachment.txt.asc --- enigmail-2.0.12+ds1/package/tests/resources/attachment.txt.asc 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/resources/attachment.txt.asc 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCgAdFiEEZVN+IS3BkCWtOO2yeBYXMZzjEcQFAlt7sCoACgkQeBYXMZzj +EcSvCw/+LqstZ5wpMhhkxAf0EQQYGrpcp4xWqfBZ4plfJaDcaQjMGQkAtGFN6taS +aW5ePfVNwOm4baBUqNT14gEWEDJUFGLpjmaj4iUd2IRxKp4cxIWzjG+OKsZTiY3R +KNG3q6VeoOfUnl6odLwyCVjkcipyb9InSXKR9oLzDMVoAk9J8EgXF6VKH9wpcPOl +E5mZk6XvNGgqD/qJ3auvptPA5pkcB+9zYVNqpb9cSSdh39i3wdrUNEnuWE4ES6O7 +RCsZNd9rc7522B60Z+prtRQBK1AKA3xxcVh72Ln9bem9jRjx5vp/VoNlB7z7QvWR +rX+EHyqtU8BcUdWizgSavGBhhK+C2OnpCZ8HtpgG8lqrtnZZuouuCK2NvnT5Hxrt +xMBbSWI+t9I4RDPUE7drGSO7OE2hHlW3tuQ40XkDjc5voKLNBFCnldko7C5Bq1Ky +0Qx7UM/XgFvQe6OAKgDtDCTcdp7Rj3TyoVshx+BwVhIqWQaxw8TxKgkxYJEpxC3T ++Vd0EZIMJWl7+vMn+XPbv2iSrbWLtv5w8p9rhGSenCUO9K940GwOG9tigA20STRf +vbIg2aPsE2VMnQoaeBoTm9QyL7VGbM9vP+rEd0O3ofyAggsZtuRQvtAVncXbJ/c5 +I2/7gi2rOy6XhB/ih7GPSpJVKer57dfEt5DXornEHp5RojAViZI= +=8FVl +-----END PGP SIGNATURE----- diff -Nru enigmail-2.0.12+ds1/package/tests/resources/autocrypt-setup-message-2.eml enigmail-2.1.3+ds1/package/tests/resources/autocrypt-setup-message-2.eml --- enigmail-2.0.12+ds1/package/tests/resources/autocrypt-setup-message-2.eml 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/resources/autocrypt-setup-message-2.eml 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,185 @@ +Message-ID: +Date: Mon, 25 Jun 2018 06:39:40 -0700 (PDT) +To: user1@enigmail-test.net +From: user1@enigmail-test.net +Autocrypt-Setup-Message: v1 +Subject: Autocrypt Setup Message +Content-type: multipart/mixed; boundary="jivYSmTJInVZOk5Hp5lVtlLRapB6zmr13" + +--jivYSmTJInVZOk5Hp5lVtlLRapB6zmr13 +Content-Type: text/plain + +This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. + +To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. + +You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. +--jivYSmTJInVZOk5Hp5lVtlLRapB6zmr13 +Content-Type: application/autocrypt-setup +Content-Disposition: attachment; filename="autocrypt-setup-message.html" + + +

This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the key from it onto your keyring.

+
+-----BEGIN PGP MESSAGE-----
+Passphrase-Format: numeric9x4
+Passphrase-Begin: 64
+
+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
+LMlQmXEhaTCXdDoAVNcLWw==
+=gH+1
+-----END PGP MESSAGE-----
+
+--jivYSmTJInVZOk5Hp5lVtlLRapB6zmr13-- diff -Nru enigmail-2.0.12+ds1/package/tests/resources/autocrypt-setup-message.eml enigmail-2.1.3+ds1/package/tests/resources/autocrypt-setup-message.eml --- enigmail-2.0.12+ds1/package/tests/resources/autocrypt-setup-message.eml 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/resources/autocrypt-setup-message.eml 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,189 @@ +Return-Path: +Message-ID: +Date: Tue, 27 Mar 2018 12:13:40 -0700 (PDT) +To: nobody +From: nobody +Autocrypt-Setup-Message: v1 +Subject: Autocrypt Setup Message +Content-type: multipart/mixed; boundary="xyBPK0qmIew1Vw0cI32MOjAWBvzPwm7cK" + +--xyBPK0qmIew1Vw0cI32MOjAWBvzPwm7cK +Content-Type: text/plain + +This message contains all information to transfer your Autocrypt settings along with your secret key securely from your original device. + +To set up your new device for Autocrypt, please follow the instuctions that should be presented by your new device. + +You can keep this message and use it as a backup for your secret key. If you want to do this, you should write down the password and store it securely. +--xyBPK0qmIew1Vw0cI32MOjAWBvzPwm7cK +Content-Type: application/autocrypt-setup +Content-Disposition: attachment; filename="autocrypt-setup-message.html" + + +

This is the Autocrypt setup file used to transfer settings and keys between clients. You can decrypt it using the setup code presented on your old device, and then import the contained key into your keyring.

+
+-----BEGIN PGP MESSAGE-----
+Passphrase-Format: numeric9x4
+Passphrase-Begin: 64
+
+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
+7hnQX5wwmjY6/ci9QQ==
+=DXsW
+-----END PGP MESSAGE-----
+
+--xyBPK0qmIew1Vw0cI32MOjAWBvzPwm7cK-- diff -Nru enigmail-2.0.12+ds1/package/tests/resources/dev-strike.asc enigmail-2.1.3+ds1/package/tests/resources/dev-strike.asc --- enigmail-2.0.12+ds1/package/tests/resources/dev-strike.asc 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/resources/dev-strike.asc 2019-10-29 17:09:36.000000000 +0000 @@ -12,19 +12,19 @@ +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 @@ -35,18 +35,18 @@ M7mU7NNYjocEmXWExq97aXS+3AE8utFttGHLpnvsE18T1rbDtjhoV6yGMSlbETxt AjIysEZpFqJDaWleYDpdhnFDzE5R+y2wBHVMz4luhckO5PD5iFpVrZbtn9HN202d qFYIKOm0WrrQO6CAvAAaeOvkdy2kuDC8tUoJ4N9TydyHMKQvseKSHYsLvJJRH9XM -5FqD9OSPFhFHABEBAAGJAjYEGAEKACACGwwWIQRlU34hLcGQJa047bJ4FhcxnOMR -xAUCXNb5GQAKCRB4FhcxnOMRxC5aD/9ibGiHb2c4ZKL0FBPZ5kPrBAWmxhXWEILc -Y2J/NZn3QeXbBnfA7NBs8vpjPjSazz/I+eOEKNZ07oq35EARG/v9X3JYu60q+Bo9 -557W3K2csFAxSGzHz1EyPiYMVb/p8+R+3WK7QlVffc4+8lLCal+tTjwCVCmtWHsg -Kh2ctZVmeiP+ovJ7gjfVdNO6KRceOU25ZzEWoh4t0/K6Hmshcjtwt/43Nlg3GywA -QJq+lj3s5Lgm1mXdrktZV1iszu72aBFxH+qi66AjPk/kTabNJ7OxNca+5+v6Smwi -N3/9goW1VyLt7wV2YWpAE+ihq86U+efRseml9WFicOOBDL9ivwVVi5XUy1RS56Qk -o81Uolc1my/FZ75EGrdpORVXt8Uus/oNaX7LY2rKXSA3NzOIgtmfJzRkREsP6Uuf -w2npZFWCuPVtttw5I9n+EEcuSGvyEREtv8LpUlUIksJ5M+Mhxje7O94XPqHrPozK -fPwAuFygazVGCPvbZQohsHRKsq93a2T4gQ32Fo2SQLnY3+wh3qt1cnj29Hla9HVt -yPcvcN/nAC5IJkbrp8SV8zKSYBiwEcs1nc3Nan1byo8m1Up4+HlAyz70oMzUHThd -Znr5k9Xl24h14LlZfk450yj6CvVFilhH8wwQ7WRSzqAhTp6i/N9KXUHOczdXf7Zt -J14nd8wqFA== -=Hflu +5FqD9OSPFhFHABEBAAGJAjYEGAEIACACGwwWIQRlU34hLcGQJa047bJ4FhcxnOMR +xAUCW1X6FAAKCRB4FhcxnOMRxECYEACaDw6JFqgdHI5pH7pkRae9Vif63Ot7XEmS +xUGpoj/qbzZy+cm9lEfcOHC9cihFa0EwG1WpFUyuzl8z8f6nulJ2vi5unC007D8y +T5kwL7vaQ+gd1JtcPny3J6qRaNxY2KhlkkLFYFLSnpt/ye0S/HuCH7RjG1lYHga9 +KULqYB+pdpFmfmPy6ogpHHaKQuYf/y9yRyylml/rjdRTWOzCa8L6y2y63y8mkcEZ +vUJ/WWAzCmka/w43uv3fPrui7wzMLDeCkSEomboax9bgTqqt9/ZNP9H0ja7XUNIj +HT8zn+h8YkjCHAupHRIltx7ZPaisZiz6RA/iwIE+rtkrYEOyCLsaHT+iXMsPFXLY +PMgR1usJqg2M3CzVdGmjXl0/ZZzo4a+wKzkRCnA1K4ZsJ/Py24QfqNIw8Jysab86 +SVSpGq3YbDIuKI/6I5CSL36WlfDcsvypr6MvE7X59otGj+1qzmlHuscL95EchJAN +RJbTW1/IHw2VMqQhRMTBKftrMediC/xP9xtl4U3D8Wybk+ghQdwuW9x3SW9H8Dol +gzBI3fdHTevZCuJJFdXhmEyEa2eEcRioc/3zaAHGThE+8SnsA8IuuqALT43w3b14 +LizcmRWQcBnH5+PlhXYf3/nAlEnXD6TCZrOGlNCzLTWQTBLg1kw97xS/PQyCg24X +snHSt1DRJA== +=I9l9 -----END PGP PUBLIC KEY BLOCK----- diff -Nru enigmail-2.0.12+ds1/package/tests/resources/dev-strike.sec enigmail-2.1.3+ds1/package/tests/resources/dev-strike.sec --- enigmail-2.0.12+ds1/package/tests/resources/dev-strike.sec 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/resources/dev-strike.sec 2019-10-29 17:09:36.000000000 +0000 @@ -11,48 +11,48 @@ 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 @@ -63,45 +63,45 @@ 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 -=HPTr +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 +=oVjy -----END PGP PRIVATE KEY BLOCK----- diff -Nru enigmail-2.0.12+ds1/package/tests/resources/email-acc2-pEp-message.eml enigmail-2.1.3+ds1/package/tests/resources/email-acc2-pEp-message.eml --- enigmail-2.0.12+ds1/package/tests/resources/email-acc2-pEp-message.eml 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/resources/email-acc2-pEp-message.eml 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,10 @@ +To: Someone +From: Tester2 +X-PEP-Version: 2.0 +Message-ID: +Date: Tue, 21 Jul 2018 09:32:41 +0200 +MIME-Version: 1.0 +Subject: Test Message +Content-Type: text/plain + +This is a test message diff -Nru enigmail-2.0.12+ds1/package/tests/resources/encrypted-email-with-autocrypt.eml enigmail-2.1.3+ds1/package/tests/resources/encrypted-email-with-autocrypt.eml --- enigmail-2.0.12+ds1/package/tests/resources/encrypted-email-with-autocrypt.eml 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/resources/encrypted-email-with-autocrypt.eml 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,120 @@ +To: Tester 2 +From: Tester 1 +Autocrypt: addr=tester@enigmail.org; prefer-encrypt=mutual; keydata= + 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 5A== +Message-ID: <3299853e-ad1b-236e-e4c1-ecbb266c26cb@gmail.com> +Date: Tue, 19 Jun 2018 23:39:32 +0530 +User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:52.0) + Gecko/20100101 Thunderbird/52.8.0 +MIME-Version: 1.0 +Subject: Encrypted Message +Content-Type: multipart/encrypted; + protocol="application/pgp-encrypted"; + boundary="UxEMgGKKbt9SDjSozkXfqI0l07sqCV5I4" + +This is an OpenPGP/MIME encrypted message (RFC 4880 and 3156) +--UxEMgGKKbt9SDjSozkXfqI0l07sqCV5I4 +Content-Type: application/pgp-encrypted +Content-Description: PGP/MIME version identification + +Version: 1 + +--UxEMgGKKbt9SDjSozkXfqI0l07sqCV5I4 +Content-Type: application/octet-stream; name="encrypted.asc" +Content-Description: OpenPGP encrypted message +Content-Disposition: inline; filename="encrypted.asc" + +-----BEGIN PGP MESSAGE----- + +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 +=4FG6 +-----END PGP MESSAGE----- + +--UxEMgGKKbt9SDjSozkXfqI0l07sqCV5I4-- diff -Nru enigmail-2.0.12+ds1/package/tests/resources/encrypted-email.eml enigmail-2.1.3+ds1/package/tests/resources/encrypted-email.eml --- enigmail-2.0.12+ds1/package/tests/resources/encrypted-email.eml 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/resources/encrypted-email.eml 2019-10-29 17:09:36.000000000 +0000 @@ -36,7 +36,7 @@ Tue, 09 Jun 2015 14:43:46 -0700 (PDT) Message-ID: <55775E11.6090701@thoughtworks.com> Date: Tue, 09 Jun 2015 16:43:45 -0500 -From: =?UTF-8?B?SXbDoW4gUGF6bWnDsW8=?= +From: =?UTF-8?B?SXbDoW4gUGF6bWnDsW8=?= User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Fan Jiang diff -Nru enigmail-2.0.12+ds1/package/tests/resources/encrypted-pgpmime-email.eml enigmail-2.1.3+ds1/package/tests/resources/encrypted-pgpmime-email.eml --- enigmail-2.0.12+ds1/package/tests/resources/encrypted-pgpmime-email.eml 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/resources/encrypted-pgpmime-email.eml 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,44 @@ +To: Tester 2 +From: Tester 1 +Message-ID: <3299853e-ad1b-236e-e4c1-ecbb266c26cb@gmail.com> +Date: Tue, 19 Jun 2018 23:39:32 +0530 +User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:52.0) + Gecko/20100101 Thunderbird/52.8.0 +MIME-Version: 1.0 +Subject: Encrypted Message +Content-Type: multipart/encrypted; + protocol="application/pgp-encrypted"; + boundary="UxEMgGKKbt9SDjSozkXfqI0l07sqCV5I4" + +This is an OpenPGP/MIME encrypted message (RFC 4880 and 3156) +--UxEMgGKKbt9SDjSozkXfqI0l07sqCV5I4 +Content-Type: application/pgp-encrypted +Content-Description: PGP/MIME version identification + +Version: 1 + +--UxEMgGKKbt9SDjSozkXfqI0l07sqCV5I4 +Content-Type: application/octet-stream; name="encrypted.asc" +Content-Description: OpenPGP encrypted message +Content-Disposition: inline; filename="encrypted.asc" + +-----BEGIN PGP MESSAGE----- + +hQIMA9U1Yju2Dp5xAQ/6AnDaC/oxD65YSD6I1e5JX3vAzOgB0TL4eTPabl/KZJ6K +8eAWiZubWF7i/EWlEXOYZbWycZC0Vo0mUlSiye4EXB/dnY369r/2UIF6kAEW0d7J +LwMbmg0WMcL+liZSa7HyxajYn8Zb7CohNI4l41KjjYGAbKiJNaK442eEvAQ3fuNp +5/KvV10jwS6fGV3caouTa8aCT8r2U5FdxowuYGGvazLCfPI9aTnz84JgeTutZfW5 +B/yBBNDeRxmUEa9c3k+8aH9c5DKYBH4Chp5EMfvlTE/pZdhRd2RcTZsR637FQVgO +FpTHKvOqQNJla4WqGeH9iHOLJh9OAhHkRaiMbbo+072KfwNHqDD4iwjQ04jFIph1 +zImMJg79PTgSsjcTRTdvkQiHaIx7pVW1m212JEl4km1lmT/C6NCHxTYfNLooEAs1 +6YPbaARnbFTTWjJXfEto7s2PZoX1pZ7GG1MNVpAL6J/puUnmVktj+87bJLkxHQVu +wf3Qq+vcFqB5t63quPMbGbXnHh4P9V+ceWhUhNFSutKWcCmeQL4vxCtL9eOphHEb +1YDHb4FpSlpVJyVUmLh7g/1X3IMCS1HKpiIqJHAUu4FfouAprL5CAfFmCeCRMkqs +/4iR3KtpnwRPwNDgY8Gfy7CL0IdvWZdpyLFaFOPr604Kz2JsJwyxbu1opM3acILS +bgFYYz3p3HwqnGdbnch3+5H3XEToOaeXsH51zSUkR/oq/wNXDWKMKiU5hIUkHYq1 +NsC04Y4EHsbpDPo/GqkcdXEx7Dg0sgohqYqoU+iyq+jjyOEZxNEUdboMadxIm879 +nu672xjC+wg8rBvFr8jh +=q7pm +-----END PGP MESSAGE----- + +--UxEMgGKKbt9SDjSozkXfqI0l07sqCV5I4-- diff -Nru enigmail-2.0.12+ds1/package/tests/resources/filterable-key.asc enigmail-2.1.3+ds1/package/tests/resources/filterable-key.asc --- enigmail-2.0.12+ds1/package/tests/resources/filterable-key.asc 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/resources/filterable-key.asc 1970-01-01 00:00:00.000000000 +0000 @@ -1,205 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -=PhCx ------END PGP PUBLIC KEY BLOCK----- diff -Nru enigmail-2.0.12+ds1/package/tests/resources/hkp-listing.txt enigmail-2.1.3+ds1/package/tests/resources/hkp-listing.txt --- enigmail-2.0.12+ds1/package/tests/resources/hkp-listing.txt 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/resources/hkp-listing.txt 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,8 @@ +info:1:3 +pub:CCCCCCCCCCCCCCCCCCCCCCCC0003AAAA00010001:1:2048:1516625442:: +uid:Test User :1516625444:: +pub:CCCCCCCCCCCCCCCCCCCCCCCC0004AAAA00010001:1:4096:1514659468:: +uid:User Two :1514659471:: +uid:User Three :1514679471:: +pub:CCCCCCCCCCCCCCCCCCCCCCCC0005AAAA00010001:1:4096:1510762768:1668442768:r +uid:Revoked User :1510762768:: diff -Nru enigmail-2.0.12+ds1/package/tests/resources/keybase-download.txt enigmail-2.1.3+ds1/package/tests/resources/keybase-download.txt --- enigmail-2.0.12+ds1/package/tests/resources/keybase-download.txt 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/resources/keybase-download.txt 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,16 @@ +{ + "status": { + "code": 0, + "name": "OK" + }, + "them": [{ + "id": "aa46f804a5329395a0d4812c79052119", + "public_keys": { + "primary": { + "kid": "010150b4b0ec7c1674bd01ab3002101dabe0abfffdd4564adb5d3b345f87248528be0a", + "key_type": 1, + "bundle": "-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v2\n\nmQENBFdGIzkBCADKys5q0rYiTr/FYdoupmNAJ0o20XWuFp/V58qsnQAMcAY2pCB/\nydx9Y7A80QjZPuVcE5QdROfvvkMXAA47ZxZrH79Kaqj11DS5XOgtLVtITGtWvrYq\nIFujxP42ICWBh7LXUwrHfi93FX74ucXoWo/PZndbo+JBxc0ZsrHUdu24grTDuqLZ\nQ8mRCx5U4tf+zEVIU6kXubFzq8aPSnjfEg6MhXxSRictjIBKM0Ez2QwZmh1vAEmv\nn0kr0VaJJ7xVRgIH1CgNh/WWtbr0lrblKCkFkTFnQfslWvSEko+LqvwgBSKyKg8V\ntWbYftnBkn8FPbP5Brp3wYgBc/c7mrLROqAFABEBAAG0ImRldi10aWdlciA8ZGV2\nLXRpZ2VyQHRlc3Qubm90cmVhbD6JATcEEwEIACEFAldGIzkCGwMFCwkIBwIGFQgJ\nCgsCBBYCAwECHgECF4AACgkQhDnhcEaXfEb3/gf/V0da3gXN5TNOsWZKj/fI2FhQ\nBglJ2vlEamnppwtnWZGktdFZ1h6ymzQ9PY3IidbKctqs/QQWKtIBVh5k02fvUe99\nnsFZmINcLeajdu7IqvKxtFBuEwZAA1Bw9dhM3JRQM8z+l+CtbFh6dVufU7q5vVEX\nciCkhdn172QYTMAXNYE4Tfh7eaEAOdRyFcwiAGZ826pOp7Al52frK+MtaXa9D2fR\nINlDXD9+IIR80sig2B4iBGeY+qAmE6bFuw7MtBya6uKupLjtAD/v48Z5wBYuU0jP\nld4KH88IWksbQo1zW/O+1N7J1/U9ZGNwpvS+wtfyjlOpTS3YWGmY8sVturZqTrkB\nDQRXRiM5AQgAsDN5j4viE5E8H5N9cfzQ9ZO5BUk66yI2DVEeasqZWFCkRA+uFHcT\nF6YpCoSn4/JsvqvUWVh63uV5vdAiU9+4sNFT8nkP7zD0LQthFtgEXqNo11NR7yvD\nRT3TOAnGaa+bLyoU/SLXzSwctZksrQjzQJVSohQNznhj95XH3UEsUydHqje7ljp7\nNHWAJx+Tlp2Yh6q060/gwh37zsfdVbaVtjeaAYECX3z6L7JB4KBb9KGlmDmOMngV\nUuR8XWWE+LEx0m7B+kZ+vZhUOSDDomBP+8jGJmXlcIt8+LIBq0NeXs/YINCc89sa\nUPw/V6X/NFRkekKFzIprCzwhg0LWl8oXAwARAQABiQEfBBgBCAAJBQJXRiM5AhsM\nAAoJEIQ54XBGl3xGUvEH/jVTBoRfJ8ohc4Ahal8TyIm8vdT/Ax/ddyyaLnCxkLFt\n0noBlA7062N1Fvv86Ts93EFrK9nF3g20gXKBKETo/vJRqtODIrwtCMfzPbS/FkQw\neLtUDZXed0nq/Yaxk60H2HmWm+n9/126F3QIt7is0E3dY0e6DYJGRHnn+lWnUs/8\nBa16Zb/os3GgwEQwr4LPEty6CFQU2DNl5HmajeB1oEqmeDZ2f/y87GRpdCoTgudQ\niHMPdm2kPVbeAA6945W6Y2LSA5Hm+yS8s2dBs4+sEiW97owLz6vcak8Aw+7JFxL2\nJkoZuN28dueoVcFQw3uX0snoBXgo3LYsK71JoufrXhY=\n=Yrbk\n-----END PGP PUBLIC KEY BLOCK-----\n" + } + } + }] +} diff -Nru enigmail-2.0.12+ds1/package/tests/resources/keybase-search.txt enigmail-2.1.3+ds1/package/tests/resources/keybase-search.txt --- enigmail-2.0.12+ds1/package/tests/resources/keybase-search.txt 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/resources/keybase-search.txt 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,110 @@ +{ + "status": { + "code": 0, + "name": "OK" + }, + "completions": [{ + "total_score": 0.05982905982905983, + "components": { + "username": { + "val": "devstrike", + "score": 0.022222222222222223 + }, + "key_fingerprint": { + "val": "1234567890abcdef1234567890abcdef12345678", + "algo": 1, + "nbits": 4096, + "score": 0 + }, + "twitter": { + "val": "devstrike", + "score": 0.011111111111111112 + }, + "github": { + "val": "devstrike", + "score": 0.011111111111111112 + } + }, + "uid": "cdef1234567890abcdcdef1234567890", + "thumbnail": "https://example.com/uploads/12345678.jpg", + "is_followee": false + }, { + "total_score": 0.029090909090909098, + "components": { + "username": { + "val": "devtiger", + "score": 0.020000000000000004 + }, + "key_fingerprint": { + "val": "abcdef0123456780000000000000000012345678", + "algo": 1, + "nbits": 4096, + "score": 0 + }, + "full_name": { + "val": "Dev Tiger", + "score": 0.009090909090909092 + }, + "github": { + "val": "devtiger.enigmail", + "score": 0 + } + }, + "uid": "abcdef01234567800000000000000000", + "is_followee": false + }, { + "total_score": 0.02361111111111111, + "components": { + "username": { + "val": "dev_enig", + "score": 0 + }, + "key_fingerprint": { + "val": "9876543210111111111bbbbbbbbcccccccaaaaaa", + "algo": 1, + "nbits": 4096, + "score": 0 + }, + "full_name": { + "val": "Enigmail Test", + "score": 0 + }, + "twitter": { + "val": "_enigmail_na", + "score": 0.0125 + }, + "github": { + "val": "na_enigmail", + "score": 0.011111111111111112 + } + }, + "uid": "9876543210111111111bbbbbbbbccccc", + "is_followee": false + }, { + "total_score": 0.022222222222222223, + "components": { + "username": { + "val": "dummy1", + "score": 0.022222222222222223 + } + }, + "uid": "9876543210111111111bbbbbbbbcccc1", + "thumbnail": null, + "is_followee": false + }, { + "total_score": 0.005000000000000001, + "components": { + "username": { + "val": "dummy2", + "score": 0 + }, + "full_name": { + "val": "Test Dummy", + "score": 0.005000000000000001 + } + }, + "uid": "9876543210111111111bbbbbbbbcccc2", + "thumbnail": null, + "is_followee": false + }] +} diff -Nru enigmail-2.0.12+ds1/package/tests/resources/multi-uid.asc enigmail-2.1.3+ds1/package/tests/resources/multi-uid.asc --- enigmail-2.0.12+ds1/package/tests/resources/multi-uid.asc 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/resources/multi-uid.asc 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,256 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +C8R5qnlVr8fs+joEZ5KcYCOy2HKSS0GufZot7GJFaKtm/Gjr933UPUqUtHYiSyNR +ovfpSlHn5pIPFDkR7d4Qc8ZpRzU9H4D0GLt5JeDr2LeTuWylQI74/i/wq9ESCPj7 +vOaHDT/RCrAAeojBA5o8TBYHjQ6PaLH4G4Pbp/BU8sMUrHlMjBSxsqXtiQIzBBAB +CAAdFiEEZVN+IS3BkCWtOO2yeBYXMZzjEcQFAlub2LgACgkQeBYXMZzjEcSoPQ// +U/yHZiq41Zn3SuI0isxDGLqpNqF+lGzs+KI2VHBBCKgn97GW6o43JPDIaWXOFtcI +JOux2Y13EID8XfS0EiCQLCf4vBRPfJ9TKyneHULBc9un+1QvmeK0/mWxUodWPpwp +cO/D9r+HzAnAuVCizOofojD33aDnAYgjh0nzjKuoQzatdVgT/RNY/O60sUhb5DDX +3X/aQRKQ4zrUktEAn4C4rFF366LDuYvMLiikesdcrgI/rFAtnTn+Bcn0GJsP6Qh7 +X3j5W0W/rj8sSwrksjtjykXFdcWCv7bXwjye/pQ1lVGX0qLZq6wJKGl+0+xwkSA0 +mjaT25TeSuxze74a6CDHlEKxE8qHFtVBpk+3K8Q2pmNH/SKIVfzP11t0O+06P1qg +9lkWxZR7K5eXWIe0Nke/EBjyDVsCNX88WxTzp9P1WwYggVCRNslFzGl0YSqlxTax +yyQoHTl78e31bFLCXHVvgFc4n+85uOHx4wyNqEeuy/07CF6sGo5uQKPEoHexnpi3 +ReQBmoms8hzkGdwMlhfrMY+6T1OX9XcVTdygCDrEXw9IY8UIcNtVmt3xCAlFpyW5 +fSQZ1+DpCR5xY3x6+ecbi3P5E2/Yze0yXjp7a9ULqOkb7VVrcN3LiixCTScUi+Os +Zuf/HMDGAS0ZAt6tznJ7BLfuQ6e8jJSLYaJdOm09rHS0IVVuaXQgVGVzdCA8Ym9i +QHNvbWV3aGVyZS5pbnZhbGlkPokBzgQTAQgAOBYhBK3ElTDLaxMkEthWEH8VaMuJ +l/e6BQJbm9QCAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEH8VaMuJl/e6 +h4kL/2TAzcbEgOUnvipkoXOeJo4TZ4lo/fSB5OPXIruuAM7yBPaS/iFRAk2w9spp +Ut608E4TKAbFspwIywztsBuib6P5LV4+gGCsn1BIB0qPh3z1nWQzCVehcSwAxKF1 +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 +qq2cvJHAtywo4NJNpldD +=CCK2 +-----END PGP PUBLIC KEY BLOCK----- diff -Nru enigmail-2.0.12+ds1/package/tests/resources/multi-uid.sec enigmail-2.1.3+ds1/package/tests/resources/multi-uid.sec --- enigmail-2.0.12+ds1/package/tests/resources/multi-uid.sec 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/resources/multi-uid.sec 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,377 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +lQVYBFub08oBDACmb04i4u8xUV1ADbnbN5l83mpr70OyWVJb5ElIcVj6bTL2gYJ7 +oADBaX9Xx8tON0ypEf8KtmmX7hFJ3rH3JWxAA6t/9oAtDZEMMCU3TwbW4/m8Y8rL +TAa5MEcPnB3ij1s/65GKFfGdsz+3yANL8raocRsUnF6JzwQAaMRrzzKz+HhW0qs9 +QpVbju7HiRAQSkh1mgkia0pT2EdJjlRWla4Kphuuqfu8leKqYIfk2vKsIBbvN5r2 +b6yvTEKbzvD0+noV5GmolFNxHm1kKO8DXFYVpgXbXJKcB4vJ6gg/L7K86nzzUIO0 +iWgczLeKT0kpArrmQdwuAl1QeoohEo/DmOUjvv1h64KcV5F78844YdBZujgTUtWo +YpQwF0YAyUf38+8h7fK909RziVDv7Rxh808uBT9y9kjVKbxVxSp8rcrR1l5Z9LNQ +2R+l71ZEzDuVDq4Gd+0ZwJGMZ+hnsj7uI4TXGUy/HWtNWZDwtt54tXFBGijyAkeG +/w0g8KoyhkaMrv8AEQEAAQAL/RGnPgXGmvxY1v0+TM0LFAVXSg5yGHTIXfX6kX3/ +l80oMVRNibDh2HKrZU3C7AuQeK8jhjEgBrSOFINd/Z5rTRS/zucJwbAFqlw9Qb/2 +FTxMfhFqEaPdR9vzWkuLkZfrALts7x5TFDJX8EA8FNgaFx8SsClQKgQ6qFVVciVv +8BQqx14zhjo/NRG7Er9TXcLR6Ob1vwD0RF6pqBYN5LWHttLQ/6ACeP3DICxWL35/ +bWdYbVZTnY+Ev4TwdSLgS6qQY/WMyGAq2CYEpzAIajBKP0uY/YyKOFSisa69OAv6 +9lJUKjYxfO38F4A7Z0Oh5jF57nfq11FRjxlmAxUPX+ioaEQxvn8JmYaWsbrYJO/j +tu+VcySfkc13lQgr9sCo3eIRG+K5kvnyo9fkUyuKbWTZm+GEr1EFWXL9xURqcXkj +nYlFzcYq92TEKaGRRZnGmNbGV2w9RNTYMYlPMoGN9BMckNS/iX6aTu2S85e6xBq+ +8mrAkDhaeezzxVzUZl/UQedn0QYAy29QaRBzQghnVR2o0pQEPt6x8uHGIng5oTmj +hgHeHFRGv9aFyl4Kbw6kL1Ws1mjI1/H9lCWnqaH1bVZr1K0DmN42/JY8eOm5DBMq +w/nlYdFeAOd2UicL+rB2hWryPa5W0fODztqmHt1c7KVl4AJ2VEyUwDKhFMB1+mdG +O0qwAAzQ3eLrscCmAzF2rZFHBv8ve9CkjJN0GuUSV17L5UD2yjLPSiCk+WScYSuV +VrPQINLC1t0dUETEFPYZapFrsHDVBgDRcIjmB1BHjx34quacDqBWF8pWh1ZNAo38 +1MZL6V6VpLOr3UMMCaBZWYfW3nA58mg6gX31ugb7CrKXT9T5WB6naBpPIoePxHOx +rjer94O64nEP1v26/ZgtHZaGD/7BgKsAmR8iOg3amD+J4xclGUG32ANXL8m38fG+ +vOkbg1DynNSDezh+xwXPnQeFsXGFeRuzKamNBAatg0jwEp9DGQ/IMPiHe2ei9+6k +q3qfVA44Wj5GKJeDonVp/up7/rXAKoMGAJHhOpNs4vlwITL9sZSv4WR8XpGgua5f +e9AmnypP1qO4AemWHty/NQ0KOnc/ZRFsTQSqO3ct2MNJYVULAPGS7JD2S2BZPVGh +FMZgItwKkzzayqoV2aUnodHPYu/120c/4wVE09EqlCnyLftIBvhu3qDB2UH4i21I ++LLPbGYAJ6VfUP5rXelteQwmUwSvmLHMM6CRrFQ04AaEWBoY4JpwlXt+sCqssV2w +fJOeUDJ5MfCLtF/dy0FhN53h1jkCU/OKceMTtCFVbml0IFRlc3QgPGFsaWNlQGV4 +YW1wbGUuaW52YWxpZD6JAdEEEwEIADsCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC +F4AWIQStxJUwy2sTJBLYVhB/FWjLiZf3ugUCW5vaRwIZAQAKCRB/FWjLiZf3uqbg +C/9CvKMYYYF+yY0keOs77ol0mY09xhy7KzIf5dRuuRrwGQKxo2HdI3JD5IvGbr2l +3be4cALeRVH5kPieSoS9W3CiKWDzCBfrfMXOPHrEkjW+DD6LK52GiR2Eu+TspYab +ZGPE+320f47U42YmlqGat+RC89aDdBGPiJFSzwKxzYn0uob614bExXwo6DUC/kgr +IEpAOealdItarmAGrw98Ikg/7THF9bvNmSuUFo5OpazxUfOOGVed1+g8bOIR+0j+ +EYA2xoEFRgHEpYZF0p6bQ6AtLO81eJqg+Cgd0penIdXVDuK6Rsu7tjcXnz0VCP57 +KZFGGaeBi2Zk8kyb8bsOJfMv90TFX3lGU02YR3UL5wPSOLllExmWyrt9E/p2A5cc +BimBL/OmQmofe1aCgWK1+dDxHwd3rUdXd8a9uWjRa8lowD3at6J1+4+pVMZ7KDtE +TZhuAdaiqDfhxhM1Z09ASe4GhtMy7KhahiASaQg/zYpnH4rKa8qL63DQh+jny4Pt +ZnSJAjMEEAEIAB0WIQRlU34hLcGQJa047bJ4FhcxnOMRxAUCW5vZBwAKCRB4Fhcx +nOMRxGCCD/sEu+y+x2/NGjWcexvpAGxGp0JTesNF0gSGOJHNKahk9Svw5qRvQ9P4 +XmSsoktsj3jk3kO1yP2Jb5S+U1bYgbvwFab9my/E5RIy8vaHKtEhTZK6HBepO4hQ +ojntFamO17Y2IdV7yY3LkBYoBn7Pvr5ayOyUC5eGWtmwzfnXKfclZ0lnjNBkVo2b +s/vUwqtWUr1uZLPi9K9zVDKqSje/dxeNoFuxys0PV5PvdR7RhCBbsdJuTtaH5yP8 +74y3XwI7SHGTJckH2fbILTf89X3ufLfm4U9lzZqhutQv9XcdnGnkApWi40ozwMEI +DzJ+2l+txjnNUSSsRQIFgZaOqJ42wR+DGk/li/6hpA2PrwBLaVlXLu8PN9oOKRZE +AifG156nO/b9JwutiywKg1BJwxrXBd6sjlyLnQpkfhaG136pqY9yB+qe5IsxXBIc +zeSEQECsCV2Wr0Dtj+IHCt/Hhfx2Gv5AqbryiGxUMXJRuBnvKmZ7hvGI0qmXwdhS +2eTkgM2JYLZE6NxNZXxiaNwBL8H5QrKxJQWmzEBjZvfWY3A/b3tIPFtFHKHMI86c +oGghYogVPCncFU8ppo2GvOv6+CHULNQFt0oVg8bV2P+mYHm69ZQ2dBTFVB0vLZAI +fRtvN77IbNSvRHuCTIMJcSIa+yq2TuD5pebT9el8o/RhUGVtEZwJkLQadGVzdC5i +b2JAc29tZXdoZXJlLmludmFsaWSJAc4EEwEIADgWIQStxJUwy2sTJBLYVhB/FWjL +iZf3ugUCW5vUZwIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRB/FWjLiZf3 +uuLqC/0T0j9t3kSzeHP9f+glxkifaI4yR5rHvNirJwHKRWC+TJ4r+QxnYwUB0G/e +Lq1a4gi792n/QO48/tzLMSdmz4k9nJGdRMcNV5I/nWON9ElNumX4h3c15cUbTKqf +oNi1FpqUUP2SrbdqukKsktBOhERWpcdhl5U+JSHT/Ox5RSD+mCTq1qji3upd5rZo +AH/f2XK/TBv6u+6HcwV515YJNvZYrSsSCjwpOb7w4cPveWCg9tbIjTOwd93S0OWg +32lLfzpxotchxIzVkPifmOb2Uek3UVDCoBzUiGlKQ59Lv7ABMoga1xjiDv6HLo+7 +Ef1ERNdXhq7g6lILxHmqeVWvx+z6OgRnkpxgI7LYcpJLQa59mi3sYkVoq2b8aOv3 +fdQ9SpS0diJLI1Gi9+lKUefmkg8UORHt3hBzxmlHNT0fgPQYu3kl4OvYt5O5bKVA +jvj+L/Cr0RII+Pu85ocNP9EKsAB6iMEDmjxMFgeNDo9osfgbg9un8FTywxSseUyM +FLGype2JAjMEEAEIAB0WIQRlU34hLcGQJa047bJ4FhcxnOMRxAUCW5vYuAAKCRB4 +FhcxnOMRxKg9D/9T/IdmKrjVmfdK4jSKzEMYuqk2oX6UbOz4ojZUcEEIqCf3sZbq +jjck8MhpZc4W1wgk67HZjXcQgPxd9LQSIJAsJ/i8FE98n1MrKd4dQsFz26f7VC+Z +4rT+ZbFSh1Y+nClw78P2v4fMCcC5UKLM6h+iMPfdoOcBiCOHSfOMq6hDNq11WBP9 +E1j87rSxSFvkMNfdf9pBEpDjOtSS0QCfgLisUXfrosO5i8wuKKR6x1yuAj+sUC2d +Of4FyfQYmw/pCHtfePlbRb+uPyxLCuSyO2PKRcV1xYK/ttfCPJ7+lDWVUZfSotmr +rAkoaX7T7HCRIDSaNpPblN5K7HN7vhroIMeUQrETyocW1UGmT7crxDamY0f9IohV +/M/XW3Q77To/WqD2WRbFlHsrl5dYh7Q2R78QGPINWwI1fzxbFPOn0/VbBiCBUJE2 +yUXMaXRhKqXFNrHLJCgdOXvx7fVsUsJcdW+AVzif7zm44fHjDI2oR67L/TsIXqwa +jm5Ao8Sgd7GemLdF5AGaiazyHOQZ3AyWF+sxj7pPU5f1dxVN3KAIOsRfD0hjxQhw +21Wa3fEICUWnJbl9JBnX4OkJHnFjfHr55xuLc/kTb9jN7TJeOntr1Quo6RvtVWtw +3cuKLEJNJxSL46xm5/8cwMYBLRkC3q3OcnsEt+5Dp7yMlIthol06bT2sdLQhVW5p +dCBUZXN0IDxib2JAc29tZXdoZXJlLmludmFsaWQ+iQHOBBMBCAA4FiEErcSVMMtr +EyQS2FYQfxVoy4mX97oFAlub1AICGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AA +CgkQfxVoy4mX97qHiQv/ZMDNxsSA5Se+KmShc54mjhNniWj99IHk49ciu64AzvIE +9pL+IVECTbD2ymlS3rTwThMoBsWynAjLDO2wG6Jvo/ktXj6AYKyfUEgHSo+HfPWd +ZDMJV6FxLADEoXUzeUp2g0bQWrl7INBZKc4s9o19tyr2ndVbz50rA/JjAvx9ghEu ++WA1waAviGF5gcTFC55jSxpdRcqFJnIGyEgh8fKHH1gDKbzsKzaVtJnAS1dalWaL +xe7dOHW6kZ2VfG6JnTwkTtP8BtEF3RTDPOCPHXEPA/Bkglac0zCeuuukqrmp1uBS +8e0k4dFkCwfoDp575Ydg0J0O8K+47FDWVp43Sys/N8P61vJhGntxqKv326rd9hkH +1Tih3FPXyDQaBpvdnP60ybUoOCHQ4VO+rO8ifuN5e4lCCllDs9gPrDQ4icj8uOaR +8vJna0aFtoYpfc02e3sQuJOfdD8j/3t09mj4V4hnCINPUNM776JEFGxijlOomDpq +SU1TJugNReAUQPPvJwBDiQIzBBABCAAdFiEEZVN+IS3BkCWtOO2yeBYXMZzjEcQF +Alub2QcACgkQeBYXMZzjEcR4bg//SD1GDe4rn/+grswN/exTmre4m5CnNU8bD9Qo +zDmWIwDIVb+zOE3Io1hYkm+LqBU6aA3lj5vG1h9RPzfPrQDT8TjIikDmIVe5F825 +QxBrRGKdgL7cqkjqbhE+czlZzhN5MhcxMRBzZqzZrfwgXT1HREskds8wcEPFGJRc +sMr297zUGqnRHBw0Dn89Rfil0N2OICDxmaBRjAEbdS+89zk5AGpkQtGDORllNvku +WsfSKyOcxIdwORqi5wkUyXzxV6le44mWJPRaGXwdMwS39Slgfcj/i2N2BHvJpHW6 +bcBdzSM1+5LxNvbpDQdfo+Kxv97+iVaENDQqW3dzAa41CYby0ZNzHHlc2YpEGnnP +lj5aHYlZRbVjwvtjnEQV9VxFZKrQMoU8c2YXPAllXu+F2P1RJvYmgezn7E3MMe2n +eO8/GUSXZzhX0v7jh9DAkN1J09jclzNvWsGZgcsHO1cZf7mMhGun86R8L5cfHn8k +2RXJcdk2gvKMhxj3aBm7oUc70jdv4GdrfLjyPzVMw2njufe9ATHmaa7udctYrPjH +drFp60e/sP7l9fGRfas3OuqnujtxNHilp9DPsyL6uN2p4M3mZK0OvuhuNPkVDh+t +p7xbaKHZZ5kBY+F2m9Mk2ZM0YawmAqT/TbqJobGRE2JFZoaxNlyrF9j1pUzvXdf7 +8eKiEHS0G0Vycm9yIDxyZXZva2VkQGV4YW1wbGUub3JnPokBtgQwAQgAIBYhBK3E +lTDLaxMkEthWEH8VaMuJl/e6BQJbm9QsAh0gAAoJEH8VaMuJl/e6g5ML/23h3v9w +3Ayz51kOgw1O+6ofgLuc8RF3MDuY0f2yrDMw0KGQ2l1f5rjJiIB8n5CBxnABFFL+ +rKuAg5cWlJUaIY3+CtIxM33vSmulYPaVTWHzPl4h2FM4E0UvOAZvMA7T+19sxzen +zxbOCbHi6BbFqzYC+KJA4gOy58DluIXMWwRXa6On4EnHAp1VM6tP5Zv4j4RTDSse +z+OiNuf11mM9KcEAjQYgA9szJ5IEQWBxGeVwq+XEDs7LC3lLf6n1wJfOzal60KTv +x68cAmjJ4L/z88L1W9926pnkMW5BLEVZG/4U1+vehDWqJ2ba0DR2Oc6ZAQ3rMf2D +2T9WqIt3v+T6FXjDjR0qHsYVf6eSHnk1X1S65QM86lLe52EiFCgSgj6l2Zu5kpGL +vrN4ZOK4xFDKFaJadJAhthJoeRLr0MOJ/Va/C6Z8uFhDFiBMtOatgEN9Nbrbxc7q +shrv6ZEflExXqCIYP7RgB6lYlzWpYDksZXDnqQPqGsBMg4uOIBjpuxsThYkBzgQT +AQgAOBYhBK3ElTDLaxMkEthWEH8VaMuJl/e6BQJbm9QbAhsDBQsJCAcCBhUKCQgL +AgQWAgMBAh4BAheAAAoJEH8VaMuJl/e6HFYL/RvZJ+evY5s/k1ao4rXg971+YJU+ +K66uNV6JlDqKIB5VaARd2lqAovEwaN8N79o8tMwalR0NIUcAMzL9DLEz85Yw/i/9 +KXydXuHNj9PemBVgSB0DQco2cZBvoDsOhssxnISBLNxzfWcYdl3PBep/qmn9aLdU +IlgAlWxytQ04aEZDJ7T/8jKucl/3WhhHJ9EplrwMP03iYfpzCKQmekAHXKQS8mcs +xZ6XA0wwuXj7M9wQHmw2VrTJXKJqy2HqKFe4dvFfoREp9Poyesy2YpnGPGFiCbAr +1ZAYZlUOyIf9YXlwXdBGCek4K5lc8Mx4IqwE0URcDaKGSAyALTMgTrX6hJx//08b +E2gvUR27zd+W9BRpOKYPc4XiY4hXZPB4nrKGCRddhsS+kI8Cs6LLdhd6qNEJBoqT +ioMkJ8FSnhgFi9xB42zpItgU9U6baUalF4H6Mg8WbptyiYsguqZ1dyUncP4OF0ka +2ZqnZza2uvhlF0A4ylM83hC4vkvb8edcpktxl9HBWcFXARAAAQEAAAAAAAAAAAAA +AAD/2P/gABBKRklGAAEBAQBIAEgAAP/bAEMAAwICAwICAwMDAwQDAwQFCAUFBAQF +CgcHBggMCgwMCwoLCw0OEhANDhEOCwsQFhARExQVFRUMDxcYFhQYEhQVFP/bAEMB +AwQEBQQFCQUFCRQNCw0UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU +FBQUFBQUFBQUFBQUFBQUFP/CABEIAAEAAQMBEQACEQEDEQH/xAAUAAEAAAAAAAAA +AAAAAAAAAAAI/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABVJ// +xAAUEAEAAAAAAAAAAAAAAAAAAAAA/9oACAEBAAEFAn//xAAUEQEAAAAAAAAAAAAA +AAAAAAAA/9oACAEDAQE/AX//xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oACAECAQE/ +AX//xAAUEAEAAAAAAAAAAAAAAAAAAAAA/9oACAEBAAY/An//xAAUEAEAAAAAAAAA +AAAAAAAAAAAA/9oACAEBAAE/IX//2gAMAwEAAgADAAAAEJ//xAAUEQEAAAAAAAAA +AAAAAAAAAAAA/9oACAEDAQE/EH//xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oACAEC +AQE/EH//xAAUEAEAAAAAAAAAAAAAAAAAAAAA/9oACAEBAAE/EH//2YkBzgQTAQgA +OBYhBK3ElTDLaxMkEthWEH8VaMuJl/e6BQJbm9Q/AhsDBQsJCAcCBhUKCQgLAgQW +AgMBAh4BAheAAAoJEH8VaMuJl/e6kTQL+wfFX9Q5DjKeu2dTTuu+FYwhMVgAGMe7 +p1LbOyurd1PQmxC1sizrzmvMuNrBIB4x9TRX7lXu67Z1Ca9xPwgmIwt94qceW4/Q +B8Xw9gl6Z5bYzUq+xPhTBPOcn5JkvEUCGG7dYyUT0TUuL90d5dceAgks3yI74IuK +r8z1rzRFgRxITKcf2z5kCgdjA8ia7y4BXPTapw3c0YNv2Byeg/5JDwPpJHSo1pbc +NZqLBstzYm7pJNR1qctkSIVr7m4IyXlhBWPG+36pUI8wpG/70b+qRl4Z/7fQzVvh +neenQaM5oxFL1Wstjq80iy7rc2QUX0Tgk3u2+3o2VUANbd/CiNH9zM78VDpyT92t +EepUKActPr08RgXycTJbtS6EOtJAaLwO/RlJwWtx7m5q6Tarp0ksWaFRN0coSxsS +xcesrMLhN8SfoZXaCj2gX2tnaFQswXJ0p69m+A02W4hnFQJ82f/Xi+sDYVQRS8IQ +41TW+sgzYmFoboj8nLOclBwpSs4saW3xIokCMwQQAQgAHRYhBGVTfiEtwZAlrTjt +sngWFzGc4xHEBQJbm9kHAAoJEHgWFzGc4xHEamYQAKhREIhvsxbLbM8ImsFCA9oK +osi2wDDHVqZ6MUs9SFBX23svqxa4Z4nCR78YLw1tVaH2Oi64GL6m+43GowW3KDtA +nr9dXQfqzaF6GauWS1HMb9farYEFkWKr2CX01PUs7HmGFKF0ENbbzvbr5qsNFSrc +dTeyxuEFn1eM970gicR7KxUf0v9NvOjngjrytRRjpj+1fd0+gWpSm1RZCYouJdrw +TVVWSLXXB9zv5seStjL/4X4V0r0qaV/3REFYpxBzZg+DG3FiXESkwUkgRFSOy3jE +lHhguji1n3ldAy/cJEjb23KVHXmWYXHFWORYN1bJH6IzSj1W7kDth4OggWIDIhsT +TK65qtCniIdeTYvmBthzxZMb0qe8QNCtnftvOXqBblAXEUY1XS+m7Xyb2WRVU/bU +BR0C14TQznCTDyVX6sEyh1rH59SfiAyp+ZIwQfJfuhbCivVxqkKURS+9wF2Yv3Z0 +NPuYK8lu6JFT9zpMyO4G0wy7vTx1a/MTlBgWTcDdQFRPu6z4E7v1BZt5adZhlh89 ++a/sPOowkuGWd29/5A457Us59VZP9T03o45fV3FLyXd36BUzcasJL8Crfcv9Zj1s +I2Dv0jgka8SvzHbWwFxIxdSs0YcLfGU07z7DrtLFogQwTu3MirgMbgj3eBzE/08c +YZg1M2eodLzTRJ1GtOwTnQVYBFub08oBDADD/QB3aEOBSMp3oUx5v0w/oyF7X54b +ldP5HrlVQYkjykvrmUZnBei0YLb027eNNJ4fWjjETH/M7xCgy3twlhsstas6f8Td +Lbe92FtL/mnpyBp6yLJ4ph/1QF4pmIyKGOgBfyLjImz4jeg9uKdGg9/bogb2PUkG +mRmaIy/cNiKdIbCWdm89/AbFw2VnknIxez/mk02ymo34ofpao/1CMZRuloN6BftB +HLVy3h0okKfie0lgosLHbs18SzUMP06HAU2uFRovnuZGkJ/cQkIrIqWJ/NTZzGwL +SDNAvcGy2UTAFcpjdQXHNdXV0FK51zobRPtbzT9ChFQJ0kCbdycZxsYkuTKeQEOy +NgXRE+UuRJw1q1lFnXqFsmIXvp5PbsZdxIOJSV5Oucrls64TIO5MRmvOYirxZu7H +nWu+i2+gbfN/y/vMOuW42qIhSGYRi2fClJklZoiGBsEJyjfOJZKrH1Mdd/hYkVd2 +D00/oXrxlmGq9PigF2k9lKyELY9oUWMn+bcAEQEAAQAL/ROlx2gxEaNiUrnPd8U0 +wkYW6oJdwZHuYUO2Kso7Oa5W12mVAhPN6dg7YdwGMs57Geb2un4jVSSMStRz0bol +si+3PqUsreWmcacci3qA1MlVACKTACFMNiP2AfqVinFFseyEfFDc4KPCRif53Psa +uVRhV+VTm4CH1KM5J9EhtDKgb/2Fff1uyJcG0aGicsQ3IN7SoZVoHRdx1ZFEo10B +b2nuuNuAwgFzCVWsoquwZMQ1q9N+PZyUpRDy0SybJBowrRX+V4trh1+2Dl4yEMhP +Le7E5xkgKXgQ76EBJUMA7nPsJv2KAkD9C4XYRvQ+P/Kokx2r6QfMUhWQtikeCm2D +hA4/EM2x1llwcTkhxwuldx1HO6wF2uMn6Yxhy313Eshj/N0puk3YaBLLKNABnTU9 +/M0XjYRitDETh5e0744lNQNy1kFKWZhcjdlnwWfMXGtIoH3tXDuIv91T/i+Amoqi +WyEPRrPv8hj/+AaJ9WVbNIkguIdtsXR4pP/ly7aFwBrvsQYA3PJlqHi92NQBQkEj +SpO8LE5HPCIwe+IqH2pvTDZyhWqv7zcvbqx11tyI52V+9cpOzjy/M7vS6R0JIOBU +R6wMFL5DzI7bAzYf2up25fEVQzAY4gasnsXviRV7jFJzuEMfUQezREgsdq9hm3gZ +RBHWNR3AECSoUUWZNwvaFOp9rDjbvAh7gtsOcEusS66WdfZaxRO1RKoppH2pzoqG +K3XtCraCRsLRbUzU+IuNbFUtOBmuGnbsqSoqxLOOHZYLF6EDBgDjFO34uqlavnyd +QrMV3STUGlXlE+HuiQnBhPPxp9R0s9+09mIw+brn0JxeXA8emdrVdC8tg06iMk4V +0V3dfAANhUuumXuSInkwGk4ypE+WgrIeLAE38Izi2cTipnuol7Vgwc5IIv2eCdja +EYXSYxtcx6C7YFVu81g1ftVnyriWP+hWnz+iKMst2LDAGtdkRKIG8Y/3hhLVciLJ +VexX4eg9NjWm8H/rOLpDvDuiELyUUUpcPMeesuylkqVmavlGND0F+gKvThKgEYYL +3+CYAbjxKwtsKUCbQ+gqIiQmgNjP8PfJCldXbMjhTl7Y0WJZ3MHyUV1gw7iMD6H9 +P7wf0+pvacQdgrGm73vlDbuwAAr+pXdaL006Ryc6w3huQNcGrvsmamRccLeBZt16 +5SfFhSgCqQQsK420deoUM3DGf8mdnGDBUHL1Dgrl02dAaPF0pcsTJypvTnaEBbH2 +wlU25Lju3IUDqq/4kClrcpL8CHMIxvkxwW/7ih4Hq9q9LLUf9eDahNxAiQG2BBgB +CAAgFiEErcSVMMtrEyQS2FYQfxVoy4mX97oFAlub08oCGwwACgkQfxVoy4mX97o2 +kwv/VmG3RSm95lJEotFRTjCp7sm3scDSa83/ZSS6OTE1iNYvPg0pUfjzMcwwbTyn +vrWBTNLYCge65Iys/Zyu1vKLHK6SkZgTe6iVUbZC56r513rrVtahHNXpJP6+Uvmo +LNIqDVhuurtl0or/kzkI/NXapdAXnMVaOMaZ6f0YSbmM6EEe8afHvs9iJhopkGyx +XdhpXiwW+BreYuB1H7kyUE/tcFhrkp0X1UqFYReYZ5S+Nw5gKxiDGW56bTVsiAu1 +Cj7WQcMrVN91o3HLQw1USAJZ9CsJcEwb1uF4s3KMG08BHIRC9QLUo62M1C+wkhPR +zHHuH5SoTlChvbIyx4LXfrk/MrJEZqeEX11QXnfeI9S3Yr+0+ydIQkM89R5naxrV +Q+B9GXIoxmnzm6OTsyeKh54ld/hcZjpqDAC8XED6WMdmIjkUS3yP9Z4iplkF4WmA +HAHh/Ff1JiytskXNdhBVFZByS/RIov8KNPvhHeaO3h08FaweKhbJu7fkbmNCx+wc +vVZqnQVYBFub1JABDACv2p7Wl+RZOcvS5HaK0sWNBfSYlP+WJ4o8AfvkupftE68u +abJtI0Bxj8Q0pwTgHYFaE0gyMUAow92fl+5RY4r9Q3PyIbckqBTRKY9OOCMxAtpQ +rF4BCfTguym7vOrOOZRFx3xFyLiOX52LGwPSIHG37q0D4KfZQIEYzw1Kyl2qLbdC +PNeIK1sds59lh4hrwqiaKNuCFFlkXu7aG3BvT5CHiIISMmCaNvhBoI39RJ6xpuKK +N1xqIRxlrNaijDdzCbd/3qqXVNOJnyl5Cwiptf+TW38KQw3A43peHGxyLX+VZovG +hWa4b8kE97T0uA6HBTBcogwaHYj/ulB8Lqf3//UoIisjCrt6ZX8PNWae4fDw9QXQ +CWEVrGxVCrErTC3NmflCCKRjQh4Ituxq0VckGFvAYHNM7bfZiuH9O00c/C7XOQvg +NDExHPQNMVlO7MA0s1vEVrxIbz4LoRqPsatGnr2Vc4FPm+MlTa07Zo6QN2eIstn6 +zBXzw4GEExecADmD4psAEQEAAQAL/RyjQla5aasg1GabD2BQLse70+ISnFom75tn +dKQCbGy5VeqoX9w8xL6O+77aAYXrMtN+bGAa0SinrQHTy4W0QOrkVI92miKoFKvI +qYPCyfMDVJZABmxY42jC/MA2uxkBG3pkStf6dhkJd9iIJQ56e3Ues0z8Wu6a/esS +XPHJvt3QkBWDXv4tQVYMQxr/qrcR05nh/s1SObSKGTpVBEcRnVHVEzREwU1Gl8CS +6vdMeM4phUmeS7h6J+u5l+06CcBRhoF2hXlamY81AR4mfPbENBxG9Mv99bZT/SFs +PBgOHp3+G4cGZmZ2WsvaPO9+imQj4oC4rV8+3J3iqaEgJ2Q9k2D5NimvLIf4r+1P +yBHYQXHluaLjDRm2u6Tm/e2MujtfudO9acFbmIl6QjCLobfQ3sQYgalCq3N+PV2a +PSuf7PDBiwR+jl5UHPcOQV7UcTWp1CK+MzXB22mHYxiG4z62PWSZ1tCBMwqrRllr +Ieg+u8ONdkEh9iHWUuyIDn58WnLp0QYAz2OzbYIrTPd1S6qVjczqIOO9YulgUG/H +7oTEhkvkYTYBjVyL4dKbEitIY/dzr55sQFf3Z4lTQfJjx+pbkbyRcLnva7bQ0RP3 +YCQFI1udn4R/GJeeA/irQr+ou+dAXZFfMIY+F/6ZjHNztPndbFeUH+Odukj7W6fL +YHOTKJFDY2vvzMSE+GD9x02eG5IJFFAQMlbGO0FctznJi0BQH+HCC0i51Ym8VOaf +jNIZqtjnMx1sn02SdgiwCclh2qQl1M9FBgDZEqZQ2usp9s20A7UChU+UMwBZAhoT +Q3cTTruJEVbbCdI8T8I9TlySv2uk9ilWQF9J5j8r6b/GFOKOEclT5fqsoYy8r0i5 +mZ6x58FLKPys2RpEUxuHbpOV9rl1ZCIX9MayNIkWgkz8ouHAfvmUQUDpWBe/y042 +wCCcT1fy+/HRAE1kK0ZGEz3qqeGuUE3jHg8YOGT/g2dt03sLNRdoM6Y5ORrs90gY +Mc+arvxi/r84VrcPyaACB0TdP6zNpwUymF8GANje/Wd9aXoS4IbA4DdmRpyK6+NH +LACIHhB2psC9YooDaJYCZN0EftKcc3qzeLgt8mXNdEKceWP56cm/TIwGSfgaCybd +MzGHEhz8RuegtNyBDKq8a1fhQjLq2wxOEb14cMHBSikXCy4hqAN4jYajFVGAh5pS +ETKRNbBhFVGSDJrKCzo2TdKmw5UMGOvyhMFS1OjQlZOFH1ob6xtkYYZutIOz2IDG +CPAkwDjR45YSiEGScfwoPjrgvgYl6+6nJMzAmN/ziQG2BCgBCAAgFiEErcSVMMtr +EyQS2FYQfxVoy4mX97oFAlub1n8CHQEACgkQfxVoy4mX97puIgwAny1rLO9upjdB +kqToSrRgqPwbDc1X5chPzvpmWrPVwpHAjCQyiEZXSVxFeAjW4Ws1QtNmCZAp+wMu +ynr5kxq0fuxV2S8lUeNOGaY5VU28QPiaQm7fDmT3zBlJwN50+ai+kA+9er9kQ/II +sJjlkvLtQiDeTp0R8sDgqM6oIwkMneuH1zXLMkoLVTUgqoYT9FICaYgDo5Dvirol +cw0QOdtb50B3AjvvEePzNdRMvYNbxpykB90Loakl+iktjonOCArcrcQ81x9xG/EV +YOa0pMGqZnTclxta64XDJddH8rngsoPxQvJRA4zmyPLWyPiAAipnqO0YxCzm4/G+ +NUHyUjRYFtfS6g/2bsvqo0UEOQHfnrwoO+tA55cpcAYskC2tW5++Xge3L685lpQ1 +4r9/LLRmbPeqY5b2QXoaD+7KZMGRKIQtHoBhGJ+svdz76uPIX4+EZZezAlKIyTz+ +2fIXfQSdLU/sz5u1NTcn2hWTpL8uUlicWG85X+Ogo1lIaydpwmQTiQNsBBgBCAAg +AhsCFiEErcSVMMtrEyQS2FYQfxVoy4mX97oFAlub1msBwMD0IAQZAQgAHRYhBMc6 +nAnKRKiHmUhA44sgkypwQZ6mBQJbm9SQAAoJEIsgkypwQZ6mgCcL/RZ4mNWb0Yf9 +PMpnO16GAmJC2uDjVb2BpV9eDcFT7WIWvt+IdagmaLipLRHcOZaxoKjEhy9RX69b +nca9itMq7o2N7Mr+Zc2gHZe2zF1K9sFiG41diDZmGb9lHYNq6Kgyy7hajowuUbOe +jjHXAwbab4tdgDZYl4QJtJ7TAMTywMHGvTQ6URlj1L3Bsag2vapMIf76CP+F9S1X +PWXF/GsGA4y+9OITGdeRqS/S1tP4aXrQkvWLgfkcbEByd8nftnG1yQ/q5e9HysHt +dR/6J8go/j+s66SA76K2WORZzH/mvvSv9JLHL45LsWd6obRNHoLX7JXj6zCo7zfj +mUZo0Uzq9pgJl2Cig/QMDEp2ZmAcUoWhr7VyjNCQLBiXByT9u9uNP8SdapN3oTiK +nGLKy+YJE9Gya82CuWxXGDIG5IYd6oCpWt7KJcEznmxHF9Bf2fcWYXkuI6s2NFE6 +U/SIhsfODT4rSDcsLsT++0zneACVbCgktZOA9UnCv5HJOpdNq6eqrAkQfxVoy4mX +97pUKQv/VYRQyB7+1PG5lCXyvphysEtJno940LrCy7mZ3Ema5l063O1exK6K1VjE +a+OU9dxy11AjIljqShhkhHwdGXHzJECd9Eg3m0vwufMvmB2LVMjAvfSYGk0HUYhb +NvLwhFOqybntDdQJMs4g9/6yDR040YIz8OdRWB0DrVmJTIpsy6nrbyIo+HWRowa1 +MHnPr8/I111ivtVmf6Rj/3FKKExZ/o3D3+L/D0b+wQMWotBEG+UzEOsyK667jq69 +I4XtcboQ/mNrDyb0n2DUmgoGLlQ+ztijbyEqaD8Qam2lsZtGX93NmxjGAO07gE+B +ih7vDrkgRJugw9QA23gfrJL0iAzxZCAjA82MkQC2BsDgK/bwjjGAh75kVuYPesY1 ++VVugTwgZs81j3p9CUySWm39ftd68S08mkxb9+/aoETDSyIS+TiQmejxFBM3Myho +FB1GVzkk1djxKTsbPePuHzbYfnJBP8Ugk95t1tlvpOo2TaClz4ggnv78fnMIN1yx +YtvOj/fpnQVXBFub1LcBDADBQ92N2pPoaZ5xik09ebo3UZt5bU1YHgiByqbIA6fG +c+RnN4GVKj+Q0vZRrHDPjP73BwpIdI5rSWNrCfD94vJbBMcIjSH6HXlBXN8ujiXm +ywxqM83nAEGBH04BfIGR6avXuw1/++6fWfYvyNaJvsc2y0w9wr3enRWYA/sb9YMu +YveST2VpX6os/7nBXIcZ6R3XLQoU0civjKgdHfHJly1doSQ2fUYyvRBh5MS/175n +eqeaAe26/HodozR6m+ywJdQJsfRlChz7dtiikLaZUA4OalQE/PTFR+xaml3LXQMz +aZr5MdP60aiO/XV+RQT0aelZPNByhUZSKWzdnM8tAmDgXCGpHpDkYO4s/jIzrkxq +3XmEBVOk28ln000czXiXRYPd8/psXd235bl89FCwfbvMXHdsKGLwR/nJdUPx4y8k +2ycBhf91Y3sjaBG5fjFME2LjhFnmxRN4+MV2CWppJFjtKkF5QVODqDxfdAog4pIV +BNmSOgkqsIZ7luGaJJiJi5MAEQEAAQAL90vYZ2+7nFAzANknwuQIA6YYccloxnpF +15lcZdNMJHqbRPaSOFmWB8KbCA/SNlFfv8DL4F9bxREid66KJyueGCk5x9FgGkrJ +rLtgcuCOG8ky93kcuVxD35NEYHq9YfnydfV4DLIcX96QCS+mf76gIDjpS3ngWZIl +z1Ol+AhFL2laOlb9wJuI3oRj+aRgNBxugiVWQ1pOtbfIv8qtfkcnYnMo/WKHHLAi +LSmTN6OJoR6UrstKXN98ek30FAq0wB1x7Ywq/xsb/GKxF7B9j0qSsguZQojSKVAT +XBv0s6J6Ljg2ThHCy9TalhAAHkD4Q10iqcO8NIcRBdRI0GwkfDksolbBhtMBWVmY +QrlErut/fqvwSSIfgF0Tp5DJIqsb2OQ+SQh+CMDDLsp01u6gnSFPzruCsSAt4P7A +iZxWRSQBKQAg6YHBBOJ6F49lxIc5LCXocF81ETN36DBsV2axktYYRBRiEJx6rDxw +m2wCWuu7h0MOc2zN9I9jrsihdG9DSMyBBgDC7PsU2UGixiD0sdH90MJ8dW0lOB/N +ggvzR+qJRFUnIRQK/hCrqTGE4HMr2P3E+Jm+5Skw6t1iiKALt7Dwy8VZ6qWwbXw8 +R+rYZpjrROxN7vBgrJO/1ruIav3VOIywkt0StoAWU5cEWWQdym/204yVNgpfBtNL +vyMvPGc9M8uMeCzpaE2LTcgE2J73otpW/FcEV7gOoGl7MpaIW/0CBS9Mqsp5IeLR +ujCZhn+hKUiEYemR13vJs1taxnmG6XP89UEGAP3Rr+jOxozQSPgmHWRKKIeGNzmY +lyH6LsEPffv9+Iu1GVLwft6S7lWSRXQsMoClZMCRfMw1HyL/I7FjvVL+kpKzDvZ8 +qGQfGfYnS1c9ADYoZs9oHqIlHTkrEU7GD2dmxuAFlmtz7nxowJdkHMyKaC4viX9x +5lgDJjK/tMHqP5G0kbONUi1Hs7RUr5dpRIOURsjNkrRLSjSmw4GMXch0hL6cUJ+b +Z2XhBoT+ljqIEYVLKjsFK/Yb+e7r/2+usY6n0wX/QAekY/r5jsxCw4r8Wmug9s46 +y3Ym3c9gG6gxWo0AJW43iiFIcbckkivfDELMChy8D12sorijnc9QxDQ3t7rUVgcP +HqWBEqyEOZC8lgoxE+zioKZ2jW2XQUycNVJv8VXXes/uvm/HYrO+i/uwW7ASRssP +DIbNCflmV1Zhs9nIX2hFgEO4meozECB9NnxJVPzS8XjOgozPjpqJ0/MWfA8O9MCK +TeeMzzONSc3IqtgNgZ8YY8DammOPhknNmdUaE0pp2d2JAbYEKAEIACAWIQStxJUw +y2sTJBLYVhB/FWjLiZf3ugUCW5vWfwIdAQAKCRB/FWjLiZf3ulbIC/9pOwX0UlkE +bkDQc7jWpokykkZTOkc6y23I9pZi7Pzm2gcsBOcVsHZ2Zwdx4GC7KUg/0xmwx/a5 +J6eBeVrFGOwymNNZmzGBHUiJJd7tbVsO5XGFHtaVl6aFc+1CIdpv5H6BfnqdWczH +S2xiYUu6az9O4BpxV0Oprey0TRjCQaud4ISlJ+fE+2cYn7nSjH9KVnv8MM49fTsi +qqgEvWGDb/6WqkDitxElDZ7qdW27QwMRI6Zid+7+oSER/IclepU0UV4KC5nsXDDc +0KbPnfftH1qxlmUrtyYu60NF/4ltJdcDc468a57omjBgCaZ3pYFYJ7vSGOkgrAGw +rSEZqzCObRXfeqcZET3FEK7Ljdd6w+jiVHHS0VzOpm+ZhnoEuFW5+6sM0DDNu7X9 +K7cotX5v/659x9ztmFchpi/4Ol/+kUkg4uB2Wxs4o4HHVMRlLt2XlrFXxBWAY014 +y8iEbNT1T2+LOcpzOKjs9xRV5M7fa11IuStbI44qLniR23UQwkGHf8GJAbYEGAEI +ACACGwwWIQStxJUwy2sTJBLYVhB/FWjLiZf3ugUCW5vWawAKCRB/FWjLiZf3ullj +C/4lAbfdw46Avi253+ptcNyEEK/uSTwd1MUSDCSHwpHvEeHgClFt7OUZyY0nzFSG +40QeWGy6n8xqHpLGabNbIlJv21UiLURjTWLEHSJd6xFAyKpo2nIYIde5KvPxZdao +DHb/DLVBOMVFp4ZsvRw2gUk3Ac1wMxPN1zbZ4rFl024uaylqA65HFEvvWuqg+EOS +CrcTYzHU5/0+VeKQsWI6kb/nC9NwsbO40z7K5s+hnmo7aPIhAT+V5D8azKwUlbPQ +t3Jzmc94f/Mxslm4bYzJoqBpWKr4cOmoGYPkGwWWniTfZFmh9MubxSyG9j5wGCdx +ZccMHswsUf9rzVzyPR7hzvVJrodDL9bmOH/+fRnUFVOO4eAsvNDKu1VhfiEFNWkz +T0+6lkUw0uvdiLlml1VTC002mcIyQLg4jbaGaJvyMFMuj4akBDQu+13Hybnq0XCB +Ml6LkHwiMyPH3tt/mbMDwvbEX4TOeILAKyt/2NAagq/dZ9m/nrvvl7xk0Vw2X4V9 +P++dBVgEW5zF4AEMANiguS0Ugx7i014qQf8OchA4FdJQ364x8/f7Ju+F2aatQMdV +TLDLISrBwbPZFmLJ5nawsQZf70b01mLkhCDLNaHyK3ezCmyXToNRt/w6hsiBZlHz +ZZbfFJydGcxN99P42ksaKAKiecyCG3SaBjTK0oLoH11U9mllc0wiNRzusOVNxlvD ++n60FUTwy3/znj3DT3m1/TNbj5yaTIpUO1biVYHslNK5kFGw9xnBE9qRLxmOSfN+ +uxKqieEKCxAXA01NwIYc2a8n3aaa041oTc8stpZrTCHmHPHRtiJyAKBTDO/mNM7j ++Juc9nqqSTaewzc2dJoXAuyzBUTjIK1MFO9B3cnm9HXdKhP+qpCScvn+5aRZ4mDO +9VFMqtToXRIdAypO9CDlaDlRTXmJyqU+mIQGOH7pufJOcS68rgWx9KDARJvhnXJq +EfNwq/7e094OCvwO3ZxyUZZQ9RYeUVwIeSlE7XBfZC0giZTjMrw/Ny1JpCd9RUoo +WYEqRSgZgZWTdsE8YwARAQABAAv5AQWBwkCDR8ZQ1Kf3TZGjlfnbyJeieFYE6aVa +Vu7/xUYn9NB13+q83dQBgVtZPGRDlV5EA1QuucrBo1iHI1qqm1ywnjBosLO5W/Yd +KVsmii4Tb3UW3mZNXD4Gwm10uMKPh+E2fj/SkMCZOw8VawewybTxq9Z/f4/smMnk +WBcjByO7MgJCPI4Yz/Ug1fCjwuofXLmNapvWuFM8DRVDOOlu/ezkSAJftD0TMHcv +Rx7UtjQEceCYLaS4XTZlP9nxxHXq61CJyTOWKxMQu4fsH6tM/u6iSHXxJgEpmRCb +azTba3DP04R5AscLBK/fWPuMEErmp+YUN1/maDF5zIH4gXByw72QbodRY4WQnJ5e +WWo6lfPYB7Pq6KNk+JksL4JLBI5q0rvx6UdTPMOwhyAcnPP4GzQ6MDvnkBMLBbYF +2PHBOfLBPcQv9I8FcttP4YLORsdf2ACoG+Tr93SINte9CAmlDwzxy49IfihSCH95 +2VCreE3Bj0/52mcZ57N10kGF+QsNBgDo29IeZ1V/Q78dYY9cYNq8T5UXGVHPQ/io +OsvJvWby8PL0WdIMhxs/7rdxF5zx4BvdWgY7hkniA7oAvx4yncIf9179+Wbnqaoa +Nci2g65e5cDrUPWkCdrL/4mQEbn2t1Uxl3LFnGelJ65YS7sQLbqTbwKvolii2IWe +dG8bvNvIKlaoTc1dvUbJ6lTGh3Cdit9dHFoJ39uDxFyM9bE9ED18YVEkhayrulF+ +QPbXadVAoepDXevMFo/TaSScVfDS1EUGAO4n+NY3haWm9vka8cmdJ3/rzgBe8ao3 +SsXAjODVc5dp/jm2GRNJ93BDpqVMKZ3KHWrNwA7aJJza3N1kN5S/4UC6qRq8y/WH +s55xOMnNiZPWc9fXyNW+2r4Rt+6Lcs/fSP6hkidEZONMaMDiHHpnjKGOc2ZTvZPX +S0DF8+YsLs6mOjwDtuuDL+Ol/C1KFYwV121X9Ouq8ZCYUCgM6zDWRiEaMuZl031Y +rYTJ8dA2F403gdvAw+FDxHj1LYKe+wjchwYA7dp+2mMBPPs4ZNdrmUD4qQkB074L +QnEfMBu1hmNobbdD7kdsxcjVliueTP07fNnE0cF+ue6gUkkCgR4tmDX+VijpVVRr +X53/c3xHHsxdI0u1nJzmdSqua989QrnbA/65+lYvqjiutibEjdwWKZ9F1J48CbAW +A89DfzIpxaAuK5yhOnMBzJl3u+FxuDKuvQVD59LdblzvRepQPFk4WDthxafUGQaC +AHY7qanif6R3hGA6XHU/kPYT2SAvD+/uRvyg8DWJA2wEGAEIACAWIQStxJUwy2sT +JBLYVhB/FWjLiZf3ugUCW5zF4AIbAgHACRB/FWjLiZf3usD0IAQZAQgAHRYhBKbN +BCvJUC0uadGFBSRi/BgwdNQWBQJbnMXgAAoJECRi/BgwdNQW5DsMAJJeGnVDmR1B +z6aNdwChz6alAglljaQaWT5IzL8d3bgjdob/DOjNJslmXw0aHvvYJJK/+wKol10F +U7s8ikUvL7c/OEliaaIaA10/QgVa6QScmqBWRUdJJMLvzNgMYa033eV6zn2ayR2b +6GVvcoNxi4w4rYgs4TbVklpxMmM3P12IRheceXA51I9gQOcwv86BTjP2vlHWyDaa +PODDzwFW2uhRlnaERB2Qt2vj9BXnUiOatz/NiUQ+NUiKLCeK5Cuk6xCdv433EWfT +Zp9PEDxJzTOIAgD7tdjzyO6/z812nLbX50Bx/0ToPm0U1k7QwzLHj9FxmK9yBFey +G5we3s61apQunHcCL1dqA5rIXwMwB4jIWDm5Qsaz1XgdSZGsN0LpOxkdcpnDZ9tY +J5OAwOHHE5stz2zDjKLbl89cAcFAKqPVKIjZANJyUR+vtfBrF5ruuQ0UazWjDZSc +u27t9BBJVzr3/9pWyJWVfidyX0TzxqzFjA/TtRoK/FiiFL6oxM2E4UmZC/9X0jNt +k3iO1W97HRmtucyoblnv8SPfZgsA9nrCzosZnfNfsRwAX25HOhB7nQt6opwIE7kw +ANNyPvYKFSPVxVk6CHHb1gcOL4wNjO/QtSXO/y5omI5jn0x5dWi9cLVPeUDaRLSm +EuojQE8WLL2oxCT4C2vdqc5Seohchs7r/PMCUBJcun8u6CBS3H/Cyu46ZginQh6F +xCVC/Bt6OvLrn5/csZrlCT3x2EkYMs9iajcpYmYjXRdLLg9MsSEmVfelhSTOXpI2 +aIv0KsM8hTmemngs1T5B8pVtnFPu/UpFlOyLlnEG0iwapoiNkirRgnIMzKQNbXlX +wusznqgUZtSFb75qXoi6iRIR7sqvonQLzdlb8uwM4GQGFkexahtKGh0DZk4OnJcq +KgOg+FhNe1Pu+9K67n1EhmdMLNYsj4tTMbqQUrwixJNVYVPOVrXdcWEYMJyajdpH +nnZV15O/wKhCm9QTxCcLmfyMtAwEtudCV/HANROPYqS6iSugsPO3FWeYnQSdBVgE +W5zF8AEMAMLFZpixCDHZZ09QGmjC6AIvuDacKvcGRN9Xj/i4hEUZagRmLLooLRZl +yEdbkK3HTWB9nhdm9881FGQqHAsxO5ewooaXeqAcXHLdzSqjB5ft5MqYV8SpIYEP +2cdx13HKM4v+4usts7lk/qzMnE7iAbJq/JjMO7K5e36EK3n5vGuZa6E29UTbEBXY +ZKv9Hwg1uWTW6RdwqsTCzjC8U/38y4z8Xss44k3OFNnci5105vP7WXxgJbR7Dx5w ++1I3Q9flLwGU6awrdrDVtp+s7/TqP8NgDy0JAKrjJIDsg2y3EfvnYUqbMtMl0HmF +XjcPvO/sSPrnmUBUNF0TUXuA/pYyNgfF3xjSH9BLDPfch7HqCNV8TsBnDkHsi4fy +Xy4n9qNtJqJZTTIhGRNvRE79m0RnAPn7F1XBriSEOMGRcO8h4TgvLmde1UE2dLft +s+z1hS9OYKP7i7dcIPFnQzsR1IjwZXrEgVY/HSx1mt/3gZ7AgjLwKAGBVU1Dg6b/ +9bncFwC8eQARAQABAAv+OegPhzEG8y8kMGfr2h6sdM30MkQ+3998xXwWgUd2h8a1 +BubLwHLmaMTNBS4bdxcMkbX3NRT3cyLgU6FTYh56jbBFucc6fXTBJaN89oKu5MQl +I/ikC4OPQvxP7qSRfbK0nZgjpfEaAHIe54gTpr456+4z+EesLghIR4aLGIIfu0vL +PIyG4jhQ8XW7BIlGWx4B5xGgDkiAdOxH+iRbwmUQrXNwyXG5kpFFELqpxZ/2dC5T +3g8F1sFJbu7/QWPN51erGx0/xTCtuStiQNSC2ldb7UOiJKTM18mMg50FvkuN1o24 +pfa4JgdVsCmrSKUHFmhvTs6i1WteDonaBMaU7Jbzrd34lmi5iKPV9COWljhpli3X +NAYGJsZ/xcCk7gSrqjgQVv/aabg939ETEbDbthYNIklUnEBcBEm+wUj3g4/eiAUi +xsvZ4DHi14I4q1ZPd/KzXmd0B3+s4xEIMGcr5MlJsq20zb1ybaKs6lTffcRr6wRg +II9skp6sb5qrTvpRWwzrBgDKXn90sdUIGrIORGvx/xvh0QkUZI+2k9rxwBLeKBxV +fHLlMERkefKO/o6qr6+fTu9DpUWTMVrHZlovccQikWNAvRSDDAZgDE7vun9CzJKe +YHyuhWWIf1I1abZTKGNGKtFsPzQ1lCFQu9+MIEfnpX1klvco+zvqvRmlE4seScDA +ReUdU47eLj/8QW293ezEtwYLIGg/7NweEQUYdZu5qvTxLBXe81ikQm9hDqO9JFS6 +OD5S6Lvo007UXBKctuMwp9cGAPZjbEEFYcE02NOd9GhsyEHRdepofw659MD0mIHg +MAEDtG0PP5fSYvOYGhYagz3fQEa4gdTneFp0UxUAKzcUk/ANHVPH5m3vNM40Pyi2 +LnAIZzi5EJ7uO09Bv3cGaXJnG27sj2koxXBSdUk/YyEixso1fczCIhkDXkS0zoii +waRD4UPO3iTqaDSDzFeIf5MJTR2PBvgtdXfcMBjvekYFxRkn9bLMMHBMoBg208Tt +9plKtYQPHVfcg5k3Yf3pwI/0LwYA3uf6vq/AcdmzDcPVVXcF0RUC00FBzMT3NUKk +hPg9Uw6ksWbkhAN48B8gtWbSi9xHOfVwxSRrAfiFl8aN85rDGkvjW2WmFeLnJe/0 +uT01B/k1unpWf2CUhhtkmvZsJnti7KGMol1j6Uz177I53J0xLTn6llV6YM5Gzft5 +mjNUlSYppJzNmkl6hruAElLlpOEWwtC0jEunjoxVBYShIueA+z+0a35DUJcUrAiH +1IPxpJYXViwCLjfdjI+KeQp9Lpv53PeJAbYEGAEIACAWIQStxJUwy2sTJBLYVhB/ +FWjLiZf3ugUCW5zF8AIbDAAKCRB/FWjLiZf3umr9C/4gQfVww60QJ5DveGN0AHU1 +2SAtXSSxZmcfTeF4U+FAdgp1Yl46irpjaLkWBaOetrpe6vjMZSXXFrQ2W6o4Nk5z +oUgOgsq9JAcBwrEOqiCOn1eCPvdB3e/ZD+o9jfYcq5FVw7/I+nFK+tf2NXdN5ZCQ +godhiCkumJhrGzTMh7Rq51fYy8lsLLiU6pjgwztvNsqjjiP5Nj7BAvP8SL6YUmBQ +THpgkDl4cGoTMYAGWASIyPOHvaugeqp2jXVLD/JY8ODbU/ZbXSuu2XMgKHB2PBYT +KE2rQ2sPkN5OrRF0JDAgaJJeoxIlVUK0BFrC6d5ukQ3E0FLniSfrRhj7M1LdTT1y +eVoas/mDRSSlT3Uug13u32sLq8YCB5Z67e8wWEwjt8BKh/EazwwkMA/l006zuFzl +YY08nATx5I2xm9glMLeq1SpkwKQ/RE+NDDFdERAlhz/9sbcf/iQXGceKLbp9TFNK +jguUrrGrVnmnmy/YoGTJWuGqrZy8kcC3LCjg0k2mV0M= +=qe9t +-----END PGP PRIVATE KEY BLOCK----- diff -Nru enigmail-2.0.12+ds1/package/tests/resources/pgpMime-msg.eml enigmail-2.1.3+ds1/package/tests/resources/pgpMime-msg.eml --- enigmail-2.0.12+ds1/package/tests/resources/pgpMime-msg.eml 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/resources/pgpMime-msg.eml 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,52 @@ +Message-ID: +Date: Tue, 17 Jul 2018 23:39:32 +0200 +From: test@nowhere.invalid +To: test@nowhere.invalid +Subject: Encrypted Message +Content-Type: multipart/encrypted; + protocol="application/pgp-encrypted"; + boundary="UxEMgGKKbt9SDjSozkXfqI0l07sqCV5I4" + +This is an OpenPGP/MIME encrypted message (RFC 4880 and 3156) +--DELIMITER +Content-Type: application/pgp-encrypted +Content-Description: PGP/MIME version identification + +Version: 1 + +--DELIMITER +Content-Type: application/octet-stream; name="encrypted.asc" +Content-Description: OpenPGP encrypted message +Content-Disposition: inline; filename="encrypted.asc" + +-----BEGIN PGP MESSAGE----- + +hQIMA9U1Yju2Dp5xAQ//V7Qww8lFyDqa7oos8eVgEN7Oan2LWB5kl7hgDr272LDv +/oiWw39xRMWwwRr19QOcyszpOvJqEzKiJ+FrsBUptnjfclJjgPFHuZEeXeuKu+3y +ddyknseC0lxbWiFmUFxMKPREQSb5GqpVbLfKXfN8cd+lIHdW0V4TBlE93KyP9jmh +mMo/a2aFfYnLlpPQfcJu/YIMHy5R/fpLyBUddyz/wFuiQoxkSodo79Xmw8RF2j4L +s7G4AlIrV5uAgZrQpwYVLWYK3jSxDbgJIePrhnm2L/ohawNim7AlUhQJzi2//uKF +d4GeXTWuTsBCrM2VCDL1WvvmgH7DBylGI0cAX5un67wpH25cVzxjubRNRuQf2oko +2xPbnu9fTue9Ghj4tuEF4EP+uhRafce6F4Tj7LG4nA2ZlhMx3nO23BmVa2cfHrv9 +MK0g+ojpt4VuDwKL8Pr72Z0jIm0Wq46OkEZ7C2XoGG7LseGr/BxbaXWgx5ZzedBT +vUfFtPLflyBBrSOrcMYtUgP6N4diw42mO4itRUc7lfyaedm32d1gGUhhV4KLVknB +qOU1uwjyk4giMT5XR4KIKs7dKlByFoIqLdFrrNPmc0dd07Jb++lHxVpVKeDXQiJ0 +F0nCSceX2MKLAu7QxL2XsB5rhemNA0PzSl8X9rjqGHM8jdGrKW/C0boz/bomIPzS +6QHU67J3HeNAemgggBhWlFJo+VVrr0TwFmJUO+3U27z5JdkNFP1xwqZ3s3mgSQID +q50D2qu4OLgdwelt9VSRqZZ1ADBjvzXbdHk5At5uA+NvQ1uZRXWD+nLcP/MBEP9T +NE0ePvZOa82tzlxm52BIVRMSk3JaZ+H3GSNSC+A7XY9nMdFhj20PTCeXmzBby7dd +9KSkTAtolo4pQCNaBhpKrTN9W7NZmQLnjpvB59zPUqgQ4YVWvTmKyrYvkRy8yOMB +GZ4o5FJMyLmLIVSQBO6rFzkn/H2ezJgRop6GW6gVmr8eOyYRVzw2E+nOT0Ao2emv +sYo9zOhdH6cA3Xdi1eb8KrZU0eRMwkxBbLp6G1kC667T+lRjRtctIcOiKirKz14g +qJxHAQcys+sz8SGEg6jlCccpcDTtNqYQSPsGtxZIUcC7n7vp5ZVXIti9eQBEYmcb +fziLkn/IDJrxGItW9UGnIWVq3rbmv35pAL4eqBlX5QlgIEv/zF9OeCIM82xh9hrE +79UiyfxoTp/G8sGZFNg+V9tjM4nF2pHszocj08vQls54RzGlaMAjy5lvjfnpdDSr +o8aCibs6xpYtOIJic+sldT+YXdRJYwGxlYQkwaorK6hFheDjuEng/4BznDOLAkUz +xCQ0shYPFl8pcbvbMPw2SS+hGlO/SZgbaFlfWTOj0a/skoJsG2Zp+HGD9OmYOJYT +SIhjC5+DBme3GYr3RslO5IZ7ZWJRuSDIT1Iz7C1jenL5zjpj/dLUMmXuSjiEfVEJ +4Nx+WgLTulJOL3TPEhthocFNtU/mqgCsjQ7AbDkvT7LVIStsA1xoaOOQ28t96hXV +1s1rMojXvZUy7wY5d90z2e3OwY2zmv/7u0pvSuqNXdVpGnJ1 +=2qXE +-----END PGP MESSAGE----- + +--DELIMITER-- diff -Nru enigmail-2.0.12+ds1/package/tests/resources/testing-domain.invalid.pub-sec enigmail-2.1.3+ds1/package/tests/resources/testing-domain.invalid.pub-sec --- enigmail-2.0.12+ds1/package/tests/resources/testing-domain.invalid.pub-sec 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/resources/testing-domain.invalid.pub-sec 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,157 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +TA== +=IAR0 +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PRIVATE KEY BLOCK----- + +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 +=zka0 +-----END PGP PRIVATE KEY BLOCK----- diff -Nru enigmail-2.0.12+ds1/package/tests/resources/tiny.pl enigmail-2.1.3+ds1/package/tests/resources/tiny.pl --- enigmail-2.0.12+ds1/package/tests/resources/tiny.pl 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/resources/tiny.pl 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,3 @@ +#!/usr/bin/perl + +printf("OK\n"); diff -Nru enigmail-2.0.12+ds1/package/tests/rules-test.js enigmail-2.1.3+ds1/package/tests/rules-test.js --- enigmail-2.0.12+ds1/package/tests/rules-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/rules-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -12,8 +12,50 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); -testing("rules.jsm"); -component("enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ +testing("rules.jsm"); /* global EnigmailFiles: false */ +const EnigmailKeyRing = component("enigmail/keyRing.jsm").EnigmailKeyRing; + +Components.utils.importGlobalProperties(["XMLHttpRequest"]); + +/* + we create our own DOMParser because the Mozill DOM parser is not ready +*/ + +function DOMParser() {} + +DOMParser.prototype = { + parseFromString: function(xmlString) { + + let f = EnigmailFiles.getTempDirObj(); + f.append("xmlFile.xml"); + EnigmailFiles.writeFileContents(f, xmlString); + + let xmlReq = new XMLHttpRequest(); + let response = null; + let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); + + xmlReq.onload = function() { + response = xmlReq.responseXML; + inspector.exitNestedEventLoop(); + }; + + xmlReq.onerror = function() { + Assert.ok(false, "should not fail"); + inspector.exitNestedEventLoop(); + }; + + xmlReq.open("GET", "file://" + f.path); + xmlReq.send(); + inspector.enterNestedEventLoop(0); + + try { + f.remove(false); + } catch (x) {} + + return response; + } +}; + // getRulesFile test(function getRulesFileReturnsTheFile() { @@ -130,8 +172,7 @@ if (typeof(arg3) === 'undefined') { expAddr = addr; expVal = arg2; - } - else { + } else { expAddr = arg2; expVal = arg3; } @@ -515,4 +556,4 @@ var publicImportResult = EnigmailKeyRing.importKeyFromFile(publicKey, errorMsgObj, importedKeysObj); // var secretImportResult = EnigmailKeyRing.importKeyFromFile(secretKey, errorMsgObj, importedKeysObj); return [publicImportResult /*, secretImportResult */ ]; -} +} \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/streams-test.js enigmail-2.1.3+ds1/package/tests/streams-test.js --- enigmail-2.0.12+ds1/package/tests/streams-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/streams-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,6 +1,5 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: false */ -/*global Components: false, EnigmailCore: false, Cc: false, Ci: false, EnigmailFiles: false, EnigmailLog: false, EnigmailPrefs: false */ -/*jshint -W097 */ +/*global EnigmailCore: 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 @@ -11,9 +10,10 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); -testing("streams.jsm"); /*global EnigmailStreams: false */ -component("enigmail/files.jsm"); +testing("streams.jsm"); /*global EnigmailStreams: false, EnigmailLog: false, EnigmailPrefs: false, NetUtil: false */ +const EnigmailFiles = component("enigmail/files.jsm").EnigmailFiles; +let inspector = Cc["@mozilla.org/jsinspector;1"].createInstance(Ci.nsIJSInspector); function makeURI(aURL, aOriginCharset, aBaseURI) { var ioService = Components.classes["@mozilla.org/network/io-service;1"] @@ -25,16 +25,20 @@ test(function stringChannelTest() { var testString = "Hello world"; - let uri = makeURI("dummy:none"); - var ch = EnigmailStreams.newStringChannel(uri, "text/plain", "UTF-8", testString); - do_test_pending(); + let c = NetUtil.newChannel({ + uri: "chrome://enigmail/content/", + loadUsingSystemPrincipal: true + }); + + var ch = EnigmailStreams.newStringChannel(c.originalURI, "text/plain", "UTF-8", testString); var stringListener = EnigmailStreams.newStringStreamListener( function compareResults(gotData) { Assert.equal(testString, gotData); - do_test_finished(); + inspector.exitNestedEventLoop(); } ); ch.asyncOpen(stringListener, null); + inspector.enterNestedEventLoop(0); }); @@ -45,18 +49,18 @@ var testString = "Hello world\n \x00what's next"; - EnigmailFiles.writeFileContents(md, testString, null); + var f = EnigmailFiles.writeFileContents(md, testString, null); + Assert.ok(f, "file written"); let uri = makeURI("dummy:none"); var ch = EnigmailStreams.newFileChannel(uri, md, "application/octet-stream", true); - do_test_pending(); var stringListener = EnigmailStreams.newStringStreamListener( function compareResults(gotData) { Assert.equal(testString, gotData); - // Assert.equal(md.exists(), false, "file was deleted:"); - do_test_finished(); + Assert.ok(md.exists(), false, "file was deleted:"); + inspector.exitNestedEventLoop(); } ); ch.asyncOpen(stringListener, null); - -}); + inspector.enterNestedEventLoop(0); +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/system-test.js enigmail-2.1.3+ds1/package/tests/system-test.js --- enigmail-2.0.12+ds1/package/tests/system-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/system-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,6 +1,5 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false */ /*global TestHelper: false, withEnvironment: false, nsIWindowsRegKey: true */ -/*jshint -W097 */ /* * 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 @@ -10,11 +9,9 @@ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); -/*global TestHelper: false, withEnvironment: false, withEnigmail: false, component: false, - withTestGpgHome: false, osUtils: false, unescape: false */ +/*global withEnigmail: false, component: false, withTestGpgHome: false, osUtils: false */ -testing("system.jsm"); /*global EnigmailSystem: false, Cc: false, Ci: false */ -component("enigmail/os.jsm"); /*global EnigmailOS: false */ +testing("system.jsm"); /*global EnigmailSystem: false, EnigmailOS: false */ function testEncoding(charset, from, to) { @@ -41,4 +38,4 @@ let cs = EnigmailSystem.determineSystemCharset(); Assert.equal(cs, "UTF-8"); testEncoding(cs, "%E3%82%B5%E3%83%9D%E3%83%BC%E3", "%u30B5%u30DD%u30FC"); -}); +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/testHelper.js enigmail-2.1.3+ds1/package/tests/testHelper.js --- enigmail-2.0.12+ds1/package/tests/testHelper.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/testHelper.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,5 @@ -/*global do_load_module: false, do_get_cwd: false, Components: false, Assert: false, CustomAssert: false, FileUtils: false, JSUnit: false, EnigmailFiles: false */ -/*jshint -W097 */ +/*global do_load_module: false, do_get_cwd: false, Assert: false, CustomAssert: false, JSUnit: false*/ +/*global dump: 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 @@ -9,18 +9,44 @@ "use strict"; const osUtils = {}; -Components.utils.import("resource://gre/modules/osfile.jsm", osUtils); -Components.utils.import("resource://gre/modules/FileUtils.jsm", osUtils); -Components.utils.import("resource://enigmail/rng.jsm"); /*global EnigmailRNG: false */ -Components.utils.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ +osUtils.OS = ChromeUtils.import("resource://gre/modules/osfile.jsm").OS; +osUtils.FileUtils = ChromeUtils.import("resource://gre/modules/FileUtils.jsm").FileUtils; +const TestEnigmailRNG = ChromeUtils.import("chrome://enigmail/content/modules/rng.jsm").EnigmailRNG; +const TestEnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const TestEnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; var TestHelper = { + getMyPath: function() { + let isWin = (Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).OS === "WINNT"); + let fn = Components.stack.filename.replace(/^.* -> file:\/\//, ""); + + if (isWin) { + fn = fn.replace(/\//g, "\\").replace(/^\\/, ""); + } + fn = fn.replace(/^file:\/\//, ""); + let file = osUtils.FileUtils.File(fn); + return file.parent; + }, + loadDirectly: function(name) { - do_load_module("file://" + do_get_cwd().parent.path + "/" + name); + do_load_module("file://" + TestHelper.getMyPath().parent.path + "/" + name); }, loadModule: function(name) { - Components.utils.import("resource://" + name); + let modName = ""; + if (name.search(/^enigmail\//) === 0) { + modName = "chrome://enigmail/content/modules/" + name.replace(/^enigmail\//, ""); + } else { + modName = "resource://" + name; + } + + try { + return ChromeUtils.import(modName); + } catch (ex) { + dump("Error importing module: '" + modName + "'\n"); + dump(ex.message + "\n" + ex.stack); + throw ex; + } }, testing: function(name) { @@ -37,8 +63,7 @@ on[prop] = val; try { return f(); - } - finally { + } finally { on[prop] = orgVal; } }, @@ -56,7 +81,7 @@ initalizeGpgHome: function() { component("enigmail/files.jsm"); - var homedir = osUtils.OS.Path.join(EnigmailFiles.getTempDir(), ".gnupgTest" + EnigmailRNG.generateRandomString(8)); + var homedir = osUtils.OS.Path.join(TestEnigmailFiles.getTempDir(), ".gnupgTest" + TestEnigmailRNG.generateRandomString(8)); var workingDirectory = new osUtils.FileUtils.File(homedir); if (!workingDirectory.exists()) { workingDirectory.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 448); @@ -68,7 +93,7 @@ file.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 384); } - var s = "pinentry-program " + do_get_cwd().path.replace(/\\/g, "/") + "/pinentry-auto"; + var s = "pinentry-program " + TestHelper.getMyPath().path.replace(/\\/g, "/") + "/pinentry-auto"; if (JSUnit.getOS() == "WINNT") { s += ".exe"; } @@ -90,19 +115,21 @@ var environment = Components.classes["@mozilla.org/process/environment;1"].getService(Components.interfaces.nsIEnvironment); environment.set("GNUPGHOME", workingDirectory.path); - if (EnigmailCore.getEnvList() !== null) - EnigmailCore.setEnvVariable("GNUPGHOME", workingDirectory.path); - return homedir; + if (TestEnigmailCore.getEnvList() !== null) + TestEnigmailCore.setEnvVariable("GNUPGHOME", workingDirectory.path); + return homedir; }, removeGpgHome: function(homedir) { var workingDirectory = new osUtils.FileUtils.File(homedir); try { - if (workingDirectory.exists()) workingDirectory.remove(true); - } - catch (ex) { - // do nothing about it + if (workingDirectory.exists()) { + workingDirectory.remove(true); + } + } catch (ex) { + // print a warning if GpgHome cannot be removed + Assert.ok(true, "Could not remove GpgHome"); } } }; @@ -126,8 +153,7 @@ } try { return f(environment); - } - finally { + } finally { for (let key in oldVals) { environment.set(key, oldVals[key]); } @@ -139,23 +165,54 @@ const homedir = initalizeGpgHome(); try { f(); - } - finally { + } finally { removeGpgHome(homedir); } }; } -function withPreferences(func) { + +/** + * Overwrite functions for the scope of a test, and re-set the original function + * after the test has completed + * + * @param {Array} overwriteArr: + * - obj {Object}: target Object + * - fn {String}: function name + * - new {Function}: new function + */ +function withOverwriteFuncs(overwriteArr, func) { return function() { - const keyRefreshPrefs = EnigmailPrefs.getPref("keyRefreshOn"); - const keyserverPrefs = EnigmailPrefs.getPref("keyserver"); + let origFuncs = []; + for (let f in overwriteArr) { + origFuncs.push({ + obj: overwriteArr[f].obj, + fn: overwriteArr[f].fn, + origFunc: overwriteArr[f].obj[overwriteArr[f].fn] + }); + overwriteArr[f].obj[overwriteArr[f].fn] = overwriteArr[f].new; + } + try { func(); + } finally { + for (let i in origFuncs) { + origFuncs[i].obj[origFuncs[i].fn] = origFuncs[i].origFunc; + } } - finally { - EnigmailPrefs.setPref("keyRefreshOn", keyRefreshPrefs); - EnigmailPrefs.setPref("keyserver", keyserverPrefs); + }; +} + + +function withPreferences(func) { + return function() { + const keyRefreshPrefs = TestEnigmailPrefs.getPref("keyRefreshOn"); + const keyserverPrefs = TestEnigmailPrefs.getPref("keyserver"); + try { + func(); + } finally { + TestEnigmailPrefs.setPref("keyRefreshOn", keyRefreshPrefs); + TestEnigmailPrefs.setPref("keyserver", keyserverPrefs); } }; } @@ -171,8 +228,12 @@ function setupTestAccounts(primaryEmail = null, primaryKeyId = null) { const UNITTEST_ACCT_NAME = "Enigmail Unit Test"; - const Cc = Components.classes; - const Ci = Components.interfaces; + setupTestAccount(UNITTEST_ACCT_NAME, "dummy", primaryEmail, primaryKeyId); +} + +function setupTestAccount(accountName, incomingServerUserName, primaryEmail = null, primaryKeyId = null) { + + // sanity check let accountManager = Cc["@mozilla.org/messenger/account-manager;1"].getService(Ci.nsIMsgAccountManager); @@ -180,21 +241,19 @@ function reportError() { return "Your profile is not set up correctly for Enigmail Unit Tests\n" + - "Please ensure that your profile contains exactly one Account of type POP3.\n" + - "The account name must be set to '" + UNITTEST_ACCT_NAME + "'.\n" + - "Alternatively, you can simply delete all accounts except for the Local Folders\n"; + "Please ensure that your profile contains only one Accounts of type POP3.\n"; } function setIdentityData(ac, idNumber, idName, fullName, email, useEnigmail, keyId) { let id; - if (ac.identities.length < idNumber - 1) throw "error - cannot add Identity with gaps"; - else if (ac.identities.length === idNumber - 1) { + if (ac.identities.length < idNumber - 1) { + throw "error - cannot add Identity with gaps"; + } else if (ac.identities.length === idNumber - 1) { id = accountManager.createIdentity(); ac.addIdentity(id); - } - else { + } else { id = ac.identities.queryElementAt(idNumber - 1, Ci.nsIMsgIdentity); } @@ -216,8 +275,12 @@ is.performingBiff = false; is.loginAtStartUp = false; - if (primaryKeyId === null) primaryKeyId = "ABCDEF0123456789"; - if (primaryEmail === null) primaryEmail = "user1@enigmail-test.net"; + if (primaryKeyId === null) { + primaryKeyId = "ABCDEF0123456789"; + } + if (primaryEmail === null) { + primaryEmail = "user1@enigmail-test.net"; + } setIdentityData(ac, 1, "Enigmail Unit Test 1", "John Doe I.", primaryEmail, true, primaryKeyId); setIdentityData(ac, 2, "Enigmail Unit Test 2", "John Doe II.", "user2@enigmail-test.net", true); @@ -227,20 +290,20 @@ for (let acct = 0; acct < accountManager.accounts.length; acct++) { let ac = accountManager.accounts.queryElementAt(acct, Ci.nsIMsgAccount); - if (ac.incomingServer.type !== "none") { - if (ac.incomingServer.type !== "pop3" || ac.incomingServer.prettyName !== UNITTEST_ACCT_NAME) { - throw reportError(); - } + if (ac.incomingServer.type !== "none" && ac.incomingServer.type !== "pop3") { + throw reportError(); } } let configured = 0; + let gotAc = null; // try to configure existing account for (let acct = 0; acct < accountManager.accounts.length; acct++) { let ac = accountManager.accounts.queryElementAt(acct, Ci.nsIMsgAccount); - if (ac.incomingServer.type !== "none") { + if (ac.incomingServer.type === "pop3" && ac.incomingServer.prettyName === accountName) { setupAccount(ac); + gotAc = ac; ++configured; } } @@ -248,51 +311,74 @@ // if no account existed, create new account if (configured === 0) { let ac = accountManager.createAccount(); - let is = accountManager.createIncomingServer("dummy", "localhost", "pop3"); - is.prettyName = UNITTEST_ACCT_NAME; + let is = accountManager.createIncomingServer(incomingServerUserName, "localhost", "pop3"); + is.prettyName = accountName; ac.incomingServer = is; + gotAc = ac; setupAccount(ac); } -} -Components.utils.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ + return gotAc; +} function withEnigmail(f) { return function() { try { - const enigmail = EnigmailCore.createInstance(); + const enigmail = TestEnigmailCore.createInstance(); const window = JSUnit.createStubWindow(); enigmail.initialize(window, ""); - return f(EnigmailCore.getEnigmailService(), window); - } - finally { - EnigmailCore.setEnigmailService(null); + return f(TestEnigmailCore.getEnigmailService(), window); + } finally { + shutdownGpgAgent(); + TestEnigmailCore.setEnigmailService(null); } }; } +function shutdownGpgAgent() { + const EnigmailGpgAgent = ChromeUtils.import("chrome://enigmail/content/modules/gpgAgent.jsm").EnigmailGpgAgent; + const subprocess = ChromeUtils.import("chrome://enigmail/content/modules/subprocess.jsm").subprocess; + + if (EnigmailGpgAgent.gpgconfPath) { + const proc = { + command: EnigmailGpgAgent.gpgconfPath, + arguments: ["--kill", "gpg-agent"], + environment: TestEnigmailCore.getEnvList(), + charset: null, + mergeStderr: false + }; + + try { + subprocess.call(proc).wait(); + } catch (ex) { + Assert.ok(false, "Could not kill gpg-agent"); + } + } +} + + CustomAssert.registerExtraAssertionsOn(Assert); -Components.utils.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Components.utils.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ +const TestEnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const TestEnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; + function withLogFiles(f) { return function() { try { - EnigmailLog.setLogLevel(5); + TestEnigmailLog.setLogLevel(5); f(); - } - finally { - EnigmailLog.onShutdown(); - EnigmailLog.createLogFiles(); + } finally { + TestEnigmailLog.onShutdown(); + TestEnigmailLog.createLogFiles(); } }; } function assertLogContains(expected) { let failureMessage = "Expected log to contain: " + expected; - Assert.ok(EnigmailLog.getLogData(EnigmailCore.version, EnigmailPrefs).indexOf(expected) !== -1, failureMessage); + Assert.ok(TestEnigmailLog.getLogData(TestEnigmailCore.version, TestEnigmailPrefs).indexOf(expected) !== -1, failureMessage); } function assertLogDoesNotContain(expected) { - Assert.equal(EnigmailLog.getLogData(EnigmailCore.version, EnigmailPrefs).indexOf(expected), -1); -} + Assert.equal(TestEnigmailLog.getLogData(TestEnigmailCore.version, TestEnigmailPrefs).indexOf(expected), -1); +} \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/tor-test.js enigmail-2.1.3+ds1/package/tests/tor-test.js --- enigmail-2.0.12+ds1/package/tests/tor-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/tor-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,4 @@ -/*global do_load_module: false, do_get_cwd: false, testing: false, test: false, Assert:false, component: false, Cc: false, Ci: false */ +/*global do_load_module: false, do_get_cwd: false, testing: false, test: false, Assert:false, component: 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 @@ -8,13 +8,9 @@ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, assertContains: false, withEnigmail: false, withTestGpgHome: false, withEnvironment: false, resetting: false */ -testing("tor.jsm"); /*global createRandomCredential, EnigmailTor, torProperties, meetsOSConstraints, MINIMUM_CURL_SOCKS5H_VERSION, MINIMUM_CURL_SOCKS5_PROXY_VERSION, createHelperArgs, gpgProxyArgs, findTorExecutableHelper: false*/ - -component("enigmail/rng.jsm"); /*global EnigmailRNG*/ -component("enigmail/gpg.jsm"); /*global EnigmailGpg: false */ -component("enigmail/files.jsm"); /*global EnigmailFiles: false */ -component("enigmail/os.jsm"); /*global EnigmailOS: false */ -component("enigmail/versioning.jsm"); /*global EnigmailVersioning: false */ +testing("tor.jsm"); +/*global createRandomCredential, EnigmailTor, torProperties, meetsOSConstraints, MINIMUM_CURL_SOCKS5H_VERSION, MINIMUM_CURL_SOCKS5_PROXY_VERSION, createHelperArgs, gpgProxyArgs, findTorExecutableHelper: false +EnigmailRNG: false, EnigmailGpg: false, EnigmailFiles: false, EnigmailOS: false, EnigmailVersioning: false */ let self = this; // eslint-disable-line no-invalid-this @@ -25,8 +21,7 @@ }; try { f(); - } - finally {} + } finally {} }; } @@ -237,7 +232,7 @@ Assert.equal(helperProperties.args, torArgs); Assert.equal(socksProperties.command, "gpg"); - Assert.equal(socksProperties.args, gpgArgs); + Assert.equal(socksProperties.args.replace(/socks5-hostname/, "socks5h"), gpgArgs); }); }); }); @@ -294,8 +289,7 @@ return { path: "/usr/bin/torsocks" }; - } - else { + } else { return null; } }, function() { @@ -319,8 +313,7 @@ return { path: "/usr/bin/torsocks" }; - } - else { + } else { return null; } }, function() { @@ -353,4 +346,4 @@ Assert.equal(typeof createRandomCredential(), "string"); Assert.notEqual(createRandomCredential(), createRandomCredential()); -}); +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/verify-test.js enigmail-2.1.3+ds1/package/tests/verify-test.js --- enigmail-2.0.12+ds1/package/tests/verify-test.js 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/verify-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,41 @@ +/*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false, component: 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"); /*global withEnigmail: false, withTestGpgHome: false */ + +testing("verify.jsm"); /*global EnigmailVerifyAttachment: false */ +const EnigmailKeyRing = component("enigmail/keyRing.jsm").EnigmailKeyRing; + +/* TODO: write higher level test based on actual message */ + +test(withTestGpgHome(withEnigmail(function shouldVerifyAttachment() { + loadSecretKey(); + loadPublicKey(); + + const attachment = do_get_file("resources/attachment.txt", false); + const signature = do_get_file("resources/attachment.txt.asc", false); + do_test_pending(); + let promise = EnigmailVerifyAttachment.attachment(attachment, signature); + promise.then(function(result) { + Assert.assertContains(result, 'Good signature from anonymous strike'); + Assert.assertContains(result, 'Key ID: 0x0x65537E212DC19025AD38EDB2781617319CE311C'); + do_test_finished(); + }); +}))); + + +var loadSecretKey = function() { + const secretKey = do_get_file("resources/dev-strike.sec", false); + EnigmailKeyRing.importKeyFromFile(secretKey, [], {}); +}; + +var loadPublicKey = function() { + const publicKey = do_get_file("resources/dev-strike.asc", false); + EnigmailKeyRing.importKeyFromFile(publicKey, [], {}); +}; \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/versioning-test.js enigmail-2.1.3+ds1/package/tests/versioning-test.js --- enigmail-2.0.12+ds1/package/tests/versioning-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/versioning-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -9,8 +9,9 @@ do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); /*global TestHelper: false, withEnigmail: false, withTestGpgHome: false */ -testing("versioning.jsm"); /*global EnigmailVersioning: false, greaterThanOrEqual: false, createVersionRequest:false, versionFoundMeetsMinimumVersionRequired:false, greaterThan: false, lessThan: false */ -component("enigmail/execution.jsm"); /*global EnigmailExecution:false */ +testing("versioning.jsm"); +/*global EnigmailVersioning: false, greaterThanOrEqual: false, createVersionRequest:false, versionFoundMeetsMinimumVersionRequired:false, greaterThan: false, lessThan: false, +EnigmailExecution: false */ test(function checkCurlVersionIsOver() { const curl749 = "curl 7.49.1 (x86_64-pc-linux-gnu) libcurl/7.49.1 OpenSSL/1.0.2h zlib/1.2.8 libidn/1.32 libssh2/1.7.0\n" + @@ -54,4 +55,4 @@ Assert.equal(lessThan("1.1", "1.0"), false); Assert.equal(lessThan("1.0", "1.0"), false); Assert.equal(lessThan("1.0", "1.1"), true); -}); +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tests/webKey-test.js enigmail-2.1.3+ds1/package/tests/webKey-test.js --- enigmail-2.0.12+ds1/package/tests/webKey-test.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tests/webKey-test.js 2019-10-29 17:09:36.000000000 +0000 @@ -1,6 +1,5 @@ /*global do_load_module: false, do_get_file: false, do_get_cwd: false, testing: false, test: false, Assert: false, resetting: false, JSUnit: false, do_test_pending: false, do_test_finished: false */ /*global TestHelper: false, withEnvironment: false, nsIWindowsRegKey: true */ -/*jshint -W097 */ /* * 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 @@ -10,16 +9,23 @@ "use strict"; do_load_module("file://" + do_get_cwd().path + "/testHelper.js"); -/*global TestHelper: false, withEnvironment: false, withEnigmail: false, component: false, withTestGpgHome: false, osUtils: false */ +/*global withEnigmail: false, component: false, withTestGpgHome: false, osUtils: false */ -testing("webKey.jsm"); /*global EnigmailWks: false, GPG_WKS_CLIENT: false */ -component("enigmail/execution.jsm"); /*global EnigmailExecution: false */ -component("enigmail/subprocess.jsm"); /*global subprocess: false */ -component("enigmail/files.jsm"); /*global EnigmailFiles: false */ -component("enigmail/os.jsm"); /*global EnigmailOS: false */ -component("enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ -component("enigmail/send.jsm"); /*global EnigmailSend: false */ -component("enigmail/log.jsm"); /*global EnigmailLog: false */ +testing("webKey.jsm"); +/*global EnigmailWks: false, GPG_WKS_CLIENT: false, + EnigmailExecution: false, EnigmailFiles: false, EnigmailGpgAgent: false, EnigmailSend: false, + EnigmailLog: false */ +const subprocess = component("enigmail/subprocess.jsm").subprocess; +const EnigmailOS = component("enigmail/os.jsm").EnigmailOS; + +function getWksPath() { + var wksClient = GPG_WKS_CLIENT; + if (EnigmailOS.isDosLike) { + wksClient += ".exe"; + } + + return wksClient; +} test(function getWksPathInBinDir() { TestHelper.resetting(EnigmailGpgAgent, "gpgconfPath", "TEST_PATH", function() { @@ -29,8 +35,7 @@ if (EnigmailOS.isDosLike) { listener.stdout("bindir:" + do_get_cwd().path + "\r\nlibexecdir:C:\\GnuPG\\lib\\exec\\dir\\test\r\n"); - } - else { + } else { listener.stdout("bindir:" + do_get_cwd().path + "\nlibexecdir:/lib/exec/dir/test\n"); } listener.done(0); @@ -42,7 +47,7 @@ let win = JSUnit.createStubWindow(); let handle = EnigmailWks.getWksClientPathAsync(win, function(ret) { let p = do_get_cwd().clone(); - p.append(GPG_WKS_CLIENT); + p.append(getWksPath()); Assert.equal(p.path, ret.path); }); @@ -62,8 +67,7 @@ if (EnigmailOS.isDosLike) { listener.stdout("libexecdir:" + do_get_cwd().path + "\r\nbindir:C:\\GnuPG\\bin\\dir\\test\r\n"); - } - else { + } else { listener.stdout("libexecdir:" + do_get_cwd().path + "\nbindir:/bin/dir/test\n"); } listener.done(0); @@ -75,7 +79,7 @@ let win = JSUnit.createStubWindow(); let handle = EnigmailWks.getWksClientPathAsync(win, function(ret) { let p = do_get_cwd().clone(); - p.append(GPG_WKS_CLIENT); + p.append(getWksPath()); Assert.equal(p.path, ret.path); }); @@ -247,4 +251,4 @@ } }); }); -}); +}); \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/time.jsm enigmail-2.1.3+ds1/package/time.jsm --- enigmail-2.0.12+ds1/package/time.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/time.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false, EnigmailLocale: false */ -/*jshint -W097 */ /* * 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 @@ -10,11 +8,7 @@ var EXPORTED_SYMBOLS = ["EnigmailTime"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/locale.jsm"); +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; const DATE_2DIGIT = "2-digit"; const DATE_4DIGIT = "numeric"; @@ -57,8 +51,7 @@ try { return new Intl.DateTimeFormat(useLocale, options).format(dat); - } - catch (ex) { + } catch (ex) { return new Intl.DateTimeFormat("en-US", options).format(dat); } } diff -Nru enigmail-2.0.12+ds1/package/timer.jsm enigmail-2.1.3+ds1/package/timer.jsm --- enigmail-2.0.12+ds1/package/timer.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/timer.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false, EnigmailLog: false, EnigmailPrefs: false */ -/*jshint -W097 */ /* * 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 @@ -10,10 +8,10 @@ const EXPORTED_SYMBOLS = ["EnigmailTimer"]; -Components.utils.import("resource://gre/modules/Timer.jsm"); /* global setTimeout: false, clearTimeout: false */ - -const Cc = Components.classes; -const Ci = Components.interfaces; +const { + setTimeout, + clearTimeout +} = ChromeUtils.import("resource://gre/modules/Timer.jsm"); var EnigmailTimer = { /** @@ -34,8 +32,7 @@ callbackFunction(); try { clearTimeout(timeoutID); - } - catch (ex) {} + } catch (ex) {} } timeoutID = setTimeout(callbackWrapper, sleepTimeMs); @@ -49,4 +46,4 @@ * @param Number: timeoutID */ clearTimeout: clearTimeout -}; +}; \ No newline at end of file diff -Nru enigmail-2.0.12+ds1/package/tor.jsm enigmail-2.1.3+ds1/package/tor.jsm --- enigmail-2.0.12+ds1/package/tor.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/tor.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -8,18 +6,18 @@ "use strict"; -const Ci = Components.interfaces; -const Cu = Components.utils; -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false*/ -Cu.import("resource://enigmail/prefs.jsm"); /*global EnigmailPrefs: false */ -Cu.import("resource://enigmail/rng.jsm"); /*global EnigmailRNG: false */ -Cu.import("resource://enigmail/versioning.jsm"); /*global EnigmailVersioning: false */ -Cu.import("resource://enigmail/os.jsm"); /*global EnigmailOS: false */ -Cu.import("resource://enigmail/socks5Proxy.jsm"); /*global EnigmailSocks5Proxy: false */ -Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ -Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ -Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ + + +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailPrefs = ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs; +const EnigmailRNG = ChromeUtils.import("chrome://enigmail/content/modules/rng.jsm").EnigmailRNG; +const EnigmailVersioning = ChromeUtils.import("chrome://enigmail/content/modules/versioning.jsm").EnigmailVersioning; +const EnigmailOS = ChromeUtils.import("chrome://enigmail/content/modules/os.jsm").EnigmailOS; +const EnigmailSocks5Proxy = ChromeUtils.import("chrome://enigmail/content/modules/socks5Proxy.jsm").EnigmailSocks5Proxy; +const EnigmailGpg = ChromeUtils.import("chrome://enigmail/content/modules/gpg.jsm").EnigmailGpg; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; const EXPORTED_SYMBOLS = ["EnigmailTor"]; diff -Nru enigmail-2.0.12+ds1/package/trust.jsm enigmail-2.1.3+ds1/package/trust.jsm --- enigmail-2.0.12+ds1/package/trust.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/trust.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -10,7 +8,7 @@ var EXPORTED_SYMBOLS = ["EnigmailTrust"]; -Components.utils.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; // trust flags according to GPG documentation: // - https://www.gnupg.org/documentation/manuals/gnupg.pdf diff -Nru enigmail-2.0.12+ds1/package/uris.jsm enigmail-2.1.3+ds1/package/uris.jsm --- enigmail-2.0.12+ds1/package/uris.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/uris.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -10,10 +8,10 @@ var EXPORTED_SYMBOLS = ["EnigmailURIs"]; -const Cu = Components.utils; -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ + +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; const messageIdList = {}; const encryptedUris = []; diff -Nru enigmail-2.0.12+ds1/package/verify.jsm enigmail-2.1.3+ds1/package/verify.jsm --- enigmail-2.0.12+ds1/package/verify.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/verify.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -10,54 +8,22 @@ var EXPORTED_SYMBOLS = ["EnigmailVerifyAttachment"]; -const Cu = Components.utils; -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/files.jsm"); /*global EnigmailFiles: false */ -Cu.import("resource://enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ -Cu.import("resource://enigmail/gpg.jsm"); /*global EnigmailGpg: false */ -Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ -Cu.import("resource://enigmail/time.jsm"); /*global EnigmailTime: false */ -Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ -Cu.import("resource://enigmail/decryption.jsm"); /*global EnigmailDecryption: false */ -Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ -const Ci = Components.interfaces; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailCryptoAPI = ChromeUtils.import("chrome://enigmail/content/modules/cryptoAPI.jsm").EnigmailCryptoAPI; + + var EnigmailVerifyAttachment = { - attachment: function(parent, verifyFile, sigFile, statusFlagsObj, errorMsgObj) { + attachment: function(verifyFile, sigFile) { EnigmailLog.DEBUG("verify.jsm: EnigmailVerifyAttachment.attachment:\n"); const verifyFilePath = EnigmailFiles.getEscapedFilename(EnigmailFiles.getFilePathReadonly(verifyFile.QueryInterface(Ci.nsIFile))); const sigFilePath = EnigmailFiles.getEscapedFilename(EnigmailFiles.getFilePathReadonly(sigFile.QueryInterface(Ci.nsIFile))); + const cApi = EnigmailCryptoAPI(); + return cApi.verifyAttachment(verifyFilePath, sigFilePath); - const args = EnigmailGpg.getStandardArgs(true). - concat(["--verify", sigFilePath, verifyFilePath]); - - const listener = EnigmailExecution.newSimpleListener(); - - const proc = EnigmailExecution.execStart(EnigmailGpgAgent.agentPath, args, false, parent, listener, statusFlagsObj); - - if (!proc) { - return -1; - } - - proc.wait(); - - const retObj = {}; - EnigmailDecryption.decryptMessageEnd(listener.stderrData, listener.exitCode, 1, true, true, EnigmailConstants.UI_INTERACTIVE, retObj); - - if (listener.exitCode === 0) { - const detailArr = retObj.sigDetails.split(/ /); - const dateTime = EnigmailTime.getDateTime(detailArr[2], true, true); - const msg1 = retObj.errorMsg.split(/\n/)[0]; - const msg2 = EnigmailLocale.getString("keyAndSigDate", ["0x" + retObj.keyId, dateTime]); - errorMsgObj.value = msg1 + "\n" + msg2; - } - else { - errorMsgObj.value = retObj.errorMsg; - } - - return listener.exitCode; } }; diff -Nru enigmail-2.0.12+ds1/package/versioning.jsm enigmail-2.1.3+ds1/package/versioning.jsm --- enigmail-2.0.12+ds1/package/versioning.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/versioning.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false */ -/*jshint -W097 */ /* * 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 @@ -11,12 +9,12 @@ const EXPORTED_SYMBOLS = ["EnigmailVersioning"]; -const Cu = Components.utils; -const Cc = Components.classes; -const Ci = Components.interfaces; -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ + + + +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailExecution = ChromeUtils.import("chrome://enigmail/content/modules/execution.jsm").EnigmailExecution; let vc = null; diff -Nru enigmail-2.0.12+ds1/package/webKey.jsm enigmail-2.1.3+ds1/package/webKey.jsm --- enigmail-2.0.12+ds1/package/webKey.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/webKey.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*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 @@ -16,19 +14,21 @@ var EXPORTED_SYMBOLS = ["EnigmailWks"]; -const Cu = Components.utils; -const Cc = Components.classes; -const Ci = Components.interfaces; - -Cu.import("resource://enigmail/files.jsm"); /* global EnigmailFiles: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ -Cu.import("resource://enigmail/execution.jsm"); /*global EnigmailExecution: false */ -Cu.import("resource://enigmail/gpgAgent.jsm"); /*global EnigmailGpgAgent: false */ -Cu.import("resource://enigmail/stdlib.jsm"); /*global EnigmailStdlib: false */ -Cu.import("resource://enigmail/send.jsm"); /*global EnigmailSend: false */ -Cu.import("resource://enigmail/msgCompFields.jsm"); /*global EnigmailMsgCompFields: false */ -Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ + + + + +const EnigmailFiles = ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailExecution = ChromeUtils.import("chrome://enigmail/content/modules/execution.jsm").EnigmailExecution; +const EnigmailGpgAgent = ChromeUtils.import("chrome://enigmail/content/modules/gpgAgent.jsm").EnigmailGpgAgent; +const EnigmailStdlib = ChromeUtils.import("chrome://enigmail/content/modules/stdlib.jsm").EnigmailStdlib; +const EnigmailSend = ChromeUtils.import("chrome://enigmail/content/modules/send.jsm").EnigmailSend; +const EnigmailMimeEncrypt = ChromeUtils.import("chrome://enigmail/content/modules/mimeEncrypt.jsm").EnigmailMimeEncrypt; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; +const EnigmailFuncs = ChromeUtils.import("chrome://enigmail/content/modules/funcs.jsm").EnigmailFuncs; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; const GPG_WKS_CLIENT = "gpg-wks-client"; @@ -127,6 +127,45 @@ }); }, + + /** + * Submit a set of keys to the Web Key Server (WKD) + * + * @param keys: Array of KeyObj + * @param win: parent Window for displaying dialogs + * @param observer: Object (KeySrvListener API) + * Object implementing: + * - onProgress: function(percentComplete) [only implemented for download()] + * - onCancel: function() - the body will be set by the callee + * + * @return Promise<...> + */ + wksUpload: function(keys, win, observer = null) { + EnigmailLog.DEBUG(`webKey.jsm: wksUpload(): keys = ${keys.length}\n`); + let ids = getWkdIdentities(keys); + + if (observer === null) { + observer = { + onProgress: function() {} + }; + } + + observer.isCanceled = false; + observer.onCancel = function() { + this.isCanceled = true; + }; + + if (!ids) throw "error"; + + if (ids.senderIdentities.length === 0) { + return new Promise(resolve => { + resolve([]); + }); + } + + return performWkdUpload(ids.senderIdentities, win, observer); + }, + /** * Submit a key to the email provider (= send publication request) * @@ -139,7 +178,7 @@ */ submitKey: function(ident, key, window, cb) { - EnigmailLog.DEBUG("webKey.jsm: submitKey: email = " + ident.email + "\n"); + EnigmailLog.DEBUG("webKey.jsm: submitKey(): email = " + ident.email + "\n"); return EnigmailWks.getWksClientPathAsync(window, function(wks_client) { if (wks_client === null) { cb(false); @@ -151,19 +190,19 @@ return; } EnigmailLog.DEBUG("webKey.jsm: submitKey: send " + listener.stdoutData + "\n"); - let si = EnigmailMsgCompFields.createObject(null); + let si = EnigmailMimeEncrypt.createMimeEncrypt(null); let subject = listener.stdoutData.match(/^Subject:[ \t]*(.+)$/im); let to = listener.stdoutData.match(/^To:[ \t]*(.+)$/im); if (subject !== null && to !== null) { - EnigmailMsgCompFields.setValue(si, "sendFlags", EnigmailConstants.SEND_VERBATIM); + si.sendFlags = EnigmailConstants.SEND_VERBATIM; if (!EnigmailSend.simpleSendMessage({ urls: [], identity: ident, to: to[1], subject: subject[1], - securityInfo: si + composeSecure: si }, listener.stdoutData, cb @@ -194,8 +233,9 @@ */ confirmKey: function(ident, body, window, cb) { - var sanitized = body.replace(/\r?\n/g, "\r\n"); EnigmailLog.DEBUG("webKey.jsm: confirmKey: ident=" + ident.email + "\n"); + + var sanitized = body.replace(/\r?\n/g, "\r\n"); return EnigmailWks.getWksClientPathAsync(window, function(wks_client) { if (wks_client === null) { if (cb) { @@ -216,19 +256,19 @@ } }, function(ret) { try { - let si = EnigmailMsgCompFields.createObject(null); + let si = EnigmailMimeEncrypt.createMimeEncrypt(null); let subject = listener.stdoutData.match(/^Subject:[ \t]*(.+)$/im); let to = listener.stdoutData.match(/^To:[ \t]*(.+)$/im); if (subject !== null && to !== null) { - EnigmailMsgCompFields.setValue(si, "sendFlags", EnigmailConstants.SEND_VERBATIM); + si.sendFlags = EnigmailConstants.SEND_VERBATIM; if (!EnigmailSend.simpleSendMessage({ urls: [], identity: ident, to: to[1], subject: subject[1], - securityInfo: si + composeSecure: si }, listener.stdoutData, cb @@ -275,3 +315,123 @@ return null; } } + + +function getWkdIdentities(keys) { + EnigmailLog.DEBUG(`webKey.jsm: getWkdIdentities(): keys = ${keys.length}\n`); + let senderIdentities = [], + notFound = []; + + for (let key of keys) { + try { + let found = false; + for (let uid of key.userIds) { + let email = EnigmailFuncs.stripEmail(uid.userId); + let maybeIdent = EnigmailStdlib.getIdentityForEmail(email); + + if (maybeIdent && maybeIdent.identity) { + senderIdentities.push({ + identity: maybeIdent.identity, + fpr: key.fpr + }); + } + } + if (!found) { + notFound.push(key); + } + } + catch (ex) { + EnigmailLog.DEBUG(ex + "\n"); + return null; + } + } + + return { + senderIdentities: senderIdentities, + notFound + }; +} + +/** + * Do the WKD upload and interact with a progress receiver + * + * @param keyList: Object: + * - fprList (String - fingerprint) + * - senderIdentities (nsIMsgIdentity) + * @param win: nsIWindow - parent window + * @param observer: Object: + * - onProgress: function(percentComplete [0 .. 100]) + * called after processing of every key (indpendent of status) + * - onUpload: function(fpr) + * called after successful uploading of a key + * - onFinished: function(completionStatus, errorMessage, displayError) + * - isCanceled: Boolean - used to determine if process is canceled + */ +function performWkdUpload(keyList, win, observer) { + EnigmailLog.DEBUG(`webKey.jsm: performWkdUpload: keyList.length=${keyList.length}\n`); + + let uploads = []; + + let numKeys = keyList.length; + + // For each key fpr/sender identity pair, check whenever WKS is supported + // Result is an array of booleans + for (let i = 0; i < numKeys; i++) { + let keyFpr = keyList[i].fpr; + let senderIdent = keyList[i].identity; + + let was_uploaded = new Promise(function _isSupported(resolve, reject) { + EnigmailLog.DEBUG("webKey.jsm: performWkdUpload: _isSupported(): ident=" + senderIdent.email + ", key=" + keyFpr + "\n"); + EnigmailWks.isWksSupportedAsync(senderIdent.email, win, function(is_supported) { + if (observer.isCanceled) { + EnigmailLog.DEBUG("webKey.jsm: performWkdUpload: canceled by user\n"); + reject("canceled"); + } + + EnigmailLog.DEBUG("webKey.jsm: performWkdUpload: ident=" + senderIdent.email + ", supported=" + is_supported + "\n"); + resolve(is_supported); + }); + }).then(function _submitKey(is_supported) { + EnigmailLog.DEBUG(`webKey.jsm: performWkdUpload: _submitKey ${is_supported}\n`); + if (is_supported) { + + return new Promise(function(resolve, reject) { + EnigmailWks.submitKey(senderIdent, { + 'fpr': keyFpr + }, win, function(success) { + observer.onProgress((i + 1) / numKeys * 100); + if (success) { + resolve(senderIdent); + } + else { + reject("submitFailed"); + } + }); + }); + } + else { + observer.onProgress((i + 1) / numKeys * 100); + return Promise.resolve(null); + } + }); + + uploads.push(was_uploaded); + } + + return Promise.all(uploads).catch(function(reason) { + //let errorMsg = EnigmailLocale.getString("keyserverProgress.wksUploadFailed"); + return []; + }).then(function(senders) { + let uploaded_uids = []; + if (senders) { + senders.forEach(function(val) { + if (val !== null) { + uploaded_uids.push(val.email); + } + }); + } + observer.onProgress(100); + + return uploaded_uids; + }); +} diff -Nru enigmail-2.0.12+ds1/package/windows.jsm enigmail-2.1.3+ds1/package/windows.jsm --- enigmail-2.0.12+ds1/package/windows.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/windows.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,5 +1,3 @@ -/*global Components: false, escape: false */ -/*jshint -W097 */ /* * 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 @@ -10,19 +8,15 @@ var EXPORTED_SYMBOLS = ["EnigmailWindows"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/core.jsm"); /*global EnigmailCore: false */ -Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ -Cu.import("resource://enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ -Cu.import("resource://enigmail/rules.jsm"); /*global EnigmailRules: false */ -Cu.import("resource://enigmail/app.jsm"); /*global EnigmailApp: false */ -Cu.import("resource://enigmail/pEpAdapter.jsm"); /*global EnigmailPEPAdapter: false */ -Cu.import("resource://gre/modules/PromiseUtils.jsm"); /* global PromiseUtils: false */ -Cu.import("resource://enigmail/stdlib.jsm"); /* global EnigmailStdlib: false */ +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailKeyRing = ChromeUtils.import("chrome://enigmail/content/modules/keyRing.jsm").EnigmailKeyRing; +const EnigmailRules = ChromeUtils.import("chrome://enigmail/content/modules/rules.jsm").EnigmailRules; +const EnigmailApp = ChromeUtils.import("chrome://enigmail/content/modules/app.jsm").EnigmailApp; +const EnigmailPEPAdapter = ChromeUtils.import("chrome://enigmail/content/modules/pEpAdapter.jsm").EnigmailPEPAdapter; +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; +const EnigmailStdlib = ChromeUtils.import("chrome://enigmail/content/modules/stdlib.jsm").EnigmailStdlib; const APPSHELL_MEDIATOR_CONTRACTID = "@mozilla.org/appshell/window-mediator;1"; const APPSHSVC_CONTRACTID = "@mozilla.org/appshell/appShellService;1"; @@ -39,7 +33,7 @@ * * no return value */ - openSetupWizard: function(win, skipIntro) { + openSetupWizard: function(win, setupType) { EnigmailLog.DEBUG("windows.jsm: openSetupWizard()\n"); if (!EnigmailStdlib.hasConfiguredAccounts()) { @@ -47,11 +41,7 @@ return; } - let param = ""; - if (skipIntro) { - param = "?skipIntro=true"; - } - win.open("chrome://enigmail/content/enigmailSetupWizard.xul" + param, + win.open("chrome://enigmail/content/ui/setupWizard2.xul", "", "chrome,centerscreen,resizable"); }, @@ -59,7 +49,7 @@ * Open a window, or focus it if it is already open * * @winName : String - name of the window; used to identify if it is already open - * @spec : String - window URL (e.g. chrome://enigmail/content/test.xul) + * @spec : String - window URL (e.g. chrome://enigmail/content/ui/test.xul) * @winOptions: String - window options as defined in nsIWindow.open * @optObj : any - an Object, Array, String, etc. that is passed as parameter * to the window @@ -162,7 +152,7 @@ openHelpWindow: function(source) { EnigmailWindows.openWin("enigmail:help", - "chrome://enigmail/content/enigmailHelp.xul?src=" + source, + "chrome://enigmail/content/ui/enigmailHelp.xul?src=" + source, "centerscreen,resizable"); }, @@ -172,7 +162,16 @@ * no return value */ openAboutWindow: function() { - EnigmailWindows.openMailTab("chrome://enigmail/content/aboutEnigmail.html"); + EnigmailWindows.openMailTab("chrome://enigmail/content/ui/aboutEnigmail.html"); + }, + + /** + * Display the "About Enigmail" window + * + * no return value + */ + openGnuPGUpdate: function() { + EnigmailWindows.openMailTab("chrome://enigmail/content/ui/updateGnuPG.html"); }, /** @@ -195,7 +194,7 @@ */ openRulesEditor: function() { EnigmailWindows.openWin("enigmail:rulesEditor", - "chrome://enigmail/content/enigmailRulesEditor.xul", + "chrome://enigmail/content/ui/enigmailRulesEditor.xul", "dialog,centerscreen,resizable"); }, @@ -208,11 +207,24 @@ EnigmailCore.getService(win); EnigmailWindows.openWin("enigmail:KeyManager", - "chrome://enigmail/content/enigmailKeyManager.xul", + "chrome://enigmail/content/ui/enigmailKeyManager.xul", "resizable"); }, /** + * Display the OpenPGP key manager window + * + * no return value + */ + openImportSettings: function(win) { + EnigmailCore.getService(win); + + EnigmailWindows.openWin("", + "chrome://enigmail/content/ui/importSettings.xul", + "chrome,dialog,centerscreen,resizable,modal"); + }, + + /** * If the Key Manager is open, dispatch an event to tell the key * manager to refresh the displayed keys */ @@ -220,7 +232,7 @@ keyManReloadKeys: function() { let windowManager = Cc[APPSHELL_MEDIATOR_CONTRACTID].getService(Ci.nsIWindowMediator); const winName = "enigmail:KeyManager"; - const spec = "chrome://enigmail/content/enigmailKeygen.xul"; + const spec = "chrome://enigmail/content/ui/enigmailKeygen.xul"; let winEnum = windowManager.getEnumerator(null); let recentWin = null; @@ -248,7 +260,7 @@ */ openKeyGen: function() { EnigmailWindows.openWin("enigmail:generateKey", - "chrome://enigmail/content/enigmailKeygen.xul", + "chrome://enigmail/content/ui/enigmailKeygen.xul", "chrome,resizable=yes"); }, @@ -259,7 +271,7 @@ */ openCardDetails: function() { EnigmailWindows.openWin("enigmail:cardDetails", - "chrome://enigmail/content/enigmailCardDetails.xul", + "chrome://enigmail/content/ui/enigmailCardDetails.xul", "centerscreen"); }, @@ -273,7 +285,7 @@ */ openConsoleWindow: function() { EnigmailWindows.openWin("enigmail:console", - "chrome://enigmail/content/enigmailConsole.xul", + "chrome://enigmail/content/ui/enigmailConsole.xul", "resizable,centerscreen"); }, @@ -286,8 +298,8 @@ */ openDebugLog: function(win) { EnigmailWindows.openWin("enigmail:logFile", - "chrome://enigmail/content/enigmailViewFile.xul?viewLog=1&title=" + escape(EnigmailLocale.getString("debugLog.title")), - "resizable,centerscreen"); + "chrome://enigmail/content/ui/enigmailViewFile.xul?viewLog=1&title=" + escape(EnigmailLocale.getString("debugLog.title")), + "centerscreen"); }, /** @@ -308,10 +320,10 @@ let url; if (EnigmailPEPAdapter.usingPep()) { - url = "chrome://enigmail/content/pref-pep.xul"; + url = "chrome://enigmail/content/ui/pref-pep.xul"; } else { - url = "chrome://enigmail/content/pref-enigmail.xul"; + url = "chrome://enigmail/content/ui/pref-enigmail.xul"; } win.openDialog(url, "_blank", "chrome,resizable=yes", { @@ -344,7 +356,7 @@ options: "", command: "add" }; - win.openDialog("chrome://enigmail/content/enigmailSingleRcptSettings.xul", "", + win.openDialog("chrome://enigmail/content/ui/enigmailSingleRcptSettings.xul", "", "dialog,modal,centerscreen,resizable", inputObj, {}); return true; }, @@ -366,7 +378,7 @@ const resultObj = { refresh: false }; - win.openDialog("chrome://enigmail/content/enigmailEditKeyExpiryDlg.xul", "", + win.openDialog("chrome://enigmail/content/ui/enigmailEditKeyExpiryDlg.xul", "", "dialog,modal,centerscreen,resizable", inputObj, resultObj); return resultObj.refresh; }, @@ -388,7 +400,7 @@ const resultObj = { refresh: false }; - win.openDialog("chrome://enigmail/content/enigmailEditKeyTrustDlg.xul", "", + win.openDialog("chrome://enigmail/content/ui/enigmailEditKeyTrustDlg.xul", "", "dialog,modal,centerscreen,resizable", inputObj, resultObj); return resultObj.refresh; }, @@ -411,7 +423,7 @@ const resultObj = { refresh: false }; - win.openDialog("chrome://enigmail/content/enigmailSignKeyDlg.xul", "", + win.openDialog("chrome://enigmail/content/ui/enigmailSignKeyDlg.xul", "", "dialog,modal,centerscreen,resizable", inputObj, resultObj); return resultObj.refresh; }, @@ -429,15 +441,14 @@ const enigmailSvc = EnigmailCore.getService(win); if (enigmailSvc) { if (!photoNumber) photoNumber = 0; - - if (keyId.search(/^0x/) < 0) { - keyId = "0x" + keyId; + let keyObj = EnigmailKeyRing.getKeyById(keyId); + if (!keyObj) { + EnigmailWindows.alert(win, EnigmailLocale.getString("noPhotoAvailable")); } - let exitCodeObj = {}; - let photoFile = EnigmailKeyRing.getPhotoFile(keyId, photoNumber, exitCodeObj, {}); + let photoFile = keyObj.getPhotoFile(photoNumber); - if (photoFile && exitCodeObj.value === 0) { + if (photoFile) { if (!(photoFile.isFile() && photoFile.isReadable())) { EnigmailWindows.alert(win, EnigmailLocale.getString("error.photoPathNotReadable", photoFile.path)); } @@ -450,7 +461,7 @@ keyId: keyId }; - win.openDialog("chrome://enigmail/content/enigmailDispPhoto.xul", + win.openDialog("chrome://enigmail/content/ui/enigmailDispPhoto.xul", photoUri, "chrome,modal,resizable,dialog,centerscreen", argsObj); @@ -496,7 +507,7 @@ const resultObj = { refresh: false }; - win.openDialog("chrome://enigmail/content/keyDetailsDlg.xul", "", + win.openDialog("chrome://enigmail/content/ui/keyDetailsDlg.xul", "", "dialog,modal,centerscreen,resizable", inputObj, resultObj); if (resultObj.refresh) { EnigmailKeyRing.clearCache(); @@ -538,7 +549,7 @@ keysrvObj.value = inputObj.autoKeyServer; } else { - win.openDialog("chrome://enigmail/content/enigmailKeyserverDlg.xul", + win.openDialog("chrome://enigmail/content/ui/enigmailKeyserverDlg.xul", "", "dialog,modal,centerscreen", valueObj, keysrvObj); } @@ -574,7 +585,7 @@ } } - win.openDialog("chrome://enigmail/content/enigmailSearchKey.xul", + win.openDialog("chrome://enigmail/content/ui/enigmailSearchKey.xul", "", "dialog,modal,centerscreen", inputObj, resultObj); }, @@ -589,30 +600,28 @@ * @return: Promise (resolve() case of success; rejection otherwise). */ verifyPepTrustWords: function(win, emailAddress, headerData) { - let deferred = PromiseUtils.defer(); - - EnigmailPEPAdapter.prepareTrustWordsDlg(emailAddress, headerData). - then(function _ok(inputObj) { - win.openDialog("chrome://enigmail/content/pepTrustWords.xul", - "", "dialog,modal,centerscreen", inputObj); - deferred.resolve(); - }). - catch(function _err(errorMsg) { - switch (errorMsg) { - case "cannotVerifyOwnId": - EnigmailWindows.alert(win, EnigmailLocale.getString("pepTrustWords.cannotVerifyOwnId")); - break; - case "cannotFindKey": - EnigmailWindows.alert(win, EnigmailLocale.getString("pepTrustWords.cannotFindKey", emailAddress)); - break; - default: - EnigmailWindows.alert(win, EnigmailLocale.getString("pepTrustWords.generalFailure", emailAddress)); - break; - } - deferred.reject(); + return new Promise((resolve, reject) => { + EnigmailPEPAdapter.prepareTrustWordsDlg(emailAddress, headerData). + then(function _ok(inputObj) { + win.openDialog("chrome://enigmail/content/ui/pepTrustWords.xul", + "", "dialog,modal,centerscreen", inputObj); + resolve(); + }). + catch(function _err(errorMsg) { + switch (errorMsg) { + case "cannotVerifyOwnId": + EnigmailWindows.alert(win, EnigmailLocale.getString("pepTrustWords.cannotVerifyOwnId")); + break; + case "cannotFindKey": + EnigmailWindows.alert(win, EnigmailLocale.getString("pepTrustWords.cannotFindKey", emailAddress)); + break; + default: + EnigmailWindows.alert(win, EnigmailLocale.getString("pepTrustWords.generalFailure", emailAddress)); + break; + } + reject(); + }); }); - - return deferred.promise; }, pepHandshake: function(window, direction, myself, peers) { @@ -622,7 +631,7 @@ direction: direction }; - window.openDialog("chrome://enigmail/content/pepHandshake.xul", + window.openDialog("chrome://enigmail/content/ui/pepHandshake.xul", "", "dialog,modal,centerscreen", inputObj); }, @@ -650,7 +659,7 @@ if (password) inputObj.initialPasswd = password; - window.openDialog("chrome://enigmail/content/autocryptSetupPasswd.xul", + window.openDialog("chrome://enigmail/content/ui/autocryptSetupPasswd.xul", "", "dialog,modal,centerscreen", inputObj); return inputObj.password; @@ -665,20 +674,19 @@ window = this.getBestParentWin(); } - window.openDialog("chrome://enigmail/content/autocryptInitiateBackup.xul", + window.openDialog("chrome://enigmail/content/ui/autocryptInitiateBackup.xul", "", "dialog,centerscreen"); }, /** * Open a URL in a tab on the main window. The URL can either be a web page - * (e.g. https://enigmail.net/ or a chrome document (e.g. chrome://enigmail/content/x.xul)) + * (e.g. https://enigmail.net/ or a chrome document (e.g. chrome://enigmail/content/ui/x.xul)) * * @param aURL: String - the URL to open * @param winName: String - name of the window; used to identify if it is already open */ openMailTab: function(aURL, windowName) { - - if (!EnigmailApp.isSuite()) { + if (!EnigmailCompat.isPostbox()) { let tabs = EnigmailStdlib.getMail3Pane().document.getElementById("tabmail"); for (let i = 0; i < tabs.tabInfo.length; i++) { diff -Nru enigmail-2.0.12+ds1/package/wkdLookup.jsm enigmail-2.1.3+ds1/package/wkdLookup.jsm --- enigmail-2.0.12+ds1/package/wkdLookup.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/wkdLookup.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/* global Components: false, btoa: 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/. */ @@ -12,30 +11,79 @@ var EXPORTED_SYMBOLS = ["EnigmailWkdLookup"]; -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.importGlobalProperties(["XMLHttpRequest"]); -Cu.import("resource://gre/modules/Sqlite.jsm"); /* global Sqlite: false */ -Cu.import("resource://enigmail/log.jsm"); /* global EnigmailLog: false*/ -Cu.import("resource://enigmail/funcs.jsm"); /* global EnigmailFuncs: false*/ -Cu.import("resource://gre/modules/PromiseUtils.jsm"); /* global PromiseUtils: false */ -Cu.import("resource://enigmail/keyRing.jsm"); /*global EnigmailKeyRing: false */ -Cu.import("resource://enigmail/zbase32.jsm"); /*global EnigmailZBase32: false */ -Cu.import("resource://enigmail/openpgp.jsm"); /*global EnigmailOpenPGP: false */ -Cu.import("resource://enigmail/key.jsm"); /*global EnigmailKey: false */ -Cu.import("resource://enigmail/data.jsm"); /*global EnigmailData: false */ +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailFuncs = ChromeUtils.import("chrome://enigmail/content/modules/funcs.jsm").EnigmailFuncs; +const PromiseUtils = ChromeUtils.import("resource://gre/modules/PromiseUtils.jsm").PromiseUtils; +const EnigmailKeyRing = ChromeUtils.import("chrome://enigmail/content/modules/keyRing.jsm").EnigmailKeyRing; +const EnigmailZBase32 = ChromeUtils.import("chrome://enigmail/content/modules/zbase32.jsm").EnigmailZBase32; +const EnigmailOpenPGP = ChromeUtils.import("chrome://enigmail/content/modules/openpgp.jsm").EnigmailOpenPGP; +const EnigmailKey = ChromeUtils.import("chrome://enigmail/content/modules/key.jsm").EnigmailKey; +const EnigmailDns = ChromeUtils.import("chrome://enigmail/content/modules/dns.jsm").EnigmailDns; +const EnigmailData = ChromeUtils.import("chrome://enigmail/content/modules/data.jsm").EnigmailData; +const EnigmailSqliteDb = ChromeUtils.import("chrome://enigmail/content/modules/sqliteDb.jsm").EnigmailSqliteDb; + +Components.utils.importGlobalProperties(["fetch"]); + +// Those domains are not expected to have WKD: +var BLACKLIST_DOMAINS = [ + /* Default domains included */ + "aol.com", "att.net", "comcast.net", "facebook.com", "gmail.com", "gmx.com", "googlemail.com", + "google.com", "hotmail.com", "hotmail.co.uk", "mac.com", "me.com", "mail.com", "msn.com", + "live.com", "sbcglobal.net", "verizon.net", "yahoo.com", "yahoo.co.uk", + + /* Other global domains */ + "email.com", "games.com" /* AOL */ , "gmx.net", "icloud.com", + "iname.com", "inbox.com", "lavabit.com", "love.com" /* AOL */ , "outlook.com", "pobox.com", "tutanota.de", "tutanota.com", "tutamail.com", "tuta.io", + "keemail.me", "rocketmail.com" /* Yahoo */ , "safe-mail.net", "wow.com" /* AOL */ , "ygm.com" /* AOL */ , + "ymail.com" /* Yahoo */ , "zoho.com", "yandex.com", + + /* United States ISP domains */ + "bellsouth.net", "charter.net", "cox.net", "earthlink.net", "juno.com", + + /* British ISP domains */ + "btinternet.com", "virginmedia.com", "blueyonder.co.uk", "freeserve.co.uk", "live.co.uk", + "ntlworld.com", "o2.co.uk", "orange.net", "sky.com", "talktalk.co.uk", "tiscali.co.uk", + "virgin.net", "wanadoo.co.uk", "bt.com", + + /* Domains used in Asia */ + "sina.com", "sina.cn", "qq.com", "naver.com", "hanmail.net", "daum.net", "nate.com", "yahoo.co.jp", "yahoo.co.kr", "yahoo.co.id", "yahoo.co.in", "yahoo.com.sg", "yahoo.com.ph", "163.com", "yeah.net", "126.com", "21cn.com", "aliyun.com", "foxmail.com", + + /* French ISP domains */ + "hotmail.fr", "live.fr", "laposte.net", "yahoo.fr", "wanadoo.fr", "orange.fr", "gmx.fr", "sfr.fr", "neuf.fr", "free.fr", + + /* German ISP domains */ + "gmx.de", "hotmail.de", "live.de", "online.de", "t-online.de" /* T-Mobile */ , "web.de", "yahoo.de", + + /* Italian ISP domains */ + "libero.it", "virgilio.it", "hotmail.it", "aol.it", "tiscali.it", "alice.it", "live.it", "yahoo.it", "email.it", "tin.it", "poste.it", "teletu.it", + + /* Russian ISP domains */ + "mail.ru", "rambler.ru", "yandex.ru", "ya.ru", "list.ru", + + /* Belgian ISP domains */ + "hotmail.be", "live.be", "skynet.be", "voo.be", "tvcablenet.be", "telenet.be", + + /* Argentinian ISP domains */ + "hotmail.com.ar", "live.com.ar", "yahoo.com.ar", "fibertel.com.ar", "speedy.com.ar", "arnet.com.ar", + + /* Domains used in Mexico */ + "yahoo.com.mx", "live.com.mx", "hotmail.es", "hotmail.com.mx", "prodigy.net.mx", + + /* Domains used in Canada */ + "yahoo.ca", "hotmail.ca", "bell.net", "shaw.ca", "sympatico.ca", "rogers.com", + + /* Domains used in Brazil */ + "yahoo.com.br", "hotmail.com.br", "outlook.com.br", "uol.com.br", "bol.com.br", "terra.com.br", "ig.com.br", "itelefonica.com.br", "r7.com", "zipmail.com.br", "globo.com", "globomail.com", "oi.com.br" +]; -var window = null; var EnigmailWkdLookup = { /** * Try to import keys using WKD. Found keys are automatically imported * - * @param emailList: Array - of email addresses (in lowercase) + * @param {Array of String} emailList: email addresses (in lowercase) * - * @return Promise() (Boolean): true - new keys found + * @return {Promise}: true - new keys found */ findKeys: function(emails) { return new Promise((resolve, reject) => { @@ -69,7 +117,8 @@ if (checks[i]) { EnigmailLog.DEBUG("wkdLookup.jsm: findKeys: recheck " + emails[i] + "\n"); toCheck.push(emails[i]); - } else { + } + else { EnigmailLog.DEBUG("wkdLookup.jsm: findKeys: skip check " + emails[i] + "\n"); } } @@ -77,24 +126,27 @@ if (toCheck.length > 0) { Promise.all(toCheck.map((email) => { - return self.downloadWkdKey(email); + return self.downloadKey(email); })).then((dataArr) => { - let gotKeys = []; - for (let i = 0; i < dataArr.length; i++) { - if (dataArr[i] !== null) { - gotKeys.push(dataArr[i]); + if (dataArr) { + let gotKeys = []; + for (let i = 0; i < dataArr.length; i++) { + if (dataArr[i] !== null) { + gotKeys.push(dataArr[i]); + } } - } - - if (gotKeys.length > 0) { - importDownloadedKeys(gotKeys); - resolve(true); - } else - resolve(false); + if (gotKeys.length > 0) { + importDownloadedKeys(gotKeys); + resolve(true); + } + else + resolve(false); + } }); - } else { + } + else { resolve(false); } @@ -109,48 +161,45 @@ * Determine for an email address when we last attempted to * obtain a key via wkd * - * @param email: String - email address + * @param {String} email: email address * - * @return Promise: true if new WKD lookup required + * @return {Promise}: true if new WKD lookup required */ - determineLastAttempt: function(email) { + determineLastAttempt: async function(email) { EnigmailLog.DEBUG("wkdLookup.jsm: determineLastAttempt(" + email + ")\n"); let conn; - - return Sqlite.openConnection({ - path: "enigmail.sqlite", - sharedMemoryCache: false - }).then(function onConnection(connection) { - conn = connection; - return checkDatabaseStructure(conn); - }, function onError(error) { - EnigmailLog.DEBUG("wkdLookup.jsm: determineLastAttempt: could not open database\n"); - }).then(function _f() { - return timeForRecheck(conn, email); - }).then(function _done(val) { - EnigmailLog.DEBUG("wkdLookup.jsm: OK - closing connection\n"); - conn.close(); - return Promise.resolve(val); - }).catch(function _err(reason) { - EnigmailLog.DEBUG("wkdLookup.jsm: error - closing connection: " + reason + "\n"); + try { + conn = await EnigmailSqliteDb.openDatabase(); + let val = await timeForRecheck(conn, email); conn.close(); - // in case something goes wrong we recheck anyway - return Promise.resolve(true); - }); + return val; + } + catch (x) { + EnigmailLog.DEBUG("wkdLookup.jsm: determineLastAttempt: could not open database\n"); + if (conn) { + EnigmailLog.DEBUG("wkdLookup.jsm: error - closing connection: " + x + "\n"); + conn.close(); + } + } + // in case something goes wrong we recheck anyway + return true; }, - /** - * get the WKD URL for an email address + /** + * get the download URL for an email address for WKD or domain-specific locations * - * @param email: String - email address - * @param advancedMethod: Boolean - use "advanced" method as specifed in draft 08 + * @param {String} email: email address * - * @return String: URL (or null if not possible) + * @return {Promise}: URL (or null if not possible) */ - getWkdUrlFromEmail: function(email, advancedMethod) { + getDownloadUrlFromEmail: async function(email, advancedMethod) { email = email.toLowerCase().trim(); + + let url = await getSiteSpecificUrl(email); + if (url) return url; + let at = email.indexOf("@"); let domain = email.substr(at + 1); @@ -166,19 +215,31 @@ let gotHash = ch.finish(false); let encodedHash = EnigmailZBase32.encode(gotHash); - let url = ""; - if (advancedMethod) { url = "https://openpgpkey." + domain + "/.well-known/openpgpkey/" + domain + "/hu/" + encodedHash + "?l=" + escape(user); - } else { + } + else { url = "https://" + domain + "/.well-known/openpgpkey/hu/" + encodedHash + "?l=" + escape(user); } + return url; }, - downloadWkdKey: async function(email) { + /** + * Download a key for an email address + * + * @param {String} email: email address + * + * @return {Promise}: Key data (or null if not possible) + */ + downloadKey: async function(email) { EnigmailLog.DEBUG("wkdLookup.jsm: downloadKey(" + email + ")\n"); + if (!this.isWkdAvailable(email)) { + EnigmailLog.DEBUG("wkdLookup.jsm: downloadKey: no WKD for the domain\n"); + return null; + } + let keyData = await this.doWkdKeyDownload(email, true); if (!keyData) { @@ -188,93 +249,65 @@ return keyData; }, - doWkdKeyDownload: function(email, advancedMethod) { - EnigmailLog.DEBUG("wkdLookup.jsm: doWkdKeyDownload(" + email + ", " + advancedMethod + ")\n"); + doWkdKeyDownload: async function(email, advancedMethod) { + EnigmailLog.DEBUG(`wkdLookup.jsm: doWkdKeyDownload(${email}, ${advancedMethod})\n`); - return new Promise((resolve, reject) => { - let oReq = new XMLHttpRequest(); - - oReq.addEventListener("load", function _f() { - EnigmailLog.DEBUG("wkdLookup.jsm: doWkdKeyDownload: data for " + email + "\n"); - if (oReq.status !== 200) { - resolve(null); - } - else { - try { - let keyData = EnigmailData.arrayBufferToString(oReq.response); - resolve(keyData); - } catch (ex) { - EnigmailLog.DEBUG("wkdLookup.jsm: doWkdKeyDownload: error " + ex.toString() + "\n"); - resolve(null); - } - } - }); + let url = await EnigmailWkdLookup.getDownloadUrlFromEmail(email, advancedMethod); - oReq.addEventListener("error", (e) => { - EnigmailLog.DEBUG("wkdLookup.jsm: doWkdKeyDownload: error for " + email + "\n"); - EnigmailLog.DEBUG(" got error: " + e + "\n"); - resolve(null); - }, - false); - - try { - let url = EnigmailWkdLookup.getWkdUrlFromEmail(email, advancedMethod); - EnigmailLog.DEBUG(`wkdLookup.jsm: doWkdKeyDownload: requesting ${url}\n`); - - oReq.overrideMimeType("application/octet-stream"); - oReq.responseType = "arraybuffer"; - oReq.open("GET", url, true); - oReq.setRequestHeader('Authorization', 'Basic ' + btoa("no-user:")); - - oReq.send(); - } catch (ex) { - EnigmailLog.DEBUG(" got error: " + ex.toString() + "\n"); - } + let padLen = (url.length % 512) + 1; + let hdrs = new Headers({ + 'Authorization': 'Basic ' + btoa("no-user:") }); - } -}; + hdrs.append('Content-Type', 'application/octet-stream'); + hdrs.append('X-Enigmail-Padding', "x".padEnd(padLen, "x")); + let myRequest = new Request(url, { + method: 'GET', + headers: hdrs, + mode: 'cors', + //redirect: 'error', + redirect: 'follow', + cache: 'default' + }); -/** - * Ensure that the database has the wkd_lookup_timestamp table. - * - * @param connection: Object - SQLite connection - * - * @return Promise - */ -function checkDatabaseStructure(connection) { - EnigmailLog.DEBUG("wkdLookup.jsm: checkDatabaseStructure\n"); + let response; + try { + EnigmailLog.DEBUG("wkdLookup.jsm: doWkdKeyDownload: requesting " + url + "\n"); + response = await fetch(myRequest); + if (!response.ok) { + return null; + } + } + catch (ex) { + EnigmailLog.DEBUG("wkdLookup.jsm: doWkdKeyDownload: error " + ex.toString() + "\n"); + return null; + } - return connection.tableExists("wkd_lookup_timestamp").then( - function onSuccess(exists) { - EnigmailLog.DEBUG("wkdLookup.jsm: checkDatabaseStructure - success\n"); - if (!exists) { - return createAutoKeyLocateTable(connection); - } else { - return PromiseUtils.defer(); + try { + if (response.headers.has("content-type") && response.headers.get("content-type").search(/^text\/html/i) === 0) { + // if we get HTML output, we return nothing (for example redirects to error catching pages) + return null; } - }, - function onError(error) { - EnigmailLog.DEBUG("wkdLookup.jsm: checkDatabaseStructure - error\n"); - Promise.reject(error); - }); -} + let keyData = EnigmailData.arrayBufferToString(Cu.cloneInto(await response.arrayBuffer(), this)); + EnigmailLog.DEBUG(`wkdLookup.jsm: doWkdKeyDownload: got data for ${email}\n`); + return { + email: email, + keyData: keyData + }; + } + catch (ex) { + EnigmailLog.DEBUG("wkdLookup.jsm: doWkdKeyDownload: error " + ex.toString() + "\n"); + return null; + } + }, -/** - * Create the "wkd_lookup_timestamp" table. - * - * @param connection: Object - SQLite connection - * - * @return Promise - */ -function createAutoKeyLocateTable(connection) { - EnigmailLog.DEBUG("wkdLookup.jsm: createAutoKeyLocateTable\n"); + isWkdAvailable: function(email) { + let domain = email.toLowerCase().replace(/^.*@/, ""); + + return (BLACKLIST_DOMAINS.indexOf(domain) < 0); + } +}; - return connection.execute( - "create table wkd_lookup_timestamp (" + - "email text not null primary key, " + // email address of correspondent - "last_seen integer);"); // timestamp of last mail received for the email/type combination -} /** * Check if enough time has passed since we looked-up the key for "email". @@ -310,16 +343,33 @@ }); } - +/** + * Import downloaded keys + * + * @param {Array of String}: ASCII armored or binary string + * + * no return value + */ function importDownloadedKeys(keysArr) { EnigmailLog.DEBUG("wkdLookup.jsm: importDownloadedKeys(" + keysArr.length + ")\n"); let keyData = ""; + let domainArr = []; for (let k in keysArr) { - try { - keyData += EnigmailOpenPGP.enigmailFuncs.bytesToArmor(EnigmailOpenPGP.openpgp.enums.armor.public_key, keysArr[k]); - } catch (ex) { - EnigmailLog.DEBUG("wkdLookup.jsm: importDownloadedKeys: exeption=" + ex + "\n"); + if (keysArr[k]) { + if (keysArr[k].keyData.search(/^-----BEGIN PGP PUBLIC KEY BLOCK-----/) < 0) { + try { + keyData += EnigmailOpenPGP.enigmailFuncs.bytesToArmor(EnigmailOpenPGP.openpgp.enums.armor.public_key, keysArr[k].keyData); + } + catch (ex) { + EnigmailLog.DEBUG("wkdLookup.jsm: importDownloadedKeys: exeption=" + ex + "\n"); + } + } + else { + keyData += keysArr[k].keyData; + } + + domainArr.push(keysArr[k].email.replace(/^.*@/, "@")); } } @@ -329,5 +379,39 @@ EnigmailLog.DEBUG("wkdLookup.jsm: importDownloadedKeys: fpr=" + keyList[k].fpr + "\n"); } - EnigmailKeyRing.importKey(null, false, keyData, "", {}, {}); -} \ No newline at end of file + EnigmailKeyRing.importKey(null, false, keyData, "", {}, {}, false, domainArr); +} + +/** + * Get special URLs for specific sites that don't use WKD, but still provide + * public keys of their users in + * + * @param {String}: emailAddr: email address in lowercase + * + * @return {Promise}: URL or null of no URL relevant + */ +async function getSiteSpecificUrl(emailAddr) { + let domain = emailAddr.replace(/^.+@/, ""); + let url = null; + + switch (domain) { + case "protonmail.ch": + case "protonmail.com": + case "pm.me": + url = "https://api.protonmail.ch/pks/lookup?op=get&options=mr&search=" + escape(emailAddr); + break; + } + + if (!url) { + try { + let mxHosts = await EnigmailDns.lookup("MX", domain); + if (mxHosts & mxHosts.indexOf("mail.protonmail.ch") >= 0 || + mxHosts.indexOf("mailsec.protonmail.ch") >= 0) { + url = "https://api.protonmail.ch/pks/lookup?op=get&options=mr&search=" + escape(emailAddr); + } + } + catch (ex) {} + } + + return url; +} diff -Nru enigmail-2.0.12+ds1/package/wksMimeHandler.jsm enigmail-2.1.3+ds1/package/wksMimeHandler.jsm --- enigmail-2.0.12+ds1/package/wksMimeHandler.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/package/wksMimeHandler.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -1,4 +1,3 @@ -/*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 https://mozilla.org/MPL/2.0/. */ @@ -11,17 +10,13 @@ * Module for handling response messages from OpenPGP Web Key Service */ -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; - -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false */ -Cu.import("resource://enigmail/mimeVerify.jsm"); /*global EnigmailVerify: false */ -Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */ -Cu.import("resource://enigmail/locale.jsm"); /*global EnigmailLocale: false */ -Cu.import("resource://enigmail/decryption.jsm"); /*global EnigmailDecryption: false */ -Cu.import("resource://enigmail/singletons.jsm"); /*global EnigmailSingletons: false */ -Cu.import("resource://enigmail/constants.jsm"); /*global EnigmailConstants: false */ +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; +const EnigmailVerify = ChromeUtils.import("chrome://enigmail/content/modules/mimeVerify.jsm").EnigmailVerify; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailLocale = ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale; +const EnigmailDecryption = ChromeUtils.import("chrome://enigmail/content/modules/decryption.jsm").EnigmailDecryption; +const EnigmailSingletons = ChromeUtils.import("chrome://enigmail/content/modules/singletons.jsm").EnigmailSingletons; +const EnigmailConstants = ChromeUtils.import("chrome://enigmail/content/modules/constants.jsm").EnigmailConstants; const APPSHELL_MEDIATOR_CONTRACTID = "@mozilla.org/appshell/window-mediator;1"; @@ -69,13 +64,20 @@ uri: null, backgroundJob: false, - QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener]), + QueryInterface: EnigmailCompat.generateQI([Ci.nsIStreamListener]), - onStartRequest: function(request, uri) { + onStartRequest: function(request, ctxt) { EnigmailLog.DEBUG("wksMimeHandler.jsm: onStartRequest\n"); // always log this one - this.uri = uri ? uri.QueryInterface(Ci.nsIURI).clone() : null; this.mimeSvc = request.QueryInterface(Ci.nsIPgpMimeProxy); + let uri = null; + if ("messageURI" in this.mimeSvc) { + uri = this.mimeSvc.messageURI; + } + else { + uri = ctxt; + } + if ("mimePart" in this.mimeSvc) { this.mimePartNumber = this.mimeSvc.mimePart; } @@ -92,7 +94,13 @@ }, - onDataAvailable: function(req, sup, stream, offset, count) { + onDataAvailable: function(req, dummy, stream, offset, count) { + if ("messageURI" in this.mimeSvc) { + // TB >= 67 + stream = dummy; + count = offset; + } + LOCAL_DEBUG("wksMimeHandler.jsm: onDataAvailable: " + count + "\n"); if (count > 0) { this.inStream.init(stream); @@ -171,9 +179,9 @@ let gConv = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); gConv.setData(msg, msg.length); try { - this.mimeSvc.onStartRequest(null, null); - this.mimeSvc.onDataAvailable(null, null, gConv, 0, msg.length); - this.mimeSvc.onStopRequest(null, null, 0); + this.mimeSvc.onStartRequest(null); + this.mimeSvc.onDataAvailable(null, gConv, 0, msg.length); + this.mimeSvc.onStopRequest(null, 0); } catch (ex) { EnigmailLog.ERROR("wksMimeHandler.jsm: returnData(): mimeSvc.onDataAvailable failed:\n" + ex.toString()); diff -Nru enigmail-2.0.12+ds1/package/xhrUtils.jsm enigmail-2.1.3+ds1/package/xhrUtils.jsm --- enigmail-2.0.12+ds1/package/xhrUtils.jsm 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/package/xhrUtils.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,135 @@ +/* + * 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 = ["EnigmailXhrUtils"]; + +var EnigmailXhrUtils = { + + /** + * Create an error description from an XMLHttpRequest error. + * Adapted from the patch for mozTCPSocket error reporting (bug 861196). + * + * @param xhr: XMLHttpRequest Object + * + * @return Object: + * - type: String: one of SecurityCertificate, SecurityProtocol, Network + * - name: Detailed error text + */ + createTCPErrorFromFailedXHR: function(xhr) { + let status = xhr.channel.QueryInterface(Ci.nsIRequest).status; + + let errType; + let errName; + + if ((status & 0xff0000) === 0x5a0000) { // Security module + const nsINSSErrorsService = Ci.nsINSSErrorsService; + let nssErrorsService = Cc['@mozilla.org/nss_errors_service;1'].getService(nsINSSErrorsService); + let errorClass; + // getErrorClass will throw a generic NS_ERROR_FAILURE if the error code is + // somehow not in the set of covered errors. + try { + errorClass = nssErrorsService.getErrorClass(status); + } + catch (ex) { + errorClass = 'SecurityProtocol'; + } + if (errorClass == nsINSSErrorsService.ERROR_CLASS_BAD_CERT) { + errType = 'SecurityCertificate'; + } + else { + errType = 'SecurityProtocol'; + } + + // NSS_SEC errors (happen below the base value because of negative vals) + if ((status & 0xffff) < Math.abs(nsINSSErrorsService.NSS_SEC_ERROR_BASE)) { + // The bases are actually negative, so in our positive numeric space, we + // need to subtract the base off our value. + let nssErr = Math.abs(nsINSSErrorsService.NSS_SEC_ERROR_BASE) - + (status & 0xffff); + switch (nssErr) { + case 11: // SEC_ERROR_EXPIRED_CERTIFICATE, sec(11) + errName = 'SecurityExpiredCertificateError'; + break; + case 12: // SEC_ERROR_REVOKED_CERTIFICATE, sec(12) + errName = 'SecurityRevokedCertificateError'; + break; + + // per bsmith, we will be unable to tell these errors apart very soon, + // so it makes sense to just folder them all together already. + case 13: // SEC_ERROR_UNKNOWN_ISSUER, sec(13) + case 20: // SEC_ERROR_UNTRUSTED_ISSUER, sec(20) + case 21: // SEC_ERROR_UNTRUSTED_CERT, sec(21) + case 36: // SEC_ERROR_CA_CERT_INVALID, sec(36) + errName = 'SecurityUntrustedCertificateIssuerError'; + break; + case 90: // SEC_ERROR_INADEQUATE_KEY_USAGE, sec(90) + errName = 'SecurityInadequateKeyUsageError'; + break; + case 176: // SEC_ERROR_CERT_SIGNATURE_ALGORITHM_DISABLED, sec(176) + errName = 'SecurityCertificateSignatureAlgorithmDisabledError'; + break; + default: + errName = 'SecurityError'; + break; + } + } + else { + let sslErr = Math.abs(nsINSSErrorsService.NSS_SSL_ERROR_BASE) - + (status & 0xffff); + switch (sslErr) { + case 3: // SSL_ERROR_NO_CERTIFICATE, ssl(3) + errName = 'SecurityNoCertificateError'; + break; + case 4: // SSL_ERROR_BAD_CERTIFICATE, ssl(4) + errName = 'SecurityBadCertificateError'; + break; + case 8: // SSL_ERROR_UNSUPPORTED_CERTIFICATE_TYPE, ssl(8) + errName = 'SecurityUnsupportedCertificateTypeError'; + break; + case 9: // SSL_ERROR_UNSUPPORTED_VERSION, ssl(9) + errName = 'SecurityUnsupportedTLSVersionError'; + break; + case 12: // SSL_ERROR_BAD_CERT_DOMAIN, ssl(12) + errName = 'SecurityCertificateDomainMismatchError'; + break; + default: + errName = 'SecurityError'; + break; + } + } + } + else { + errType = 'Network'; + switch (status) { + // connect to host:port failed + case 0x804B000C: // NS_ERROR_CONNECTION_REFUSED, network(13) + errName = 'ConnectionRefusedError'; + break; + // network timeout error + case 0x804B000E: // NS_ERROR_NET_TIMEOUT, network(14) + errName = 'NetworkTimeoutError'; + break; + // hostname lookup failed + case 0x804B001E: // NS_ERROR_UNKNOWN_HOST, network(30) + errName = 'DomainNotFoundError'; + break; + case 0x804B0047: // NS_ERROR_NET_INTERRUPT, network(71) + errName = 'NetworkInterruptError'; + break; + default: + errName = 'NetworkError'; + break; + } + } + + return { + name: errName, + type: errType + }; + } +}; diff -Nru enigmail-2.0.12+ds1/static_analysis/eslint enigmail-2.1.3+ds1/static_analysis/eslint --- enigmail-2.0.12+ds1/static_analysis/eslint 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/static_analysis/eslint 2019-10-29 17:09:36.000000000 +0000 @@ -24,8 +24,8 @@ STATIC_ANALYSIS_DIR=`dirname "$CURRENT_FILE"` - find "$1" -name "*.js" -exec eslint --quiet {} + && \ - find "$1" -name "*.jsm" -exec eslint --quiet {} + + find "$1" -name "*.js" -exec eslint --quiet --cache {} + && \ + find "$1" -name "*.jsm" -exec eslint --quiet --cache {} + if [ $? -ne 0 ]; then exit 1 fi diff -Nru enigmail-2.0.12+ds1/stdlib/LICENSE-openpgp.js.txt enigmail-2.1.3+ds1/stdlib/LICENSE-openpgp.js.txt --- enigmail-2.0.12+ds1/stdlib/LICENSE-openpgp.js.txt 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/stdlib/LICENSE-openpgp.js.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,176 +0,0 @@ -License for OpenPGP.js -====================== - -The original source code for OpenPGP.js is available from -http://openpgpjs.org/ - - ---------------------------------------------------------------------- - - - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. - diff -Nru enigmail-2.0.12+ds1/stdlib/Makefile enigmail-2.1.3+ds1/stdlib/Makefile --- enigmail-2.0.12+ds1/stdlib/Makefile 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/stdlib/Makefile 2019-10-29 17:09:36.000000000 +0000 @@ -7,18 +7,30 @@ include $(DEPTH)/config/autoconf.mk +GENDIR = $(DIST)/chrome/content/modules/stdlib + MODFILES = \ compose.jsm \ misc.jsm \ msgHdrUtils.jsm \ - openpgp-lib.js \ - openpgp.worker.min.js + openpgp.worker.js \ + web-streams.jsm + +GENFILES = $(addprefix $(GENDIR)/,$(MODFILES)) + +$(GENDIR)/%.jsm: %.jsm + $(DEPTH)/util/prepPostbox $(TARGET_TOOL) $< $@ + +$(GENDIR)/%.js: %.js + $(DEPTH)/util/prepPostbox $(TARGET_TOOL) $< $@ all: deploy -deploy: $(MODFILES) - $(DEPTH)/util/install -m 644 $(DIST)/modules/stdlib $(MODFILES) +deploy: createlib $(GENFILES) +createlib: + cat openpgp-lib-head.js openpgp-lib.js openpgp-lib-tail.js > openpgp-lib.jsm + $(DEPTH)/util/prepPostbox $(TARGET_TOOL) openpgp-lib.jsm $(GENDIR)/openpgp-lib.jsm clean: - $(DEPTH)/util/install -u $(DIST)/modules/stdlib $(MODFILES) + $(DEPTH)/util/install -u $(DIST)/chrome/content/modules/stdlib $(MODFILES) openpgp-lib.jsm diff -Nru enigmail-2.0.12+ds1/stdlib/compose.jsm enigmail-2.1.3+ds1/stdlib/compose.jsm --- enigmail-2.0.12+ds1/stdlib/compose.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/stdlib/compose.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -18,88 +18,72 @@ ] const { - classes: Cc, - interfaces: Ci, - utils: Cu, results: Cr } = Components; -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); // for generateQI, defineLazyServiceGetter -Cu.import("resource://gre/modules/NetUtil.jsm"); -Cu.import("resource:///modules/gloda/mimemsg.js"); -Cu.import("resource:///modules/mailServices.js"); - -Cu.import("resource://enigmail/stdlib/misc.jsm"); -Cu.import("resource://enigmail/stdlib/msgHdrUtils.jsm"); -Cu.import("resource://enigmail/log.jsm"); - -/** - * Use the mailnews component to stream a message, and process it in a way - * that's suitable for quoting (strip signature, remove images, stuff like - * that). - * @param {nsIMsgDBHdr} aMsgHdr The message header that you want to quote - * @param {Function} k The continuation. This function will be passed quoted - * text suitable for insertion in an HTML editor. You can pass this to - * htmlToPlainText if you're running a plaintext editor. - * @return - */ -function quoteMsgHdr(aMsgHdr, k) { - let chunks = []; - // Everyone knows that nsICharsetConverterManager and nsIUnicodeDecoder - // are not to be used from scriptable code, right? And the error you'll - // get if you try to do so is really meaningful, and that you'll have no - // trouble figuring out where the error comes from... - let unicodeConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"] - .createInstance(Ci.nsIScriptableUnicodeConverter); - unicodeConverter.charset = "UTF-8"; - let listener = { - /**@ignore*/ - setMimeHeaders: function() {}, - - /**@ignore*/ - onStartRequest: function( /* nsIRequest */ aRequest, /* nsISupports */ aContext) {}, - - /**@ignore*/ - onStopRequest: function( /* nsIRequest */ aRequest, /* nsISupports */ aContext, /* int */ aStatusCode) { - let data = chunks.join(""); - k(data); - }, - - /**@ignore*/ - onDataAvailable: function( /* nsIRequest */ aRequest, /* nsISupports */ aContext, - /* nsIInputStream */ - aStream, /* int */ aOffset, /* int */ aCount) { - // Fortunately, we have in Gecko 2.0 a nice wrapper - let data = NetUtil.readInputStreamToString(aStream, aCount); - // Now each character of the string is actually to be understood as a byte - // of a UTF-8 string. - // So charCodeAt is what we want here... - let array = []; - for (let i = 0; i < data.length; ++i) - array[i] = data.charCodeAt(i); - // Yay, good to go! - chunks.push(unicodeConverter.convertFromByteArray(array, array.length)); - }, - - QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports, Ci.nsIStreamListener, - Ci.nsIMsgQuotingOutputStreamListener, Ci.nsIRequestObserver - ]) - }; - // Here's what we want to stream... - let msgUri = msgHdrGetUri(aMsgHdr); - /** - * Quote a particular message specified by its URI. - * - * @param charset optional parameter - if set, force the message to be - * quoted using this particular charset - */ - // void quoteMessage(in string msgURI, in boolean quoteHeaders, - // in nsIMsgQuotingOutputStreamListener streamListener, - // in string charset, in boolean headersOnly); - let quoter = Cc["@mozilla.org/messengercompose/quoting;1"] - .createInstance(Ci.nsIMsgQuote); - quoter.quoteMessage(msgUri, false, listener, "", false, aMsgHdr); +const { + MsgHdrToMimeMessage, + MimeMessage, MimeContainer, + MimeBody, MimeUnknown, + MimeMessageAttachment +} = ChromeUtils.import("resource:///modules/gloda/mimemsg.js"); + + +var MailServices; +try { + MailServices = ChromeUtils.import("resource:///modules/MailServices.jsm").MailServices; } +catch (x){ + MailServices = ChromeUtils.import("resource:///modules/mailServices.js").MailServices; +} + +const { + gIdentities, + fillIdentities, + getIdentities, + getDefaultIdentity, + getIdentityForEmail, + hasConfiguredAccounts, + range, + MixIn, + combine, + entries, + dateAsInMessageList, + escapeHtml, + sanitize, + parseMimeLine, + encodeUrlParameters, + decodeUrlParameters, + systemCharset, + isOSX, + isWindows, + isAccel +} = ChromeUtils.import("chrome://enigmail/content/modules/stdlib/misc.jsm"); + +const { + msgHdrToMessageBody, + msgHdrToNeckoURL, + msgHdrGetTags, + msgUriToMsgHdr, + msgHdrGetUri, + msgHdrFromNeckoUrl, + msgHdrSetTags, + msgHdrIsDraft, + msgHdrIsSent, + msgHdrIsArchive, + msgHdrIsInbox, + msgHdrIsRss, + msgHdrIsNntp, + msgHdrIsJunk, + msgHdrsMarkAsRead, + msgHdrsArchive, + msgHdrsDelete, + getMail3Pane, + msgHdrGetHeaders, + msgHdrsModifyRaw +} = ChromeUtils.import("chrome://enigmail/content/modules/stdlib/msgHdrUtils.jsm"); +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; + function getEditorForIframe(aIframe) { let w = aIframe.contentWindow; diff -Nru enigmail-2.0.12+ds1/stdlib/misc.jsm enigmail-2.1.3+ds1/stdlib/misc.jsm --- enigmail-2.0.12+ds1/stdlib/misc.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/stdlib/misc.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -27,20 +27,20 @@ 'isOSX', 'isWindows', 'isAccel' ] -const { - classes: Cc, - interfaces: Ci, - utils: Cu -} = Components; -Cu.import("resource:///modules/iteratorUtils.jsm"); // for fixIterator -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +const fixIterator = ChromeUtils.import("resource:///modules/iteratorUtils.jsm").fixIterator; +const XPCOMUtils = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm").XPCOMUtils; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +var MailServices; +try { + MailServices = ChromeUtils.import("resource:///modules/MailServices.jsm").MailServices; +} +catch (x){ + MailServices = ChromeUtils.import("resource:///modules/mailServices.js").MailServices; +} -Cu.import("resource:///modules/mailServices.js"); -// That one doesn't belong to MailServices. XPCOMUtils.defineLazyServiceGetter(MailServices, "i18nDateFormatter", "@mozilla.org/intl/scriptabledateformat;1"); -Cu.import("resource://enigmail/log.jsm"); let isOSX = ("nsILocalFileMac" in Ci); let isWindows = ("@mozilla.org/windows-registry-key;1" in Cc); @@ -168,7 +168,7 @@ // We're only interested in identities that have a real email. if (currentIdentity.email) { identities.push({ - isDefault: (currentIdentity == MailServices.accounts.defaultAccount.defaultIdentity), + isDefault: (currentIdentity == MailServices.accounts.defaultAccount ? MailServices.accounts.defaultAccount.defaultIdentity : false), identity: currentIdentity }); } diff -Nru enigmail-2.0.12+ds1/stdlib/msgHdrUtils.jsm enigmail-2.1.3+ds1/stdlib/msgHdrUtils.jsm --- enigmail-2.0.12+ds1/stdlib/msgHdrUtils.jsm 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/stdlib/msgHdrUtils.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -26,12 +26,7 @@ 'msgHdrsModifyRaw', ] -const { - classes: Cc, - interfaces: Ci, - utils: Cu, - results: Cr -} = Components; +const Cr = Components.results; // from mailnews/base/public/nsMsgFolderFlags.idl const nsMsgFolderFlags_SentMail = 0x00000200; @@ -41,15 +36,51 @@ const PR_WRONLY = 0x02; -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); // for defineLazyServiceGetter -Cu.import("resource:///modules/gloda/mimemsg.js"); -Cu.import("resource:///modules/gloda/utils.js"); -Cu.import("resource:///modules/iteratorUtils.jsm"); // for toXPCOMArray -Cu.import("resource://gre/modules/Services.jsm"); -Cu.import("resource:///modules/mailServices.js"); +const XPCOMUtils = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm").XPCOMUtils; +const { + MsgHdrToMimeMessage, + MimeMessage, MimeContainer, + MimeBody, MimeUnknown, + MimeMessageAttachment +} = ChromeUtils.import("resource:///modules/gloda/mimemsg.js"); +const GlodaUtils = ChromeUtils.import("resource:///modules/gloda/utils.js").GlodaUtils; +const { + fixIterator, toXPCOMArray, toArray +} =ChromeUtils.import("resource:///modules/iteratorUtils.jsm"); +const Services = ChromeUtils.import("resource://gre/modules/Services.jsm").Services; +const EnigmailCompat = ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat; + +var MailServices; +try { + MailServices = ChromeUtils.import("resource:///modules/MailServices.jsm").MailServices; +} +catch (x){ + MailServices = ChromeUtils.import("resource:///modules/mailServices.js").MailServices; +} -Cu.import("resource://enigmail/stdlib/misc.jsm"); -Cu.import("resource://enigmail/log.jsm"); +const { + gIdentities, + fillIdentities, + getIdentities, + getDefaultIdentity, + getIdentityForEmail, + hasConfiguredAccounts, + range, + MixIn, + combine, + entries, + dateAsInMessageList, + escapeHtml, + sanitize, + parseMimeLine, + encodeUrlParameters, + decodeUrlParameters, + systemCharset, + isOSX, + isWindows, + isAccel +} = ChromeUtils.import("chrome://enigmail/content/modules/stdlib/misc.jsm"); +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; // Adding a messenger lazy getter to the MailServices even though it's not a service XPCOMUtils.defineLazyGetter(MailServices, "messenger", function() { @@ -337,8 +368,8 @@ QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener, Ci.nsIRequestObserver]), // nsIRequestObserver - onStartRequest: function(aRequest, aContext) {}, - onStopRequest: function(aRequest, aContext, aStatusCode) { + onStartRequest: function(aRequest) {}, + onStopRequest: function(aRequest, aStatusCode) { try { k(this._data); } @@ -348,7 +379,11 @@ }, // nsIStreamListener - onDataAvailable: function(aRequest, aContext, aInputStream, aOffset, aCount) { + onDataAvailable: function(aRequest, dummy, aInputStream, aOffset, aCount) { + if (isPlatformNewerThan("67")) { + aInputStream = dummy; + aCount = aOffset; + } if (this._stream == null) { this._stream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream); this._stream.init(aInputStream); @@ -427,11 +462,9 @@ msgHdr, tempFile } = obj; - MailServices.copy.CopyFileMessage( + EnigmailCompat.copyFileToMailFolder( tempFile, msgHdr.folder, - null, - false, msgHdr.flags, msgHdr.getStringProperty("keywords"), { QueryInterface: XPCOMUtils.generateQI([Ci.nsIMsgCopyServiceListener]), @@ -489,3 +522,14 @@ }), null, null, false, ""); } } + + +/** + * return true, if plafform is newer than or equal a given version + */ +function isPlatformNewerThan(requestedVersion) { + let vc = Cc["@mozilla.org/xpcom/version-comparator;1"].getService(Ci.nsIVersionComparator); + let appVer = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo).platformVersion; + + return vc.compare(appVer, requestedVersion) >= 0; +} diff -Nru enigmail-2.0.12+ds1/stdlib/qrcode.jsm enigmail-2.1.3+ds1/stdlib/qrcode.jsm --- enigmail-2.0.12+ds1/stdlib/qrcode.jsm 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/stdlib/qrcode.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,904 @@ +/** + * modified qr.js -- QR code generator in Javascript (revision 2011-01-19) + * Written by Kang Seonghoon . + * v0.0.20110119 + * This source code is in the public domain; if your jurisdiction does not + * recognize the public domain the terms of Creative Commons CC0 license + * apply. In the other words, you can always do what you want. + * added options properties: fillcolor and textcolor + * svg now works in Edge 13 and IE 11 + * @see {@link https://gist.github.com/englishextra/b46969e3382ef737c611bb59d837220b} + * @see {@link https://github.com/lifthrasiir/qr.js/blob/v0.0.20110119/qr.js} + * passes jshint with suppressing comments + * Docu: https://www.cssscript.com/customizable-qr-code-generator-vanilla-javascript-qrjs2/ + * + * Adapted to Mozilla-style module by Patrick Brunschwig + */ + + +/** + * Usage + * + * QRCode.generateSVG(data, settings) + * QRCode.generatePNG(data, settings) + * QRCode.generateHTML(data, settings) + * + * @param {String} data: the data to be put into the QR code + * @param {Object} settings: + * - ecclevel: ECC level (low, medium, quartile, high) + * allowed values: one of L, M, Q, H. Default: L (low) + * - mode: one of "alphanumeric", "octet", "numeric". Default: auto-detected + * - version: Symbol version of the QR code (~ amount of data to put into the QR code) (1-40). + * @see {@link http://www.qrcode.com/en/about/version.html} for details + * Default: -1 (auto-dectected) + * - fillcolor: background color. Default: "#FFFFFF" (white) + * - textcolor: foreground color. Default: "#000000" (black) + * - margin: margin around the generated. Default: 4 + * - modulesize: unscaled image size. Default: 5 + * + + */ + +"use strict"; + +var EXPORTED_SYMBOLS = ["QRCode"]; + +var length = "length"; +var VERSIONS = [null, [ + [10, 7, 17, 13], + [1, 1, 1, 1], + [] + ], + [ + [16, 10, 28, 22], + [1, 1, 1, 1], + [4, 16] + ], + [ + [26, 15, 22, 18], + [1, 1, 2, 2], + [4, 20] + ], + [ + [18, 20, 16, 26], + [2, 1, 4, 2], + [4, 24] + ], + [ + [24, 26, 22, 18], + [2, 1, 4, 4], + [4, 28] + ], + [ + [16, 18, 28, 24], + [4, 2, 4, 4], + [4, 32] + ], + [ + [18, 20, 26, 18], + [4, 2, 5, 6], + [4, 20, 36] + ], + [ + [22, 24, 26, 22], + [4, 2, 6, 6], + [4, 22, 40] + ], + [ + [22, 30, 24, 20], + [5, 2, 8, 8], + [4, 24, 44] + ], + [ + [26, 18, 28, 24], + [5, 4, 8, 8], + [4, 26, 48] + ], + [ + [30, 20, 24, 28], + [5, 4, 11, 8], + [4, 28, 52] + ], + [ + [22, 24, 28, 26], + [8, 4, 11, 10], + [4, 30, 56] + ], + [ + [22, 26, 22, 24], + [9, 4, 16, 12], + [4, 32, 60] + ], + [ + [24, 30, 24, 20], + [9, 4, 16, 16], + [4, 24, 44, 64] + ], + [ + [24, 22, 24, 30], + [10, 6, 18, 12], + [4, 24, 46, 68] + ], + [ + [28, 24, 30, 24], + [10, 6, 16, 17], + [4, 24, 48, 72] + ], + [ + [28, 28, 28, 28], + [11, 6, 19, 16], + [4, 28, 52, 76] + ], + [ + [26, 30, 28, 28], + [13, 6, 21, 18], + [4, 28, 54, 80] + ], + [ + [26, 28, 26, 26], + [14, 7, 25, 21], + [4, 28, 56, 84] + ], + [ + [26, 28, 28, 30], + [16, 8, 25, 20], + [4, 32, 60, 88] + ], + [ + [26, 28, 30, 28], + [17, 8, 25, 23], + [4, 26, 48, 70, 92] + ], + [ + [28, 28, 24, 30], + [17, 9, 34, 23], + [4, 24, 48, 72, 96] + ], + [ + [28, 30, 30, 30], + [18, 9, 30, 25], + [4, 28, 52, 76, 100] + ], + [ + [28, 30, 30, 30], + [20, 10, 32, 27], + [4, 26, 52, 78, 104] + ], + [ + [28, 26, 30, 30], + [21, 12, 35, 29], + [4, 30, 56, 82, 108] + ], + [ + [28, 28, 30, 28], + [23, 12, 37, 34], + [4, 28, 56, 84, 112] + ], + [ + [28, 30, 30, 30], + [25, 12, 40, 34], + [4, 32, 60, 88, 116] + ], + [ + [28, 30, 30, 30], + [26, 13, 42, 35], + [4, 24, 48, 72, 96, 120] + ], + [ + [28, 30, 30, 30], + [28, 14, 45, 38], + [4, 28, 52, 76, 100, 124] + ], + [ + [28, 30, 30, 30], + [29, 15, 48, 40], + [4, 24, 50, 76, 102, 128] + ], + [ + [28, 30, 30, 30], + [31, 16, 51, 43], + [4, 28, 54, 80, 106, 132] + ], + [ + [28, 30, 30, 30], + [33, 17, 54, 45], + [4, 32, 58, 84, 110, 136] + ], + [ + [28, 30, 30, 30], + [35, 18, 57, 48], + [4, 28, 56, 84, 112, 140] + ], + [ + [28, 30, 30, 30], + [37, 19, 60, 51], + [4, 32, 60, 88, 116, 144] + ], + [ + [28, 30, 30, 30], + [38, 19, 63, 53], + [4, 28, 52, 76, 100, 124, 148] + ], + [ + [28, 30, 30, 30], + [40, 20, 66, 56], + [4, 22, 48, 74, 100, 126, 152] + ], + [ + [28, 30, 30, 30], + [43, 21, 70, 59], + [4, 26, 52, 78, 104, 130, 156] + ], + [ + [28, 30, 30, 30], + [45, 22, 74, 62], + [4, 30, 56, 82, 108, 134, 160] + ], + [ + [28, 30, 30, 30], + [47, 24, 77, 65], + [4, 24, 52, 80, 108, 136, 164] + ], + [ + [28, 30, 30, 30], + [49, 25, 81, 68], + [4, 28, 56, 84, 112, 140, 168] + ] +]; + +var MODE_TERMINATOR = 0; +var MODE_NUMERIC = 1, + MODE_ALPHANUMERIC = 2, + MODE_OCTET = 4, + MODE_KANJI = 8; +var NUMERIC_REGEXP = /^\d*$/; +var ALPHANUMERIC_REGEXP = /^[A-Za-z0-9 $%*+\-./:] * $ /; +var ALPHANUMERIC_OUT_REGEXP = /^[A-Z0-9 $%*+\-./:] * $ /; +var ECCLEVEL_L = 1, + ECCLEVEL_M = 0, + ECCLEVEL_Q = 3, + ECCLEVEL_H = 2; +var GF256_MAP = [], + GF256_INVMAP = [-1]; +for (var i1 = 0, v = 1; i1 < 255; ++i1) { + GF256_MAP.push(v); + GF256_INVMAP[v] = i1; + v = (v * 2) ^ (v >= 128 ? 0x11d : 0); +} +var GF256_GENPOLY = [ + [] +]; + +for (var i2 = 0; i2 < 30; ++i2) { + var prevpoly = GF256_GENPOLY[i2], + poly = []; + for (var j1 = 0; j1 <= i2; ++j1) { + var a = (j1 < i2 ? GF256_MAP[prevpoly[j1]] : 0); + var b = GF256_MAP[(i2 + (prevpoly[j1 - 1] || 0)) % 255]; + poly.push(GF256_INVMAP[a ^ b]); + } + GF256_GENPOLY.push(poly); +} + +var ALPHANUMERIC_MAP = {}; +for (var i = 0; i < 45; ++i) { + ALPHANUMERIC_MAP["0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:".charAt(i)] = i; +} + +var MASKFUNCS = [function(i, j) { + return (i + j) % 2 === 0; +}, function(i) { + return i % 2 === 0; +}, function(i, j) { + return j % 3 === 0; +}, function(i, j) { + return (i + j) % 3 === 0; +}, function(i, j) { + return (((i / 2) | 0) + ((j / 3) | 0)) % 2 === 0; +}, function(i, j) { + return (i * j) % 2 + (i * j) % 3 === 0; +}, function(i, j) { + return ((i * j) % 2 + (i * j) % 3) % 2 === 0; +}, function(i, j) { + return ((i + j) % 2 + (i * j) % 3) % 2 === 0; +}]; + +var needsverinfo = function(ver) { + return ver > 6; +}; + +var getsizebyver = function(ver) { + return 4 * ver + 17; +}; + +var nfullbits = function(ver) { + var v = VERSIONS[ver]; + var nbits = 16 * ver * ver + 128 * ver + 64; + if (needsverinfo(ver)) { + nbits -= 36; + } + if (v[2][length]) { + nbits -= 25 * v[2][length] * v[2][length] - 10 * v[2][length] - 55; + } + return nbits; +}; + +var ndatabits = function(ver, ecclevel) { + var nbits = nfullbits(ver) & ~7; + var v = VERSIONS[ver]; + nbits -= 8 * v[0][ecclevel] * v[1][ecclevel]; + return nbits; +}; + +var ndatalenbits = function(ver, mode) { + switch (mode) { + case MODE_NUMERIC: + return (ver < 10 ? 10 : ver < 27 ? 12 : 14); + case MODE_ALPHANUMERIC: + return (ver < 10 ? 9 : ver < 27 ? 11 : 13); + case MODE_OCTET: + return (ver < 10 ? 8 : 16); + case MODE_KANJI: + return (ver < 10 ? 8 : ver < 27 ? 10 : 12); + } + + return 0; +}; + +var getmaxdatalen = function(ver, mode, ecclevel) { + var nbits = ndatabits(ver, ecclevel) - 4 - ndatalenbits(ver, mode); + switch (mode) { + case MODE_NUMERIC: + return ((nbits / 10) | 0) * 3 + (nbits % 10 < 4 ? 0 : nbits % 10 < 7 ? 1 : 2); + case MODE_ALPHANUMERIC: + return ((nbits / 11) | 0) * 2 + (nbits % 11 < 6 ? 0 : 1); + case MODE_OCTET: + return (nbits / 8) | 0; + case MODE_KANJI: + return (nbits / 13) | 0; + } + + return 0; +}; + +var validatedata = function(mode, data) { + switch (mode) { + case MODE_NUMERIC: + if (!data.match(NUMERIC_REGEXP)) { + return null; + } + return data; + case MODE_ALPHANUMERIC: + if (!data.match(ALPHANUMERIC_REGEXP)) { + return null; + } + return data.toUpperCase(); + case MODE_OCTET: + if (typeof data === "string") { + var newdata = []; + for (var i = 0; i < data[length]; ++i) { + var ch = data.charCodeAt(i); + if (ch < 0x80) { + newdata.push(ch); + } + else if (ch < 0x800) { + newdata.push(0xc0 | (ch >> 6), 0x80 | (ch & 0x3f)); + } + else if (ch < 0x10000) { + newdata.push(0xe0 | (ch >> 12), 0x80 | ((ch >> 6) & 0x3f), 0x80 | (ch & 0x3f)); + } + else { + newdata.push(0xf0 | (ch >> 18), 0x80 | ((ch >> 12) & 0x3f), 0x80 | ((ch >> 6) & 0x3f), 0x80 | (ch & 0x3f)); + } + } + return newdata; + } + else { + return data; + } + } + + return null; +}; + +var encode = function(ver, mode, data, maxbuflen) { + var buf = []; + var bits = 0, + remaining = 8; + var datalen = data[length]; + var pack = function(x, n) { + if (n >= remaining) { + buf.push(bits | (x >> (n -= remaining))); + while (n >= 8) { + buf.push((x >> (n -= 8)) & 255); + } + bits = 0; + remaining = 8; + } + if (n > 0) { + bits |= (x & ((1 << n) - 1)) << (remaining -= n); + } + }; + var nlenbits = ndatalenbits(ver, mode); + pack(mode, 4); + pack(datalen, nlenbits); + var i, i2; + switch (mode) { + case MODE_NUMERIC: + for (i = 2; i < datalen; i += 3) { + pack(parseInt(data.substring(i - 2, i + 1), 10), 10); + } + pack(parseInt(data.substring(i - 2), 10), [0, 4, 7][datalen % 3]); + break; + case MODE_ALPHANUMERIC: + for (i2 = 1; i2 < datalen; i2 += 2) { + pack(ALPHANUMERIC_MAP[data.charAt(i2 - 1)] * 45 + + ALPHANUMERIC_MAP[data.charAt(i2)], 11); + } + if (datalen % 2 === 1) { + pack(ALPHANUMERIC_MAP[data.charAt(i2 - 1)], 6); + } + break; + case MODE_OCTET: + for (var i3 = 0; i3 < datalen; ++i3) { + pack(data[i3], 8); + } + break; + } + pack(MODE_TERMINATOR, 4); + if (remaining < 8) { + buf.push(bits); + } + while (buf[length] + 1 < maxbuflen) { + buf.push(0xec, 0x11); + } + if (buf[length] < maxbuflen) { + buf.push(0xec); + } + return buf; +}; + +var calculateecc = function(poly, genpoly) { + var modulus = poly.slice(0); + var polylen = poly[length], + genpolylen = genpoly[length]; + for (var k = 0; k < genpolylen; ++k) { + modulus.push(0); + } + for (var i = 0; i < polylen;) { + var quotient = GF256_INVMAP[modulus[i++]]; + if (quotient >= 0) { + for (var j = 0; j < genpolylen; ++j) { + modulus[i + j] ^= GF256_MAP[(quotient + genpoly[j]) % 255]; + } + } + } + return modulus.slice(polylen); +}; + +var augumenteccs = function(poly, nblocks, genpoly) { + var subsizes = []; + var subsize = (poly[length] / nblocks) | 0, + subsize0 = 0; + var pivot = nblocks - poly[length] % nblocks; + for (var i = 0; i < pivot; ++i) { + subsizes.push(subsize0); + subsize0 += subsize; + } + for (var i2 = pivot; i2 < nblocks; ++i2) { + subsizes.push(subsize0); + subsize0 += subsize + 1; + } + subsizes.push(subsize0); + var eccs = []; + for (var i3 = 0; i3 < nblocks; ++i3) { + eccs.push(calculateecc(poly.slice(subsizes[i3], subsizes[i3 + 1]), genpoly)); + } + var result = []; + var nitemsperblock = (poly[length] / nblocks) | 0; + for (var i4 = 0; i4 < nitemsperblock; ++i4) { + for (var j = 0; j < nblocks; ++j) { + result.push(poly[subsizes[j] + i4]); + } + } + for (var j2 = pivot; j2 < nblocks; ++j2) { + result.push(poly[subsizes[j2 + 1] - 1]); + } + for (var i5 = 0; i5 < genpoly[length]; ++i5) { + for (var j3 = 0; j3 < nblocks; ++j3) { + result.push(eccs[j3][i5]); + } + } + return result; +}; + +var augumentbch = function(poly, p, genpoly, q) { + var modulus = poly << q; + for (var i = p - 1; i >= 0; --i) { + if ((modulus >> (q + i)) & 1) { + modulus ^= genpoly << i; + } + } + return (poly << q) | modulus; +}; + +var makebasematrix = function(ver) { + var v = VERSIONS[ver], + n = getsizebyver(ver); + var matrix = [], + reserved = []; + for (var i = 0; i < n; ++i) { + matrix.push([]); + reserved.push([]); + } + var blit = function(y, x, h, w, bits) { + for (var i = 0; i < h; ++i) { + for (var j = 0; j < w; ++j) { + matrix[y + i][x + j] = (bits[i] >> j) & 1; + reserved[y + i][x + j] = 1; + } + } + }; + blit(0, 0, 9, 9, [0x7f, 0x41, 0x5d, 0x5d, 0x5d, 0x41, 0x17f, 0x00, 0x40]); + blit(n - 8, 0, 8, 9, [0x100, 0x7f, 0x41, 0x5d, 0x5d, 0x5d, 0x41, 0x7f]); + blit(0, n - 8, 9, 8, [0xfe, 0x82, 0xba, 0xba, 0xba, 0x82, 0xfe, 0x00, 0x00]); + for (var i2 = 9; i2 < n - 8; ++i2) { + matrix[6][i2] = matrix[i2][6] = ~i2 & 1; + reserved[6][i2] = reserved[i2][6] = 1; + } + var aligns = v[2], + m = aligns[length]; + for (var i3 = 0; i3 < m; ++i3) { + var minj = (i3 === 0 || i3 === m - 1 ? 1 : 0), + maxj = (i3 === 0 ? m - 1 : m); + for (var j = minj; j < maxj; ++j) { + blit(aligns[i3], aligns[j], 5, 5, [0x1f, 0x11, 0x15, 0x11, 0x1f]); + } + } + if (needsverinfo(ver)) { + var code = augumentbch(ver, 6, 0x1f25, 12); + var k = 0; + for (var i4 = 0; i4 < 6; ++i4) { + for (var j2 = 0; j2 < 3; ++j2) { + matrix[i4][(n - 11) + j2] = matrix[(n - 11) + j2][i4] = (code >> k++) & 1; + reserved[i4][(n - 11) + j2] = reserved[(n - 11) + j2][i4] = 1; + } + } + } + return { + matrix: matrix, + reserved: reserved + }; +}; + +var putdata = function(matrix, reserved, buf) { + var n = matrix[length]; + var k = 0, + dir = -1; + for (var i = n - 1; i >= 0; i -= 2) { + if (i === 6) { + --i; + } + var jj = (dir < 0 ? n - 1 : 0); + for (var j = 0; j < n; ++j) { + for (var ii = i; ii > i - 2; --ii) { + if (!reserved[jj][ii]) { + matrix[jj][ii] = (buf[k >> 3] >> (~k & 7)) & 1; + ++k; + } + } + jj += dir; + } + dir = -dir; + } + return matrix; +}; + +var maskdata = function(matrix, reserved, mask) { + var maskf = MASKFUNCS[mask]; + var n = matrix[length]; + for (var i = 0; i < n; ++i) { + for (var j = 0; j < n; ++j) { + if (!reserved[i][j]) { + matrix[i][j] ^= maskf(i, j); + } + } + } + return matrix; +}; + +var putformatinfo = function(matrix, reserved, ecclevel, mask) { + var n = matrix[length]; + var code = augumentbch((ecclevel << 3) | mask, 5, 0x537, 10) ^ 0x5412; + for (var i = 0; i < 15; ++i) { + var r = [0, 1, 2, 3, 4, 5, 7, 8, n - 7, n - 6, n - 5, n - 4, n - 3, n - 2, n - 1][i]; + var c = [n - 1, n - 2, n - 3, n - 4, n - 5, n - 6, n - 7, n - 8, 7, 5, 4, 3, 2, 1, 0][i]; + matrix[r][8] = matrix[8][c] = (code >> i) & 1; + } + return matrix; +}; + +var evaluatematrix = function(matrix) { + var PENALTY_CONSECUTIVE = 3; + var PENALTY_TWOBYTWO = 3; + var PENALTY_FINDERLIKE = 40; + var PENALTY_DENSITY = 10; + var evaluategroup = function(groups) { + var score = 0; + for (var i = 0; i < groups[length]; ++i) { + if (groups[i] >= 5) { + score += PENALTY_CONSECUTIVE + (groups[i] - 5); + } + } + for (var i2 = 5; i2 < groups[length]; i2 += 2) { + var p = groups[i2]; + if ( + groups[i2 - 1] === p && + groups[i2 - 2] === 3 * p && + groups[i2 - 3] === p && + groups[i2 - 4] === p && + (groups[i2 - 5] >= 4 * p || groups[i2 + 1] >= 4 * p) + ) { + score += PENALTY_FINDERLIKE; + } + } + return score; + }; + var n = matrix[length]; + var score = 0, + nblacks = 0; + for (var i = 0; i < n; ++i) { + var row = matrix[i]; + var groups; + groups = [0]; + for (var j = 0; j < n;) { + var k; + for (k = 0; j < n && row[j]; ++k) { + ++j; + } + groups.push(k); + for (k = 0; j < n && !row[j]; ++k) { + ++j; + } + groups.push(k); + } + score += evaluategroup(groups); + groups = [0]; + for (var j2 = 0; j2 < n;) { + var k2; + for (k2 = 0; j2 < n && matrix[j2][i]; ++k2) { + ++j2; + } + groups.push(k2); + for (k2 = 0; j2 < n && !matrix[j2][i]; ++k2) { + ++j2; + } + groups.push(k2); + } + score += evaluategroup(groups); + var nextrow = matrix[i + 1] || []; + nblacks += row[0]; + for (var j3 = 1; j3 < n; ++j3) { + var p = row[j3]; + nblacks += p; + if (row[j3 - 1] === p && nextrow[j3] === p && nextrow[j3 - 1] === p) { + score += PENALTY_TWOBYTWO; + } + } + } + score += PENALTY_DENSITY * ((Math.abs(nblacks / n / n - 0.5) / 0.05) | 0); + return score; +}; + +var generate = function(data, ver, mode, ecclevel, mask) { + var v = VERSIONS[ver]; + var buf = encode(ver, mode, data, ndatabits(ver, ecclevel) >> 3); + buf = augumenteccs(buf, v[1][ecclevel], GF256_GENPOLY[v[0][ecclevel]]); + var result = makebasematrix(ver); + var matrix = result.matrix, + reserved = result.reserved; + putdata(matrix, reserved, buf); + if (mask < 0) { + maskdata(matrix, reserved, 0); + putformatinfo(matrix, reserved, ecclevel, 0); + var bestmask = 0, + bestscore = evaluatematrix(matrix); + maskdata(matrix, reserved, 0); + for (mask = 1; mask < 8; ++mask) { + maskdata(matrix, reserved, mask); + putformatinfo(matrix, reserved, ecclevel, mask); + var score = evaluatematrix(matrix); + if (bestscore > score) { + bestscore = score; + bestmask = mask; + } + maskdata(matrix, reserved, mask); + } + mask = bestmask; + } + maskdata(matrix, reserved, mask); + putformatinfo(matrix, reserved, ecclevel, mask); + return matrix; +}; + +var appendChild = "appendChild"; +var createElement = "createElement"; +var createElementNS = "createElementNS"; +var setAttributeNS = "setAttributeNS"; +var createRange = "createRange"; +var selectNodeContents = "selectNodeContents"; +var createContextualFragment = "createContextualFragment"; +var createDocumentFragment = "createDocumentFragment"; +var createTextNode = "createTextNode"; + +var QRCode = { + generate: function(data, settings) { + var options = settings || {}; + var MODES = { + "numeric": MODE_NUMERIC, + "alphanumeric": MODE_ALPHANUMERIC, + "octet": MODE_OCTET + }; + var ECCLEVELS = { + "L": ECCLEVEL_L, + "M": ECCLEVEL_M, + "Q": ECCLEVEL_Q, + "H": ECCLEVEL_H + }; + + var ver = options.version || -1; + var ecclevel = ECCLEVELS[(options.ecclevel || "L").toUpperCase()]; + var mode = options.mode ? MODES[options.mode.toLowerCase()] : -1; + var mask = "mask" in options ? options.mask : -1; + if (mode < 0) { + if (typeof data === "string") { + if (data.match(NUMERIC_REGEXP)) { + mode = MODE_NUMERIC; + } + else if (data.match(ALPHANUMERIC_OUT_REGEXP)) { + mode = MODE_ALPHANUMERIC; + } + else { + mode = MODE_OCTET; + } + } + else { + mode = MODE_OCTET; + } + } + else if (!(mode === MODE_NUMERIC || mode === MODE_ALPHANUMERIC || mode === MODE_OCTET)) { + throw "invalid or unsupported mode"; + } + data = validatedata(mode, data); + if (data === null) { + throw "invalid data format"; + } + if (ecclevel < 0 || ecclevel > 3) { + throw "invalid ECC level"; + } + if (ver < 0) { + for (ver = 1; ver <= 40; ++ver) { + if (data[length] <= getmaxdatalen(ver, mode, ecclevel)) { + break; + } + } + if (ver > 40) { + throw "too large data"; + } + } + else if (ver < 1 || ver > 40) { + throw "invalid version"; + } + if (mask !== -1 && (mask < 0 || mask > 8)) { + throw "invalid mask"; + } + return generate(data, ver, mode, ecclevel, mask); + }, + + generateSVG: function(data, settings) { + var options = settings || {}; + var fillcolor = options.fillcolor ? options.fillcolor : "#FFFFFF"; + var textcolor = options.textcolor ? options.textcolor : "#000000"; + var matrix = QRCode.generate(data, options); + var n = matrix[length]; + var modsize = Math.max(options.modulesize || 5, 0.5); + var margin = Math.max(options.margin ? options.margin : 4, 0.0); + var size = modsize * (n + 2 * margin); + /* var common = ' class= "fg"' + ' width="' + modsize + '" height="' + modsize + '"/>'; */ + var e = document[createElementNS]("http://www.w3.org/2000/svg", "svg"); + e[setAttributeNS](null, "viewBox", "0 0 " + size + " " + size); + e[setAttributeNS](null, "style", "shape-rendering:crispEdges"); + var qrcodeId = "qrcode" + Date.now(); + e[setAttributeNS](null, "id", qrcodeId); + var frag = document[createDocumentFragment](); + /* var svg = ['', '', ]; */ + var style = document[createElementNS]("http://www.w3.org/2000/svg", "style"); + style[appendChild](document[createTextNode]("#" + qrcodeId + " .bg{fill:" + fillcolor + "}#" + qrcodeId + " .fg{fill:" + textcolor + "}")); + /* style[setAttributeNS](null, "scoped", "scoped"); */ + frag[appendChild](style); + var createRect = function(c, f, x, y, s) { + var fg = document[createElementNS]("http://www.w3.org/2000/svg", "rect") || ""; + fg[setAttributeNS](null, "class", c); + fg[setAttributeNS](null, "fill", f); + fg[setAttributeNS](null, "x", x); + fg[setAttributeNS](null, "y", y); + fg[setAttributeNS](null, "width", s); + fg[setAttributeNS](null, "height", s); + return fg; + }; + frag[appendChild](createRect("bg", "none", 0, 0, size)); + var yo = margin * modsize; + for (var y = 0; y < n; ++y) { + var xo = margin * modsize; + for (var x = 0; x < n; ++x) { + if (matrix[y][x]) { + /* svg.push('' + ]; + for (var i = 0; i < n; ++i) { + html.push(""); + for (var j = 0; j < n; ++j) { + html.push(''); + } + html.push(""); + } + e.className = "qrcode"; + /* e.innerHTML = html.join("") + ""; */ + var range = document[createRange](); + range[selectNodeContents](e); + var frag = range[createContextualFragment](html.join("") + ""); + e[appendChild](frag); + return e; + }, + + generatePNG: function(data, settings) { + var options = settings || {}; + var fillcolor = options.fillcolor || "#FFFFFF"; + var textcolor = options.textcolor || "#000000"; + var matrix = QRCode.generate(data, options); + var modsize = Math.max(options.modulesize || 5, 0.5); + var margin = Math.max((options.margin !== null && options.margin !== undefined) ? options.margin : 4, 0.0); + var n = matrix[length]; + var size = modsize * (n + 2 * margin); + var canvas = document[createElement]("canvas"), + context; + canvas.width = canvas.height = size; + context = canvas.getContext("2d"); + if (!context) { + throw "canvas support is needed for PNG output"; + } + context.fillStyle = fillcolor; + context.fillRect(0, 0, size, size); + context.fillStyle = textcolor; + for (var i = 0; i < n; ++i) { + for (var j = 0; j < n; ++j) { + if (matrix[i][j]) { + context.fillRect(modsize * (margin + j), modsize * (margin + i), modsize, modsize); + } + } + } + return canvas.toDataURL(); + } +}; diff -Nru enigmail-2.0.12+ds1/stdlib/web-streams.jsm enigmail-2.1.3+ds1/stdlib/web-streams.jsm --- enigmail-2.0.12+ds1/stdlib/web-streams.jsm 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/stdlib/web-streams.jsm 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,1797 @@ +/* + The MIT License (MIT) + + Copyright (c) 2018 Mattias Buelens + Copyright (c) 2016 Diwank Singh Tomer + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/* + * This is a polyfill for web-streams, taken from + * https://github.com/MattiasBuelens/web-streams-polyfill + * + */ + + +var EXPORTED_SYMBOLS = ["TransformStream", "ReadableStream", "WritableStream"]; + + +let window = {}; + +(function(global) { + ! function(e, r) { + "object" == typeof exports && "undefined" != typeof module ? r(exports) : "function" == typeof define && define.amd ? define(["exports"], r) : r(e.WebStreamsPolyfill = {}) + }(this, function(e) { + "use strict"; + + function r(e, r) { + for (var t = 0; t < r.length; t++) { + var o = r[t]; + o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, o.key, o) + } + } + + function t(e, t, o) { + return t && r(e.prototype, t), o && r(e, o), e + } + + function o() { + return (o = Object.assign || function(e) { + for (var r = 1; r < arguments.length; r++) { + var t = arguments[r]; + for (var o in t) Object.prototype.hasOwnProperty.call(t, o) && (e[o] = t[o]) + } + return e + }).apply(this, arguments) + } + var n = Number.isInteger || function(e) { + return "number" == typeof e && isFinite(e) && Math.floor(e) === e + }, + i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? Symbol : function(e) { + return "Symbol(" + e + ")" + }; + + function a() {} + var s = "undefined" != typeof self ? self : "undefined" != typeof window ? window : "undefined" != typeof global ? global : void 0, + l = Number.isNaN || function(e) { + return e != e + }; + var u = function(e, r) { + return e(r = { + exports: {} + }, r.exports), r.exports + }(function(e, r) { + var t = i('is "detached" for our purposes'); + + function o(e, r, t) { + if ("function" != typeof e) throw new TypeError("Argument is not a function"); + return Function.prototype.apply.call(e, r, t) + } + + function n(e, r, t) { + try { + return Promise.resolve(o(e, r, t)) + } + catch (e) { + return Promise.reject(e) + } + } + r.typeIsObject = function(e) { + return "object" == typeof e && null !== e || "function" == typeof e + }, r.createDataProperty = function(e, r, t) { + Object.defineProperty(e, r, { + value: t, + writable: !0, + enumerable: !0, + configurable: !0 + }) + }, r.createArrayFromList = function(e) { + return e.slice() + }, r.ArrayBufferCopy = function(e, r, t, o, n) { + new Uint8Array(e).set(new Uint8Array(t, o, n), r) + }, r.CreateIterResultObject = function(e, r) { + var t = {}; + return Object.defineProperty(t, "value", { + value: e, + enumerable: !0, + writable: !0, + configurable: !0 + }), Object.defineProperty(t, "done", { + value: r, + enumerable: !0, + writable: !0, + configurable: !0 + }), t + }, r.IsFiniteNonNegativeNumber = function(e) { + return !1 !== r.IsNonNegativeNumber(e) && e !== 1 / 0 + }, r.IsNonNegativeNumber = function(e) { + return "number" == typeof e && (!l(e) && !(e < 0)) + }, r.Call = o, r.CreateAlgorithmFromUnderlyingMethod = function(e, r, t, o) { + var i = e[r]; + if (void 0 !== i) { + if ("function" != typeof i) throw new TypeError(i + " is not a method"); + switch (t) { + case 0: + return function() { + return n(i, e, o) + }; + case 1: + return function(r) { + var t = [r].concat(o); + return n(i, e, t) + } + } + } + return function() { + return Promise.resolve() + } + }, r.InvokeOrNoop = function(e, r, t) { + var n = e[r]; + if (void 0 !== n) return o(n, e, t) + }, r.PromiseCall = n, r.TransferArrayBuffer = function(e) { + var r = e.slice(); + return Object.defineProperty(e, "byteLength", { + get: function() { + return 0 + } + }), e[t] = !0, r + }, r.IsDetachedBuffer = function(e) { + return t in e + }, r.ValidateAndNormalizeHighWaterMark = function(e) { + if (e = Number(e), l(e) || e < 0) throw new RangeError("highWaterMark property of a queuing strategy must be non-negative and non-NaN"); + return e + }, r.MakeSizeAlgorithmFromSizeFunction = function(e) { + if (void 0 === e) return function() { + return 1 + }; + if ("function" != typeof e) throw new TypeError("size property of a queuing strategy must be a function"); + return function(r) { + return e(r) + } + } + }), + c = { + default: u, + __moduleExports: u, + typeIsObject: u.typeIsObject, + createDataProperty: u.createDataProperty, + createArrayFromList: u.createArrayFromList, + ArrayBufferCopy: u.ArrayBufferCopy, + CreateIterResultObject: u.CreateIterResultObject, + IsFiniteNonNegativeNumber: u.IsFiniteNonNegativeNumber, + IsNonNegativeNumber: u.IsNonNegativeNumber, + Call: u.Call, + CreateAlgorithmFromUnderlyingMethod: u.CreateAlgorithmFromUnderlyingMethod, + InvokeOrNoop: u.InvokeOrNoop, + PromiseCall: u.PromiseCall, + TransferArrayBuffer: u.TransferArrayBuffer, + IsDetachedBuffer: u.IsDetachedBuffer, + ValidateAndNormalizeHighWaterMark: u.ValidateAndNormalizeHighWaterMark, + MakeSizeAlgorithmFromSizeFunction: u.MakeSizeAlgorithmFromSizeFunction + }; + + function d() {} + d.AssertionError = a; + var f = { + default: d + }, + _ = f && d || f, + m = function(e) { + e && e instanceof _.AssertionError && setTimeout(function() { + throw e + }, 0) + }, + h = { + rethrowAssertionErrorRejection: m + }, + b = { + default: h, + __moduleExports: h, + rethrowAssertionErrorRejection: m + }, + v = c && u || c, + y = v.IsFiniteNonNegativeNumber, + p = function(e) { + var r = e._queue.shift(); + return e._queueTotalSize -= r.size, e._queueTotalSize < 0 && (e._queueTotalSize = 0), r.value + }, + w = function(e, r, t) { + if (t = Number(t), !y(t)) throw new RangeError("Size must be a finite, non-NaN, non-negative number."); + e._queue.push({ + value: r, + size: t + }), e._queueTotalSize += t + }, + g = function(e) { + return e._queue[0].value + }, + S = function(e) { + e._queue = [], e._queueTotalSize = 0 + }, + P = { + DequeueValue: p, + EnqueueValueWithSize: w, + PeekQueueValue: g, + ResetQueue: S + }, + R = { + default: P, + __moduleExports: P, + DequeueValue: p, + EnqueueValueWithSize: w, + PeekQueueValue: g, + ResetQueue: S + }, + q = { + default: a + }, + T = q && a || q, + j = b && h || b, + C = R && P || R, + E = (T("streams:writable-stream:verbose"), v.CreateAlgorithmFromUnderlyingMethod), + W = v.InvokeOrNoop, + A = v.ValidateAndNormalizeHighWaterMark, + k = (v.IsNonNegativeNumber, v.MakeSizeAlgorithmFromSizeFunction), + O = v.typeIsObject, + z = j.rethrowAssertionErrorRejection, + B = C.DequeueValue, + I = C.EnqueueValueWithSize, + F = C.PeekQueueValue, + N = C.ResetQueue, + D = i("[[AbortSteps]]"), + M = i("[[ErrorSteps]]"), + L = function() { + function e(e, r) { + void 0 === e && (e = {}); + var t = void 0 === r ? {} : r, + o = t.size, + n = t.highWaterMark, + i = void 0 === n ? 1 : n; + if (x(this), void 0 !== e.type) throw new RangeError("Invalid type is specified"); + var a = k(o); + ! function(e, r, t, o) { + var n = Object.create(le.prototype); + var i = E(r, "write", 1, [n]), + a = E(r, "close", 0, []), + s = E(r, "abort", 1, []); + ue(e, n, function() { + return W(r, "start", [n]) + }, i, a, s, t, o) + }(this, e, i = A(i), a) + } + var r = e.prototype; + return r.abort = function(e) { + return !1 === Q(this) ? Promise.reject(he("abort")) : !0 === Y(this) ? Promise.reject(new TypeError("Cannot abort a stream that already has a writer")) : U(this, e) + }, r.getWriter = function() { + if (!1 === Q(this)) throw he("getWriter"); + return H(this) + }, t(e, [{ + key: "locked", + get: function() { + if (!1 === Q(this)) throw he("locked"); + return Y(this) + } + }]), e + }(), + V = { + AcquireWritableStreamDefaultWriter: H, + CreateWritableStream: function(e, r, t, o, n, i) { + void 0 === n && (n = 1); + void 0 === i && (i = function() { + return 1 + }); + var a = Object.create(L.prototype); + x(a); + var s = Object.create(le.prototype); + return ue(a, s, e, r, t, o, n, i), a + }, + IsWritableStream: Q, + IsWritableStreamLocked: Y, + WritableStream: L, + WritableStreamAbort: U, + WritableStreamDefaultControllerErrorIfNeeded: fe, + WritableStreamDefaultWriterCloseWithErrorPropagation: function(e) { + var r = e._ownerWritableStream, + t = r._state; + if (!0 === Z(r) || "closed" === t) return Promise.resolve(); + if ("errored" === t) return Promise.reject(r._storedError); + return oe(e) + }, + WritableStreamDefaultWriterRelease: ae, + WritableStreamDefaultWriterWrite: se, + WritableStreamCloseQueuedOrInFlight: Z + }; + + function H(e) { + return new re(e) + } + + function x(e) { + e._state = "writable", e._storedError = void 0, e._writer = void 0, e._writableStreamController = void 0, e._writeRequests = [], e._inFlightWriteRequest = void 0, e._closeRequest = void 0, e._inFlightCloseRequest = void 0, e._pendingAbortRequest = void 0, e._backpressure = !1 + } + + function Q(e) { + return !!O(e) && !!Object.prototype.hasOwnProperty.call(e, "_writableStreamController") + } + + function Y(e) { + return void 0 !== e._writer + } + + function U(e, r) { + var t = e._state; + if ("closed" === t || "errored" === t) return Promise.resolve(void 0); + if (void 0 !== e._pendingAbortRequest) return e._pendingAbortRequest._promise; + var o = !1; + "erroring" === t && (o = !0, r = void 0); + var n = new Promise(function(t, n) { + e._pendingAbortRequest = { + _resolve: t, + _reject: n, + _reason: r, + _wasAlreadyErroring: o + } + }); + return e._pendingAbortRequest._promise = n, !1 === o && J(e, r), n + } + + function G(e, r) { + "writable" !== e._state ? K(e) : J(e, r) + } + + function J(e, r) { + var t = e._writableStreamController; + e._state = "erroring", e._storedError = r; + var o = e._writer; + void 0 !== o && ie(o, r), !1 === function(e) { + if (void 0 === e._inFlightWriteRequest && void 0 === e._inFlightCloseRequest) return !1; + return !0 + }(e) && !0 === t._started && K(e) + } + + function K(e) { + e._state = "errored", e._writableStreamController[M](); + for (var r = e._storedError, t = 0, o = e._writeRequests; t < o.length; t++) { + o[t]._reject(r) + } + if (e._writeRequests = [], void 0 !== e._pendingAbortRequest) { + var n = e._pendingAbortRequest; + if (e._pendingAbortRequest = void 0, !0 === n._wasAlreadyErroring) return n._reject(r), void $(e); + e._writableStreamController[D](n._reason).then(function() { + n._resolve(), $(e) + }, function(r) { + n._reject(r), $(e) + }) + } + else $(e) + } + + function X(e) { + e._inFlightCloseRequest._resolve(void 0), e._inFlightCloseRequest = void 0, "erroring" === e._state && (e._storedError = void 0, void 0 !== e._pendingAbortRequest && (e._pendingAbortRequest._resolve(), e._pendingAbortRequest = void 0)), e._state = "closed"; + var r = e._writer; + void 0 !== r && function(e) { + e._closedPromise_resolve(void 0), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0, e._closedPromiseState = "resolved" + }(r) + } + + function Z(e) { + return void 0 !== e._closeRequest || void 0 !== e._inFlightCloseRequest + } + + function $(e) { + void 0 !== e._closeRequest && (e._closeRequest._reject(e._storedError), e._closeRequest = void 0); + var r = e._writer; + void 0 !== r && (pe(r, e._storedError), r._closedPromise.catch(function() {})) + } + + function ee(e, r) { + var t = e._writer; + void 0 !== t && r !== e._backpressure && (!0 === r ? function(e) { + e._readyPromise = new Promise(function(r, t) { + e._readyPromise_resolve = r, e._readyPromise_reject = t + }), e._readyPromiseState = "pending" + }(t) : Se(t)), e._backpressure = r + } + var re = function() { + function e(e) { + if (!1 === Q(e)) throw new TypeError("WritableStreamDefaultWriter can only be constructed with a WritableStream instance"); + if (!0 === Y(e)) throw new TypeError("This stream has already been locked for exclusive writing by another writer"); + this._ownerWritableStream = e, e._writer = this; + var r = e._state; + if ("writable" === r) !1 === Z(e) && !0 === e._backpressure ? function(e) { + e._readyPromise = new Promise(function(r, t) { + e._readyPromise_resolve = r, e._readyPromise_reject = t + }), e._readyPromiseState = "pending" + }(this) : ge(this), ye(this); + else if ("erroring" === r) we(this, e._storedError), this._readyPromise.catch(function() {}), ye(this); + else if ("closed" === r) ge(this), + function(e) { + e._closedPromise = Promise.resolve(void 0), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0, e._closedPromiseState = "resolved" + }(this); + else { + var t = e._storedError; + we(this, t), this._readyPromise.catch(function() {}), + function(e, r) { + e._closedPromise = Promise.reject(r), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0, e._closedPromiseState = "rejected" + }(this, t), this._closedPromise.catch(function() {}) + } + } + var r = e.prototype; + return r.abort = function(e) { + return !1 === te(this) ? Promise.reject(be("abort")) : void 0 === this._ownerWritableStream ? Promise.reject(ve("abort")) : function(e, r) { + return U(e._ownerWritableStream, r) + }(this, e) + }, r.close = function() { + if (!1 === te(this)) return Promise.reject(be("close")); + var e = this._ownerWritableStream; + return void 0 === e ? Promise.reject(ve("close")) : !0 === Z(e) ? Promise.reject(new TypeError("cannot close an already-closing stream")) : oe(this) + }, r.releaseLock = function() { + if (!1 === te(this)) throw be("releaseLock"); + void 0 !== this._ownerWritableStream && ae(this) + }, r.write = function(e) { + return !1 === te(this) ? Promise.reject(be("write")) : void 0 === this._ownerWritableStream ? Promise.reject(ve("write to")) : se(this, e) + }, t(e, [{ + key: "closed", + get: function() { + return !1 === te(this) ? Promise.reject(be("closed")) : this._closedPromise + } + }, { + key: "desiredSize", + get: function() { + if (!1 === te(this)) throw be("desiredSize"); + if (void 0 === this._ownerWritableStream) throw ve("desiredSize"); + return function(e) { + var r = e._ownerWritableStream, + t = r._state; + if ("errored" === t || "erroring" === t) return null; + if ("closed" === t) return 0; + return ce(r._writableStreamController) + }(this) + } + }, { + key: "ready", + get: function() { + return !1 === te(this) ? Promise.reject(be("ready")) : this._readyPromise + } + }]), e + }(); + + function te(e) { + return !!O(e) && !!Object.prototype.hasOwnProperty.call(e, "_ownerWritableStream") + } + + function oe(e) { + var r = e._ownerWritableStream, + t = r._state; + if ("closed" === t || "errored" === t) return Promise.reject(new TypeError("The stream (in " + t + " state) is not in the writable state and cannot be closed")); + var o = new Promise(function(e, t) { + var o = { + _resolve: e, + _reject: t + }; + r._closeRequest = o + }); + return !0 === r._backpressure && "writable" === t && Se(e), + function(e) { + I(e, "close", 0), de(e) + }(r._writableStreamController), o + } + + function ne(e, r) { + "pending" === e._closedPromiseState ? pe(e, r) : function(e, r) { + e._closedPromise = Promise.reject(r), e._closedPromiseState = "rejected" + }(e, r), e._closedPromise.catch(function() {}) + } + + function ie(e, r) { + "pending" === e._readyPromiseState ? function(e, r) { + e._readyPromise_reject(r), e._readyPromise_resolve = void 0, e._readyPromise_reject = void 0, e._readyPromiseState = "rejected" + }(e, r) : function(e, r) { + e._readyPromise = Promise.reject(r), e._readyPromiseState = "rejected" + }(e, r), e._readyPromise.catch(function() {}) + } + + function ae(e) { + var r = e._ownerWritableStream, + t = new TypeError("Writer was released and can no longer be used to monitor the stream's closedness"); + ie(e, t), ne(e, t), r._writer = void 0, e._ownerWritableStream = void 0 + } + + function se(e, r) { + var t = e._ownerWritableStream, + o = t._writableStreamController, + n = function(e, r) { + try { + return e._strategySizeAlgorithm(r) + } + catch (r) { + return fe(e, r), 1 + } + }(o, r); + if (t !== e._ownerWritableStream) return Promise.reject(ve("write to")); + var i = t._state; + if ("errored" === i) return Promise.reject(t._storedError); + if (!0 === Z(t) || "closed" === i) return Promise.reject(new TypeError("The stream is closing or closed and cannot be written to")); + if ("erroring" === i) return Promise.reject(t._storedError); + var a = function(e) { + return new Promise(function(r, t) { + var o = { + _resolve: r, + _reject: t + }; + e._writeRequests.push(o) + }) + }(t); + return function(e, r, t) { + var o = { + chunk: r + }; + try { + I(e, o, t) + } + catch (r) { + return void fe(e, r) + } + var n = e._controlledWritableStream; + if (!1 === Z(n) && "writable" === n._state) { + var i = _e(e); + ee(n, i) + } + de(e) + }(o, r, n), a + } + var le = function() { + function e() { + throw new TypeError("WritableStreamDefaultController cannot be constructed explicitly") + } + var r = e.prototype; + return r.error = function(e) { + if (!1 === function(e) { + if (!O(e)) return !1; + if (!Object.prototype.hasOwnProperty.call(e, "_controlledWritableStream")) return !1; + return !0 + }(this)) throw new TypeError("WritableStreamDefaultController.prototype.error can only be used on a WritableStreamDefaultController"); + "writable" === this._controlledWritableStream._state && me(this, e) + }, r[D] = function(e) { + return this._abortAlgorithm(e) + }, r[M] = function() { + N(this) + }, e + }(); + + function ue(e, r, t, o, n, i, a, s) { + r._controlledWritableStream = e, e._writableStreamController = r, r._queue = void 0, r._queueTotalSize = void 0, N(r), r._started = !1, r._strategySizeAlgorithm = s, r._strategyHWM = a, r._writeAlgorithm = o, r._closeAlgorithm = n, r._abortAlgorithm = i; + var l = _e(r); + ee(e, l); + var u = t(); + Promise.resolve(u).then(function() { + r._started = !0, de(r) + }, function(t) { + r._started = !0, G(e, t) + }).catch(z) + } + + function ce(e) { + return e._strategyHWM - e._queueTotalSize + } + + function de(e) { + var r = e._controlledWritableStream; + if (!1 !== e._started && void 0 === r._inFlightWriteRequest) { + var t = r._state; + if ("closed" !== t && "errored" !== t) + if ("erroring" !== t) { + if (0 !== e._queue.length) { + var o = F(e); + "close" === o ? function(e) { + var r = e._controlledWritableStream; + (function(e) { + e._inFlightCloseRequest = e._closeRequest, e._closeRequest = void 0 + })(r), B(e), e._closeAlgorithm().then(function() { + X(r) + }, function(e) { + ! function(e, r) { + e._inFlightCloseRequest._reject(r), e._inFlightCloseRequest = void 0, void 0 !== e._pendingAbortRequest && (e._pendingAbortRequest._reject(r), e._pendingAbortRequest = void 0), G(e, r) + }(r, e) + }).catch(z) + }(e) : function(e, r) { + var t = e._controlledWritableStream; + (function(e) { + e._inFlightWriteRequest = e._writeRequests.shift() + })(t), e._writeAlgorithm(r).then(function() { + ! function(e) { + e._inFlightWriteRequest._resolve(void 0), e._inFlightWriteRequest = void 0 + }(t); + var r = t._state; + if (B(e), !1 === Z(t) && "writable" === r) { + var o = _e(e); + ee(t, o) + } + de(e) + }, function(e) { + ! function(e, r) { + e._inFlightWriteRequest._reject(r), e._inFlightWriteRequest = void 0, G(e, r) + }(t, e) + }).catch(z) + }(e, o.chunk) + } + } + else K(r) + } + } + + function fe(e, r) { + "writable" === e._controlledWritableStream._state && me(e, r) + } + + function _e(e) { + return ce(e) <= 0 + } + + function me(e, r) { + J(e._controlledWritableStream, r) + } + + function he(e) { + return new TypeError("WritableStream.prototype." + e + " can only be used on a WritableStream") + } + + function be(e) { + return new TypeError("WritableStreamDefaultWriter.prototype." + e + " can only be used on a WritableStreamDefaultWriter") + } + + function ve(e) { + return new TypeError("Cannot " + e + " a stream using a released writer") + } + + function ye(e) { + e._closedPromise = new Promise(function(r, t) { + e._closedPromise_resolve = r, e._closedPromise_reject = t, e._closedPromiseState = "pending" + }) + } + + function pe(e, r) { + e._closedPromise_reject(r), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0, e._closedPromiseState = "rejected" + } + + function we(e, r) { + e._readyPromise = Promise.reject(r), e._readyPromise_resolve = void 0, e._readyPromise_reject = void 0, e._readyPromiseState = "rejected" + } + + function ge(e) { + e._readyPromise = Promise.resolve(void 0), e._readyPromise_resolve = void 0, e._readyPromise_reject = void 0, e._readyPromiseState = "fulfilled" + } + + function Se(e) { + e._readyPromise_resolve(void 0), e._readyPromise_resolve = void 0, e._readyPromise_reject = void 0, e._readyPromiseState = "fulfilled" + } + var Pe = V.WritableStream, + Re = v.ArrayBufferCopy, + qe = v.CreateAlgorithmFromUnderlyingMethod, + Te = v.CreateIterResultObject, + je = v.IsFiniteNonNegativeNumber, + Ce = v.InvokeOrNoop, + Ee = v.IsDetachedBuffer, + We = v.TransferArrayBuffer, + Ae = v.ValidateAndNormalizeHighWaterMark, + ke = (v.IsNonNegativeNumber, v.MakeSizeAlgorithmFromSizeFunction), + Oe = v.createArrayFromList, + ze = v.typeIsObject, + Be = j.rethrowAssertionErrorRejection, + Ie = C.DequeueValue, + Fe = C.EnqueueValueWithSize, + Ne = C.ResetQueue, + De = V.AcquireWritableStreamDefaultWriter, + Me = V.IsWritableStream, + Le = V.IsWritableStreamLocked, + Ve = V.WritableStreamAbort, + He = V.WritableStreamDefaultWriterCloseWithErrorPropagation, + xe = V.WritableStreamDefaultWriterRelease, + Qe = V.WritableStreamDefaultWriterWrite, + Ye = V.WritableStreamCloseQueuedOrInFlight, + Ue = i("[[CancelSteps]]"), + Ge = i("[[PullSteps]]"), + Je = function() { + function e(e, r) { + void 0 === e && (e = {}); + var t = void 0 === r ? {} : r, + o = t.size, + i = t.highWaterMark; + $e(this); + var a = e.type; + if ("bytes" === String(a)) { + if (void 0 === i && (i = 0), i = Ae(i), void 0 !== o) throw new RangeError("The strategy for a byte stream cannot have a size function"); + ! function(e, r, t) { + var o = Object.create(Ar.prototype); + var i = qe(r, "pull", 0, [o]), + a = qe(r, "cancel", 1, []), + s = r.autoAllocateChunkSize; + if (void 0 !== s && (!1 === n(s) || s <= 0)) throw new RangeError("autoAllocateChunkSize must be a positive integer"); + Gr(e, o, function() { + return Ce(r, "start", [o]) + }, i, a, t, s) + }(this, e, i) + } + else { + if (void 0 !== a) throw new RangeError("Invalid type is specified"); + void 0 === i && (i = 1), + function(e, r, t, o) { + var n = Object.create(wr.prototype); + var i = qe(r, "pull", 0, [n]), + a = qe(r, "cancel", 1, []); + Er(e, n, function() { + return Ce(r, "start", [n]) + }, i, a, t, o) + }(this, e, i = Ae(i), ke(o)) + } + } + var r = e.prototype; + return r.cancel = function(e) { + return !1 === er(this) ? Promise.reject(Jr("cancel")) : !0 === rr(this) ? Promise.reject(new TypeError("Cannot cancel a stream that already has a reader")) : nr(this, e) + }, r.getReader = function(e) { + var r = (void 0 === e ? {} : e).mode; + if (!1 === er(this)) throw Jr("getReader"); + if (void 0 === r) return Xe(this); + if ("byob" === (r = String(r))) return function(e) { + return new _r(e) + }(this); + throw new RangeError("Invalid mode is specified") + }, r.pipeThrough = function(e, r) { + var t = e.writable, + o = e.readable; + if (void 0 === t || void 0 === o) throw new TypeError("readable and writable arguments must be defined"); + return function(e) { + try { + Promise.prototype.then.call(e, void 0, function() {}) + } + catch (e) {} + }(this.pipeTo(t, r)), o + }, r.pipeTo = function(e, r) { + var t = this, + o = void 0 === r ? {} : r, + n = o.preventClose, + i = o.preventAbort, + a = o.preventCancel; + if (!1 === er(this)) return Promise.reject(Jr("pipeTo")); + if (!1 === Me(e)) return Promise.reject(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream")); + if (n = Boolean(n), i = Boolean(i), a = Boolean(a), !0 === rr(this)) return Promise.reject(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream")); + if (!0 === Le(e)) return Promise.reject(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream")); + var s = Xe(this), + l = De(e), + u = !1, + c = Promise.resolve(); + return new Promise(function(r, o) { + if (_(t, s._closedPromise, function(r) { + !1 === i ? m(function() { + return Ve(e, r) + }, !0, r) : h(!0, r) + }), _(e, l._closedPromise, function(e) { + !1 === a ? m(function() { + return nr(t, e) + }, !0, e) : h(!0, e) + }), function(e, r, t) { + "closed" === e._state ? t() : r.then(t).catch(Be) + }(t, s._closedPromise, function() { + !1 === n ? m(function() { + return He(l) + }) : h() + }), !0 === Ye(e) || "closed" === e._state) { + var d = new TypeError("the destination writable stream closed before all data could be piped to it"); + !1 === a ? m(function() { + return nr(t, d) + }, !0, d) : h(!0, d) + } + + function f() { + var e = c; + return c.then(function() { + return e !== c ? f() : void 0 + }) + } + + function _(e, r, t) { + "errored" === e._state ? t(e._storedError) : r.catch(t).catch(Be) + } + + function m(r, t, o) { + function n() { + r().then(function() { + return b(t, o) + }, function(e) { + return b(!0, e) + }).catch(Be) + }!0 !== u && (u = !0, "writable" === e._state && !1 === Ye(e) ? f().then(n) : n()) + } + + function h(r, t) { + !0 !== u && (u = !0, "writable" === e._state && !1 === Ye(e) ? f().then(function() { + return b(r, t) + }).catch(Be) : b(r, t)) + } + + function b(e, t) { + xe(l), yr(s), e ? o(t) : r(void 0) + }(function e() { + return !0 === u ? Promise.resolve() : l._readyPromise.then(function() { + return pr(s).then(function(e) { + var r = e.value; + !0 !== e.done && (c = Qe(l, r).catch(function() {})) + }) + }).then(e) + })().catch(function(e) { + c = Promise.resolve(), Be(e) + }) + }) + }, r.tee = function() { + if (!1 === er(this)) throw Jr("tee"); + var e = function(e, r) { + var t, o, n, i, a, s = Xe(e), + l = !1, + u = !1, + c = !1, + d = new Promise(function(e) { + a = e + }); + + function f() { + return pr(s).then(function(e) { + var r = e.value, + t = e.done; + if (!0 === t && !1 === l && (!1 === u && Rr(n._readableStreamController), !1 === c && Rr(i._readableStreamController), l = !0), !0 !== l) { + var o = r, + a = r; + !1 === u && qr(n._readableStreamController, o), !1 === c && qr(i._readableStreamController, a) + } + }) + } + + function _() {} + return n = Ze(_, f, function(r) { + if (u = !0, t = r, !0 === c) { + var n = Oe([t, o]), + i = nr(e, n); + a(i) + } + return d + }), i = Ze(_, f, function(r) { + if (c = !0, o = r, !0 === u) { + var n = Oe([t, o]), + i = nr(e, n); + a(i) + } + return d + }), s._closedPromise.catch(function(e) { + !0 !== l && (Tr(n._readableStreamController, e), Tr(i._readableStreamController, e), l = !0) + }), [n, i] + }(this); + return Oe(e) + }, t(e, [{ + key: "locked", + get: function() { + if (!1 === er(this)) throw Jr("locked"); + return rr(this) + } + }]), e + }(), + Ke = { + CreateReadableByteStream: function(e, r, t, o, n) { + void 0 === o && (o = 0); + void 0 === n && (n = void 0); + var i = Object.create(Je.prototype); + $e(i); + var a = Object.create(Ar.prototype); + return Gr(i, a, e, r, t, o, n), i + }, + CreateReadableStream: Ze, + ReadableStream: Je, + IsReadableStreamDisturbed: function(e) { + return e._disturbed + }, + ReadableStreamDefaultControllerClose: Rr, + ReadableStreamDefaultControllerEnqueue: qr, + ReadableStreamDefaultControllerError: Tr, + ReadableStreamDefaultControllerGetDesiredSize: jr, + ReadableStreamDefaultControllerHasBackpressure: function(e) { + if (!0 === Pr(e)) return !1; + return !0 + }, + ReadableStreamDefaultControllerCanCloseOrEnqueue: Cr + }; + + function Xe(e) { + return new fr(e) + } + + function Ze(e, r, t, o, n) { + void 0 === o && (o = 1), void 0 === n && (n = function() { + return 1 + }); + var i = Object.create(Je.prototype); + return $e(i), Er(i, Object.create(wr.prototype), e, r, t, o, n), i + } + + function $e(e) { + e._state = "readable", e._reader = void 0, e._storedError = void 0, e._disturbed = !1 + } + + function er(e) { + return !!ze(e) && !!Object.prototype.hasOwnProperty.call(e, "_readableStreamController") + } + + function rr(e) { + return void 0 !== e._reader + } + + function tr(e) { + return new Promise(function(r, t) { + var o = { + _resolve: r, + _reject: t + }; + e._reader._readIntoRequests.push(o) + }) + } + + function or(e) { + return new Promise(function(r, t) { + var o = { + _resolve: r, + _reject: t + }; + e._reader._readRequests.push(o) + }) + } + + function nr(e, r) { + return e._disturbed = !0, "closed" === e._state ? Promise.resolve(void 0) : "errored" === e._state ? Promise.reject(e._storedError) : (ir(e), e._readableStreamController[Ue](r).then(function() {})) + } + + function ir(e) { + e._state = "closed"; + var r = e._reader; + if (void 0 !== r) { + if (!0 === hr(r)) { + for (var t = 0, o = r._readRequests; t < o.length; t++) { + (0, o[t]._resolve)(Te(void 0, !0)) + } + r._readRequests = [] + }! function(e) { + e._closedPromise_resolve(void 0), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0 + }(r) + } + } + + function ar(e, r) { + e._state = "errored", e._storedError = r; + var t = e._reader; + if (void 0 !== t) { + if (!0 === hr(t)) { + for (var o = 0, n = t._readRequests; o < n.length; o++) { + n[o]._reject(r) + } + t._readRequests = [] + } + else { + for (var i = 0, a = t._readIntoRequests; i < a.length; i++) { + a[i]._reject(r) + } + t._readIntoRequests = [] + } + Zr(t, r), t._closedPromise.catch(function() {}) + } + } + + function sr(e, r, t) { + e._reader._readRequests.shift()._resolve(Te(r, t)) + } + + function lr(e) { + return e._reader._readIntoRequests.length + } + + function ur(e) { + return e._reader._readRequests.length + } + + function cr(e) { + var r = e._reader; + return void 0 !== r && !1 !== mr(r) + } + + function dr(e) { + var r = e._reader; + return void 0 !== r && !1 !== hr(r) + } + var fr = function() { + function e(e) { + if (!1 === er(e)) throw new TypeError("ReadableStreamDefaultReader can only be constructed with a ReadableStream instance"); + if (!0 === rr(e)) throw new TypeError("This stream has already been locked for exclusive reading by another reader"); + br(this, e), this._readRequests = [] + } + var r = e.prototype; + return r.cancel = function(e) { + return !1 === hr(this) ? Promise.reject(Xr("cancel")) : void 0 === this._ownerReadableStream ? Promise.reject(Kr("cancel")) : vr(this, e) + }, r.read = function() { + return !1 === hr(this) ? Promise.reject(Xr("read")) : void 0 === this._ownerReadableStream ? Promise.reject(Kr("read from")) : pr(this) + }, r.releaseLock = function() { + if (!1 === hr(this)) throw Xr("releaseLock"); + if (void 0 !== this._ownerReadableStream) { + if (this._readRequests.length > 0) throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled"); + yr(this) + } + }, t(e, [{ + key: "closed", + get: function() { + return !1 === hr(this) ? Promise.reject(Xr("closed")) : this._closedPromise + } + }]), e + }(), + _r = function() { + function e(e) { + if (!er(e)) throw new TypeError("ReadableStreamBYOBReader can only be constructed with a ReadableStream instance given a byte source"); + if (!1 === kr(e._readableStreamController)) throw new TypeError("Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte source"); + if (rr(e)) throw new TypeError("This stream has already been locked for exclusive reading by another reader"); + br(this, e), this._readIntoRequests = [] + } + var r = e.prototype; + return r.cancel = function(e) { + return mr(this) ? void 0 === this._ownerReadableStream ? Promise.reject(Kr("cancel")) : vr(this, e) : Promise.reject($r("cancel")) + }, r.read = function(e) { + return mr(this) ? void 0 === this._ownerReadableStream ? Promise.reject(Kr("read from")) : ArrayBuffer.isView(e) ? !0 === Ee(e.buffer) ? Promise.reject(new TypeError("Cannot read into a view onto a detached ArrayBuffer")) : 0 === e.byteLength ? Promise.reject(new TypeError("view must have non-zero byteLength")) : function(e, r) { + var t = e._ownerReadableStream; + if (t._disturbed = !0, "errored" === t._state) return Promise.reject(t._storedError); + return function(e, r) { + var t = e._controlledReadableByteStream, + o = 1; + r.constructor !== DataView && (o = r.constructor.BYTES_PER_ELEMENT); + var n = r.constructor, + i = { + buffer: We(r.buffer), + byteOffset: r.byteOffset, + byteLength: r.byteLength, + bytesFilled: 0, + elementSize: o, + ctor: n, + readerType: "byob" + }; + if (e._pendingPullIntos.length > 0) return e._pendingPullIntos.push(i), tr(t); + if ("closed" === t._state) { + var a = new r.constructor(i.buffer, i.byteOffset, 0); + return Promise.resolve(Te(a, !0)) + } + if (e._queueTotalSize > 0) { + if (!0 === Dr(e, i)) { + var s = Fr(i); + return Lr(e), Promise.resolve(Te(s, !1)) + } + if (!0 === e._closeRequested) { + var l = new TypeError("Insufficient bytes to fill elements in the given buffer"); + return Yr(e, l), Promise.reject(l) + } + } + e._pendingPullIntos.push(i); + var u = tr(t); + return zr(e), u + }(t._readableStreamController, r) + }(this, e) : Promise.reject(new TypeError("view must be an array buffer view")) : Promise.reject($r("read")) + }, r.releaseLock = function() { + if (!mr(this)) throw $r("releaseLock"); + if (void 0 !== this._ownerReadableStream) { + if (this._readIntoRequests.length > 0) throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled"); + yr(this) + } + }, t(e, [{ + key: "closed", + get: function() { + return mr(this) ? this._closedPromise : Promise.reject($r("closed")) + } + }]), e + }(); + + function mr(e) { + return !!ze(e) && !!Object.prototype.hasOwnProperty.call(e, "_readIntoRequests") + } + + function hr(e) { + return !!ze(e) && !!Object.prototype.hasOwnProperty.call(e, "_readRequests") + } + + function br(e, r) { + e._ownerReadableStream = r, r._reader = e, "readable" === r._state ? function(e) { + e._closedPromise = new Promise(function(r, t) { + e._closedPromise_resolve = r, e._closedPromise_reject = t + }) + }(e) : "closed" === r._state ? function(e) { + e._closedPromise = Promise.resolve(void 0), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0 + }(e) : (! function(e, r) { + e._closedPromise = Promise.reject(r), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0 + }(e, r._storedError), e._closedPromise.catch(function() {})) + } + + function vr(e, r) { + return nr(e._ownerReadableStream, r) + } + + function yr(e) { + "readable" === e._ownerReadableStream._state ? Zr(e, new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")) : function(e, r) { + e._closedPromise = Promise.reject(r) + }(e, new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")), e._closedPromise.catch(function() {}), e._ownerReadableStream._reader = void 0, e._ownerReadableStream = void 0 + } + + function pr(e) { + var r = e._ownerReadableStream; + return r._disturbed = !0, "closed" === r._state ? Promise.resolve(Te(void 0, !0)) : "errored" === r._state ? Promise.reject(r._storedError) : r._readableStreamController[Ge]() + } + var wr = function() { + function e() { + throw new TypeError + } + var r = e.prototype; + return r.close = function() { + if (!1 === gr(this)) throw et("close"); + if (!1 === Cr(this)) throw new TypeError("The stream is not in a state that permits close"); + Rr(this) + }, r.enqueue = function(e) { + if (!1 === gr(this)) throw et("enqueue"); + if (!1 === Cr(this)) throw new TypeError("The stream is not in a state that permits enqueue"); + return qr(this, e) + }, r.error = function(e) { + if (!1 === gr(this)) throw et("error"); + Tr(this, e) + }, r[Ue] = function(e) { + return Ne(this), this._cancelAlgorithm(e) + }, r[Ge] = function() { + var e = this._controlledReadableStream; + if (this._queue.length > 0) { + var r = Ie(this); + return !0 === this._closeRequested && 0 === this._queue.length ? ir(e) : Sr(this), Promise.resolve(Te(r, !1)) + } + var t = or(e); + return Sr(this), t + }, t(e, [{ + key: "desiredSize", + get: function() { + if (!1 === gr(this)) throw et("desiredSize"); + return jr(this) + } + }]), e + }(); + + function gr(e) { + return !!ze(e) && !!Object.prototype.hasOwnProperty.call(e, "_controlledReadableStream") + } + + function Sr(e) { + !1 !== Pr(e) && (!0 !== e._pulling ? (e._pulling = !0, e._pullAlgorithm().then(function() { + if (e._pulling = !1, !0 === e._pullAgain) return e._pullAgain = !1, Sr(e) + }, function(r) { + Tr(e, r) + }).catch(Be)) : e._pullAgain = !0) + } + + function Pr(e) { + var r = e._controlledReadableStream; + return !1 !== Cr(e) && (!1 !== e._started && (!0 === rr(r) && ur(r) > 0 || jr(e) > 0)) + } + + function Rr(e) { + var r = e._controlledReadableStream; + e._closeRequested = !0, 0 === e._queue.length && ir(r) + } + + function qr(e, r) { + var t = e._controlledReadableStream; + if (!0 === rr(t) && ur(t) > 0) sr(t, r, !1); + else { + var o; + try { + o = e._strategySizeAlgorithm(r) + } + catch (r) { + throw Tr(e, r), r + } + try { + Fe(e, r, o) + } + catch (r) { + throw Tr(e, r), r + } + } + Sr(e) + } + + function Tr(e, r) { + var t = e._controlledReadableStream; + "readable" === t._state && (Ne(e), ar(t, r)) + } + + function jr(e) { + var r = e._controlledReadableStream._state; + return "errored" === r ? null : "closed" === r ? 0 : e._strategyHWM - e._queueTotalSize + } + + function Cr(e) { + var r = e._controlledReadableStream._state; + return !1 === e._closeRequested && "readable" === r + } + + function Er(e, r, t, o, n, i, a) { + r._controlledReadableStream = e, r._queue = void 0, r._queueTotalSize = void 0, Ne(r), r._started = !1, r._closeRequested = !1, r._pullAgain = !1, r._pulling = !1, r._strategySizeAlgorithm = a, r._strategyHWM = i, r._pullAlgorithm = o, r._cancelAlgorithm = n, e._readableStreamController = r; + var s = t(); + Promise.resolve(s).then(function() { + r._started = !0, Sr(r) + }, function(e) { + Tr(r, e) + }).catch(Be) + } + var Wr = function() { + function e() { + throw new TypeError("ReadableStreamBYOBRequest cannot be used directly") + } + var r = e.prototype; + return r.respond = function(e) { + if (!1 === Or(this)) throw rt("respond"); + if (void 0 === this._associatedReadableByteStreamController) throw new TypeError("This BYOB request has been invalidated"); + if (!0 === Ee(this._view.buffer)) throw new TypeError("The BYOB request's buffer has been detached and so cannot be used as a response"); + ! function(e, r) { + if (r = Number(r), !1 === je(r)) throw new RangeError("bytesWritten must be a finite"); + xr(e, r) + }(this._associatedReadableByteStreamController, e) + }, r.respondWithNewView = function(e) { + if (!1 === Or(this)) throw rt("respond"); + if (void 0 === this._associatedReadableByteStreamController) throw new TypeError("This BYOB request has been invalidated"); + if (!ArrayBuffer.isView(e)) throw new TypeError("You can only respond with array buffer views"); + if (!0 === Ee(e.buffer)) throw new TypeError("The supplied view's buffer has been detached and so cannot be used as a response"); + ! function(e, r) { + var t = e._pendingPullIntos[0]; + if (t.byteOffset + t.bytesFilled !== r.byteOffset) throw new RangeError("The region specified by view does not match byobRequest"); + if (t.byteLength !== r.byteLength) throw new RangeError("The buffer of view has different capacity than byobRequest"); + t.buffer = r.buffer, xr(e, r.byteLength) + }(this._associatedReadableByteStreamController, e) + }, t(e, [{ + key: "view", + get: function() { + if (!1 === Or(this)) throw rt("view"); + return this._view + } + }]), e + }(), + Ar = function() { + function e() { + throw new TypeError("ReadableByteStreamController constructor cannot be used directly") + } + var r = e.prototype; + return r.close = function() { + if (!1 === kr(this)) throw tt("close"); + if (!0 === this._closeRequested) throw new TypeError("The stream has already been closed; do not close it again!"); + var e = this._controlledReadableByteStream._state; + if ("readable" !== e) throw new TypeError("The stream (in " + e + " state) is not in the readable state and cannot be closed"); + ! function(e) { + var r = e._controlledReadableByteStream; + if (e._queueTotalSize > 0) return void(e._closeRequested = !0); + if (e._pendingPullIntos.length > 0) { + var t = e._pendingPullIntos[0]; + if (t.bytesFilled > 0) { + var o = new TypeError("Insufficient bytes to fill elements in the given buffer"); + throw Yr(e, o), o + } + } + ir(r) + }(this) + }, r.enqueue = function(e) { + if (!1 === kr(this)) throw tt("enqueue"); + if (!0 === this._closeRequested) throw new TypeError("stream is closed or draining"); + var r = this._controlledReadableByteStream._state; + if ("readable" !== r) throw new TypeError("The stream (in " + r + " state) is not in the readable state and cannot be enqueued to"); + if (!ArrayBuffer.isView(e)) throw new TypeError("You can only enqueue array buffer views when using a ReadableByteStreamController"); + if (!0 === Ee(e.buffer)) throw new TypeError("Cannot enqueue a view onto a detached ArrayBuffer"); + ! function(e, r) { + var t = e._controlledReadableByteStream, + o = r.buffer, + n = r.byteOffset, + i = r.byteLength, + a = We(o); + if (!0 === dr(t)) + if (0 === ur(t)) Nr(e, a, n, i); + else { + var s = new Uint8Array(a, n, i); + sr(t, s, !1) + } + else !0 === cr(t) ? (Nr(e, a, n, i), Hr(e)) : Nr(e, a, n, i); + zr(e) + }(this, e) + }, r.error = function(e) { + if (!1 === kr(this)) throw tt("error"); + Yr(this, e) + }, r[Ue] = function(e) { + this._pendingPullIntos.length > 0 && (this._pendingPullIntos[0].bytesFilled = 0); + return Ne(this), this._cancelAlgorithm(e) + }, r[Ge] = function() { + var e = this._controlledReadableByteStream; + if (this._queueTotalSize > 0) { + var r, t = this._queue.shift(); + this._queueTotalSize -= t.byteLength, Lr(this); + try { + r = new Uint8Array(t.buffer, t.byteOffset, t.byteLength) + } + catch (e) { + return Promise.reject(e) + } + return Promise.resolve(Te(r, !1)) + } + var o = this._autoAllocateChunkSize; + if (void 0 !== o) { + var n; + try { + n = new ArrayBuffer(o) + } + catch (e) { + return Promise.reject(e) + } + var i = { + buffer: n, + byteOffset: 0, + byteLength: o, + bytesFilled: 0, + elementSize: 1, + ctor: Uint8Array, + readerType: "default" + }; + this._pendingPullIntos.push(i) + } + var a = or(e); + return zr(this), a + }, t(e, [{ + key: "byobRequest", + get: function() { + if (!1 === kr(this)) throw tt("byobRequest"); + if (void 0 === this._byobRequest && this._pendingPullIntos.length > 0) { + var e = this._pendingPullIntos[0], + r = new Uint8Array(e.buffer, e.byteOffset + e.bytesFilled, e.byteLength - e.bytesFilled), + t = Object.create(Wr.prototype); + ! function(e, r, t) { + e._associatedReadableByteStreamController = r, e._view = t + }(t, this, r), this._byobRequest = t + } + return this._byobRequest + } + }, { + key: "desiredSize", + get: function() { + if (!1 === kr(this)) throw tt("desiredSize"); + return Ur(this) + } + }]), e + }(); + + function kr(e) { + return !!ze(e) && !!Object.prototype.hasOwnProperty.call(e, "_controlledReadableByteStream") + } + + function Or(e) { + return !!ze(e) && !!Object.prototype.hasOwnProperty.call(e, "_associatedReadableByteStreamController") + } + + function zr(e) { + !1 !== function(e) { + var r = e._controlledReadableByteStream; + if ("readable" !== r._state) return !1; + if (!0 === e._closeRequested) return !1; + if (!1 === e._started) return !1; + if (!0 === dr(r) && ur(r) > 0) return !0; + if (!0 === cr(r) && lr(r) > 0) return !0; + if (Ur(e) > 0) return !0; + return !1 + }(e) && (!0 !== e._pulling ? (e._pulling = !0, e._pullAlgorithm().then(function() { + e._pulling = !1, !0 === e._pullAgain && (e._pullAgain = !1, zr(e)) + }, function(r) { + Yr(e, r) + }).catch(Be)) : e._pullAgain = !0) + } + + function Br(e) { + Vr(e), e._pendingPullIntos = [] + } + + function Ir(e, r) { + var t = !1; + "closed" === e._state && (t = !0); + var o = Fr(r); + "default" === r.readerType ? sr(e, o, t) : function(e, r, t) { + e._reader._readIntoRequests.shift()._resolve(Te(r, t)) + }(e, o, t) + } + + function Fr(e) { + var r = e.bytesFilled, + t = e.elementSize; + return new e.ctor(e.buffer, e.byteOffset, r / t) + } + + function Nr(e, r, t, o) { + e._queue.push({ + buffer: r, + byteOffset: t, + byteLength: o + }), e._queueTotalSize += o + } + + function Dr(e, r) { + var t = r.elementSize, + o = r.bytesFilled - r.bytesFilled % t, + n = Math.min(e._queueTotalSize, r.byteLength - r.bytesFilled), + i = r.bytesFilled + n, + a = i - i % t, + s = n, + l = !1; + a > o && (s = a - r.bytesFilled, l = !0); + for (var u = e._queue; s > 0;) { + var c = u[0], + d = Math.min(s, c.byteLength), + f = r.byteOffset + r.bytesFilled; + Re(r.buffer, f, c.buffer, c.byteOffset, d), c.byteLength === d ? u.shift() : (c.byteOffset += d, c.byteLength -= d), e._queueTotalSize -= d, Mr(e, d, r), s -= d + } + return l + } + + function Mr(e, r, t) { + Vr(e), t.bytesFilled += r + } + + function Lr(e) { + 0 === e._queueTotalSize && !0 === e._closeRequested ? ir(e._controlledReadableByteStream) : zr(e) + } + + function Vr(e) { + void 0 !== e._byobRequest && (e._byobRequest._associatedReadableByteStreamController = void 0, e._byobRequest._view = void 0, e._byobRequest = void 0) + } + + function Hr(e) { + for (; e._pendingPullIntos.length > 0;) { + if (0 === e._queueTotalSize) return; + var r = e._pendingPullIntos[0]; + !0 === Dr(e, r) && (Qr(e), Ir(e._controlledReadableByteStream, r)) + } + } + + function xr(e, r) { + var t = e._pendingPullIntos[0]; + if ("closed" === e._controlledReadableByteStream._state) { + if (0 !== r) throw new TypeError("bytesWritten must be 0 when calling respond() on a closed stream"); + ! function(e, r) { + r.buffer = We(r.buffer); + var t = e._controlledReadableByteStream; + if (!0 === cr(t)) + for (; lr(t) > 0;) Ir(t, Qr(e)) + }(e, t) + } + else ! function(e, r, t) { + if (t.bytesFilled + r > t.byteLength) throw new RangeError("bytesWritten out of range"); + if (Mr(e, r, t), !(t.bytesFilled < t.elementSize)) { + Qr(e); + var o = t.bytesFilled % t.elementSize; + if (o > 0) { + var n = t.byteOffset + t.bytesFilled, + i = t.buffer.slice(n - o, n); + Nr(e, i, 0, i.byteLength) + } + t.buffer = We(t.buffer), t.bytesFilled -= o, Ir(e._controlledReadableByteStream, t), Hr(e) + } + }(e, r, t); + zr(e) + } + + function Qr(e) { + var r = e._pendingPullIntos.shift(); + return Vr(e), r + } + + function Yr(e, r) { + var t = e._controlledReadableByteStream; + "readable" === t._state && (Br(e), Ne(e), ar(t, r)) + } + + function Ur(e) { + var r = e._controlledReadableByteStream._state; + return "errored" === r ? null : "closed" === r ? 0 : e._strategyHWM - e._queueTotalSize + } + + function Gr(e, r, t, o, n, i, a) { + r._controlledReadableByteStream = e, r._pullAgain = !1, r._pulling = !1, Br(r), r._queue = r._queueTotalSize = void 0, Ne(r), r._closeRequested = !1, r._started = !1, r._strategyHWM = Ae(i), r._pullAlgorithm = o, r._cancelAlgorithm = n, r._autoAllocateChunkSize = a, r._pendingPullIntos = [], e._readableStreamController = r; + var s = t(); + Promise.resolve(s).then(function() { + r._started = !0, zr(r) + }, function(e) { + Yr(r, e) + }).catch(Be) + } + + function Jr(e) { + return new TypeError("ReadableStream.prototype." + e + " can only be used on a ReadableStream") + } + + function Kr(e) { + return new TypeError("Cannot " + e + " a stream using a released reader") + } + + function Xr(e) { + return new TypeError("ReadableStreamDefaultReader.prototype." + e + " can only be used on a ReadableStreamDefaultReader") + } + + function Zr(e, r) { + e._closedPromise_reject(r), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0 + } + + function $r(e) { + return new TypeError("ReadableStreamBYOBReader.prototype." + e + " can only be used on a ReadableStreamBYOBReader") + } + + function et(e) { + return new TypeError("ReadableStreamDefaultController.prototype." + e + " can only be used on a ReadableStreamDefaultController") + } + + function rt(e) { + return new TypeError("ReadableStreamBYOBRequest.prototype." + e + " can only be used on a ReadableStreamBYOBRequest") + } + + function tt(e) { + return new TypeError("ReadableByteStreamController.prototype." + e + " can only be used on a ReadableByteStreamController") + } + var ot = Ke.ReadableStream, + nt = v.createDataProperty, + it = function() { + function e(e) { + var r = e.highWaterMark; + nt(this, "highWaterMark", r) + } + return e.prototype.size = function(e) { + return e.byteLength + }, e + }(), + at = v.createDataProperty, + st = function() { + function e(e) { + var r = e.highWaterMark; + at(this, "highWaterMark", r) + } + return e.prototype.size = function() { + return 1 + }, e + }(), + lt = (T("streams:transform-stream:verbose"), v.InvokeOrNoop), + ut = v.CreateAlgorithmFromUnderlyingMethod, + ct = v.PromiseCall, + dt = v.typeIsObject, + ft = v.ValidateAndNormalizeHighWaterMark, + _t = (v.IsNonNegativeNumber, v.MakeSizeAlgorithmFromSizeFunction), + mt = Ke.CreateReadableStream, + ht = Ke.ReadableStreamDefaultControllerClose, + bt = Ke.ReadableStreamDefaultControllerEnqueue, + vt = Ke.ReadableStreamDefaultControllerError, + yt = Ke.ReadableStreamDefaultControllerGetDesiredSize, + pt = Ke.ReadableStreamDefaultControllerHasBackpressure, + wt = Ke.ReadableStreamDefaultControllerCanCloseOrEnqueue, + gt = V.CreateWritableStream, + St = V.WritableStreamDefaultControllerErrorIfNeeded, + Pt = function() { + function e(e, r, t) { + if (void 0 === e && (e = {}), void 0 === r && (r = {}), void 0 === t && (t = {}), void 0 !== e.readableType) throw new RangeError("Invalid readable type specified"); + if (void 0 !== e.writableType) throw new RangeError("Invalid writable type specified"); + var o = r.size, + n = _t(o), + i = r.highWaterMark; + void 0 === i && (i = 1), i = ft(i); + var a, s = t.size, + l = _t(s), + u = t.highWaterMark; + void 0 === u && (u = 0), u = ft(u), Rt(this, new Promise(function(e) { + a = e + }), i, n, u, l), + function(e, r) { + var t = Object.create(Et.prototype), + o = function(e) { + try { + return kt(t, e), Promise.resolve() + } + catch (e) { + return Promise.reject(e) + } + }, + n = r.transform; + if (void 0 !== n) { + if ("function" != typeof n) throw new TypeError("transform is not a method"); + o = function(o) { + var i = ct(n, r, [o, t]); + return i.catch(function(r) { + throw Tt(e, r), r + }) + } + } + var i = ut(r, "flush", 0, [t]); + At(e, t, o, i) + }(this, e); + var c = lt(e, "start", [this._transformStreamController]); + a(c) + } + return t(e, [{ + key: "readable", + get: function() { + if (!1 === qt(this)) throw zt("readable"); + return this._readable + } + }, { + key: "writable", + get: function() { + if (!1 === qt(this)) throw zt("writable"); + return this._writable + } + }]), e + }(); + + function Rt(e, r, t, o, n, i) { + function a() { + return r + } + e._writable = gt(a, function(r) { + return function(e, r) { + var t = e._transformStreamController; + if (!0 === e._backpressure) { + var o = e._backpressureChangePromise; + return o.then(function() { + var o = e._writable, + n = o._state; + if ("erroring" === n) throw o._storedError; + return t._transformAlgorithm(r) + }) + } + return t._transformAlgorithm(r) + }(e, r) + }, function() { + return function(e) { + var r = e._readable; + return e._transformStreamController._flushAlgorithm().then(function() { + if ("errored" === r._state) throw r._storedError; + var e = r._readableStreamController; + !0 === wt(e) && ht(e) + }).catch(function(t) { + throw Tt(e, t), r._storedError + }) + }(e) + }, function(r) { + return function(e, r) { + return Tt(e, r), Promise.resolve() + }(e, r) + }, t, o), e._readable = mt(a, function() { + return function(e) { + return Ct(e, !1), e._backpressureChangePromise + }(e) + }, function(r) { + return jt(e, r), Promise.resolve() + }, n, i), e._backpressure = void 0, e._backpressureChangePromise = void 0, e._backpressureChangePromise_resolve = void 0, Ct(e, !0), e._transformStreamController = void 0 + } + + function qt(e) { + return !!dt(e) && !!Object.prototype.hasOwnProperty.call(e, "_transformStreamController") + } + + function Tt(e, r) { + vt(e._readable._readableStreamController, r), jt(e, r) + } + + function jt(e, r) { + St(e._writable._writableStreamController, r), !0 === e._backpressure && Ct(e, !1) + } + + function Ct(e, r) { + void 0 !== e._backpressureChangePromise && e._backpressureChangePromise_resolve(), e._backpressureChangePromise = new Promise(function(r) { + e._backpressureChangePromise_resolve = r + }), e._backpressure = r + } + var Et = function() { + function e() { + throw new TypeError("TransformStreamDefaultController instances cannot be created directly") + } + var r = e.prototype; + return r.enqueue = function(e) { + if (!1 === Wt(this)) throw Ot("enqueue"); + kt(this, e) + }, r.error = function(e) { + if (!1 === Wt(this)) throw Ot("error"); + ! function(e, r) { + Tt(e._controlledTransformStream, r) + }(this, e) + }, r.terminate = function() { + if (!1 === Wt(this)) throw Ot("terminate"); + ! function(e) { + var r = e._controlledTransformStream, + t = r._readable._readableStreamController; + !0 === wt(t) && ht(t); + var o = new TypeError("TransformStream terminated"); + jt(r, o) + }(this) + }, t(e, [{ + key: "desiredSize", + get: function() { + if (!1 === Wt(this)) throw Ot("desiredSize"); + var e = this._controlledTransformStream._readable._readableStreamController; + return yt(e) + } + }]), e + }(); + + function Wt(e) { + return !!dt(e) && !!Object.prototype.hasOwnProperty.call(e, "_controlledTransformStream") + } + + function At(e, r, t, o) { + r._controlledTransformStream = e, e._transformStreamController = r, r._transformAlgorithm = t, r._flushAlgorithm = o + } + + function kt(e, r) { + var t = e._controlledTransformStream, + o = t._readable._readableStreamController; + if (!1 === wt(o)) throw new TypeError("Readable side is not in a state that permits enqueue"); + try { + bt(o, r) + } + catch (e) { + throw jt(t, e), t._readable._storedError + } + pt(o) !== t._backpressure && Ct(t, !0) + } + + function Ot(e) { + return new TypeError("TransformStreamDefaultController.prototype." + e + " can only be used on a TransformStreamDefaultController") + } + + function zt(e) { + return new TypeError("TransformStream.prototype." + e + " can only be used on a TransformStream") + } + var Bt = { + CreateTransformStream: function(e, r, t, o, n, i, a) { + void 0 === o && (o = 1), void 0 === n && (n = function() { + return 1 + }), void 0 === i && (i = 0), void 0 === a && (a = function() { + return 1 + }); + var s, l = Object.create(Pt.prototype); + Rt(l, new Promise(function(e) { + s = e + }), o, n, i, a), At(l, Object.create(Et.prototype), r, t); + var u = e(); + return s(u), l + }, + TransformStream: Pt + }.TransformStream; + void 0 !== s && o(s, { + ReadableStream: ot, + WritableStream: Pe, + ByteLengthQueuingStrategy: it, + CountQueuingStrategy: st, + TransformStream: Bt + }), e.ReadableStream = ot, e.WritableStream = Pe, e.ByteLengthQueuingStrategy = it, e.CountQueuingStrategy = st, e.TransformStream = Bt, Object.defineProperty(e, "__esModule", { + value: !0 + }) + }); +}).call(this, typeof global !== "undefined" ? global : typeof w !== "undefined" ? w : {}) + +var TransformStream = window.TransformStream; +var ReadableStream = window.ReadableStream; +var WritableStream = window.WritableStream; diff -Nru enigmail-2.0.12+ds1/ui/content/Makefile enigmail-2.1.3+ds1/ui/content/Makefile --- enigmail-2.0.12+ds1/ui/content/Makefile 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/ui/content/Makefile 2019-10-29 17:09:36.000000000 +0000 @@ -6,6 +6,10 @@ include $(DEPTH)/config/autoconf.mk +GENDIR = $(DIST)/chrome/content/ui + +AM_FILES = am-enigprefs.xul + UIFILES = \ autocryptInitiateBackup.xul \ autocryptInitiateBackup.js \ @@ -13,15 +17,15 @@ autocryptSetupPasswd.js \ columnOverlay.xul \ columnOverlay.js \ + commonWorkflows.js \ enigmailCommon.js \ enigmailAbCardViewOverlay.xul \ enigmailAbContactsPanel.xul \ enigmailAbOverlay.js \ aboutEnigmail.html \ + aboutEnigmail.js \ enigmailAddUidDlg.js \ enigmailAddUidDlg.xul \ - enigmailAdvancedIdentityDlg.js \ - enigmailAdvancedIdentityDlg.xul \ enigmailMsgBox.js \ enigmailMsgBox.xul \ enigmailAttachmentsDialog.xul \ @@ -33,7 +37,6 @@ enigmailConsole.xul \ enigmailConsole.js \ enigmailConsole.htm \ - enigmailCustToolOverlay.js \ enigmailCustToolOverlay.xul \ enigmailDispPhoto.js \ enigmailDispPhoto.xul \ @@ -91,11 +94,11 @@ enigmailKeySelection.xul \ enigmailKeySelection.js \ enigmailMsgComposeOverlay.xul \ - enigmailMsgComposeOverlay-sm.xul \ + enigmailMsgComposeOverlay-pbx.xul \ enigmailMsgComposeOverlay.js \ enigmailMsgComposeHelper.js \ messengerOverlay-tbird.xul \ - messengerOverlay-sm.xul \ + messengerOverlay-pbx.xul \ enigmailMessengerOverlay.xul \ enigmailMessengerOverlay.js \ enigmailMsgHdrViewOverlay.xul \ @@ -104,12 +107,8 @@ enigmailFilterEditorOverlay.js \ enigmailFilterListOverlay.xul \ enigmailFilterListOverlay.js \ - enigmailMsgPrintOverlay.xul \ - enigmailMsgPrintOverlay.js \ enigmailPrivacyOverlay.js \ enigmailPrivacyOverlay.xul \ - enigmailSetupWizard.js \ - enigmailSetupWizard.xul \ enigmailWrapSelection.xul \ enigmailWrapSelection.js \ enigmailViewFile.js \ @@ -118,15 +117,43 @@ enigRetrieveProgress.js \ exportSettingsWizard.js \ exportSettingsWizard.xul \ + importSettings.js \ + importSettings.xul \ upgradeInfo.html \ pepHandshake.xul \ pepHandshake.js \ pepPrepHandshake.xul \ pepPrepHandshake.js \ pepTrustWords.xul \ - pepTrustWords.js + pepTrustWords.js \ + updateGnuPG.html \ + updateGnuPG.js \ + setupWizard2.js \ + setupWizard2.xul \ + tb60FilterEditorOverlay.js \ + tb60FilterEditorOverlay.xul + +GENFILES = $(addprefix $(GENDIR)/,$(UIFILES)) + +$(GENDIR)/%.js: %.js + $(DEPTH)/util/prepPostbox -c $(TARGET_TOOL) $< $@ + +$(GENDIR)/%.xul: %.xul + $(PYTHON) $(DEPTH)/util/Preprocessor.py -I $(INCLUDE) -o $@ $< + +$(GENDIR)/%.htm: %.htm + $(DEPTH)/util/install -m 644 $(DIST)/chrome/content/ui $< + +$(GENDIR)/%.html: %.html + $(DEPTH)/util/install -m 644 $(DIST)/chrome/content/ui $< + +all: build deploy + +build: $(GENFILES) -all: deploy +deploy: $(AM_FILES) + $(DEPTH)/util/install -m 644 $(DIST)/chrome/content $(AM_FILES) -deploy: $(UIFILES) - $(DEPTH)/util/install -m 644 $(DIST)/chrome/content $(UIFILES) +clean: + $(DEPTH)/util/install -u $(DIST)/chrome/content/ui $(UIFILES) + $(DEPTH)/util/install -u $(DIST)/chrome/content $(AM_FILES) diff -Nru enigmail-2.0.12+ds1/ui/content/aboutEnigmail.html enigmail-2.1.3+ds1/ui/content/aboutEnigmail.html --- enigmail-2.0.12+ds1/ui/content/aboutEnigmail.html 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/ui/content/aboutEnigmail.html 2019-10-29 17:09:36.000000000 +0000 @@ -8,27 +8,7 @@ - + @@ -57,6 +37,12 @@
       

+

@@ -64,7 +50,7 @@
  • Robert J. Hansen
  • Daniele Raffo
  • Olav Seyfarth
  • -
  • the team and the list/forum members
  • +
  • @@ -72,7 +58,10 @@
  • R. Saravanan:
  • Jochen Eisinger (Modern), Jan Gerber (Classic), Frank Gerhardt
  • Barry Porter, Shane M. Coughlan, Nicolai Josuttis, John Clizbe, Ludwig Hügelschäfer
  • -
  • Sourceforge.net
  • +
  • + Gitlab & + Sourceforge.net +
  • diff -Nru enigmail-2.0.12+ds1/ui/content/aboutEnigmail.js enigmail-2.1.3+ds1/ui/content/aboutEnigmail.js --- enigmail-2.0.12+ds1/ui/content/aboutEnigmail.js 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/ui/content/aboutEnigmail.js 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,33 @@ +/* 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"; + +var Cu = Components.utils; +var Cc = Components.classes; +var Ci = Components.interfaces; + +const EnigmailLocalizeHtml = ChromeUtils.import("chrome://enigmail/content/modules/localizeHtml.jsm").EnigmailLocalizeHtml; +const EnigmailWindows = ChromeUtils.import("chrome://enigmail/content/modules/windows.jsm").EnigmailWindows; +const EnigmailGnuPGUpdate = ChromeUtils.import("chrome://enigmail/content/modules/gnupgUpdate.jsm").EnigmailGnuPGUpdate; +const EnigmailCore = ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore; +const EnigmailTimer = ChromeUtils.import("chrome://enigmail/content/modules/timer.jsm").EnigmailTimer; + +function onload() { + EnigmailTimer.setTimeout(() => { + EnigmailLocalizeHtml.onPageLoad(document); + + let enigmailSvc = EnigmailCore.getService(); + + if (enigmailSvc) { + if (EnigmailGnuPGUpdate.isGnuPGUpdatable()) { + document.getElementById("checkGnupgUpdate").classList.remove("hidden"); + } + } + }, 50); +} + +function checkGnupgUpdate() { + EnigmailWindows.openGnuPGUpdate(); +} diff -Nru enigmail-2.0.12+ds1/ui/content/accountManagerOverlay.js enigmail-2.1.3+ds1/ui/content/accountManagerOverlay.js --- enigmail-2.0.12+ds1/ui/content/accountManagerOverlay.js 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/ui/content/accountManagerOverlay.js 2019-10-29 17:09:36.000000000 +0000 @@ -4,11 +4,13 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -/* global Components: false */ - "use strict"; -Components.utils.import("resource://enigmail/pEpAdapter.jsm"); /*global EnigmailPEPAdapter: false */ +var Cu = Components.utils; +var Cc = Components.classes; +var Ci = Components.interfaces; + +var EnigmailPEPAdapter = ChromeUtils.import("chrome://enigmail/content/modules/pEpAdapter.jsm").EnigmailPEPAdapter; var Enigmail = { diff -Nru enigmail-2.0.12+ds1/ui/content/accountManagerOverlay.xul enigmail-2.1.3+ds1/ui/content/accountManagerOverlay.xul --- enigmail-2.0.12+ds1/ui/content/accountManagerOverlay.xul 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/ui/content/accountManagerOverlay.xul 2019-10-29 17:09:36.000000000 +0000 @@ -11,6 +11,6 @@ xmlns:html="http://www.w3.org/1999/xhtml" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> - + + + + + + +
    +
    +
    + + The Enigmail Project + +
    +
    +
    +
    + +
    + +

    + +

    + + + + + + + + + + + + + + diff -Nru enigmail-2.0.12+ds1/ui/content/updateGnuPG.js enigmail-2.1.3+ds1/ui/content/updateGnuPG.js --- enigmail-2.0.12+ds1/ui/content/updateGnuPG.js 1970-01-01 00:00:00.000000000 +0000 +++ enigmail-2.1.3+ds1/ui/content/updateGnuPG.js 2019-10-29 17:09:36.000000000 +0000 @@ -0,0 +1,177 @@ +/* + * 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"; + +var Cu = Components.utils; +var Cc = Components.classes; +var Ci = Components.interfaces; + +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; +const EnigmailLog = ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog; +const EnigmailLazy = ChromeUtils.import("chrome://enigmail/content/modules/lazy.jsm").EnigmailLazy; +const EnigmailApp = ChromeUtils.import("chrome://enigmail/content/modules/app.jsm").EnigmailApp; +const getCore = EnigmailLazy.loader("enigmail/core.jsm", "EnigmailCore"); + + +var gEnigmailSvc = null; +var gResolveInstall = null; +var gDownoadObj = null; + +async function checkGnuPGUpdate() { + let elem = "noUpdateAvailable"; + + if (!EnigmailGnuPGUpdate.isGnuPGUpdatable()) { + elem = "cannotUpdateGnuPG"; + } else if (await EnigmailGnuPGUpdate.isUpdateAvailable()) { + elem = "updateAvailable"; + } + + document.getElementById(elem).classList.remove("hidden"); +} + + +function onload() { + EnigmailLocalizeHtml.onPageLoad(document); + if (!EnigmailGnuPGUpdate.isAutoCheckEnabled()) { + document.getElementById("noMoreUpdates").checked = true; + } + checkGnuPGUpdate(); +} + +function stopChecking(elem) { + if (elem.checked) { + EnigmailGnuPGUpdate.stopCheckingForUpdate(); + } else { + EnigmailGnuPGUpdate.enableCheckingForUpdate(); + } +} + +function installUpdate() { + let progressBox = document.getElementById("progressBox"); + let downloadProgress = document.getElementById("downloadProgress"); + let installProgressBox = document.getElementById("installProgressBox"); + let installProgress = document.getElementById("installProgress"); + let btnInstallGnupg = document.getElementById("btnInstallGnupg"); + + btnInstallGnupg.setAttribute("disabled", true); + progressBox.classList.remove("hidden"); + + InstallGnuPG.startInstaller({ + onStart: function(reqObj) { + gDownoadObj = reqObj; + }, + + onError: function(errorMessage) { + if (typeof(errorMessage) == "object") { + var s = EnigmailLocale.getString("errorType." + errorMessage.type); + if (errorMessage.type.startsWith("Security")) { + s += "\n" + EnigmailLocale.getString("setupWizard.downloadForbidden"); + } else + s += "\n" + EnigmailLocale.getString("setupWizard.downloadImpossible"); + + EnigmailDialog.alert(window, s); + } else { + EnigmailDialog.alert(window, EnigmailLocale.getString(errorMessage)); + } + + this.returnToDownload(); + }, + + onWarning: function(message) { + var ret = false; + if (message == "hashSumMismatch") { + ret = EnigmailDialog.confirmDlg(window, EnigmailLocale.getString("setupWizard.hashSumError"), EnigmailLocale.getString("dlgYes"), + EnigmailLocale.getString("dlgNo")); + } + + if (!ret) this.returnToDownload(); + + return ret; + }, + + onProgress: function(event) { + if (event.lengthComputable) { + var percentComplete = event.loaded / event.total * 100; + downloadProgress.setAttribute("value", percentComplete); + } else { + downloadProgress.removeAttribute("value"); + } + }, + + onDownloaded: function() { + gDownoadObj = null; + downloadProgress.setAttribute("value", 100); + installProgressBox.classList.remove("hidden"); + }, + + + returnToDownload: function() { + btnInstallGnupg.removeAttribute("disabled"); + progressBox.classList.add("hidden"); + downloadProgress.setAttribute("value", 0); + installProgressBox.classList.add("hidden"); + }, + + onLoaded: function() { + installProgress.setAttribute("value", 100); + + let origPath = EnigmailPrefs.getPref("agentPath"); + EnigmailPrefs.setPref("agentPath", ""); + + let svc = reinitEnigmail(); + + if (!svc) { + EnigmailPrefs.setPref("agentPath", origPath); + this.returnToDownload(); + EnigmailDialog.alert(window, EnigmailLocale.getString("setupWizard.installFailed")); + } else { + document.getElementById("updateComplete").classList.remove("hidden"); + } + } + }); +} + +function reinitEnigmail() { + if (!gEnigmailSvc) { + try { + gEnigmailSvc = getCore().createInstance(); + } catch (ex) { + EnigmailLog.ERROR("updateGnuPG.js: reinitEnigmail: Error in instantiating EnigmailService\n"); + return null; + } + } + + EnigmailLog.DEBUG("updateGnuPG.js: reinitEnigmail: gEnigmailSvc = " + gEnigmailSvc + "\n"); + + if (gEnigmailSvc.initialized) { + try { + gEnigmailSvc.reinitialize(); + } catch (ex) {} + } else { + // Try to initialize Enigmail + + try { + // Initialize enigmail + gEnigmailSvc.initialize(window, EnigmailApp.getVersion()); + + // Reset alert count to default value + EnigmailPrefs.getPrefBranch().clearUserPref("initAlert"); + } catch (ex) { + return null; + } + + let configuredVersion = EnigmailPrefs.getPref("configuredVersion"); + EnigmailLog.DEBUG("updateGnuPG.js: reinitEnigmail: " + configuredVersion + "\n"); + } + + return gEnigmailSvc.initialized ? gEnigmailSvc : null; +} diff -Nru enigmail-2.0.12+ds1/ui/content/upgradeInfo.html enigmail-2.1.3+ds1/ui/content/upgradeInfo.html --- enigmail-2.0.12+ds1/ui/content/upgradeInfo.html 2019-07-06 14:39:53.000000000 +0000 +++ enigmail-2.1.3+ds1/ui/content/upgradeInfo.html 2019-10-29 17:09:36.000000000 +0000 @@ -12,7 +12,7 @@