aboutsummaryrefslogtreecommitdiffstats
path: root/lang/js/src/Connection.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lang/js/src/Connection.js372
1 files changed, 187 insertions, 185 deletions
diff --git a/lang/js/src/Connection.js b/lang/js/src/Connection.js
index d482667e..561a5b70 100644
--- a/lang/js/src/Connection.js
+++ b/lang/js/src/Connection.js
@@ -52,128 +52,128 @@ export class Connection{
};
- /**
- * @typedef {Object} backEndDetails
- * @property {String} gpgme Version number of gpgme
- * @property {Array<Object>} info Further information about the backend
- * and the used applications (Example:
- * {
- * "protocol": "OpenPGP",
- * "fname": "/usr/bin/gpg",
- * "version": "2.2.6",
- * "req_version": "1.4.0",
- * "homedir": "default"
- * }
- */
+ /**
+ * @typedef {Object} backEndDetails
+ * @property {String} gpgme Version number of gpgme
+ * @property {Array<Object>} info Further information about the backend
+ * and the used applications (Example:
+ * {
+ * "protocol": "OpenPGP",
+ * "fname": "/usr/bin/gpg",
+ * "version": "2.2.6",
+ * "req_version": "1.4.0",
+ * "homedir": "default"
+ * }
+ */
- /**
- * Retrieves the information about the backend.
- * @param {Boolean} details (optional) If set to false, the promise will
- * just return if a connection was successful.
- * @returns {Promise<backEndDetails>|Promise<Boolean>} Details from the
- * backend
- * @async
- */
- this.checkConnection = function(details = true){
- const msg = createMessage('version');
- if (details === true) {
- return this.post(msg);
- } else {
- let me = this;
- return new Promise(function(resolve) {
- Promise.race([
- me.post(msg),
- new Promise(function(resolve, reject){
- setTimeout(function(){
- reject(gpgme_error('CONN_TIMEOUT'));
- }, 500);
- })
- ]).then(function(){ // success
- resolve(true);
- }, function(){ // failure
- resolve(false);
+ /**
+ * Retrieves the information about the backend.
+ * @param {Boolean} details (optional) If set to false, the promise will
+ * just return if a connection was successful.
+ * @returns {Promise<backEndDetails>|Promise<Boolean>} Details from the
+ * backend
+ * @async
+ */
+ this.checkConnection = function(details = true){
+ const msg = createMessage('version');
+ if (details === true) {
+ return this.post(msg);
+ } else {
+ let me = this;
+ return new Promise(function(resolve) {
+ Promise.race([
+ me.post(msg),
+ new Promise(function(resolve, reject){
+ setTimeout(function(){
+ reject(gpgme_error('CONN_TIMEOUT'));
+ }, 500);
+ })
+ ]).then(function(){ // success
+ resolve(true);
+ }, function(){ // failure
+ resolve(false);
+ });
});
- });
- }
- };
+ }
+ };
- /**
- * Sends a {@link GPGME_Message} via tghe nativeMessaging port. It resolves
- * with the completed answer after all parts have been received and
- * reassembled, or rejects with an {@link GPGME_Error}.
- *
- * @param {GPGME_Message} message
- * @returns {Promise<Object>} The collected answer
- * @async
- */
- this.post = function (message){
- if (!message || !(message instanceof GPGME_Message)){
- this.disconnect();
- return Promise.reject(gpgme_error(
- 'PARAM_WRONG', 'Connection.post'));
- }
- if (message.isComplete() !== true){
- this.disconnect();
- return Promise.reject(gpgme_error('MSG_INCOMPLETE'));
- }
- let chunksize = message.chunksize;
- return new Promise(function(resolve, reject){
- let answer = new Answer(message);
- let listener = function(msg) {
- if (!msg){
- _connection.onMessage.removeListener(listener);
- _connection.disconnect();
- reject(gpgme_error('CONN_EMPTY_GPG_ANSWER'));
- } else {
- let answer_result = answer.collect(msg);
- if (answer_result !== true){
+ /**
+ * Sends a {@link GPGME_Message} via tghe nativeMessaging port. It
+ * resolves with the completed answer after all parts have been
+ * received and reassembled, or rejects with an {@link GPGME_Error}.
+ *
+ * @param {GPGME_Message} message
+ * @returns {Promise<Object>} The collected answer
+ * @async
+ */
+ this.post = function (message){
+ if (!message || !(message instanceof GPGME_Message)){
+ this.disconnect();
+ return Promise.reject(gpgme_error(
+ 'PARAM_WRONG', 'Connection.post'));
+ }
+ if (message.isComplete() !== true){
+ this.disconnect();
+ return Promise.reject(gpgme_error('MSG_INCOMPLETE'));
+ }
+ let chunksize = message.chunksize;
+ return new Promise(function(resolve, reject){
+ let answer = new Answer(message);
+ let listener = function(msg) {
+ if (!msg){
_connection.onMessage.removeListener(listener);
_connection.disconnect();
- reject(answer_result);
+ reject(gpgme_error('CONN_EMPTY_GPG_ANSWER'));
} else {
- if (msg.more === true){
- _connection.postMessage({
- 'op': 'getmore',
- 'chunksize': chunksize
- });
- } else {
+ let answer_result = answer.collect(msg);
+ if (answer_result !== true){
_connection.onMessage.removeListener(listener);
_connection.disconnect();
- const message = answer.getMessage();
- if (message instanceof Error){
- reject(message);
+ reject(answer_result);
+ } else {
+ if (msg.more === true){
+ _connection.postMessage({
+ 'op': 'getmore',
+ 'chunksize': chunksize
+ });
} else {
- resolve(message);
+ _connection.onMessage.removeListener(listener);
+ _connection.disconnect();
+ const message = answer.getMessage();
+ if (message instanceof Error){
+ reject(message);
+ } else {
+ resolve(message);
+ }
}
}
}
- }
- };
- _connection.onMessage.addListener(listener);
- if (permittedOperations[message.operation].pinentry){
- return _connection.postMessage(message.message);
- } else {
- return Promise.race([
- _connection.postMessage(message.message),
- function(resolve, reject){
- setTimeout(function(){
+ };
+ _connection.onMessage.addListener(listener);
+ if (permittedOperations[message.operation].pinentry){
+ return _connection.postMessage(message.message);
+ } else {
+ return Promise.race([
+ _connection.postMessage(message.message),
+ function(resolve, reject){
+ setTimeout(function(){
+ _connection.disconnect();
+ reject(gpgme_error('CONN_TIMEOUT'));
+ }, 5000);
+ }]).then(function(result){
+ return result;
+ }, function(reject){
+ if(!(reject instanceof Error)) {
_connection.disconnect();
- reject(gpgme_error('CONN_TIMEOUT'));
- }, 5000);
- }]).then(function(result){
- return result;
- }, function(reject){
- if(!(reject instanceof Error)) {
- _connection.disconnect();
- return gpgme_error('GNUPG_ERROR', reject);
- } else {
- return reject;
- }
- });
- }
- });
- };
-}
+ return gpgme_error('GNUPG_ERROR', reject);
+ } else {
+ return reject;
+ }
+ });
+ }
+ });
+ };
+ }
}
/**
@@ -197,82 +197,84 @@ class Answer{
this.getExpect = function(){
return expect;
};
- /**
- * Adds incoming base64 encoded data to the existing response
- * @param {*} msg base64 encoded data.
- * @returns {Boolean}
- *
- * @private
- */
- this.collect = function (msg){
- if (typeof(msg) !== 'object' || !msg.hasOwnProperty('response')) {
- return gpgme_error('CONN_UNEXPECTED_ANSWER');
- }
- if (response_b64 === null){
- response_b64 = msg.response;
- return true;
- } else {
- response_b64 += msg.response;
- return true;
- }
- };
- /**
- * Returns the base64 encoded answer data with the content verified against
- * {@link permittedOperations}.
- */
- this.getMessage = function (){
- if (response_b64 === undefined){
- return gpgme_error('CONN_UNEXPECTED_ANSWER');
- }
- let _decodedResponse = JSON.parse(atob(response_b64));
- let _response = {};
- let messageKeys = Object.keys(_decodedResponse);
- let poa = permittedOperations[this.getOperation()].answer;
- if (messageKeys.length === 0){
- return gpgme_error('CONN_UNEXPECTED_ANSWER');
- }
- for (let i= 0; i < messageKeys.length; i++){
- let key = messageKeys[i];
- switch (key) {
- case 'type':
- if (_decodedResponse.type === 'error'){
- return (gpgme_error('GNUPG_ERROR',
- decodeURIComponent(escape(_decodedResponse.msg))));
- } else if (poa.type.indexOf(_decodedResponse.type) < 0){
- return gpgme_error('CONN_UNEXPECTED_ANSWER');
- }
- break;
- case 'base64':
- break;
- case 'msg':
- if (_decodedResponse.type === 'error'){
- return (gpgme_error('GNUPG_ERROR', _decodedResponse.msg));
- }
- break;
- default:
- if (!poa.data.hasOwnProperty(key)){
- return gpgme_error('CONN_UNEXPECTED_ANSWER');
- }
- if( typeof(_decodedResponse[key]) !== poa.data[key] ){
- return gpgme_error('CONN_UNEXPECTED_ANSWER');
- }
- if (_decodedResponse.base64 === true
- && poa.data[key] === 'string'
- && this.getExpect() === undefined
- ){
- _response[key] = decodeURIComponent(
- atob(_decodedResponse[key]).split('').map(
- function(c) {
- return '%' +
- ('00' + c.charCodeAt(0).toString(16)).slice(-2);
- }).join(''));
- } else {
- _response[key] = _decodedResponse[key];
+
+ /**
+ * Adds incoming base64 encoded data to the existing response
+ * @param {*} msg base64 encoded data.
+ * @returns {Boolean}
+ *
+ * @private
+ */
+ this.collect = function (msg){
+ if (typeof(msg) !== 'object' || !msg.hasOwnProperty('response')) {
+ return gpgme_error('CONN_UNEXPECTED_ANSWER');
+ }
+ if (response_b64 === null){
+ response_b64 = msg.response;
+ return true;
+ } else {
+ response_b64 += msg.response;
+ return true;
+ }
+ };
+ /**
+ * Returns the base64 encoded answer data with the content verified
+ * against {@link permittedOperations}.
+ */
+ this.getMessage = function (){
+ if (response_b64 === undefined){
+ return gpgme_error('CONN_UNEXPECTED_ANSWER');
+ }
+ let _decodedResponse = JSON.parse(atob(response_b64));
+ let _response = {};
+ let messageKeys = Object.keys(_decodedResponse);
+ let poa = permittedOperations[this.getOperation()].answer;
+ if (messageKeys.length === 0){
+ return gpgme_error('CONN_UNEXPECTED_ANSWER');
+ }
+ for (let i= 0; i < messageKeys.length; i++){
+ let key = messageKeys[i];
+ switch (key) {
+ case 'type':
+ if (_decodedResponse.type === 'error'){
+ return (gpgme_error('GNUPG_ERROR',
+ decodeURIComponent(escape(_decodedResponse.msg))));
+ } else if (poa.type.indexOf(_decodedResponse.type) < 0){
+ return gpgme_error('CONN_UNEXPECTED_ANSWER');
+ }
+ break;
+ case 'base64':
+ break;
+ case 'msg':
+ if (_decodedResponse.type === 'error'){
+ return (gpgme_error('GNUPG_ERROR',
+ _decodedResponse.msg));
+ }
+ break;
+ default:
+ if (!poa.data.hasOwnProperty(key)){
+ return gpgme_error('CONN_UNEXPECTED_ANSWER');
+ }
+ if( typeof(_decodedResponse[key]) !== poa.data[key] ){
+ return gpgme_error('CONN_UNEXPECTED_ANSWER');
+ }
+ if (_decodedResponse.base64 === true
+ && poa.data[key] === 'string'
+ && this.getExpect() === undefined
+ ){
+ _response[key] = decodeURIComponent(
+ atob(_decodedResponse[key]).split('').map(
+ function(c) {
+ return '%' +
+ ('00' + c.charCodeAt(0).toString(16)).slice(-2);
+ }).join(''));
+ } else {
+ _response[key] = _decodedResponse[key];
+ }
+ break;
}
- break;
}
- }
- return _response;
- };
-}
+ return _response;
+ };
+ }
}