js: add with-sec-fprs to getKeysArmored

--

* Reflects the changes made to gpgme-json in commit
  6cc842c9aa.

  - getKeysArmored now returns an object with property 'armored' being
    the exported armored block, and an (optional) array of fingerprint
    strings for those keys that can be used in sign/encrypt operations
    as property 'secret_fprs'. With this, extensions such as mailvelope
    will be able to bulk fetch all necessary key information in one
    request.
This commit is contained in:
Maximilian Krambach 2018-07-12 11:36:55 +02:00
parent 4015f5b498
commit 30bb549046
3 changed files with 60 additions and 15 deletions

View File

@ -22,7 +22,7 @@
* Raimund Renkert <rrenkert@intevation.de>
*/
/* global describe, it, expect, Gpgmejs, ImportablePublicKey */
/* global describe, it, expect, Gpgmejs, ImportablePublicKey, inputvalues */
describe('Key importing', function () {
it('Prepare test Key (deleting it from gnupg, if present)', function(done){
@ -83,5 +83,30 @@ describe('Key importing', function () {
});
});
});
it('exporting armored Key with getKeysArmored', function (done) {
let prm = Gpgmejs.init();
const fpr = inputvalues.encrypt.good.fingerprint;
prm.then(function (context) {
context.Keyring.getKeysArmored(fpr).then(function(result){
expect(result).to.be.an('object');
expect(result.armored).to.be.a('string');
expect(result.secret_fprs).to.be.undefined;
done();
});
});
});
it('exporting armored Key (including secret fingerprints) with '
+ 'getKeysArmored', function (done) {
let prm = Gpgmejs.init();
const fpr = inputvalues.encrypt.good.fingerprint;
prm.then(function (context) {
context.Keyring.getKeysArmored(fpr, true).then(function(result){
expect(result).to.be.an('object');
expect(result.armored).to.be.a('string');
expect(result.secret_fprs).to.be.an('array');
expect(result.secret_fprs[0]).to.equal(fpr);
done();
});
});
});
});

View File

@ -107,26 +107,46 @@ export class GPGME_Keyring {
});
}
/**
* @typedef {Object} exportResult The result of a getKeysArmored operation.
* @property {String} armored The public Key(s) as armored block. Note that
* the result is one armored block, and not a block per key.
* @property {Array<String>} secret_fprs (optional) list of fingerprints
* for those Keys that also have a secret Key available in gnupg. The
* secret key will not be exported, but the fingerprint can be used in
* operations needing a secret key.
*/
/**
* Fetches the armored public Key blocks for all Keys matching the pattern
* (if no pattern is given, fetches all keys known to gnupg). Note that the
* result may be one big armored block, instead of several smaller armored
* blocks
* (if no pattern is given, fetches all keys known to gnupg).
* @param {String|Array<String>} pattern (optional) The Pattern to search
* for
* @returns {Promise<String|GPGME_Error>} Armored Key blocks
* @param {Boolean} with_secret_fpr (optional) also return a list of
* fingerprints for the keys that have a secret key available
* @returns {Promise<exportResult|GPGME_Error>} Object containing the
* armored Key(s) and additional information.
* @static
* @async
*/
getKeysArmored(pattern) {
getKeysArmored(pattern, with_secret_fpr) {
return new Promise(function(resolve, reject) {
let msg = createMessage('export');
msg.setParameter('armor', true);
if (with_secret_fpr === true) {
msg.setParameter('with-sec-fprs', true);
}
if (pattern !== undefined){
msg.setParameter('keys', pattern);
}
msg.post().then(function(result){
resolve(result.data);
msg.post().then(function(answer){
const result = {armored: answer.data};
if (with_secret_fpr === true
&& answer.hasOwnProperty('sec-fprs')
) {
result.secret_fprs = answer['sec-fprs'];
}
resolve(result);
}, function(error){
reject(error);
});

View File

@ -246,7 +246,10 @@ export const permittedOperations = {
'raw': {
allowed: ['boolean']
},
'pkcs12':{
'pkcs12': {
allowed: ['boolean']
},
'with-sec-fprs': {
allowed: ['boolean']
}
// secret: not yet implemented
@ -255,7 +258,8 @@ export const permittedOperations = {
type: ['keys'],
data: {
'data': 'string',
'base64': 'boolean'
'base64': 'boolean',
'sec-fprs': 'object'
}
}
},
@ -295,10 +299,6 @@ export const permittedOperations = {
allowed: ['string'],
allowed_data: ['cms', 'openpgp']
},
// 'secret': { not implemented
// allowed: ['boolean']
// }
},
answer: {
data: {