js: decode arriving gpg message strings

--

* 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
This commit is contained in:
Maximilian Krambach 2018-08-17 19:20:35 +02:00
parent 3cbafb97ec
commit 74684f24c6
4 changed files with 76 additions and 4 deletions

View 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();
});
});
});

View 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.

View 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;
}

View 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;
}