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