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

Annotation of /trunk/Src/wptClipDecryptDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 278 - (hide annotations)
Mon Jan 15 22:02:04 2007 UTC (18 years, 1 month ago) by twoaday
File size: 8634 byte(s)
See ChangeLog.


1 twoaday 220 /* wptClipDecryptDlg.cpp - Clipboard decryption
2     * Copyright (C) 2000-2006 Timo Schulz
3 werner 36 * Copyright (C) 2005 g10 Code GmbH
4     *
5     * This file is part of WinPT.
6     *
7     * WinPT is free software; you can redistribute it and/or modify
8     * it under the terms of the GNU General Public License as published by
9     * the Free Software Foundation; either version 2 of the License, or
10     * (at your option) any later version.
11     *
12     * WinPT is distributed in the hope that it will be useful,
13     * but WITHOUT ANY WARRANTY; without even the implied warranty of
14     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     * GNU General Public License for more details.
16     */
17 werner 42 #ifdef HAVE_CONFIG_H
18     #include <config.h>
19     #endif
20    
21 werner 36 #include <windows.h>
22 twoaday 231 #include <assert.h>
23     #include <time.h>
24 werner 36
25     #include "wptTypes.h"
26     #include "wptW32API.h"
27     #include "wptAgent.h"
28     #include "wptNLS.h"
29     #include "wptGPG.h"
30     #include "wptVersion.h"
31     #include "wptErrors.h"
32     #include "wptCommonCtl.h"
33     #include "wptContext.h"
34     #include "wptDlgs.h"
35     #include "wptKeylist.h"
36 twoaday 129 #include "wptUTF8.h"
37 werner 47 #include "resource.h"
38 twoaday 278 #include "StringBuffer.h"
39 werner 36
40 twoaday 217 bool is_seckey_available (gpgme_recipient_t rset);
41 twoaday 220 char* get_pka_status (gpgme_signature_t sig);
42 werner 36
43 twoaday 220
44 werner 36 /* Return the primary user-ID of the key with the keyid @keyid.
45     Caller must free string. */
46     char*
47     get_key_userid (const char *keyid)
48     {
49 twoaday 208 winpt_key_s key;
50 twoaday 278 StringBuffer p;
51     const char *userid;
52 twoaday 208 char *uid;
53 werner 36
54 twoaday 278 p = "\n ";
55 twoaday 208 memset (&key, 0, sizeof (key));
56     if (winpt_get_pubkey (keyid, &key))
57 twoaday 256 userid = (_("user ID not found"));
58     else
59     userid = key.ext->uids->uid;
60 twoaday 278 p = p + "\"" + userid + "\"";
61    
62 twoaday 217 winpt_release_pubkey (&key);
63 twoaday 278 uid = p.getBufferCopy ();
64 twoaday 208 return uid;
65 werner 36 }
66    
67    
68     /* Decrypt the clipboard contents and on success
69     replace the data with the plaintext.
70     Return value: 0 on success. */
71     gpgme_error_t
72     gpgme_op_clip_decrypt (gpgme_ctx_t ctx)
73     {
74     gpgme_error_t err;
75     gpgme_data_t ciph = NULL;
76     gpgme_data_t plain = NULL;
77    
78     err = gpg_data_new_from_clipboard (&ciph, 0);
79     if (err)
80     return err;
81    
82     err = gpgme_data_new (&plain);
83     if (err) {
84     gpgme_data_release (ciph);
85     return err;
86     }
87    
88 twoaday 41 err = gpgme_op_decrypt_verify (ctx, ciph, plain);
89 werner 36
90     gpg_data_release_and_set_clipboard (plain, 0);
91     gpgme_data_release (ciph);
92     return err;
93     }
94    
95    
96 twoaday 229 /* Return humand readable ownertrust description for verification info. */
97     const char*
98     verify_get_key_ownertrust (gpgme_validity_t key_ot, int *novalid)
99     {
100     const char *s;
101    
102 twoaday 273 if (novalid)
103     *novalid = 0; /* reset */
104 twoaday 229 if (key_ot == GPGME_VALIDITY_FULL ||
105     key_ot == GPGME_VALIDITY_ULTIMATE)
106     s = _("Signature status: created with a fully trusted key");
107     else if (key_ot == GPGME_VALIDITY_MARGINAL)
108     s = _("Signature status: created with a marginal trusted key");
109     else if (key_ot == GPGME_VALIDITY_NEVER) {
110 twoaday 273 if (novalid)
111     *novalid = 1;
112 twoaday 229 s = _("Signature status: created with an UNTRUSTED key");
113     }
114     else
115     s = _("Signature status: created with an undefined trusted key");
116     return s;
117     }
118    
119    
120     /* Return a signature specific header and footer for the clipboard. */
121     void
122     verify_get_clip_info (gpgme_signature_t sig, char **r_header, char **r_footer)
123     {
124     struct winpt_key_s pk;
125 twoaday 231 const char *head = _("*** PGP SIGNATURE VERIFICATION ***\r\n"
126     "*** Signature made: %s\r\n"
127     "*** Signature verfied: %s\r\n"
128     "*** %s\r\n"
129     "*** Signature result: %s\r\n"
130     "*** Signer: %s (0x%s)\r\n"
131     "*** BEGIN PGP DECRYPTED TEXT ***\r\n");
132     const char *foot = _("\r\n*** END PGP DECRYPTED TEXT ***");
133 twoaday 278 const char *stat, *ot, *uid;
134     char made[128], ver[128];
135     char *p;
136 twoaday 229
137 twoaday 273 if (winpt_get_pubkey (sig->fpr, &pk)) {
138     uid = _("user ID not found");
139     ot = verify_get_key_ownertrust (GPGME_VALIDITY_UNDEFINED, NULL);
140     }
141     else {
142     uid = pk.ext->uids->uid;
143     ot = verify_get_key_ownertrust (pk.ctx->owner_trust, NULL);
144     }
145    
146 twoaday 278 if (!get_locale_timedate (sig->timestamp, made, DIM (made)-1))
147     _snprintf (made, DIM (made)-1, "'unknown time'");
148     if (!get_locale_timedate (time (NULL), ver, DIM (ver)-1))
149     _snprintf (ver, DIM (ver)-1, "'unknown time'");
150     stat = get_gpg_sigstat (sig->summary);
151     p = new char[strlen (head) + strlen (stat) + strlen (made) +
152 twoaday 231 strlen (sig->fpr) + strlen (ot) + strlen (ver) +
153 twoaday 273 strlen (uid) + 1];
154 twoaday 229 if (!p)
155     BUG (0);
156 twoaday 278 sprintf (p, head, made, ver, ot, stat, uid, get_keyid_from_fpr (sig->fpr));
157 twoaday 229 *r_header = p;
158     *r_footer = m_strdup (foot);
159     }
160    
161    
162 twoaday 220 /* Show a human readable description of the given signature @sig. */
163     void
164     verify_show_signature_state (gpgme_signature_t sig)
165     {
166     winpt_key_s key;
167     const char *keyid, *uid;
168     const char *s;
169 twoaday 278 char *pka_info = NULL, timebuf[128];
170 twoaday 220 int novalid = 0;
171    
172 twoaday 231 assert (sig->fpr != NULL);
173 twoaday 220
174     keyid = get_keyid_from_fpr (sig->fpr);
175     memset (&key, 0, sizeof (key));
176     if (!winpt_get_pubkey (keyid, &key)) {
177 twoaday 229 s = verify_get_key_ownertrust (key.ctx->owner_trust, &novalid);
178 twoaday 220 uid = key.ext->uids->uid;
179 twoaday 231 }
180 twoaday 220 else {
181     s = "";
182     uid = _("user ID not found");
183     }
184    
185 twoaday 278 if (!get_locale_timedate (sig->timestamp, timebuf, DIM (timebuf)-1))
186     _snprintf (timebuf, DIM (timebuf)-1, "'unknown time'");
187    
188 twoaday 229 pka_info = get_pka_status (sig);
189 twoaday 220 log_box (_("Decrypt Verify"), novalid? MB_WARN : MB_OK,
190     _("%s\n"
191     "%s\n"
192     "Signature made: %s\n"
193     "From \"%s\" using key ID 0x%s"
194     "%s %s\n%s"),
195     s, get_gpg_sigstat (sig->summary),
196 twoaday 278 timebuf, uid, keyid,
197 twoaday 220 novalid? "\nPrimary key fingerprint: " : "",
198     novalid? get_key_fpr (key.ctx) : "",
199     pka_info? pka_info : ""
200     );
201     free_if_alloc (pka_info);
202     winpt_release_pubkey (&key);
203     }
204    
205    
206 werner 36 /* Convenient function to provide clipboard decryption.
207     @hwnd is the parent window used for showing messsages.
208     Return value: 0 on success. */
209     gpgme_error_t
210 twoaday 229 clip_decrypt_dlg (HWND hwnd, int use_viewer)
211 werner 36 {
212     gpgme_error_t err;
213     gpgme_ctx_t ctx = NULL;
214     gpgme_decrypt_result_t res;
215     gpgme_verify_result_t sigres;
216     passphrase_cb_s pwd;
217 twoaday 179 int pgp_type = 0;
218 werner 36
219     /* allow to verify data generated by 'gpg -a --sign foo' */
220 twoaday 214 if (fm_assume_onepass_sig (NULL) == 1) {
221     dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_VERIFY, hwnd,
222     clip_verify_dlg_proc, 0,
223     _("Verify"), IDS_WINPT_VERIFY);
224     return 0;
225 werner 36 }
226    
227     err = gpgme_new (&ctx);
228     if (err)
229     BUG (NULL);
230     set_gpg_passphrase_cb (&pwd, ctx, GPG_CMD_DECRYPT, hwnd, _("Decryption"));
231 twoaday 179 gpg_get_recipients (NULL, &pwd.recipients);
232    
233 werner 36 err = gpgme_op_clip_decrypt (ctx);
234     if (pwd.cancel)
235     goto leave;
236     if (gpgme_err_code (err) == GPG_ERR_BAD_PASSPHRASE)
237     agent_del_cache (pwd.keyid);
238    
239     res = gpgme_op_decrypt_result (ctx);
240 twoaday 217 if (err && res->recipients && !is_seckey_available (res->recipients)) {
241 werner 36 gpgme_recipient_t r = res->recipients;
242 twoaday 208 char *u = get_key_userid (r->keyid+8);
243 werner 36 log_box (_("Decryption"), MB_ERR,
244 twoaday 256 _("Encrypted with %s key, ID 0x%s.%s\n"
245 werner 36 "Decryption failed: secret key not available."),
246 twoaday 208 get_key_pubalgo (r->pubkey_algo), r->keyid+8, u);
247     free_if_alloc (u);
248 werner 36 goto leave;
249     }
250 twoaday 41 else if (res->unsupported_algorithm) {
251     log_box (_("Decryption"), MB_ERR, _("Unsupported algorithm: %s"),
252     res->unsupported_algorithm);
253     }
254 werner 36 else if (err) {
255     gpg_clip_get_pgptype (&pgp_type);
256 twoaday 129 if (gpgme_err_code (err) == GPG_ERR_NO_DATA && (pgp_type & PGP_MESSAGE))
257 werner 36 msg_box (hwnd, _("Broken OpenPGP message (maybe: quoted printable "
258 twoaday 129 "character in armor)."), _("Decryption"), MB_INFO);
259 werner 36 else
260     msg_box (hwnd, gpgme_strerror (err), _("Decryption"), MB_ERR);
261     goto leave;
262     }
263    
264 twoaday 236 #if 0
265     if (status_bad_mdc) { /* XXX: Bad MDC */
266     const char *s =
267     _("WARNING: encrypted message has been manipulated!\n"
268 werner 36 "\n"
269     "Do *NOT* trust any text or data output from this file!\n"
270 twoaday 248 "It is likely that the data was corrupted in transport\n"
271 werner 36 "but it might be also possible that this is part of an attack.");
272     msg_box (hwnd, s, _("*** IMPORTANT ***"), MB_INFO);
273 twoaday 179 }
274 twoaday 236 #endif
275 werner 36
276     show_msg (GetDesktopWindow (), 1500, _("GnuPG Status: Finished"));
277    
278     sigres = gpgme_op_verify_result (ctx);
279 twoaday 229 if (sigres && sigres->signatures) {
280     if (!use_viewer)
281     verify_show_signature_state (sigres->signatures);
282     else
283     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_CLIPEDIT,
284     hwnd, clip_edit_dlg_proc,
285     (LPARAM)sigres->signatures);
286     }
287 twoaday 236 else if (use_viewer)
288     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_CLIPEDIT,
289     hwnd, clip_edit_dlg_proc, 0);
290 twoaday 229
291 werner 36 leave:
292     release_gpg_passphrase_cb (&pwd);
293     gpgme_release (ctx);
294     return err;
295     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26