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

Annotation of /trunk/Src/wptClipDecryptDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 236 - (hide annotations)
Wed Jun 28 06:59:30 2006 UTC (18 years, 8 months ago) by twoaday
File size: 8379 byte(s)


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26