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

Annotation of /trunk/Src/wptGPGME.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 32 - (hide annotations)
Mon Oct 24 08:03:48 2005 UTC (19 years, 4 months ago) by twoaday
File size: 7438 byte(s)
2005-10-23  Timo Schulz  <twoaday@g10code.com>
 
        * wptFileManager.cpp (fm_get_file_type): Detect detached sigs.
        * wptKeyList.cpp (keylist_cmp_cb): Take care of expired/revoked keys.
        (get_ext_validity): New.
        * wptFileVerifyDlg.cpp (file_verify_dlg_proc): Several cleanups.
        * wptClipEditDlg.cpp (load_clipboard): Factored out some code into
        this function.
        (load_clipboard_from_file): Likewise.
        (save_clipboard_to_file): New.
        * wptKeyManagerDlg.cpp (keyprops_dlg_proc): Fix stack overflow.

For complete details, see the ChangeLog files.

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26