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

Annotation of /trunk/Src/wptClipDecryptDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 42 - (hide annotations)
Fri Oct 28 08:25:30 2005 UTC (19 years, 4 months ago) by werner
File size: 6021 byte(s)
Readded lost changes from revision 40

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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26