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

Annotation of /trunk/Src/wptClipDecryptDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 214 - (hide annotations)
Sun May 14 18:40:36 2006 UTC (18 years, 9 months ago) by twoaday
File size: 6161 byte(s)
2006-05-14  Timo Schulz  <ts@g10code.de>
                                                                                
        * wptKeyCache.cpp (gpg_keycache_update_attr): Parse
        preferred keyserver URL.
        * wptHTTP.cpp (extractHostInfo): Fix segv.
        * wptGPGUtil.cpp (gpg_find_key_subpacket): Ignore default
        gpg.conf.
        * wptKeyserverSearchDlg.cpp (search_hkp_keys): Do not
        assume an existing user id.
        * wptPassphraseCB.cpp (passphrase_cb): Automatic cancel
        if no passphrase is available.

(for complete list of changes, see Src/ChangeLog)

About to release 0.12.1


1 werner 36 /* wptClipDecryptDlg.cpp - Clipboard decrypt dialog
2     * Copyright (C) 2000-2005 Timo Schulz
3     * 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    
28     #include "wptTypes.h"
29     #include "wptW32API.h"
30     #include "wptAgent.h"
31     #include "wptNLS.h"
32     #include "wptGPG.h"
33     #include "wptVersion.h"
34     #include "wptErrors.h"
35     #include "wptCommonCtl.h"
36     #include "wptContext.h"
37     #include "wptDlgs.h"
38     #include "wptKeylist.h"
39 twoaday 129 #include "wptUTF8.h"
40 werner 47 #include "resource.h"
41 werner 36
42     bool secret_key_available (gpgme_recipient_t rset);
43    
44     /* 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     char *uid;
51 werner 36
52 twoaday 208 memset (&key, 0, sizeof (key));
53     if (winpt_get_pubkey (keyid, &key))
54 werner 36 return m_strdup (_("user ID not found"));
55 twoaday 208 uid = new char[strlen (key.ext->uids->uid) + 4 + 8];
56 twoaday 129 if (!uid)
57 werner 36 BUG (NULL);
58 twoaday 208 sprintf (uid, "\n \"%s\"", key.ext->uids->uid);
59     return uid;
60 werner 36 }
61    
62    
63     /* Decrypt the clipboard contents and on success
64     replace the data with the plaintext.
65     Return value: 0 on success. */
66     gpgme_error_t
67     gpgme_op_clip_decrypt (gpgme_ctx_t ctx)
68     {
69     gpgme_error_t err;
70     gpgme_data_t ciph = NULL;
71     gpgme_data_t plain = NULL;
72    
73     err = gpg_data_new_from_clipboard (&ciph, 0);
74     if (err)
75     return err;
76    
77     err = gpgme_data_new (&plain);
78     if (err) {
79     gpgme_data_release (ciph);
80     return err;
81     }
82    
83 twoaday 41 err = gpgme_op_decrypt_verify (ctx, ciph, plain);
84 werner 36
85     gpg_data_release_and_set_clipboard (plain, 0);
86     gpgme_data_release (ciph);
87     return err;
88     }
89    
90    
91     /* Convenient function to provide clipboard decryption.
92     @hwnd is the parent window used for showing messsages.
93     Return value: 0 on success. */
94     gpgme_error_t
95     clip_decrypt_dlg (HWND hwnd)
96     {
97     gpgme_error_t err;
98     gpgme_ctx_t ctx = NULL;
99     gpgme_signature_t sig = NULL;
100     gpgme_decrypt_result_t res;
101     gpgme_verify_result_t sigres;
102     passphrase_cb_s pwd;
103 twoaday 41 const char *s;
104 twoaday 208 const char *uid;
105 twoaday 179 int pgp_type = 0;
106 werner 36 int novalid = 0;
107    
108     /* allow to verify data generated by 'gpg -a --sign foo' */
109 twoaday 214 if (fm_assume_onepass_sig (NULL) == 1) {
110     dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_VERIFY, hwnd,
111     clip_verify_dlg_proc, 0,
112     _("Verify"), IDS_WINPT_VERIFY);
113     return 0;
114 werner 36 }
115    
116     err = gpgme_new (&ctx);
117     if (err)
118     BUG (NULL);
119     set_gpg_passphrase_cb (&pwd, ctx, GPG_CMD_DECRYPT, hwnd, _("Decryption"));
120 twoaday 179 gpg_get_recipients (NULL, &pwd.recipients);
121    
122 werner 36 err = gpgme_op_clip_decrypt (ctx);
123     if (pwd.cancel)
124     goto leave;
125     if (gpgme_err_code (err) == GPG_ERR_BAD_PASSPHRASE)
126     agent_del_cache (pwd.keyid);
127    
128     res = gpgme_op_decrypt_result (ctx);
129     if (err && res->recipients && !secret_key_available (res->recipients)) {
130     gpgme_recipient_t r = res->recipients;
131 twoaday 208 char *u = get_key_userid (r->keyid+8);
132 werner 36 log_box (_("Decryption"), MB_ERR,
133     _("Encrypted with %s key, ID %s.%s\n"
134     "Decryption failed: secret key not available."),
135 twoaday 208 get_key_pubalgo (r->pubkey_algo), r->keyid+8, u);
136     free_if_alloc (u);
137 werner 36 goto leave;
138     }
139 twoaday 41 else if (res->unsupported_algorithm) {
140     log_box (_("Decryption"), MB_ERR, _("Unsupported algorithm: %s"),
141     res->unsupported_algorithm);
142     }
143 werner 36 else if (err) {
144     gpg_clip_get_pgptype (&pgp_type);
145 twoaday 129 if (gpgme_err_code (err) == GPG_ERR_NO_DATA && (pgp_type & PGP_MESSAGE))
146 werner 36 msg_box (hwnd, _("Broken OpenPGP message (maybe: quoted printable "
147 twoaday 129 "character in armor)."), _("Decryption"), MB_INFO);
148 werner 36 else
149     msg_box (hwnd, gpgme_strerror (err), _("Decryption"), MB_ERR);
150     goto leave;
151     }
152    
153 twoaday 179 if (0) { /* XXX: Bad MDC */
154 werner 36 s = _("WARNING: encrypted message has been manipulated!\n"
155     "\n"
156     "Do *NOT* trust any text or data output from this file!\n"
157     "It is likely, the data was corrupted during the transport\n"
158     "but it might be also possible that this is part of an attack.");
159     msg_box (hwnd, s, _("*** IMPORTANT ***"), MB_INFO);
160 twoaday 179 }
161 werner 36
162     show_msg (GetDesktopWindow (), 1500, _("GnuPG Status: Finished"));
163    
164     sigres = gpgme_op_verify_result (ctx);
165     if (sigres && sigres->signatures) {
166 twoaday 208 winpt_key_s key;
167 twoaday 41 const char *keyid;
168 werner 36
169     sig = sigres->signatures;
170     if (!sig->fpr)
171 twoaday 41 BUG (NULL);
172 twoaday 205 keyid = get_keyid_from_fpr (sig->fpr);
173 twoaday 208 memset (&key, 0, sizeof (key));
174     if (!winpt_get_pubkey (keyid, &key)) {
175     if (key.ctx->owner_trust == GPGME_VALIDITY_FULL ||
176     key.ctx->owner_trust == GPGME_VALIDITY_ULTIMATE)
177 twoaday 41 s = _("Signature Status: Created with a fully trusted key");
178 twoaday 208 else if (key.ctx->owner_trust == GPGME_VALIDITY_MARGINAL)
179 twoaday 41 s = _("Signature Status: Created with a marginal trusted key");
180 twoaday 208 else if (key.ctx->owner_trust == GPGME_VALIDITY_NEVER) {
181 twoaday 41 novalid = 1;
182     s = _("Signature Status: Created with an UNTRUSTED key");
183     }
184     else
185     s = _("Signature Status: Created with an undefined trusted key");
186 twoaday 208 uid = key.ext->uids->uid;
187 werner 36 }
188 twoaday 179 else {
189 twoaday 41 s = "";
190 twoaday 208 uid = _("user ID not found");
191 twoaday 179 }
192 werner 36 log_box (_("WinPT Verify"), MB_OK,
193     _("%s\n"
194     "%s\n"
195 twoaday 129 "Signature made: %s\n"
196 werner 36 "From \"%s\" using key ID 0x%s"
197     "%s %s"),
198 twoaday 41 s, get_gpg_sigstat (sig->summary),
199     strtimestamp (sig->timestamp),
200 twoaday 205 uid, keyid,
201 werner 36 novalid? "\nPrimary key fingerprint: " : "",
202 twoaday 208 novalid? get_key_fpr (key.ctx) : "");
203 werner 36 }
204    
205     leave:
206     release_gpg_passphrase_cb (&pwd);
207     gpgme_release (ctx);
208     return err;
209     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26