js: Configuration and Error handling
[gpgme.git] / lang / js / src / Message.js
1 /* gpgme.js - Javascript integration for gpgme
2  * Copyright (C) 2018 Bundesamt für Sicherheit in der Informationstechnik
3  *
4  * This file is part of GPGME.
5  *
6  * GPGME is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as
8  * published by the Free Software Foundation; either version 2.1 of
9  * the License, or (at your option) any later version.
10  *
11  * GPGME is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
18  * SPDX-License-Identifier: LGPL-2.1+
19  */
20 import { permittedOperations } from './permittedOperations'
21 import { gpgme_error } from './Errors'
22 export class GPGME_Message {
23     //TODO getter
24
25     constructor(operation){
26         setOperation(this, operation);
27     }
28
29     get operation(){
30         return this._msg.op;
31     }
32
33     /**
34      * Sets a parameter for the message. Note that the operation has to be set
35      * first, to be able to check if the parameter is permittted
36      * @param {String} param Parameter to set
37      * @param {any} value Value to set //TODO: Some type checking
38      * @returns {Boolean} If the parameter was set successfully
39      */
40     setParameter(param,value){
41         if (!param || typeof(param) !== 'string'){
42             return gpgme_error('PARAM_WRONG');
43         }
44         if (!this._msg || !this._msg.op){
45             return gpgme_error('MSG_OP_PENDING');
46         }
47         let po = permittedOperations[this._msg.op];
48         if (!po){
49             return gpgme_error('MSG_WRONG_OP');
50         }
51         if (po.required.indexOf(param) >= 0 || po.optional.indexOf(param) >= 0){
52             this._msg[param] = value;
53             return true;
54         }
55         return gpgme_error('PARAM_WRONG');
56     }
57
58     /**
59      * Check if the message has the minimum requirements to be sent, according
60      * to the definitions in permittedOperations
61      * @returns {Boolean}
62      */
63     get isComplete(){
64         if (!this._msg.op){
65             return false;
66         }
67         let reqParams = permittedOperations[this._msg.op].required;
68         for (let i=0; i < reqParams.length; i++){
69
70             if (!this._msg.hasOwnProperty(reqParams[i])){
71                 console.log(reqParams[i] + 'missing');
72                 return false;
73             }
74         }
75         return true;
76     }
77
78     /**
79      * Returns the prepared message with parameters and completeness checked
80      * @returns {Object|null} Object to be posted to gnupg, or null if
81      * incomplete
82      */
83     get message(){
84         if (this.isComplete === true){
85             return this._msg;
86         }
87         else {
88             return null;
89         }
90
91     }
92 }
93
94 /**
95  * Defines the operation this message will have
96  * @param {String} operation Must be defined in permittedOperations
97  *  TODO: move to constructor?
98  */
99 function setOperation (scope, operation){
100     if (!operation || typeof(operation) !== 'string'){
101         return gpgme_error('PARAM_WRONG');
102     }
103     if (permittedOperations.hasOwnProperty(operation)){
104         if (!scope._msg){
105             scope._msg = {};
106         }
107         scope._msg.op = operation;
108     } else {
109         return gpgme_error('MSG_WRONG_OP');
110     }
111 }