js: Configuration and Error handling
[gpgme.git] / lang / js / src / Helpers.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 { gpgme_error } from "./Errors";
21
22 /**
23  * Tries to return an array of fingerprints, either from input fingerprints or
24  * from Key objects
25  * @param {Key |Array<Key>| GPGME_Key | Array<GPGME_Key>|String|Array<String>} input
26  * @returns {Array<String>} Array of fingerprints.
27  */
28
29 export function toKeyIdArray(input, nocheck){
30     if (!input){
31         gpgme_error('MSG_NO_KEYS');
32         return [];
33     }
34     if (!Array.isArray(input)){
35         input = [input];
36     }
37     let result = [];
38     for (let i=0; i < input.length; i++){
39         if (typeof(input[i]) === 'string'){
40             if (isFingerprint(input[i]) === true){
41                 result.push(input[i]);
42             } else {
43                 gpgme_error('MSG_NOT_A_FPR');
44             }
45         } else if (typeof(input[i]) === 'object'){
46             let fpr = '';
47             if (input[i] instanceof GPGME_Key){
48                 fpr = input[i].fingerprint;
49             } else if (input[i].hasOwnProperty(primaryKey) &&
50                 input[i].primaryKey.hasOwnProperty(getFingerprint)){
51                     fpr = input[i].primaryKey.getFingerprint();
52             }
53             if (isFingerprint(fpr) === true){
54                 result.push(fpr);
55             } else {
56                 gpgme_error('MSG_NOT_A_FPR');
57             }
58         } else {
59             return gpgme_error('PARAM_WRONG');
60         }
61     }
62     if (result.length === 0){
63         gpgme_error('MSG_NO_KEYS');
64         return [];
65     } else {
66         return result;
67     }
68 };
69
70 /**
71  * check if values are valid hexadecimal values of a specified length
72  * @param {*} key input value.
73  * @param {int} len the expected length of the value
74  */
75 function hextest(key, len){
76     if (!key || typeof(key) !== "string"){
77         return false;
78     }
79     if (key.length !== len){
80         return false;
81     }
82     let regexp= /^[0-9a-fA-F]*$/i;
83     return regexp.test(key);
84 };
85
86 /**
87  * check if the input is a valid Hex string with a length of 40
88  */
89 export function isFingerprint(string){
90     return hextest(string, 40);
91 };
92 /**
93  * check if the input is a valid Hex string with a length of 16
94  */
95 function isLongId(string){
96     return hextest(string, 16);
97 };
98
99 // TODO still not needed anywhere
100 function isShortId(string){
101     return hextest(string, 8);
102 };