js: typecheck destructured parameters

--

* destructuring just takes the input argument and treats it as object.
  In cases like in src/Keyring/generateKey, where I forgot to change
  the old syntax, the fingerprint as string was destructured into an
  object without "pattern", which caused all Keys to be retrieved.
  So, methods with a destructuring now check if the first argument is
  an object and get a default empty object if no parameter is
  submitted. This allows the further use of destructured parameters,
  while still ensuring nothing vastly incorrect is used.
* src/Kering.js, unittsets.js: fixed old syntax in method usage
This commit is contained in:
Maximilian Krambach 2018-08-27 12:32:28 +02:00
parent 53c5b9a265
commit 766d42c248
3 changed files with 40 additions and 20 deletions

View File

@ -49,7 +49,13 @@ export class GPGME_Keyring {
* @static
* @async
*/
getKeys ({ pattern, prepare_sync = false, search = false }){
getKeys ({ pattern, prepare_sync = false, search = false } = {}){
if (typeof arguments[0] !== 'object') {
return Promise.reject(gpgme_error('PARAM_WRONG'));
}
if (arguments.length && typeof arguments[0] !== 'object') {
return Promise.reject(gpgme_error('PARAM_WRONG'));
}
return new Promise(function (resolve, reject) {
let msg = createMessage('keylist');
if (pattern) {
@ -387,7 +393,7 @@ export class GPGME_Keyring {
* @return {Promise<Key|GPGME_Error>}
* @async
*/
generateKey ({ userId, algo = 'default', expires= 0, subkey_algo }){
generateKey ({ userId, algo = 'default', expires= 0, subkey_algo } = {}){
if (typeof userId !== 'string'
// eslint-disable-next-line no-use-before-define
|| (algo && supportedKeyAlgos.indexOf(algo) < 0 )
@ -409,13 +415,14 @@ export class GPGME_Keyring {
}
msg.setParameter('expires', expires);
msg.post().then(function (response){
me.getKeys(response.fingerprint, true).then(
// TODO prepare_sync?
function (result){
resolve(result);
}, function (error){
reject(error);
});
me.getKeys({
pattern: response.fingerprint,
prepare_sync: true
}).then(function (result){
resolve(result);
}, function (error){
reject(error);
});
}, function (error) {
reject(error);
});

View File

@ -142,7 +142,10 @@ export class GpgME {
* @async
*/
encrypt ({ data, publicKeys, secretKeys, base64 = false, armor = true,
wildcard, always_trust = true, additional = {} }){
wildcard, always_trust = true, additional = {} } = {}){
if (typeof arguments[0] !== 'object') {
return Promise.reject(gpgme_error('PARAM_WRONG'));
}
if (!data || !publicKeys){
return Promise.reject(gpgme_error('MSG_INCOMPLETE'));
}
@ -203,7 +206,10 @@ export class GpgME {
* @returns {Promise<decrypt_result>} Decrypted Message and information
* @async
*/
decrypt ({ data, base64, expect }){
decrypt ({ data, base64, expect } = {}){
if (typeof arguments[0] !== 'object') {
return Promise.reject(gpgme_error('PARAM_WRONG'));
}
if (!data){
return Promise.reject(gpgme_error('MSG_EMPTY'));
}
@ -263,7 +269,10 @@ export class GpgME {
* @returns {Promise<signResult>}
* @async
*/
sign ({ data, keys, mode = 'clearsign', base64 }){
sign ({ data, keys, mode = 'clearsign', base64 } = {}){
if (typeof arguments[0] !== 'object') {
return Promise.reject(gpgme_error('PARAM_WRONG'));
}
if (!data){
return Promise.reject(gpgme_error('MSG_EMPTY'));
}
@ -310,7 +319,10 @@ export class GpgME {
* @returns {Promise<verifyResult>}
*@async
*/
verify ({ data, signature, base64 }){
verify ({ data, signature, base64 } = {}){
if (typeof arguments[0] !== 'object') {
return Promise.reject(gpgme_error('PARAM_WRONG'));
}
if (!data){
return Promise.reject(gpgme_error('PARAM_WRONG'));
}

View File

@ -287,13 +287,14 @@ function unittests (){
it('Querying non-existing Key from Keyring', function (done){
let keyring = new GPGME_Keyring;
keyring.getKeys(kp.invalidKeyFingerprint, true).then(
function (result){
expect(result).to.be.an('array');
expect(result.length).to.equal(0);
done();
}
);
keyring.getKeys({
pattern: kp.invalidKeyFingerprint,
prepare_sync: true
}).then(function (result){
expect(result).to.be.an('array');
expect(result.length).to.equal(0);
done();
});
});
});