aboutsummaryrefslogtreecommitdiffstats
path: root/lang/js/src
diff options
context:
space:
mode:
authorMaximilian Krambach <[email protected]>2018-05-28 14:52:50 +0000
committerMaximilian Krambach <[email protected]>2018-05-28 14:52:50 +0000
commitd4adbf453d39659eee378b2be1d7125315d76083 (patch)
treef560b50bacf8b64a019326c2cf4c72b43457adc8 /lang/js/src
parentjs: implement Key handling (1) (diff)
downloadgpgme-d4adbf453d39659eee378b2be1d7125315d76083.tar.gz
gpgme-d4adbf453d39659eee378b2be1d7125315d76083.zip
js: Treat a connection as a gpgme Context
-- * After an operation a connection should be disconnected again. The "end of operation" is now assumed to be either an error as answer, or a message not including a "more" * GPGME, GPGME_Key, GPGME_Keyring don't require a connection anymore * Message.js: The Message.post() method will open a connection as required
Diffstat (limited to '')
-rw-r--r--lang/js/src/Connection.js14
-rw-r--r--lang/js/src/Key.js42
-rw-r--r--lang/js/src/Keyring.js20
-rw-r--r--lang/js/src/Message.js18
-rw-r--r--lang/js/src/gpgmejs.js45
-rw-r--r--lang/js/src/index.js2
6 files changed, 48 insertions, 93 deletions
diff --git a/lang/js/src/Connection.js b/lang/js/src/Connection.js
index 3b442622..3480d811 100644
--- a/lang/js/src/Connection.js
+++ b/lang/js/src/Connection.js
@@ -102,9 +102,11 @@ export class Connection{
}
if (!message || !message instanceof GPGME_Message){
+ this.disconnect();
return Promise.reject(gpgme_error('PARAM_WRONG'), message);
}
if (message.isComplete !== true){
+ this.disconnect();
return Promise.reject(gpgme_error('MSG_INCOMPLETE'));
}
let me = this;
@@ -113,25 +115,27 @@ export class Connection{
let listener = function(msg) {
if (!msg){
me._connection.onMessage.removeListener(listener)
+ me._connection.disconnect();
reject(gpgme_error('CONN_EMPTY_GPG_ANSWER'));
} else if (msg.type === "error"){
me._connection.onMessage.removeListener(listener);
+ me._connection.disconnect();
reject(gpgme_error('GNUPG_ERROR', msg.msg));
} else {
let answer_result = answer.add(msg);
if (answer_result !== true){
me._connection.onMessage.removeListener(listener);
+ me._connection.disconnect();
reject(answer_result);
- }
- if (msg.more === true){
+ } else if (msg.more === true){
me._connection.postMessage({'op': 'getmore'});
} else {
me._connection.onMessage.removeListener(listener)
+ me._connection.disconnect();
resolve(answer.message);
}
}
};
-
me._connection.onMessage.addListener(listener);
if (permittedOperations[message.operation].pinentry){
return me._connection.postMessage(message.message);
@@ -140,12 +144,14 @@ export class Connection{
me._connection.postMessage(message.message),
function(resolve, reject){
setTimeout(function(){
+ me._connection.disconnect();
reject(gpgme_error('CONN_TIMEOUT'));
}, 5000);
}]).then(function(result){
- return result;
+ return result;
}, function(reject){
if(!reject instanceof Error) {
+ me._connection.disconnect();
return gpgme_error('GNUPG_ERROR', reject);
} else {
return reject;
diff --git a/lang/js/src/Key.js b/lang/js/src/Key.js
index 7d3d82b1..13c99542 100644
--- a/lang/js/src/Key.js
+++ b/lang/js/src/Key.js
@@ -30,27 +30,16 @@ import { isFingerprint, isLongId } from './Helpers'
import { gpgme_error } from './Errors'
import { createMessage } from './Message';
import { permittedOperations } from './permittedOperations';
-import { Connection } from './Connection';
/**
- * Validates the fingerprint, and checks for tha availability of a connection.
- * If both are available, a Key will be returned.
+ * Validates the fingerprint.
* @param {String} fingerprint
- * @param {Object} parent Either a Connection, or the invoking object with a
- * Connection (e.g. Keyring)
*/
-export function createKey(fingerprint, parent){
+export function createKey(fingerprint){
if (!isFingerprint(fingerprint)){
return gpgme_error('PARAM_WRONG');
}
- if ( parent instanceof Connection){
- return new GPGME_Key(fingerprint, parent);
- } else if ( parent.hasOwnProperty('connection') &&
- parent.connection instanceof Connection){
- return new GPGME_Key(fingerprint, parent.connection);
- } else {
- return gpgme_error('PARAM_WRONG');
- }
+ else return new GPGME_Key(fingerprint);
}
/**
@@ -58,28 +47,8 @@ export function createKey(fingerprint, parent){
*/
export class GPGME_Key {
- constructor(fingerprint, connection){
+ constructor(fingerprint){
this.fingerprint = fingerprint;
- this.connection = connection;
- }
-
- set connection(conn){
- if (this._connection instanceof Connection) {
- gpgme_error('CONN_ALREADY_CONNECTED');
- } else if (conn instanceof Connection ) {
- this._connection = conn;
- }
- }
-
- get connection(){
- if (!this._data.fingerprint){
- return gpgme_error('KEY_INVALID');
- }
- if (!this._connection instanceof Connection){
- return gpgme_error('CONN_NO_CONNECT');
- } else {
- return this._connection;
- }
}
set fingerprint(fpr){
@@ -219,7 +188,8 @@ export class GPGME_Key {
let msg = createMessage('keylist');
msg.setParameter('sigs', true);
msg.setParameter('keys', me._data.fingerprint);
- me.connection.post(msg).then(function(result){
+ console.log(msg);
+ msg.post().then(function(result){
if (result.keys.length === 1){
me.setKeydata(result.keys[0]);
resolve(me);
diff --git a/lang/js/src/Keyring.js b/lang/js/src/Keyring.js
index 80792f77..9abb9ec3 100644
--- a/lang/js/src/Keyring.js
+++ b/lang/js/src/Keyring.js
@@ -22,23 +22,9 @@ import {createMessage} from './Message'
import {GPGME_Key} from './Key'
import { isFingerprint } from './Helpers';
import { gpgme_error } from './Errors';
-import { Connection } from './Connection';
export class GPGME_Keyring {
- constructor(connection){
- this.connection = connection;
- }
-
- set connection(connection){
- if (!this._connection && connection instanceof Connection){
- this._connection = connection;
- }
- }
- get connection(){
- if (this._connection instanceof Connection){
- return this._connection;
- }
- return gpgme_error('CONN_NO_CONNECT');
+ constructor(){
}
/**
@@ -58,7 +44,7 @@ export class GPGME_Keyring {
if (include_secret){
msg.setParameter('with-secret', true);
}
- me.connection.post(msg).then(function(result){
+ msg.post().then(function(result){
let fpr_list = [];
let resultset = [];
if (!Array.isArray(result.keys)){
@@ -68,7 +54,7 @@ export class GPGME_Keyring {
fpr_list = result.keys;
}
for (let i=0; i < fpr_list.length; i++){
- let newKey = new GPGME_Key(fpr_list[i], me._connection);
+ let newKey = new GPGME_Key(fpr_list[i]);
if (newKey instanceof GPGME_Key){
resultset.push(newKey);
}
diff --git a/lang/js/src/Message.js b/lang/js/src/Message.js
index 932212a6..5664f723 100644
--- a/lang/js/src/Message.js
+++ b/lang/js/src/Message.js
@@ -19,6 +19,7 @@
*/
import { permittedOperations } from './permittedOperations'
import { gpgme_error } from './Errors'
+import { Connection } from './Connection';
export function createMessage(operation){
if (typeof(operation) !== 'string'){
@@ -193,4 +194,21 @@ export class GPGME_Message {
}
}
+
+ post(){
+ let me = this;
+ return new Promise(function(resolve, reject) {
+ if (me.isComplete === true) {
+ let conn = new Connection;
+ conn.post(me).then(function(response) {
+ resolve(response);
+ }, function(reason) {
+ reject(gpgme_error('GNUPG_ERROR', reason));
+ });
+ }
+ else {
+ reject(gpgme_error('MSG_INCOMPLETE'));
+ }
+ });
+ }
}
diff --git a/lang/js/src/gpgmejs.js b/lang/js/src/gpgmejs.js
index c182c175..88a91a60 100644
--- a/lang/js/src/gpgmejs.js
+++ b/lang/js/src/gpgmejs.js
@@ -18,7 +18,6 @@
* SPDX-License-Identifier: LGPL-2.1+
*/
-import {Connection} from "./Connection"
import {GPGME_Message, createMessage} from './Message'
import {toKeyIdArray} from "./Helpers"
import { gpgme_error } from "./Errors"
@@ -29,31 +28,20 @@ export class GpgME {
* initializes GpgME by opening a nativeMessaging port
* TODO: add configuration
*/
- constructor(connection){
- this.connection = connection;
+ constructor(config){ //TODO config not parsed
+ this._config = config;
}
- set connection(conn){
- if (this._connection instanceof Connection){
- gpgme_error('CONN_ALREADY_CONNECTED');
- } else if (conn instanceof Connection){
- this._connection = conn;
- } else {
- gpgme_error('PARAM_WRONG');
- }
- }
-
- get connection(){
- return this._connection;
- }
-
- set Keyring(keyring){
+ set Keyring(keyring){
if (keyring && keyring instanceof GPGME_Keyring){
this._Keyring = keyring;
}
}
get Keyring(){
+ if (!this._Keyring){
+ this._Keyring = new GPGME_Keyring;
+ }
return this._Keyring;
}
@@ -81,7 +69,7 @@ export class GpgME {
msg.setParameter('throw-keyids', true);
};
if (msg.isComplete === true){
- return this.connection.post(msg);
+ return msg.post();
} else {
return Promise.reject(gpgme_error('MSG_INCOMPLETE'));
}
@@ -110,7 +98,7 @@ export class GpgME {
return Promise.reject(msg);
}
putData(msg, data);
- return this.connection.post(msg);
+ return msg.post();
}
@@ -135,7 +123,7 @@ export class GpgME {
}
let me = this;
return new Promise(function(resolve,reject) {
- me.connection.post(msg).then( function(message) {
+ msg.post().then( function(message) {
if (mode === 'clearsign'){
resolve({
data: message.data}
@@ -174,20 +162,7 @@ export class GpgME {
// TBD
}
if (msg.isComplete === true){
- this.connection.post(msg).then(function(success){
- // TODO: it seems that there is always errors coming back:
- }, function(error){
- switch (error.msg){
- case 'ERR_NO_ERROR':
- return Promise.resolve('okay'); //TBD
- default:
- return Promise.reject(gpgme_error('TODO') ); //
- // INV_VALUE,
- // GPG_ERR_NO_PUBKEY,
- // GPG_ERR_AMBIGUOUS_NAME,
- // GPG_ERR_CONFLICT
- }
- });
+ return msg.post();
} else {
return Promise.reject(gpgme_error('MSG_INCOMPLETE'));
}
diff --git a/lang/js/src/index.js b/lang/js/src/index.js
index 7f969fee..220a6984 100644
--- a/lang/js/src/index.js
+++ b/lang/js/src/index.js
@@ -37,7 +37,7 @@ function init(config){
connection.checkConnection(false).then(
function(result){
if (result === true) {
- resolve(new GpgME(connection, _conf));
+ resolve(new GpgME(_conf));
} else {
reject(gpgme_error('CONN_NO_CONNECT'));
}