/[gpgoe]/trunk/src/OEPassphraseCBDlg.c
ViewVC logotype

Annotation of /trunk/src/OEPassphraseCBDlg.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (hide annotations)
Fri Mar 24 13:36:54 2006 UTC (19 years, 1 month ago) by twoaday
File MIME type: text/plain
File size: 4590 byte(s)
Initial checkin of the GPGOE code.


1 twoaday 1 /* OEPassphraseDLG.cpp - GPGME Passphrase Callback
2     * Copyright (C) 2001, 2002, 2006 Timo Schulz
3     *
4     * This file is part of GPGOE.
5     *
6     * GPGOE is free software; you can redistribute it and/or modify
7     * it under the terms of the GNU Lesser General Public License as published by
8     * the Free Software Foundation; either version 2.1 of the License, or
9     * (at your option) any later version.
10     *
11     * GPGOE 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     * You should have received a copy of the GNU Lesser General Public License
17     * along with GPGOE; if not, write to the Free Software Foundation,
18     * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA7 USA
19     */
20    
21     #ifdef HAVE_CONFIG_H
22     #include <config.h>
23     #endif
24     #include <windows.h>
25     #include <assert.h>
26     #include "resource.h"
27     #include "gpgme.h"
28     #include "GPGOE.h"
29    
30     /* Structure for the passphrase callback. */
31     struct pass_cb_s {
32     const char *uid_hint;
33     const char *passphrase_info;
34     char *pass;
35     HWND main_hwnd;
36     int cancel;
37     int prev_was_bad;
38     };
39    
40    
41     /* Extract public key algorithm from passwd info. */
42     const char*
43     get_pubkey_algo (const char *passphrase_info)
44     {
45     size_t pos = 16+1+16+1;
46    
47     /* AA6F7AB7DD3B4A21 E71D9BC8C93A8529 1 0 */
48     assert (strlen (passphrase_info) > pos);
49     switch (atol (passphrase_info+pos)) {
50     case 1: return "RSA";
51     case 17: return "DSA";
52     case 16: return "ELG";
53     }
54     return "???";
55     }
56    
57    
58     /* Passphrase callback dialog box procedure. */
59     BOOL CALLBACK
60     pass_cb_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
61     {
62     static pass_cb_t ctx;
63     char *info, keyid[8+2] = {0};
64     int n;
65    
66     switch (msg) {
67     case WM_INITDIALOG:
68     ctx = (pass_cb_t)lparam;
69     assert (ctx);
70     if (ctx->uid_hint && ctx->passphrase_info) {
71     char *utf8_uid = utf8_to_native (ctx->uid_hint+17);
72     memcpy (keyid, ctx->passphrase_info+8, 8);
73     info = xcalloc (1, strlen (utf8_uid) + strlen (keyid) + 32);
74     sprintf (info, _("%s\n%s key, ID %s"), utf8_uid,
75     get_pubkey_algo (ctx->passphrase_info), keyid);
76     SetDlgItemText (dlg, IDC_DECRYPT_MSG, info);
77     free_if_alloc (utf8_uid);
78     free_if_alloc (info);
79     }
80     SendDlgItemMessage (dlg, IDC_DECRYPT_PWD, EM_SETPASSWORDCHAR,
81     (WPARAM)(UINT)'*', 0);
82     SetForegroundWindow (dlg);
83     break;
84    
85     case WM_COMMAND:
86     switch (LOWORD (wparam)) {
87     case IDCANCEL:
88     ctx->cancel = 1;
89     free_if_alloc (ctx->pass);
90     EndDialog (dlg, FALSE);
91     break;
92    
93     case IDOK:
94     if (ctx->prev_was_bad)
95     SetDlgItemText (dlg, IDC_DECRYPT_PWDINFO,
96     _("Invalid passphrase; please enter your passphrase again"));
97     else
98     SetDlgItemText (dlg, IDC_DECRYPT_PWDINFO,
99     _("Please enter your passphrase"));
100     n = SendDlgItemMessage (dlg, IDC_DECRYPT_PWD,
101     WM_GETTEXTLENGTH, 0, 0);
102     if (n < 1) {
103     MessageBox (dlg, _("Please enter your passphrase"),
104     _("GPG Plug-in Info"), MB_ICONINFORMATION|MB_OK);
105     return FALSE;
106     }
107     ctx->cancel = 0;
108     ctx->pass = xcalloc (1, n+2);
109     GetDlgItemText (dlg, IDC_DECRYPT_PWD, ctx->pass, n+1);
110     EndDialog (dlg, TRUE);
111     break;
112     }
113     break;
114     }
115     return FALSE;
116     }
117    
118    
119     /* GPGME compatible passphrase callback. */
120     gpgme_error_t
121     passphrase_cb (void *hook,
122     const char *uid_hint,
123     const char *passphrase_info,
124     int prev_was_bad, int fd)
125     {
126     pass_cb_t cb = (pass_cb_t)hook;
127     HANDLE fp = (HANDLE)fd;
128     DWORD nwritten = 0;
129    
130     cb->prev_was_bad = prev_was_bad;
131     if (prev_was_bad && !cb->cancel) {
132     wipememory (cb->pass, strlen (cb->pass));
133     free_if_alloc (cb->pass);
134     }
135     if (!cb->pass && !cb->cancel) {
136     cb->uid_hint = uid_hint;
137     cb->passphrase_info = passphrase_info;
138     DialogBoxParam (mod_hinst_dll, (LPCTSTR)IDD_DECRYPT,
139     cb->main_hwnd, pass_cb_dlg_proc, (LPARAM)cb);
140     }
141    
142     if (cb->cancel)
143     WriteFile (fp, "\n", 1, &nwritten, NULL);
144     else if (cb->pass != NULL) {
145     WriteFile (fp, cb->pass, strlen (cb->pass), &nwritten, NULL);
146     WriteFile (fp, "\n", 1, &nwritten, NULL);
147     }
148     return 0;
149     }
150    
151    
152     /* Allocate new passphrase callback context. */
153     pass_cb_t
154     new_pass_cb (HWND main)
155     {
156     pass_cb_t cb_val;
157    
158     cb_val = xcalloc (1, sizeof *cb_val);
159     cb_val->main_hwnd = main;
160     return cb_val;
161     }
162    
163    
164    
165     /* Free passphrase callback context. */
166     void
167     free_pass_cb (pass_cb_t cb)
168     {
169     if (!cb)
170     return;
171     if (cb->pass) {
172     wipememory (cb->pass, strlen (cb->pass));
173     free_if_alloc (cb->pass);
174     }
175     free_if_alloc (cb);
176     }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26