js: getDefaultKey and verify fix
-- * DemoExtension/maindemo.js - added a Demo for retrieving the default signing key * src/Errors.js - add a new Error if no default key can be determined * src/Key.js added documentation and a TODO marker for hasSecret. * src/Keyring.js implemented getDefaultKey * src/permittedOperations.js: Added missing entry for verify, added config_opt
This commit is contained in:
parent
d0fc4ded58
commit
aed402c5d5
@ -13,10 +13,11 @@ receiving an answer
|
|||||||
[*] Key handling (import/export, modifying, status queries)
|
[*] Key handling (import/export, modifying, status queries)
|
||||||
[x] Import (not importing secret)
|
[x] Import (not importing secret)
|
||||||
[x] Export (not exporting secret)
|
[x] Export (not exporting secret)
|
||||||
[x] status queries
|
[*] status queries
|
||||||
|
[ ] getHasSecret
|
||||||
[ ] key generation
|
[ ] key generation
|
||||||
[ ] modification
|
[ ] modification
|
||||||
[*] Configuration handling
|
[x] Configuration handling
|
||||||
[ ] check for completeness
|
[ ] check for completeness
|
||||||
|
|
||||||
Communication with other implementations
|
Communication with other implementations
|
||||||
|
@ -36,7 +36,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
'answer').value = answer.data;
|
'answer').value = answer.data;
|
||||||
}
|
}
|
||||||
}, function(errormsg){
|
}, function(errormsg){
|
||||||
alert( errormsg.code + ' ' + errormsg.msg);
|
alert( errormsg.message);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -50,8 +50,18 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
'answer').value = answer.data;
|
'answer').value = answer.data;
|
||||||
}
|
}
|
||||||
}, function(errormsg){
|
}, function(errormsg){
|
||||||
alert( errormsg.code + ' ' + errormsg.msg);
|
alert(errormsg.message);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
document.getElementById('getdefaultkey').addEventListener('click',
|
||||||
|
function(){
|
||||||
|
gpgmejs.Keyring.getDefaultKey().then(function(answer){
|
||||||
|
document.getElementById('defaultkey').innerHtml =
|
||||||
|
answer.fingerprint;
|
||||||
|
}, function(errormsg){
|
||||||
|
alert(errormsg.message);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -29,5 +29,16 @@
|
|||||||
<hr>
|
<hr>
|
||||||
<h3>Result data:</h3>
|
<h3>Result data:</h3>
|
||||||
<textarea id="answer" rows="5" cols="65" wrap="hard"></textarea>
|
<textarea id="answer" rows="5" cols="65" wrap="hard"></textarea>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<span class="label">Default Key:</span>
|
||||||
|
<button id="getdefaultkey">Get</button><br>
|
||||||
|
<span id="defaultkey"></span>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -78,6 +78,11 @@ const err_list = {
|
|||||||
msg:'This property has not been retrieved yet from GPG',
|
msg:'This property has not been retrieved yet from GPG',
|
||||||
type: 'error'
|
type: 'error'
|
||||||
},
|
},
|
||||||
|
'KEY_NO_DEFAULT': {
|
||||||
|
msg:'A default key could not be established. Please check yout gpg ' +
|
||||||
|
'configuration',
|
||||||
|
type: 'error'
|
||||||
|
},
|
||||||
// generic
|
// generic
|
||||||
'PARAM_WRONG':{
|
'PARAM_WRONG':{
|
||||||
msg: 'Invalid parameter was found',
|
msg: 'Invalid parameter was found',
|
||||||
|
@ -192,6 +192,7 @@ export class GPGME_Key {
|
|||||||
* Query the armored block of the non- secret parts of the Key directly
|
* Query the armored block of the non- secret parts of the Key directly
|
||||||
* from gpg.
|
* from gpg.
|
||||||
* @returns {Promise<String>}
|
* @returns {Promise<String>}
|
||||||
|
* @async
|
||||||
*/
|
*/
|
||||||
getArmor(){
|
getArmor(){
|
||||||
let me = this;
|
let me = this;
|
||||||
@ -211,6 +212,13 @@ export class GPGME_Key {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find out if the Key includes a secret part
|
||||||
|
* @returns {Promise<Boolean>}
|
||||||
|
*
|
||||||
|
* @async
|
||||||
|
*/
|
||||||
|
// TODO: Does not work yet, result is always false
|
||||||
getHasSecret(){
|
getHasSecret(){
|
||||||
let me = this;
|
let me = this;
|
||||||
return new Promise(function(resolve, reject) {
|
return new Promise(function(resolve, reject) {
|
||||||
|
@ -99,7 +99,61 @@ export class GPGME_Keyring {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// getDefaultKey() Big TODO
|
/**
|
||||||
|
* Returns the Key to be used by default for signing operations,
|
||||||
|
* looking up the gpg configuration, or returning the first key that
|
||||||
|
* contains a secret key.
|
||||||
|
* @returns {Promise<GPGME_Key>}
|
||||||
|
*
|
||||||
|
* @async
|
||||||
|
* TODO: getHasSecret always returns false at this moment, so this fucntion
|
||||||
|
* still does not fully work as intended.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
getDefaultKey() {
|
||||||
|
let me = this;
|
||||||
|
return new Promise(function(resolve, reject){
|
||||||
|
let msg = createMessage('config_opt');
|
||||||
|
msg.setParameter('component', 'gpg');
|
||||||
|
msg.setParameter('option', 'default-key');
|
||||||
|
msg.post().then(function(response){
|
||||||
|
if (response.value !== undefined
|
||||||
|
&& response.value.hasOwnProperty('string')
|
||||||
|
&& typeof(response.value.string) === 'string'
|
||||||
|
){
|
||||||
|
me.getKeys(response.value.string,true).then(function(keys){
|
||||||
|
if(keys.length === 1){
|
||||||
|
resolve(keys[0]);
|
||||||
|
} else {
|
||||||
|
reject(gpgme_error('KEY_NO_DEFAULT'));
|
||||||
|
}
|
||||||
|
}, function(error){
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// TODO: this is overly 'expensive' in communication
|
||||||
|
// and probably performance, too
|
||||||
|
me.getKeys(null,true).then(function(keys){
|
||||||
|
for (let i=0; i < keys.length; i++){
|
||||||
|
console.log(keys[i]);
|
||||||
|
console.log(keys[i].get('hasSecret'));
|
||||||
|
if (keys[i].get('hasSecret') === true){
|
||||||
|
resolve(keys[i]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i === keys.length -1){
|
||||||
|
reject(gpgme_error('KEY_NO_DEFAULT'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, function(error){
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, function(error){
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -314,7 +314,7 @@ export const permittedOperations = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
createkey: {
|
createkey: {
|
||||||
pinentry: true,
|
pinentry: true,
|
||||||
required: {
|
required: {
|
||||||
userid: {
|
userid: {
|
||||||
allowed: ['string']
|
allowed: ['string']
|
||||||
@ -332,7 +332,59 @@ export const permittedOperations = {
|
|||||||
type: [''],
|
type: [''],
|
||||||
data: {'fingerprint': 'string'}
|
data: {'fingerprint': 'string'}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
verify: {
|
||||||
|
required: {
|
||||||
|
data: {
|
||||||
|
allowed: ['string']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
optional: {
|
||||||
|
'protocol': {
|
||||||
|
allowed: ['string'],
|
||||||
|
allowed_data: ['cms', 'openpgp']
|
||||||
|
},
|
||||||
|
'signature': {
|
||||||
|
allowed: ['string']
|
||||||
|
},
|
||||||
|
'base64':{
|
||||||
|
allowed: ['boolean']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
answer: {
|
||||||
|
type: ['plaintext'],
|
||||||
|
data:{
|
||||||
|
data: 'string',
|
||||||
|
base64:'boolean',
|
||||||
|
info: 'object'
|
||||||
|
// file_name: Optional string of the plaintext file name.
|
||||||
|
// is_mime: Boolean if the messages claims it is MIME.
|
||||||
|
// signatures: Array of signatures
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
config_opt: {
|
||||||
|
required: {
|
||||||
|
'component':{
|
||||||
|
allowed: ['string'],
|
||||||
|
// allowed_data: ['gpg'] // TODO check all available
|
||||||
|
},
|
||||||
|
'option': {
|
||||||
|
allowed: ['string'],
|
||||||
|
// allowed_data: ['default-key'] // TODO check all available
|
||||||
|
}
|
||||||
|
},
|
||||||
|
optional: {},
|
||||||
|
answer: {
|
||||||
|
type: [],
|
||||||
|
data: {
|
||||||
|
option: 'object'
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TBD handling of secrets
|
* TBD handling of secrets
|
||||||
* TBD key modification?
|
* TBD key modification?
|
||||||
|
Loading…
Reference in New Issue
Block a user