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

Annotation of /trunk/Src/wptGPGME.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 109 - (hide annotations)
Fri Dec 2 07:32:13 2005 UTC (19 years, 3 months ago) by twoaday
File size: 8232 byte(s)
2005-12-01  Timo Schulz  <ts@g10code.com>
 
        * wptClipVerifyDlg.cpp (clipverify_dlg_proc): Use new semantic
        for get_gpg_sigstat().
        * wptGPGME.cpp (get_gpg_sigstat): New. It is now a function.
        As a macro strings will not be translated at runtime.
        * wptKeyserverDlg.cpp (hkp_recv_key): Properly detect if we
        need to update the cache. Thanks to Jan-Oliver.
        * wptKeyImportStatusDlg.cpp (import_status_dlg_proc): Localized.
         

Prepare a new release.


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     #ifdef HAVE_CONFIG_H
21     #include <config.h>
22     #endif
23    
24     #include <sys/types.h>
25     #include <windows.h>
26    
27 werner 47 #include "resource.h"
28 werner 36 #include "wptNLS.h"
29     #include "wptGPG.h"
30     #include "wptErrors.h"
31     #include "wptTypes.h"
32     #include "wptW32API.h"
33     #include "wptVersion.h"
34     #include "wptCommonCtl.h"
35     #include "wptContext.h"
36     #include "wptRegistry.h"
37     #include "wptDlgs.h"
38    
39     #include "openpgp.h"
40    
41     BOOL CALLBACK keycache_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam);
42     void progress_cleanup (progress_filter_s * pfx);
43    
44     static gpg_keycache_t pub = NULL;
45     static gpg_keycache_t sec = NULL;
46     static unsigned int reload = 0;
47     static char *gpg_secring = NULL;
48    
49    
50     /* Reload the key cache. */
51     void
52     keycache_reload (HWND dlg)
53     {
54     refresh_cache_s rcs;
55    
56     memset (&rcs, 0, sizeof rcs);
57     rcs.kr_reload = rcs.kr_update = 1;
58     rcs.tr_update = 0;
59     DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,
60     keycache_dlg_proc, (LPARAM)&rcs);
61     }
62    
63    
64     /* Release both key cache objects. If @cleanup is 1,
65     also release other global structs. */
66     void
67     keycache_release (int cleanup)
68     {
69     int n = gpg_keycache_get_size (pub);
70     char tmpbuf[64];
71    
72     /* XXX: update the value when the cache has changed. */
73     sprintf (tmpbuf, "%d", n);
74     set_reg_key (HKEY_CURRENT_USER, "Software\\WinPT", "nKeys", tmpbuf);
75    
76     if (pub) {
77     gpg_keycache_release (pub);
78     pub = NULL;
79     }
80     if (sec) {
81     gpg_keycache_release (sec);
82     sec = NULL;
83     }
84     if (cleanup) {
85     if (gpg_secring)
86     free (gpg_secring);
87     gpg_secring = NULL;
88     }
89     }
90    
91    
92     /* Update the key with the keyid @keyid in the key cache.
93     If @is_sec is 1, the secret key cache is used. */
94     gpgme_error_t
95     keycache_update (int is_sec, const char *keyid)
96     {
97     gpg_keycache_t ctx = pub;
98     gpgme_error_t err;
99    
100     if (is_sec)
101     ctx = sec;
102     err = gpg_keycache_update_key (ctx, is_sec, pub, keyid);
103     if (is_sec)
104     gpg_keycache_prepare_single (ctx, keyid, NULL, gpg_secring);
105     return err;
106     }
107    
108     /* XXX: cache_keyring_names must be called then the GPG homedir changes! */
109    
110     /* Initialize both cache contexts. Use @pubring for the public
111     keyring and @secring for the secret keyring. */
112     gpgme_error_t
113     keycache_init (const char *pubring, const char *secring)
114     {
115     struct progress_filter_s pfx;
116     gpgme_error_t err;
117     int val = 0;
118     char *p;
119    
120     if (secring != NULL) {
121     free_if_alloc (gpg_secring);
122     gpg_secring = get_gnupg_keyring (0, NO_STRICT);
123     }
124    
125     if (reload) {
126     keycache_release (0);
127     reload = 0;
128     }
129     p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "nKeys");
130     if (p && *p != ' ') {
131     val = atoi (p);
132     free_if_alloc (p);
133     memset (&pfx, 0, sizeof (pfx));
134     }
135    
136     err = gpg_keycache_new (&pub);
137     if (err)
138     return err;
139     if (val != 0)
140     gpg_keycache_set_cb (pub, progress_callback, &pfx, val);
141     err = gpg_keycache_new (&sec);
142     if (!err)
143     err = gpg_keycache_init (pub, NULL, 0);
144     if (!err)
145     err = gpg_keycache_init( sec, NULL, 1 );
146     if( !err && pubring && *pubring )
147     err = gpg_keycache_prepare( pub, pubring, NULL );
148     if( !err && secring && * secring )
149     err = gpg_keycache_prepare( sec, NULL, secring );
150     if (!err)
151     gpg_keycache_sync (pub, sec);
152     if (val != 0)
153     progress_cleanup (&pfx);
154     return err;
155     }
156    
157    
158     /* If @val = 1 indicate to reload the cache. */
159     void
160     keycache_set_reload (int val)
161     {
162     reload = val;
163     }
164    
165    
166     /* Return the reload cache flag. */
167     int
168     keycache_get_reload (void)
169     {
170     return reload;
171     }
172    
173    
174     /* Return the public cache context if @is_pub is set
175     the secre cache context otherwise. */
176     gpg_keycache_t
177     keycache_get_ctx (int is_pub)
178     {
179     return is_pub? pub : sec;
180     }
181    
182    
183     /* Get the GPG key with keyid @keyid from the cache. Return it
184     in @r_key on success. */
185     static int
186     get_key_from_cache (const char *keyid, gpgme_key_t *r_key,
187     struct keycache_s **c, int secret)
188     {
189     gpg_keycache_t cache;
190     gpgme_error_t err;
191     int mode = secret? KEYCACHE_PRV : KEYCACHE_PUB;
192    
193     if (!keyid)
194     return WPTERR_GENERAL;
195     if (r_key)
196     *r_key = NULL;
197     cache = keycache_get_ctx (mode);
198     if (!cache)
199     BUG( NULL );
200     if (!c)
201     err = gpg_keycache_find_key (cache, keyid, 0, r_key);
202     else
203     err = gpg_keycache_find_key2 (cache, keyid, 0, r_key, c);
204     return err? WPTERR_GENERAL : 0;
205     }
206    
207    
208     /* Get GPG key with keyid @keyid directly from GPG and return
209     it in @r_key on success. */
210     static int
211     get_key_directly (const char *keyid, gpgme_key_t *r_key, int secret)
212     {
213     gpgme_ctx_t ctx;
214     gpgme_error_t err;
215    
216     err = gpgme_new (&ctx);
217     if (err)
218     return WPTERR_GENERAL;
219     err = gpgme_get_key (ctx, keyid, r_key, secret);
220     gpgme_release (ctx);
221     return err? WPTERR_GENERAL : 0;
222     }
223    
224    
225     /* Search the public key with @keyid as the keyid in the cache and
226     return the item in @k. */
227     int
228     winpt_get_pubkey (const char *keyid, winpt_key_s *k)
229     {
230     int rc;
231    
232     rc = get_key_from_cache (keyid, &k->ctx, &k->ext, 0);
233     if (rc)
234     return rc;
235     k->is_v3 = k->ctx->subkeys->pubkey_algo == GPGME_PK_RSA &&
236     strlen (k->ctx->subkeys->fpr) == 32;
237     k->is_protected = k->ext->gloflags.is_protected;
238     k->keyid = k->ctx->subkeys->keyid;
239     k->uid = k->ctx->uids->uid;
240     return rc;
241     }
242    
243    
244     int
245     winpt_get_seckey (const char *keyid, winpt_key_s *k)
246     {
247     int rc;
248     rc = get_key_from_cache (keyid, &k->ctx, &k->ext, 1);
249     if (rc)
250     return rc;
251     k->is_v3 = k->ctx->subkeys->pubkey_algo == GPGME_PK_RSA &&
252     strlen (k->ctx->subkeys->fpr) == 32;
253     k->is_protected = k->ext->gloflags.is_protected;
254     k->keyid = k->ctx->subkeys->keyid;
255     k->uid = k->ctx->uids->uid;
256     return rc;
257     }
258    
259    
260     int
261     get_pubkey (const char *keyid, gpgme_key_t *ret_key)
262     {
263     int rc;
264    
265     if (pub && sec)
266     rc = get_key_from_cache (keyid, ret_key, NULL, 0);
267     else
268     rc = get_key_directly (keyid, ret_key, 0);
269     return rc;
270     }
271    
272    
273     int
274     get_seckey (const char *keyid, gpgme_key_t *ret_skey)
275     {
276     int rc;
277    
278     if (pub && sec)
279     rc = get_key_from_cache (keyid, ret_skey, NULL, 1);
280     else
281     rc = get_key_directly (keyid, ret_skey, 1);
282     return rc;
283     }
284    
285    
286     /* Search for insecure ElGamal keys and return the
287     number of founded keys. */
288     int
289     count_insecure_elgkeys (void)
290     {
291     gpg_keycache_t pc;
292     gpgme_key_t key;
293     int n=0;
294    
295     pc = keycache_get_ctx (1);
296     if (!pc)
297     BUG (0);
298     while (!gpg_keycache_next_key (pc, 0, &key)) {
299     if (key->subkeys->pubkey_algo == GPGME_PK_ELG)
300     n++;
301     }
302     gpg_keycache_rewind (pc);
303     return n;
304     }
305 twoaday 109
306    
307    
308     /* Map the signature summary in @sum to signature status table index.
309     Return value: index to table. */
310     static int
311     sigsum_to_index (gpgme_sigsum_t sum)
312     {
313     if ((sum & GPGME_SIGSUM_VALID) && (sum & GPGME_SIGSUM_KEY_REVOKED))
314     return 7;
315     if ((sum & GPGME_SIGSUM_VALID) && (sum & GPGME_SIGSUM_SIG_EXPIRED))
316     return 6;
317     if (sum & GPGME_SIGSUM_GREEN)
318     return 1;
319     else if (sum & GPGME_SIGSUM_RED)
320     return 2;
321     else if (sum & GPGME_SIGSUM_KEY_MISSING)
322     return 3;
323     return 0;
324     }
325    
326    
327     /* Return a humand readable description for the signature status @sum. */
328     const char*
329     get_gpg_sigstat (gpgme_sigsum_t sum)
330     {
331     const char *gpg_sigstat[] = {
332     _("Error during verification process."),
333     _("The signature is good."),
334     _("The signature is BAD!"),
335     _("The signature could not be checked due to a missing key."),
336     _("No valid OpenPGP signature."),
337     _("Signature Error"),
338     _("Good Signature (Expired Key)"),
339     _("Good Signature (Revoked Key)"),
340     NULL
341     };
342     const unsigned int mask = 8;
343    
344     return gpg_sigstat[sigsum_to_index (sum) % mask];
345     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26