aboutsummaryrefslogtreecommitdiffstats
path: root/lang/js/src/Connection.js
diff options
context:
space:
mode:
Diffstat (limited to 'lang/js/src/Connection.js')
-rw-r--r--lang/js/src/Connection.js58
1 files changed, 33 insertions, 25 deletions
diff --git a/lang/js/src/Connection.js b/lang/js/src/Connection.js
index e6ff67be..8bc3d42a 100644
--- a/lang/js/src/Connection.js
+++ b/lang/js/src/Connection.js
@@ -1,5 +1,3 @@
-import { GPGME_Message } from "./Message";
-
/* gpgme.js - Javascript integration for gpgme
* Copyright (C) 2018 Bundesamt für Sicherheit in der Informationstechnik
*
@@ -26,7 +24,8 @@ import { GPGME_Message } from "./Message";
* expected.
*/
import { permittedOperations } from './permittedOperations'
-import { GPGMEJS_Error} from "./Errors"
+import { GPGMEJS_Error } from "./Errors"
+import { GPGME_Message } from "./Message";
/**
* A Connection handles the nativeMessaging interaction.
@@ -60,20 +59,20 @@ export class Connection{
/**
* Opens a nativeMessaging port.
- * TODO: Error handling ALREADY_CONNECTED
*/
connect(){
if (this._isConnected === true){
- return new GPGMEJS_Error('ALREADY_CONNECTED');
+ GPGMEJS_Error('CONN_ALREADY_CONNECTED');
+ } else {
+ this._isConnected = true;
+ this._connection = chrome.runtime.connectNative('gpgmejson');
+ let me = this;
+ this._connection.onDisconnect.addListener(
+ function(){
+ me._isConnected = false;
+ }
+ );
}
- this._isConnected = true;
- this._connection = chrome.runtime.connectNative('gpgmejson');
- let me = this;
- this._connection.onDisconnect.addListener(
- function(){
- me._isConnected = false;
- }
- );
}
/**
@@ -84,28 +83,31 @@ export class Connection{
*/
post(message){
if (!this.isConnected){
- return Promise.reject(new GPGMEJS_Error('NO_CONNECT'));
+ return Promise.reject(GPGMEJS_Error('CONN_NO_CONNECT'));
}
if (!message || !message instanceof GPGME_Message){
- return Promise.reject(new GPGMEJS_Error('WRONGPARAM'));
+ return Promise.reject(GPGMEJS_Error('PARAM_WRONG'), message);
}
if (message.isComplete !== true){
- return Promise.reject(new GPGMEJS_Error('MSG_INCOMPLETE'));
+ return Promise.reject(GPGMEJS_Error('MSG_INCOMPLETE'));
}
- // let timeout = 5000; //TODO config
let me = this;
return new Promise(function(resolve, reject){
let answer = new Answer(message.operation);
let listener = function(msg) {
if (!msg){
me._connection.onMessage.removeListener(listener)
- reject(new GPGMEJS_Error('EMPTY_GPG_ANSWER'));
+ reject(GPGMEJS_Error('CONN_EMPTY_GPG_ANSWER'));
} else if (msg.type === "error"){
me._connection.onMessage.removeListener(listener)
- //TODO: GPGMEJS_Error?
- reject(msg.msg);
+ reject(
+ {code: 'GNUPG_ERROR',
+ msg: msg.msg} );
} else {
- answer.add(msg);
+ let answer_result = answer.add(msg);
+ if (answer_result !== true){
+ reject(answer_result);
+ }
if (msg.more === true){
me._connection.postMessage({'op': 'getmore'});
} else {
@@ -117,11 +119,12 @@ export class Connection{
me._connection.onMessage.addListener(listener);
me._connection.postMessage(message.message);
+
//TBD: needs to be aware if there is a pinentry pending
// setTimeout(
// function(){
// me.disconnect();
- // reject(new GPGMEJS_Error('TIMEOUT', 5000));
+ // reject(GPGMEJS_Error('CONN_TIMEOUT'));
// }, timeout);
});
}
@@ -141,6 +144,7 @@ class Answer{
/**
* Add the information to the answer
* @param {Object} msg The message as received with nativeMessaging
+ * returns true if successfull, GPGMEJS_Error otherwise
*/
add(msg){
if (this._response === undefined){
@@ -148,12 +152,15 @@ class Answer{
}
let messageKeys = Object.keys(msg);
let poa = permittedOperations[this.operation].answer;
+ if (messageKeys.length === 0){
+ return GPGMEJS_Error('CONN_UNEXPECTED_ANSWER');
+ }
for (let i= 0; i < messageKeys.length; i++){
let key = messageKeys[i];
switch (key) {
case 'type':
if ( msg.type !== 'error' && poa.type.indexOf(msg.type) < 0){
- return new GPGMEJS_Error('UNEXPECTED_ANSWER');
+ return GPGMEJS_Error('CONN_UNEXPECTED_ANSWER');
}
break;
case 'more':
@@ -172,7 +179,7 @@ class Answer{
this._response[key] = msg[key];
}
else if (this._response[key] !== msg[key]){
- return new GPGMEJS_Error('UNEXPECTED_ANSWER',msg[key]);
+ return GPGMEJS_Error('CONN_UNEXPECTED_ANSWER',msg[key]);
}
}
//infos may be json objects etc. Not yet defined.
@@ -184,11 +191,12 @@ class Answer{
this._response.push(msg[key]);
}
else {
- return new GPGMEJS_Error('UNEXPECTED_ANSWER', key);
+ return GPGMEJS_Error('CONN_UNEXPECTED_ANSWER', key);
}
break;
}
}
+ return true;
}
/**