js: Configuration and Error handling
[gpgme.git] / lang / js / src / Errors.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
21 const err_list = {
22     // Connection
23     'CONN_NO_CONNECT': {
24         msg:'Connection with the nativeMessaging host could not be'
25             + ' established.',
26         type: 'error'
27     },
28     'CONN_DISCONNECTED': {
29         msg:'Connection with the nativeMessaging host was lost.',
30         type: 'error'
31     },
32     'CONN_EMPTY_GPG_ANSWER':{
33         msg: 'The nativeMessaging answer was empty.',
34         type: 'error'
35     },
36     'CONN_TIMEOUT': {
37         msg: 'A connection timeout was exceeded.',
38         type: 'error'
39     },
40     'CONN_UNEXPECTED_ANSWER': {
41         msg: 'The answer from gnupg was not as expected.',
42         type: 'error'
43     },
44     'CONN_ALREADY_CONNECTED':{
45         msg: 'A connection was already established.',
46         type: 'warning'
47     },
48     // Message/Data
49     'MSG_INCOMPLETE': {
50         msg: 'The Message did not match the minimum requirements for'
51             + ' the interaction.',
52         type: 'error'
53     },
54     'MSG_EMPTY' : {
55         msg: 'The Message is empty.',
56         type: 'error'
57     },
58     'MSG_OP_PENDING': {
59         msg: 'There is no operation specified yet. The parameter cannot'
60             + ' be set',
61         type: 'warning'
62     },
63     'MSG_WRONG_OP': {
64         msg: 'The operation requested could not be found',
65         type: 'warning'
66     },
67     'MSG_NO_KEYS' : {
68         msg: 'There were no valid keys provided.',
69         type: 'warning'
70     },
71     'MSG_NOT_A_FPR': {
72         msg: 'The String is not an accepted fingerprint',
73         type: 'warning'
74     },
75     'KEY_INVALID': {
76         msg:'Key object is invalid',
77         type: 'error'
78     },
79     // generic
80     'PARAM_WRONG':{
81         msg: 'invalid parameter was found',
82         type: 'error'
83     },
84     'PARAM_IGNORED': {
85         msg: 'An parameter was set that has no effect in gpgmejs',
86         type: 'warning'
87     },
88     'NOT_IMPLEMENTED': {
89         msg: 'A openpgpjs parameter was submitted that is not implemented',
90         type: 'error'
91     },
92     'NOT_YET_IMPLEMENTED': {
93         msg: 'Support of this is probable, but it is not implemented yet',
94         type: 'error'
95     },
96     'GENERIC_ERROR': {
97         msg: 'Unspecified error',
98         type: 'error'
99     }
100 };
101
102 /**
103  * Checks the given error code and returns an error object with some
104  * information about meaning and origin
105  * @param {*} code Error code. Should be in err_list or 'GNUPG_ERROR'
106  * @param {*} info Error message passed through if code is 'GNUPG_ERROR'
107  */
108 export function gpgme_error(code = 'GENERIC_ERROR', info){
109     if (err_list.hasOwnProperty(code)){
110         if (err_list[code].type === 'error'){
111             return new GPGME_Error(code);
112         }
113         if (err_list[code].type === 'warning'){
114             console.log(new GPGME_Error(code));
115         }
116         return null;
117     } else if (code === 'GNUPG_ERROR'){
118         return new GPGME_Error(code, info.msg);
119     }
120     else {
121         return new GPGME_Error('GENERIC_ERROR');
122     }
123 }
124
125 class GPGME_Error extends Error{
126     constructor(code, msg=''){
127         if (code === 'GNUPG_ERROR' && typeof(msg) === 'string'){
128             super(msg);
129         } else if (err_list.hasOwnProperty(code)){
130             super(err_list[code].msg);
131         } else {
132             super(err_list['GENERIC_ERROR'].msg);
133         }
134         this.code = code || 'GENERIC_ERROR';
135     }
136     set code(value){
137         this._code = value;
138     }
139     get code(){
140         return this._code;
141     }
142 }