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

Annotation of /trunk/Src/wptClipSignEncDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 451 - (hide annotations)
Sat May 5 14:06:10 2012 UTC (12 years, 9 months ago) by twoaday
File size: 6662 byte(s)
2012-05-05  Timo Schulz  <twoaday@gmx.net>

        * wptListview.cpp (keylist_listview_notify): Cleanups.
	* wptClipSignDlg.cpp (clip_sign_dlg_proc): Fixed a race condition
        that could cause a segfault.
        * wptClipSignEncDlg.cpp (clip_signenc_dlg_proc): Likewise.
        * wptClipEncryptDlg.cpp (clip_encrypt_dlg_proc): Likewise and
        enabled the 'redraw' code again.        
	

1 werner 36 /* wptSignEncDlg.cpp - Sign & encrypt dialog
2 twoaday 328 * Copyright (C) 2000-2006, 2009 Timo Schulz
3 werner 36 *
4     * This file is part of WinPT.
5     *
6     * WinPT is free software; you can redistribute it and/or modify
7     * it under the terms of the GNU General Public License as published by
8     * the Free Software Foundation; either version 2 of the License, or
9     * (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
14     * GNU General Public License for more details.
15     */
16     #ifdef HAVE_CONFIG_H
17     #include <config.h>
18     #endif
19    
20     #include <windows.h>
21     #include <commctrl.h>
22    
23 werner 47 #include "resource.h"
24 werner 36 #include "wptErrors.h"
25     #include "wptAgent.h"
26     #include "wptCrypto.h"
27     #include "wptGPG.h"
28     #include "wptCommonCtl.h"
29     #include "wptKeylist.h"
30     #include "wptTypes.h"
31     #include "wptNLS.h"
32     #include "wptContext.h" /* for passphrase_s */
33     #include "wptDlgs.h"
34     #include "wptW32API.h"
35     #include "wptKeylist.h"
36     #include "wptVersion.h"
37     #include "wptGPG.h"
38     #include "wptRegistry.h"
39     #include "wptUTF8.h"
40    
41    
42     /* Encrypt the clipboard data with the recipients from @rset and
43     additionally sign the data before @signer as the keyID.
44     Return value: 0 on success. */
45     gpgme_error_t
46     gpg_clip_sign_encrypt (gpgme_ctx_t ctx, const char *signer,
47     gpgme_key_t *rset, int opts)
48     {
49     gpgme_error_t err;
50     gpgme_data_t plain = NULL;
51     gpgme_data_t ciph = NULL;
52     gpgme_key_t key = NULL;
53    
54     if (!signer)
55     return gpg_error (GPG_ERR_INV_ARG);
56     if (get_pubkey (signer, &key))
57     return gpg_error (GPG_ERR_NO_PUBKEY);
58    
59     gpgme_set_armor (ctx, 1);
60 twoaday 175 gpgme_set_textmode (ctx, 1);
61 werner 36
62 twoaday 328 err = gpg_data_utf8_new_from_clipboard (&plain, 0, NULL);
63 werner 36 if (err)
64     goto leave;
65     err = gpgme_data_new (&ciph);
66     if (err)
67     goto leave;
68     err = gpgme_signers_add (ctx, key);
69     if (err)
70     goto leave;
71    
72     err = gpgme_op_encrypt_sign (ctx, rset,
73     opts? GPGME_ENCRYPT_ALWAYS_TRUST : (gpgme_encrypt_flags_t)0,
74     plain, ciph);
75     if (err)
76     goto leave;
77    
78 twoaday 328 gpg_data_release_to_clipboard (ciph, 1);
79 werner 36 ciph = NULL;
80    
81     leave:
82     if (plain)
83     gpgme_data_release (plain);
84     if (ciph)
85     gpgme_data_release (ciph);
86     return err;
87     }
88    
89    
90     /* Dialog procedure for clipboard sign + encrypt. */
91     BOOL CALLBACK
92     clip_signenc_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
93     {
94 twoaday 328 static keylist_ctrl_t kl = NULL;
95 werner 36 static keylist_t list = NULL;
96 twoaday 328 static int keys_sortby = 0;
97 werner 36 gpg_keycache_t kc;
98     gpgme_key_t *rset;
99     gpgme_error_t err;
100     gpgme_ctx_t ctx;
101     passphrase_cb_s pwd;
102     char *signer = NULL;
103 twoaday 260 size_t n;
104 twoaday 68 int force_trust = 0;
105 werner 36
106 twoaday 225 switch (msg) {
107 werner 36 case WM_INITDIALOG:
108     SetWindowText (dlg, _("Sign & Encrypt"));
109 twoaday 105 SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));
110     kc = keycache_get_ctx (KEYCACHE_PUB);
111 twoaday 451 if (!kc)
112     BUG (NULL);
113    
114 twoaday 328 kl = keylist_load (GetDlgItem (dlg, IDC_SIGNENC_KEYLIST),
115 twoaday 176 kc, NULL, KEYLIST_ENCRYPT_MIN, KEY_SORT_USERID);
116 twoaday 105 seclist_init (dlg, IDC_SIGNENC_SECLIST, KEYLIST_FLAG_SHORT, &list);
117 werner 36 center_window (dlg, NULL);
118     EnableWindow (GetDlgItem (dlg, IDC_SIGNENC_SECLIST), FALSE);
119     SetDlgItemText (dlg, IDC_SIGNENC_SELKEY, _("Select key for signing"));
120     SetDlgItemText (dlg, IDC_SIGNENC_SECLISTINF, _("Signing key:"));
121     SetForegroundWindow (dlg);
122     return TRUE;
123    
124     case WM_DESTROY:
125     seclist_destroy (&list);
126 twoaday 328 if (kl) {
127     keylist_delete (kl);
128     kl = NULL;
129 werner 36 }
130     return FALSE;
131    
132     case WM_NOTIFY:
133 twoaday 451 /* Wait until the dialog initialization is done */
134     if (kl == NULL)
135     break;
136    
137 twoaday 328 int ret;
138     ret = keylist_listview_notify (dlg, kl->keys,
139     IDC_SIGNENC_KEYLIST, lparam);
140     if (ret != 0) {
141     SetWindowLong (dlg, DWL_MSGRESULT, ret);
142     return TRUE;
143     }
144    
145 twoaday 225 NMHDR *notify;
146 werner 36 notify = (NMHDR *)lparam;
147 twoaday 451 if (notify && notify->code == NM_DBLCLK &&
148     notify->idFrom == IDC_SIGNENC_KEYLIST)
149 twoaday 65 PostMessage (dlg, WM_COMMAND, MAKEWPARAM (IDOK, 0), 0);
150 twoaday 328
151     if (notify && notify->code == LVN_COLUMNCLICK &&
152     notify->idFrom == IDC_SIGNENC_KEYLIST) {
153     NMLISTVIEW *p = (LPNMLISTVIEW) lparam;
154     int sortby = 0;
155    
156     switch (p->iSubItem) {
157     case 0: sortby = KEY_SORT_USERID; break;
158     case 1: sortby = KEY_SORT_KEYID; break;
159     case 2: sortby = KEY_SORT_LEN; break;
160     case 4: sortby = KEY_SORT_VALIDITY; break;
161     default: sortby = KEY_SORT_USERID; break;
162     }
163     if ((keys_sortby & ~KEYLIST_SORT_DESC) == sortby)
164     keys_sortby ^= KEYLIST_SORT_DESC;
165     else
166     keys_sortby = sortby;
167     keylist_sort (kl, keys_sortby);
168 twoaday 451 return TRUE;
169     }
170     break;
171    
172 werner 36 case WM_COMMAND:
173 twoaday 451 if (HIWORD (wparam) == BN_CLICKED &&
174     LOWORD (wparam) == IDC_SIGNENC_SELKEY) {
175 werner 36 int enable = IsDlgButtonChecked (dlg, IDC_SIGNENC_SELKEY);
176     EnableWindow (GetDlgItem (dlg, IDC_SIGNENC_SECLIST), enable? TRUE : FALSE);
177 twoaday 451 break;
178 werner 36 }
179 twoaday 451
180 twoaday 105 switch (LOWORD (wparam)) {
181 werner 36 case IDOK:
182 twoaday 328 rset = keylist_get_recipients (kl, &force_trust, &n);
183 werner 36 if (!n) {
184 twoaday 105 msg_box (dlg, _("You must select at least one key."),
185     _("Sign & Encrypt"), MB_ERR);
186 werner 36 return FALSE;
187     }
188 twoaday 225 if (IsDlgButtonChecked (dlg, IDC_SIGNENC_SELKEY)) {
189 werner 36 gpgme_key_t key;
190 twoaday 225 const char *s;
191 werner 36
192 twoaday 225 if (seclist_select_key (dlg, IDC_SIGNENC_SECLIST, &key)) {
193 twoaday 105 msg_box (dlg, _("No key was selected."), _("Signing"), MB_ERR);
194 twoaday 225 safe_free (rset);
195 werner 36 return FALSE;
196     }
197     s = key->subkeys->keyid;
198     if (s)
199     signer = m_strdup(s+8);
200     }
201     else {
202     signer = get_gnupg_default_key ();
203     if (!signer) {
204     msg_box (dlg, _("Could not get default key."), _("Signing"), MB_ERR);
205 twoaday 225 safe_free (rset);
206 werner 36 return FALSE;
207     }
208     }
209    
210     err = gpgme_new (&ctx);
211     if (err)
212     BUG (NULL);
213     set_gpg_passphrase_cb (&pwd, ctx, GPG_CMD_SIGN, dlg, _("Sign & Encrypt"));
214     err = gpg_clip_sign_encrypt (ctx, signer, rset, force_trust);
215     release_gpg_passphrase_cb (&pwd);
216 twoaday 225 safe_free (rset);
217 werner 36 free_if_alloc (signer);
218     gpgme_release (ctx);
219     if (gpgme_err_code (err) == GPG_ERR_BAD_PASSPHRASE)
220     agent_del_cache (pwd.keyid);
221 twoaday 225 if (err)
222     msg_box (dlg, gpgme_strerror (err), _("Sign & Encrypt"), MB_ERR);
223     else {
224     show_msg (dlg, 1500, _("GnuPG Status: Finished"));
225     EndDialog (dlg, TRUE);
226 werner 36 }
227     return TRUE;
228    
229     case IDCANCEL:
230 twoaday 225 EndDialog (dlg, FALSE);
231 werner 36 return FALSE;
232     }
233     break;
234     }
235    
236     return FALSE;
237     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26