js: decode arriving gpg message strings
authorMaximilian Krambach <maximilian.krambach@intevation.de>
Fri, 17 Aug 2018 17:20:35 +0000 (19:20 +0200)
committerMaximilian Krambach <maximilian.krambach@intevation.de>
Fri, 17 Aug 2018 17:20:35 +0000 (19:20 +0200)
--

* Arriving strings (i.e. user id names, error messages) are not
  always in javascript encoding. This is an attempt to go through
  the whole gpgme answer (with the exception of payload data) and
  to fix the encoding of these

lang/js/BrowserTestExtension/tests/KeyInfos.js
lang/js/BrowserTestExtension/tests/inputvalues.js
lang/js/src/Connection.js
lang/js/src/Helpers.js

index 03773a4..1829f22 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 /* global describe, it, expect, before, Gpgmejs */
-/* global inputvalues, fixedLengthString */
+/* global inputvalues*/
 
 describe('Key information', function () {
     let context = null;
@@ -43,4 +43,15 @@ describe('Key information', function () {
             done();
         });
     });
+
+    it('A userId keeps their encoding', function(done){
+        context.Keyring.importKey(inputvalues.publicKeyNonAscii.key, true)
+            .then(function(result){
+                expect(result.Keys[0]).to.be.an('object');
+                const user = result.Keys[0].key.get('userids')[0];
+                expect(user.get('name')).to.equal(
+                    inputvalues.publicKeyNonAscii.userid);
+                done();
+            });
+    });
 });
\ No newline at end of file
index 7dda47c..b33d985 100644 (file)
@@ -89,7 +89,40 @@ const inputvalues = {// eslint-disable-line no-unused-vars
         '-----END PGP SIGNATURE-----\n',
     },
 
-    someInputParameter: 'bad string'
+    someInputParameter: 'bad string',
+
+    publicKeyNonAscii: {
+        userid: 'Müller €uro',
+        key: '-----BEGIN PGP PUBLIC KEY BLOCK-----\n' + '\n' +
+          'mQENBFt2/VIBCADIWBIMxExZlHda4XIVnM9nsIfUYLebJSC/krEriyWgzytU8/fQ\n' +
+          'S05cfnYx7RXvOOq4k8aa7mu80ovg3q77idXauLreAUwng4Njw0nMxWq/vtoMiZ60\n' +
+          '9f8EmfthZophhkQF2HIPHyqXMDZzMLWv4oTr2UJ9BKudL1XtbK51y9TbiyfQygBl\n' +
+          '8bl+zrOo70/dN6aunvuo6Hlu5cEzkj2QrzZlqTdfG5qv6KVEMut1eAbxZAmvSnna\n' +
+          'R4wqiRCT3/eRXGJbDL/8GaCEYkwi9FBrimjOTV0MpcLNwAU4aGfDxMUsxML9xJ+/\n' +
+          '/6GFxzYf7Lmk5UhvoewR58uQkHkTVPjZ9hXZABEBAAG0KE3DvGxsZXIg4oKsdXJv\n' +
+          'IDxtdWVsbGVyZXVyb0BleGFtcGxlLm9yZz6JAVQEEwEIAD4WIQQVNixp3XT/DuGT\n' +
+          'F4MFmkL4L5UZdAUCW3b9UgIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIX\n' +
+          'gAAKCRAFmkL4L5UZdAhiCACowW1aC8DYGtJyAaBO2MqWhyw1wVCbQN9uFsQZPydY\n' +
+          'v3BEbCDrRc0HyfV1PVoRQsgkiNMes1S2tz2IMJoEOTMaz3WjPM8yK0dDbo5sfx/o\n' +
+          '/XaXeKhyYNqRkz2dPzorg1sHyHe0ki/HoQiANEJ8mByMtlwnPWlhnINAX+27eL17\n' +
+          'JC8juhBYUchqoIBAl+ajYKSThdLzrUkcL7QfJjZb3pPytJSTTdFc0rD6ERDbfXXc\n' +
+          '/vnE2SDYme+XXn7H5tNe67tPM8M96vbp+uM+n2t/z96C+Pqb6GJFMBa35PM+/qQO\n' +
+          'yr0I2oaQnTecx2AfBXGZvd81wMYikAJ9rAOWyMQZHJWouQENBFt2/VIBCADXCvKD\n' +
+          '3wRWCOzRWtLTs7hpAjCDxp6niPkwxKuUf9r/sUPmn0pWdZHYlbPDev9psN9bnJ+C\n' +
+          '+wzzPZ1zgSYKIAN0IMoh0L7BRAoau7VWQ3Q7hP6HIbdzOTEGyklSoh9pIh6IlwZZ\n' +
+          'XfPlFlnn7FeH1UeA711E174SUpDRKYSfT+mFObQUuQewGi9QC3gBsz5MPLQQLzML\n' +
+          'yimIOT+8i64fHHSKChw5ZDckBffej31/YHPQ7+JsWFV+G/6xDfbwnaFZFAUwo+1L\n' +
+          '4w9UiMyCNkIWCkulzJ2Hbz66xzFMi/8zMYxr08Af+PpsXaWTQHAa5V4GNJSInDEB\n' +
+          '7gy/CGLcY90EozoDABEBAAGJATwEGAEIACYWIQQVNixp3XT/DuGTF4MFmkL4L5UZ\n' +
+          'dAUCW3b9UgIbDAUJA8JnAAAKCRAFmkL4L5UZdPqoB/9kpqxqa82k7JMcq7UiwQY7\n' +
+          'CdqCUPKF88ciOWKBpZmpl8V7zgM7kEXwmM6ocHcznXi8xM7eOfDIJcBeqFVIE4OT\n' +
+          '63OCMuvZICM9Kiu48wLNAw5W/YGAOBH7ySQzZM2XrtvwfFtJ3lR00t5f4FVtriA5\n' +
+          '47BjYYG5tTdJc8HwEHs045S99xKCWqwuDgO9qskIi6iPePUkuhpaVBLuEj2Goku6\n' +
+          'i8aql/vKYQS67L7UHJiEbjLe+wP9k3FvWUFTx39lAubsDzb4Abhe+qRqs2TKD7Go\n' +
+          'k35ZriRIYllmx4c9KyWL7Mvzcp+84Sq9LeMfsN4JstBDJ7jn6g19SjO5dmtxSuP0\n' +
+          '=zZSJ\n' +
+          '-----END PGP PUBLIC KEY BLOCK-----\n'
+    }
 };
 
 // (Pseudo-)Random String covering all of utf8.
