/[winpt]/trunk/Src/wptGPGME.cpp
ViewVC logotype

Annotation of /trunk/Src/wptGPGME.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 47 - (hide annotations)
Mon Oct 31 14:04:59 2005 UTC (19 years, 4 months ago) by werner
File size: 7206 byte(s)
Minor changes; compiles now but gettext is still missing.

1 werner 36 /* wptGPGME.cpp - WinPT GPGME interface
2     * Copyright (C) 2001-2005 Timo Schulz
3     *
4     * This file is part of WinPT.
5     *
6     * WinPT is free software; you can redistribute it and/or
7     * modify it under the terms of the GNU General Public License
8     * as published by the Free Software Foundation; either version 2
9     * of the License, or (at your option) any later version.
10     *
11     * WinPT is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14     * General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with WinPT; if not, write to the Free Software Foundation,
18     * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19     */
20    
21     #ifdef HAVE_CONFIG_H
22     #include <config.h>
23     #endif
24    
25     #include <sys/types.h>
26     #include <sys/types.h>
27     #include <windows.h>
28    
29 werner 47 #include "resource.h"
30 werner 36 #include "wptNLS.h"
31     #include "wptGPG.h"
32     #include "wptErrors.h"
33     #include "wptTypes.h"
34     #include "wptW32API.h"
35     #include "wptVersion.h"
36     #include "wptCommonCtl.h"
37     #include "wptContext.h"
38     #include "wptRegistry.h"
39     #include "wptDlgs.h"
40    
41     #include "openpgp.h"
42    
43     BOOL CALLBACK keycache_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam);
44     void progress_cleanup (progress_filter_s * pfx);
45    
46     static gpg_keycache_t pub = NULL;
47     static gpg_keycache_t sec = NULL;
48     static unsigned int reload = 0;
49     static char *gpg_secring = NULL;
50    
51    
52     /* Reload the key cache. */
53     void
54     keycache_reload (HWND dlg)
55     {
56     refresh_cache_s rcs;
57    
58     memset (&rcs, 0, sizeof rcs);
59     rcs.kr_reload = rcs.kr_update = 1;
60     rcs.tr_update = 0;
61     DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,
62     keycache_dlg_proc, (LPARAM)&rcs);
63     }
64    
65    
66     /* Release both key cache objects. If @cleanup is 1,
67     also release other global structs. */
68     void
69     keycache_release (int cleanup)
70     {
71     int n = gpg_keycache_get_size (pub);
72     char tmpbuf[64];
73    
74     /* XXX: update the value when the cache has changed. */
75     sprintf (tmpbuf, "%d", n);
76     set_reg_key (HKEY_CURRENT_USER, "Software\\WinPT", "nKeys", tmpbuf);
77    
78     if (pub) {
79     gpg_keycache_release (pub);
80     pub = NULL;
81     }
82     if (sec) {
83     gpg_keycache_release (sec);
84     sec = NULL;
85     }
86     if (cleanup) {
87     if (gpg_secring)
88     free (gpg_secring);
89     gpg_secring = NULL;
90     }
91     }
92    
93    
94     /* Update the key with the keyid @keyid in the key cache.
95     If @is_sec is 1, the secret key cache is used. */
96     gpgme_error_t
97     keycache_update (int is_sec, const char *keyid)
98     {
99     gpg_keycache_t ctx = pub;
100     gpgme_error_t err;
101    
102     if (is_sec)
103     ctx = sec;
104     err = gpg_keycache_update_key (ctx, is_sec, pub, keyid);
105     if (is_sec)
106     gpg_keycache_prepare_single (ctx, keyid, NULL, gpg_secring);
107     return err;
108     }
109    
110     /* XXX: cache_keyring_names must be called then the GPG homedir changes! */
111    
112     /* Initialize both cache contexts. Use @pubring for the public
113     keyring and @secring for the secret keyring. */
114     gpgme_error_t
115     keycache_init (const char *pubring, const char *secring)
116     {
117     struct progress_filter_s pfx;
118     gpgme_error_t err;
119     int val = 0;
120     char *p;
121    
122     if (secring != NULL) {
123     free_if_alloc (gpg_secring);
124     gpg_secring = get_gnupg_keyring (0, NO_STRICT);
125     }
126    
127     if (reload) {
128     keycache_release (0);
129     reload = 0;
130     }
131     p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "nKeys");
132     if (p && *p != ' ') {
133     val = atoi (p);
134     free_if_alloc (p);
135     memset (&pfx, 0, sizeof (pfx));
136     }
137    
138     err = gpg_keycache_new (&pub);
139     if (err)
140     return err;
141     if (val != 0)
142     gpg_keycache_set_cb (pub, progress_callback, &pfx, val);
143     err = gpg_keycache_new (&sec);
144     if (!err)
145     err = gpg_keycache_init (pub, NULL, 0);
146     if (!err)
147     err = gpg_keycache_init( sec, NULL, 1 );
148     if( !err && pubring && *pubring )
149     err = gpg_keycache_prepare( pub, pubring, NULL );
150     if( !err && secring && * secring )
151     err = gpg_keycache_prepare( sec, NULL, secring );
152     if (!err)
153     gpg_keycache_sync (pub, sec);
154     if (val != 0)
155     progress_cleanup (&pfx);
156     return err;
157     }
158    
159    
160     /* If @val = 1 indicate to reload the cache. */
161     void
162     keycache_set_reload (int val)
163     {
164     reload = val;
165     }
166    
167    
168     /* Return the reload cache flag. */
169     int
170     keycache_get_reload (void)
171     {
172     return reload;
173     }
174    
175    
176     /* Return the public cache context if @is_pub is set
177     the secre cache context otherwise. */
178     gpg_keycache_t
179     keycache_get_ctx (int is_pub)
180     {
181     return is_pub? pub : sec;
182     }
183    
184    
185     /* Get the GPG key with keyid @keyid from the cache. Return it
186     in @r_key on success. */
187     static int
188     get_key_from_cache (const char *keyid, gpgme_key_t *r_key,
189     struct keycache_s **c, int secret)
190     {
191     gpg_keycache_t cache;
192     gpgme_error_t err;
193     int mode = secret? KEYCACHE_PRV : KEYCACHE_PUB;
194    
195     if (!keyid)
196     return WPTERR_GENERAL;
197     if (r_key)
198     *r_key = NULL;
199     cache = keycache_get_ctx (mode);
200     if (!cache)
201     BUG( NULL );
202     if (!c)
203     err = gpg_keycache_find_key (cache, keyid, 0, r_key);
204     else
205     err = gpg_keycache_find_key2 (cache, keyid, 0, r_key, c);
206     return err? WPTERR_GENERAL : 0;
207     }
208    
209    
210     /* Get GPG key with keyid @keyid directly from GPG and return
211     it in @r_key on success. */
212     static int
213     get_key_directly (const char *keyid, gpgme_key_t *r_key, int secret)
214     {
215     gpgme_ctx_t ctx;
216     gpgme_error_t err;
217    
218     err = gpgme_new (&ctx);
219     if (err)
220     return WPTERR_GENERAL;
221     err = gpgme_get_key (ctx, keyid, r_key, secret);
222     gpgme_release (ctx);
223     return err? WPTERR_GENERAL : 0;
224     }
225    
226    
227     /* Search the public key with @keyid as the keyid in the cache and
228     return the item in @k. */
229     int
230     winpt_get_pubkey (const char *keyid, winpt_key_s *k)
231     {
232     int rc;
233    
234     rc = get_key_from_cache (keyid, &k->ctx, &k->ext, 0);
235     if (rc)
236     return rc;
237     k->is_v3 = k->ctx->subkeys->pubkey_algo == GPGME_PK_RSA &&
238     strlen (k->ctx->subkeys->fpr) == 32;
239     k->is_protected = k->ext->gloflags.is_protected;
240     k->keyid = k->ctx->subkeys->keyid;
241     k->uid = k->ctx->uids->uid;
242     return rc;
243     }
244    
245    
246     int
247     winpt_get_seckey (const char *keyid, winpt_key_s *k)
248     {
249     int rc;
250     rc = get_key_from_cache (keyid, &k->ctx, &k->ext, 1);
251     if (rc)
252     return rc;
253     k->is_v3 = k->ctx->subkeys->pubkey_algo == GPGME_PK_RSA &&
254     strlen (k->ctx->subkeys->fpr) == 32;
255     k->is_protected = k->ext->gloflags.is_protected;
256     k->keyid = k->ctx->subkeys->keyid;
257     k->uid = k->ctx->uids->uid;
258     return rc;
259     }
260    
261    
262     int
263     get_pubkey (const char *keyid, gpgme_key_t *ret_key)
264     {
265     int rc;
266    
267     if (pub && sec)
268     rc = get_key_from_cache (keyid, ret_key, NULL, 0);
269     else
270     rc = get_key_directly (keyid, ret_key, 0);
271     return rc;
272     }
273    
274    
275     int
276     get_seckey (const char *keyid, gpgme_key_t *ret_skey)
277     {
278     int rc;
279    
280     if (pub && sec)
281     rc = get_key_from_cache (keyid, ret_skey, NULL, 1);
282     else
283     rc = get_key_directly (keyid, ret_skey, 1);
284     return rc;
285     }
286    
287    
288     /* Search for insecure ElGamal keys and return the
289     number of founded keys. */
290     int
291     count_insecure_elgkeys (void)
292     {
293     gpg_keycache_t pc;
294     gpgme_key_t key;
295     int n=0;
296    
297     pc = keycache_get_ctx (1);
298     if (!pc)
299     BUG (0);
300     while (!gpg_keycache_next_key (pc, 0, &key)) {
301     if (key->subkeys->pubkey_algo == GPGME_PK_ELG)
302     n++;
303     }
304     gpg_keycache_rewind (pc);
305     return n;
306     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26