commit enigmail for openSUSE:Factory
Hello community, here is the log from the commit of package enigmail for openSUSE:Factory checked in at 2016-11-14 20:15:35 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/enigmail (Old) and /work/SRC/openSUSE:Factory/.enigmail.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "enigmail" Changes: -------- --- /work/SRC/openSUSE:Factory/enigmail/enigmail.changes 2016-09-27 13:43:45.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.enigmail.new/enigmail.changes 2016-11-14 20:15:37.000000000 +0100 @@ -1,0 +2,8 @@ +Sun Nov 13 12:02:26 UTC 2016 - astieger@suse.com + +- enigmail 1.9.6: + * Better detection is decrypted message is displayed + * New variant of PGP/MIME messages broken by MS-Exchange + * Make key importing more robust + +------------------------------------------------------------------- Old: ---- enigmail-1.9.5.tar.gz enigmail-1.9.5.tar.gz.asc New: ---- enigmail-1.9.6.tar.gz enigmail-1.9.6.tar.gz.asc ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ enigmail.spec ++++++ --- /var/tmp/diff_new_pack.ZyANoe/_old 2016-11-14 20:15:38.000000000 +0100 +++ /var/tmp/diff_new_pack.ZyANoe/_new 2016-11-14 20:15:38.000000000 +0100 @@ -18,7 +18,7 @@ Name: enigmail -Version: 1.9.5 +Version: 1.9.6 Release: 0 Summary: OpenPGP addon for Thunderbird and SeaMonkey License: MPL-2.0 ++++++ enigmail-1.9.5.tar.gz -> enigmail-1.9.6.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/enigmail/Makefile new/enigmail/Makefile --- old/enigmail/Makefile 2016-08-20 16:02:21.000000000 +0200 +++ new/enigmail/Makefile 2016-11-02 18:05:38.000000000 +0100 @@ -3,7 +3,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. XPI_MODULE = enigmail -XPI_MODULE_VERS = 1.9.4 +XPI_MODULE_VERS = 1.9.6 DEPTH = . diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/enigmail/ipc/modules/subprocess.jsm new/enigmail/ipc/modules/subprocess.jsm --- old/enigmail/ipc/modules/subprocess.jsm 2016-08-20 16:02:21.000000000 +0200 +++ new/enigmail/ipc/modules/subprocess.jsm 2016-11-02 18:05:38.000000000 +0100 @@ -1123,7 +1123,6 @@ active = true, done = false, exitCode = -1, - workerExitCode = 0, child = {}, pid = -1, writeWorker = [], @@ -1657,7 +1656,7 @@ break; case "done": debugLog("Pipe " + name + " closed\n"); - if (event.data.data !== 0) workerExitCode = event.data.data; + updateExitCode(event.data.data); --readers; if (readers === 0) cleanup(); break; @@ -1737,6 +1736,13 @@ } } + function updateExitCode(code) { + if (exitCode > -2 && code >= 0) { + exitCode = code; + } + exitCode = exitCode % 0xFF; + } + function cleanup() { debugLog("Cleanup called\n"); @@ -1753,18 +1759,10 @@ var result, status = ctypes.int(); result = waitpid(child.pid, status.address(), 0); - if (exitCode > -2) { - if (result > 0) - exitCode = status.value; - else - if (workerExitCode >= 0) - exitCode = workerExitCode; - else - exitCode = status.value; + if (exitCode > -2 && result > 0) { + updateExitCode((status.value & 0xff00) >> 8); } - exitCode = exitCode % 0xFF; - for (i = 0; i < writeWorker.length; i++) { if (writeWorker[i]) writeWorker[i].postMessage({ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/enigmail/ipc/modules/subprocess_worker_unix.js new/enigmail/ipc/modules/subprocess_worker_unix.js --- old/enigmail/ipc/modules/subprocess_worker_unix.js 2016-08-20 16:02:21.000000000 +0200 +++ new/enigmail/ipc/modules/subprocess_worker_unix.js 2016-11-02 18:05:38.000000000 +0100 @@ -252,10 +252,10 @@ result = libcFunc.waitpid(pid, status.address(), WNOHANG); if (result > 0) { pollTimeout = NOWAIT; - exitCode = parseInt(status.value, 10); + exitCode = (parseInt(status.value, 10) & 0xff00) >> 8; postMessage({ msg: "debug", - data: "waitpid signaled subprocess stop, exitcode=" + status.value + data: "waitpid signaled subprocess stop, exitcode=" + exitCode }); } else if (result < 0) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/enigmail/package/fixExchangeMsg.jsm new/enigmail/package/fixExchangeMsg.jsm --- old/enigmail/package/fixExchangeMsg.jsm 2016-08-20 16:02:21.000000000 +0200 +++ new/enigmail/package/fixExchangeMsg.jsm 2016-11-02 18:05:38.000000000 +0100 @@ -252,7 +252,7 @@ return null; } - mimeHdr.initialize(bodyData.substr(encData, 500)); + mimeHdr.initialize(bodyData.substr(encData, 5000)); ct = mimeHdr.extractHeader("content-type", false); if (!ct || ct.search(/application\/octet-stream/i) < 0) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: getCorrectedExchangeBodyData: wrong content-type of PGP/MIME data\n"); @@ -295,7 +295,7 @@ let mimeHdr = Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders); - mimeHdr.initialize(bodyData.substr(encData, 500)); + mimeHdr.initialize(bodyData.substr(encData, 5000)); let ct = mimeHdr.extractHeader("content-type", false); if (!ct || ct.search(/application\/pgp-encrypted/i) < 0) { EnigmailLog.DEBUG("fixExchangeMsg.jsm: getCorrectediPGMailBodyData: wrong content-type of PGP/MIME data\n"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/enigmail/package/install.rdf new/enigmail/package/install.rdf --- old/enigmail/package/install.rdf 2016-08-20 16:02:21.000000000 +0200 +++ new/enigmail/package/install.rdf 2016-11-02 18:05:38.000000000 +0100 @@ -5,7 +5,7 @@ <Description about="urn:mozilla:install-manifest"> em:id{847b3a00-7ab1-11d4-8f02-006008948af5} - em:version1.9.5 + em:version1.9.6 em:type2 <!-- type = extension --> em:unpacktrue diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/enigmail/package/key.jsm new/enigmail/package/key.jsm --- old/enigmail/package/key.jsm 2016-08-20 16:02:21.000000000 +0200 +++ new/enigmail/package/key.jsm 2016-11-02 18:05:38.000000000 +0100 @@ -156,18 +156,29 @@ let key = getKeyRing().getKeyById(keyId); if (key) { - let userId = key.userId + " - 0x" + key.keyId.substr(-8, 8); - if (!getDialog().confirmDlg(null, - EnigmailLocale.getString("revokeKeyQuestion", userId), - EnigmailLocale.getString("keyMan.button.revokeKey"))) { - return; + if (key.keyTrust === "r") { + // Key has already been revoked + getDialog().alert(null, EnigmailLocale.getString("revokeKeyAlreadyRevoked", keyId.substr(-8, 8))); } + else { - let errorMsgObj = {}; - if (getKeyRing().importKey(null, false, keyBlockStr, keyId, errorMsgObj) > 0) { - getDialog().alert(errorMsgObj.value); + let userId = key.userId + " - 0x" + key.keyId.substr(-8, 8); + if (!getDialog().confirmDlg(null, + EnigmailLocale.getString("revokeKeyQuestion", userId), + EnigmailLocale.getString("keyMan.button.revokeKey"))) { + return; + } + + let errorMsgObj = {}; + if (getKeyRing().importKey(null, false, keyBlockStr, keyId, errorMsgObj) > 0) { + getDialog().alert(null, errorMsgObj.value); + } } } + else { + // Suitable key for revocation certificate is not present in keyring + getDialog().alert(null, EnigmailLocale.getString("revokeKeyNotPresent", keyId.substr(-8, 8))); + } } }, @@ -184,7 +195,7 @@ * - packetStr - String: the packet list as received from GnuPG */ getKeyFileType: function(keyBlockStr) { - let args = EnigmailGpg.getStandardArgs(true).concat("--list-packets"); + let args = EnigmailGpg.getStandardArgs(true).concat(["--no-verbose", "--list-packets"]); const exitCodeObj = {}; const statusMsgObj = {}; const errorMsgObj = {}; @@ -242,7 +253,7 @@ return ret; } - const tempDir = EnigmailFiles.createTempSubDir("enigmail_import"); + const tempDir = EnigmailFiles.createTempSubDir("enigmail_import", true); const tempPath = EnigmailFiles.getFilePath(tempDir); const args = EnigmailGpg.getStandardArgs(true).concat([ "--import", @@ -266,20 +277,19 @@ var keyexpired; while (state != "end") { + + // Ignore all irrelevant lines + while (lines[idx].search(/^(IMPORTED|IMPORT_OK|IMPORT_RES|IMPORT_PROBLEM) /) < 0 && + idx < lines.length) { + EnigmailLog.DEBUG("Ignoring line: '" + lines[idx] + "'\n"); + ++idx; + } + if (idx >= lines.length) { errorMsgObj.value = EnigmailLocale.getString("cantImport"); return []; } - // Ignore all lines starting with "KEYEXPIRED" - keyexpired = lines[idx].match(/^KEYEXPIRED/); - - while (keyexpired && (keyexpired.length > 0) && (idx < (lines.length - 1))) { - EnigmailLog.DEBUG("Ignoring KEYEXPIRED line: '" + lines[idx] + "'\n"); - idx += 1; - keyexpired = lines[idx].match(/^KEYEXPIRED/); - } - EnigmailLog.DEBUG("state: '" + state + "', line: '" + lines[idx] + "'\n"); switch (state) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/enigmail/package/mimeDecrypt.jsm new/enigmail/package/mimeDecrypt.jsm --- old/enigmail/package/mimeDecrypt.jsm 2016-08-20 16:02:21.000000000 +0200 +++ new/enigmail/package/mimeDecrypt.jsm 2016-11-02 18:05:38.000000000 +0100 @@ -439,17 +439,28 @@ if (proto && proto.search(/application\/(pgp|pkcs7|x-pkcs7)-signature/i) >= 0) { EnigmailLog.DEBUG("mimeDecrypt.jsm: returnData: using direct verification\n"); this.mimeSvc.contentType = ct; - this.mimeSvc.mimePart = this.mimeSvc.mimePart + ".1"; + if ("mimePart" in this.mimeSvc) { + this.mimeSvc.mimePart = this.mimeSvc.mimePart + ".1"; + } let proto = EnigmailMime.getProtocol(ct); let veri = EnigmailVerify.newVerifier(proto); veri.onStartRequest(this.mimeSvc, this.uri); - veri.onDataAvailable(null, null, gConv, 0, data.length + 1); + try { + veri.onDataAvailable(null, null, gConv, 0, data.length + 1); + } + catch (ex) { + EnigmailLog.ERROR("mimeDecrypt.jsm: returnData(): mimeSvc.onDataAvailable failed:\n" + ex.toString()); + } veri.onStopRequest(null, null, 0); } else { - gConv.setData(data, data.length); this.mimeSvc.onStartRequest(null, null); - this.mimeSvc.onDataAvailable(null, null, gConv, 0, data.length); + try { + this.mimeSvc.onDataAvailable(null, null, gConv, 0, data.length); + } + catch (ex) { + EnigmailLog.ERROR("mimeDecrypt.jsm: returnData(): mimeSvc.onDataAvailable failed:\n" + ex.toString()); + } this.mimeSvc.onStopRequest(null, null, 0); } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/enigmail/package/mimeVerify.jsm new/enigmail/package/mimeVerify.jsm --- old/enigmail/package/mimeVerify.jsm 2016-08-20 16:02:21.000000000 +0200 +++ new/enigmail/package/mimeVerify.jsm 2016-11-02 18:05:38.000000000 +0100 @@ -313,6 +313,9 @@ start = 0; } let end = this.keepData.indexOf("--" + this.boundary + "--") - 1; + if (end < 0) { + end = this.keepData.length; + } return { start: start, @@ -369,9 +372,17 @@ this.backgroundJob = false; + // don't try to verify if no message found // if (this.verifyEmbedded && (!this.foundMsg)) return; // TODO - check + if (this.readMode < 4) { + // we got incomplete data; simply return what we got + this.returnData(this.signedData.length > 0 ? this.signedData : this.keepData); + + return; + } + this.protectedHeaders = EnigmailMime.extractProtectedHeaders(this.signedData); if (this.protectedHeaders && this.protectedHeaders.startPos >= 0 && this.protectedHeaders.endPos > this.protectedHeaders.startPos) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/enigmail/package/pgpmimeHandler.js new/enigmail/package/pgpmimeHandler.js --- old/enigmail/package/pgpmimeHandler.js 2016-08-20 16:02:21.000000000 +0200 +++ new/enigmail/package/pgpmimeHandler.js 2016-11-02 18:05:38.000000000 +0100 @@ -125,12 +125,20 @@ inStream: Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream), onStartRequest: function(request, uri) { - if (!EnigmailCore.getService()) // Ensure Enigmail is initialized + let mimeSvc = request.QueryInterface(Ci.nsIPgpMimeProxy); + let ct = mimeSvc.contentType; + + if (!EnigmailCore.getService()) { + // Ensure Enigmail is initialized + if (ct.search(/application\/(x-)?pkcs7-signature/i) > 0) { + return this.handleSmime(uri); + } return null; + } + EnigmailLog.DEBUG("pgpmimeHandler.js: onStartRequest\n"); + EnigmailLog.DEBUG("pgpmimeHandler.js: ct= " + ct + "\n"); - let mimeSvc = request.QueryInterface(Ci.nsIPgpMimeProxy); - let ct = mimeSvc.contentType; let cth = null; if (ct.search(/^multipart\/encrypted/i) === 0) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/enigmail/ui/content/enigmailKeyImportInfo.xul new/enigmail/ui/content/enigmailKeyImportInfo.xul --- old/enigmail/ui/content/enigmailKeyImportInfo.xul 2016-08-20 16:02:21.000000000 +0200 +++ new/enigmail/ui/content/enigmailKeyImportInfo.xul 2016-11-02 18:05:38.000000000 +0100 @@ -31,7 +31,7 @@ <vbox align="center" flex="1" style="overflow:auto" id="outerbox"> <hbox align="center" flex="1"> - <description flex="1" id="keyInfo" style="plain;white-space: pre"/> + <description flex="1" id="keyInfo" class="plain" style="white-space: pre"/> </hbox> </vbox> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/enigmail/ui/content/enigmailKeyManager.xul new/enigmail/ui/content/enigmailKeyManager.xul --- old/enigmail/ui/content/enigmailKeyManager.xul 2016-08-20 16:02:21.000000000 +0200 +++ new/enigmail/ui/content/enigmailKeyManager.xul 2016-11-02 18:05:38.000000000 +0100 @@ -453,9 +453,5 @@ <hbox id="statusLine"> <label id="statusText" value=" "/> <progressmeter id="progressBar" mode="undetermined" value="0" collapsed="true"/> - <description id="cancelBox" collapsed="true"> - &enigmail.keyMan.stopTransfer.label;</a> - </description> </hbox> </window> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/enigmail/ui/content/enigmailMessengerOverlay.js new/enigmail/ui/content/enigmailMessengerOverlay.js --- old/enigmail/ui/content/enigmailMessengerOverlay.js 2016-08-20 16:02:21.000000000 +0200 +++ new/enigmail/ui/content/enigmailMessengerOverlay.js 2016-11-02 18:05:38.000000000 +0100 @@ -704,7 +704,7 @@ mimeMsg.parts[0].parts[0].headers["content-type"][0].indexOf("text/plain") >= 0 && mimeMsg.parts[0].parts[1].headers["content-type"][0].indexOf("application/pgp-encrypted") >= 0) { if (mimeMsg.parts[0].parts[1].headers["content-type"][0].search(/multipart\/encrypted/i) < 0 && - mimeMsg.parts[0].parts[1].headers["content-type"][0].search(/PGPMIME Versions? Identification/i) >= 0 && + mimeMsg.parts[0].parts[1].headers["content-type"][0].search(/PGP\/?MIME Versions? Identification/i) >= 0 && mimeMsg.parts[0].parts[2].headers["content-type"][0].indexOf("application/octet-stream") >= 0 && mimeMsg.parts[0].parts[2].headers["content-type"][0].indexOf("encrypted.asc") >= 0) { this.buggyMailType = "exchange"; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/enigmail/ui/content/enigmailMsgHdrViewOverlay.js new/enigmail/ui/content/enigmailMsgHdrViewOverlay.js --- old/enigmail/ui/content/enigmailMsgHdrViewOverlay.js 2016-08-20 16:02:21.000000000 +0200 +++ new/enigmail/ui/content/enigmailMsgHdrViewOverlay.js 2016-11-02 18:05:38.000000000 +0100 @@ -981,37 +981,98 @@ throw Components.results.NS_NOINTERFACE; }, + /** + * Determine message number and folder from mailnews URI + * + * @param url - nsIURI object + * + * @return Object: + * - msgNum: String - the message number, or "" if no URI Scheme fits + * - folder: String - the folder (or newsgroup) name + */ + msgIdentificationFromUrl: function(url) { + + // sample URLs in Thunderbird + // Local folder: mailbox:///some/path/to/folder?number=359360 + // IMAP: imap://user@host:port/fetch>some>path>111 + // NNTP: news://some.host/some.service.com?group=some.group.name&key=3510 + // also seen: e.g. mailbox:///som/path/to/folder?number=4455522&part=1.1.2&filename=test.eml + // mailbox:///...?number=4455522&part=1.1.2&filename=test.eml&type=application/x-message-display&filename=test.eml + // imap://user@host:port>UID>some>path>10?header=filter&emitter=js&examineEncryptedParts=true + + EnigmailLog.DEBUG("enigmailMsgHdrViewOverlay.js: msgIdentificationFromUrl: url.path=" + url.path + "\n"); + + let msgNum = ""; + let msgFolder = ""; + + if (url.schemeIs("mailbox")) { + msgNum = url.path.replace(/(.*[?&]number=)([0-9]+)([^0-9].*)?/, "$2"); + msgFolder = url.path.replace(/\?.*/, ""); + } + else if (url.schemeIs("imap")) { + let p = unescape(url.path); + msgNum = p.replace(/(.*>)([0-9]+)([^0-9].*)?/, "$2"); + msgFolder = p.replace(/\?.*$/, "").replace(/>[^>]+$/, ""); + } + else if (url.schemeIs("news")) { + msgNum = url.path.replace(/(.*[\?&]key=)([0-9]+)([^0-9].*)?/, "$2"); + msgFolder = url.path.replace(/(.*[\?&]group=)([^&]+)(&.*)?/, "$2"); + } + + EnigmailLog.DEBUG("enigmailMsgHdrViewOverlay.js: msgIdentificationFromUrl: msgNum=" + msgNum + " / folder=" + msgFolder + "\n"); + + return { + msgNum: msgNum, + folder: msgFolder.toLowerCase() + }; + }, + + isCurrentMessage: function(uri) { let uriSpec = (uri ? uri.spec : null); EnigmailLog.DEBUG("enigmailMsgHdrViewOverlay.js: EnigMimeHeaderSink.isCurrentMessage: uri.spec=" + uriSpec + "\n"); + if (!uriSpec || uriSpec.search(/^enigmail:/) === 0) { + // we cannot compare if no URI given or if URI is Enigmail-internal; + // therefore assuming it's the current message + return true; + } + let msgUriSpec = Enigmail.msg.getCurrentMsgUriSpec(); - let url = {}; + let currUrl = {}; try { let messenger = Components.classes["@mozilla.org/messenger;1"].getService(Components.interfaces.nsIMessenger); let msgSvc = messenger.messageServiceFromURI(msgUriSpec); - msgSvc.GetUrlForUri(msgUriSpec, url, null); + msgSvc.GetUrlForUri(msgUriSpec, currUrl, null); } catch (ex) { EnigmailLog.DEBUG("enigmailMsgHdrViewOverlay.js: EnigMimeHeaderSink.isCurrentMessage: could not determine URL\n"); - url.value = { + currUrl.value = { host: "invalid", path: "/message", scheme: "enigmail", - spec: "enigmail://invalid/message" + spec: "enigmail://invalid/message", + schemeIs: function(s) { + return s === this.scheme; + } }; } - EnigmailLog.DEBUG("enigmailMsgHdrViewOverlay.js: EnigMimeHeaderSink.isCurrentMessage: url=" + url.value.spec + "\n"); + let currMsgId = this.msgIdentificationFromUrl(currUrl.value); + let gotMsgId = this.msgIdentificationFromUrl(uri); + + EnigmailLog.DEBUG("enigmailMsgHdrViewOverlay.js: EnigMimeHeaderSink.isCurrentMessage: url=" + currUrl.value.spec + "\n"); - if (!uriSpec || uriSpec.search(/^enigmail:/) === 0 || - (uri.host == url.value.host && - uri.path.substr(url.value.path.length).search(/([\?&].*)?$/) === 0)) { + if (uri.host == currUrl.value.host && + currMsgId.folder === gotMsgId.folder && + currMsgId.msgNum === gotMsgId.msgNum) { + EnigmailLog.DEBUG("enigmailMsgHdrViewOverlay.js: EnigMimeHeaderSink.isCurrentMessage: true\n"); return true; } + EnigmailLog.DEBUG("enigmailMsgHdrViewOverlay.js: EnigMimeHeaderSink.isCurrentMessage: false\n"); return false; }, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/enigmail/ui/locale/en-US/enigmail.properties new/enigmail/ui/locale/en-US/enigmail.properties --- old/enigmail/ui/locale/en-US/enigmail.properties 2016-08-20 16:02:21.000000000 +0200 +++ new/enigmail/ui/locale/en-US/enigmail.properties 2016-11-02 18:05:38.000000000 +0100 @@ -472,6 +472,8 @@ 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. +revokeKeyAlreadyRevoked=This key has already been revoked. +revokeKeyNotPresent=No suitable key available for revocation certificate. refreshAllQuestion=You did not select any key. Would you like to refresh ALL keys? 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!
participants (1)
-
root@hilbert.suse.de