index b010575..8d381f1 100644 (file)
@@ -26,6 +26,7 @@
 import { permittedOperations } from './permittedOperations';
 import { gpgme_error } from './Errors';
 import { GPGME_Message, createMessage } from './Message';
+import { decode } from './Helpers';
 
 /**
  * A Connection handles the nativeMessaging interaction via a port. As the
@@ -239,7 +240,7 @@ class Answer{
                 case 'type':
                     if (_decodedResponse.type === 'error'){
                         return (gpgme_error('GNUPG_ERROR',
-                            decodeURIComponent(escape(_decodedResponse.msg))));
+                            decode(_decodedResponse.msg)));
                     } else if (poa.type.indexOf(_decodedResponse.type) < 0){
                         return gpgme_error('CONN_UNEXPECTED_ANSWER');
                     }
@@ -270,7 +271,7 @@ class Answer{
                                 ('00' + c.charCodeAt(0).toString(16)).slice(-2);
                                 }).join(''));
                     } else {
-                        _response[key] = _decodedResponse[key];
+                        _response[key] = decode(_decodedResponse[key]);
                     }
                     break;
                 }
index accc2af..379015f 100644 (file)
@@ -108,3 +108,30 @@ export function isFingerprint(value){
 export function isLongId(value){
     return hextest(value, 16);
 }
+
+/**
+ * Recursively decodes input (utf8) to output (utf-16; javascript) strings
+ * @param {Object | Array | String} property
+ */
+export function decode(property){
+    if (typeof property === 'string'){
+        return decodeURIComponent(escape(property));
+    } else if (Array.isArray(property)){
+        let res = [];
+        for (let arr=0; arr < property.length; arr++){
+            res.push(decode(property[arr]));
+        }
+        return res;
+    } else if (typeof property === 'object'){
+        const keys = Object.keys(property);
+        if (keys.length){
+            let res = {};
+            for (let k=0; k < keys.length; k++ ){
+                res[keys[k]] = decode(property[keys[k]]);
+            }
+            return res;
+        }
+        return property;
+    }
+    return property;
+}
\ No newline at end of file