9081cbe9c35c472832c2295bcfff3ace83b552cb
[gpgme.git] / lang / js / src / Keyring.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 import {createMessage} from './Message'
22 import {GPGME_Key, createKey} from './Key'
23 import { isFingerprint, toKeyIdArray } from './Helpers';
24 import { gpgme_error } from './Errors';
25
26 export class GPGME_Keyring {
27     constructor(){
28     }
29
30     /**
31      * @param {String} pattern (optional) pattern A pattern to search for,
32      * in userIds or KeyIds
33      * @param {Boolean} prepare_sync (optional, default true) if set to true,
34      * Key.armor and Key.hasSecret will be called, so they can be used
35      * inmediately. This allows for full synchronous use. If set to false,
36      * these will initially only be available as Promises in getArmor() and
37      * getHasSecret()
38      * @returns {Promise.<Array<GPGME_Key>>}
39      *
40      */
41     getKeys(pattern, prepare_sync){
42         let me = this;
43         return new Promise(function(resolve, reject) {
44             let msg;
45             msg = createMessage('keylist');
46             if (pattern !== undefined){
47                 msg.setParameter('keys', pattern);
48             }
49             msg.setParameter('sigs', true);
50             msg.post().then(function(result){
51                 let resultset = [];
52                 let promises = [];
53                 // TODO check if result.key is not empty
54                 for (let i=0; i< result.keys.length; i++){
55                     let k = createKey(result.keys[i].fingerprint, me);
56                     k.setKeyData(result.keys[i]);
57                     if (prepare_sync === true){
58                         promises.push(k.getArmor());
59                         promises.push(k.getHasSecret());
60                     }
61                     resultset.push(k);
62                 }
63                 if (promises.length > 0) {
64                     Promise.all(promises).then(function (res){
65                         resolve(resultset);
66                     }, function(error){
67                         reject(error);
68                     });
69                 }
70             }, function(error){
71                 reject(error);
72             });
73         });
74     }
75
76     /**
77      * Fetches the armored public Key blocks for all Keys matchin the pattern
78      * (if no pattern is given, fetches all known to gnupg)
79      * @param {String|Array<String>} pattern (optional)
80      * @returns {Promise<String>} Armored Key blocks
81      */
82     getKeysArmored(pattern) {
83         if (pattern)
84         return new Promise(function(resolve, reject) {
85             let msg = createMessage('export');
86             msg.setParameter('armor', true);
87             if (pattern !== undefined){
88                 msg.setParameter('keys', pattern);
89             }
90             msg.post().then(function(result){
91                 resolve(result.data);
92             }, function(error){
93                 reject(error);
94             });
95     }
96
97     // getDefaultKey() Big TODO
98     // importKeys(armoredKeys)
99     // generateKey  --> TODO (Andre noch anfragen!)
100
101 };