aboutsummaryrefslogtreecommitdiffstats
path: root/lang/js/src/Message.js
blob: f5e21e00ef014d3ba11583afa3d170a8e87f7f96 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/* gpgme.js - Javascript integration for gpgme
 * Copyright (C) 2018 Bundesamt für Sicherheit in der Informationstechnik
 *
 * This file is part of GPGME.
 *
 * GPGME is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * GPGME is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this program; if not, see <http://www.gnu.org/licenses/>.
 * SPDX-License-Identifier: LGPL-2.1+
 */
import { permittedOperations } from './permittedOperations'
import { GPGMEJS_Error } from './Errors'
export class GPGME_Message {
    //TODO getter

    constructor(operation){
        setOperation(this, operation);
    }

    get operation(){
        return this._msg.op;
    }

    /**
     * Sets a parameter for the message. Note that the operation has to be set
     * first, to be able to check if the parameter is permittted
     * @param {String} param Parameter to set
     * @param {any} value Value to set //TODO: Some type checking
     * @returns {Boolean} If the parameter was set successfully
     */
    setParameter(param,value){
        if (!param || typeof(param) !== 'string'){
            return new GPGMEJS_Error('WRONGPARAM', 'type check failed');
        }
        if (!this._msg || !this._msg.op){
            return new GPGMEJS_Error('MSG_OP_PENDING');
        }
        let po = permittedOperations[this._msg.op];
        if (!po){
            return new GPGMEJS_Error('WRONG_OP', param);
        }
        if (po.required.indexOf(param) >= 0 || po.optional.indexOf(param) >= 0){
            this._msg[param] = value;
            return true;
        }
        return new GPGMEJS_Error('WRONGPARAM', param);
    }

    /**
     * Check if the message has the minimum requirements to be sent, according
     * to the definitions in permittedOperations
     * @returns {Boolean}
     */
    get isComplete(){
        if (!this._msg.op){
            return false;
        }
        let reqParams = permittedOperations[this._msg.op].required;
        for (let i=0; i < reqParams.length; i++){

            if (!this._msg.hasOwnProperty(reqParams[i])){
                console.log(reqParams[i] + 'missing');
                return false;
            }
        }
        return true;
    }

    /**
     * Returns the prepared message with parameters and completeness checked
     * @returns {Object|null} Object to be posted to gnupg, or null if
     * incomplete
     */
    get message(){
        if (this.isComplete === true){
            return this._msg;
        }
        else {
            return null;
        }

    }
}

/**
 * Defines the operation this message will have
 * @param {String} operation Must be defined in permittedOperations
 *  TODO: move to constructor?
 */
function setOperation (scope, operation){
    if (!operation || typeof(operation) !== 'string'){
        return new GPGMEJS_Error('WRONGTYPE');
    }
    if (permittedOperations.hasOwnProperty(operation)){
        if (!scope._msg){
            scope._msg = {};
        }
        scope._msg.op = operation;
    } else {
        return new GPGMEJS_Error('WRONG_OP');
    }
}