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

Contents of /trunk/src/GPGOE.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 24 - (show annotations)
Tue Dec 13 10:40:30 2011 UTC (13 years, 4 months ago) by twoaday
File MIME type: text/plain
File size: 5290 byte(s)
Commit code for backup purposes.


1 /* GPGOE.c - GnuPG for Outlook Express
2 * Copyright (C) 2001, 2002, 2003, 2006, 2007 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
17 #ifdef HAVE_CONFIG_H
18 #include <config.h>
19 #endif
20
21 #include <windows.h>
22 #include <stdio.h>
23 #include "gpgme.h"
24 #include "GPGOE.h"
25
26 /* Global DLL module handle. */
27 HINSTANCE mod_hinst_dll;
28
29 /* Outlook Express old window procedure. */
30 WNDPROC oe_proc_old;
31
32 /* DLL hook handle for the CBT function. */
33 static HHOOK ctb_hook = NULL;
34
35 /* Outlook Express window handle. */
36 static HWND oe_hwnd = NULL;
37
38 /* We need a shared section to define variables which
39 will keep their values in all address spaces. */
40 #ifndef __GNUC__
41 #pragma data_seg(".SHARDAT")
42 #endif
43 /* Supported GPGOE feature modes. */
44 int gpgoe_active_modes ATTR_SEC = 0;
45
46 /* FIXME: we currently limit the passphrase to N octets. */
47 char gpgoe_pass_cache[HASH_BUCKETS][MAX_PASS_LEN];
48 #ifndef __GNUC__
49 #pragma data_seg()
50 #endif
51
52
53 /* Main DLL entry point. */
54 BOOL WINAPI
55 DllMain (HINSTANCE hinst_dll, DWORD reason, LPVOID reserved)
56 {
57 switch (reason) {
58 case DLL_PROCESS_ATTACH:
59 mod_hinst_dll = hinst_dll;
60 break;
61
62 case DLL_PROCESS_DETACH:
63 mod_hinst_dll = NULL;
64 break;
65
66 case DLL_THREAD_ATTACH:
67 break;
68
69 case DLL_THREAD_DETACH:
70 break;
71 }
72
73 return TRUE;
74 }
75
76
77 #if 0
78 /* Quick and dirty check if the dialog is a common dialog
79 and the 'File {Open, Save}' style. */
80 static int
81 is_common_file_dlg (HWND h)
82 {
83 HWND button = GetDlgItem (h, 1040);
84 char wclass[200];
85
86 if (button == NULL)
87 return 0;
88 if (GetClassName (button, wclass, 200) > 0
89 && !stricmp (wclass, "Button"))
90 return -1;
91 return 0;
92 }
93 #endif
94
95
96 /* CTB hook procedure.
97 Monitors the creation of all windows and subclass the window
98 if it belongs to the Outlook Express (message) class. */
99 static LRESULT CALLBACK
100 ctb_proc (int code, WPARAM wparam, LPARAM lparam)
101 {
102 HWND hwnd;
103 char wclass[256];
104
105 if (code < 0)
106 return CallNextHookEx (ctb_hook, code, wparam, lparam);
107
108 hwnd = (HWND)wparam;
109 switch (code) {
110 case HCBT_CREATEWND:
111 GetClassName (hwnd, wclass, DIM (wclass) - 1);
112 if (!strcmp (wclass, "ATH_Note")) {
113 oe_proc_old = (WNDPROC) GetWindowLong (hwnd, GWL_WNDPROC);
114 if (!oe_proc_old)
115 show_error (NULL, "GPGOE", MB_ICONERROR|MB_OK,
116 "Could not get window procedure ec=%d",
117 (int)GetLastError ());
118 else if (!SetWindowLong (hwnd, GWL_WNDPROC, (LONG)(WNDPROC)oe_proc))
119 show_error (NULL, "GPGOE", MB_ICONERROR|MB_OK,
120 "Could not set window procedure: ec=%d",
121 (int)GetLastError ());
122 else
123 oe_hwnd = hwnd;
124 }
125
126 if ((gpgoe_active_modes & GPGOE_MODE_PLAINREPLY) &&
127 !strcmp (wclass, "Outlook Express Browser Class")) {
128 oe_main_proc_old = (WNDPROC)GetWindowLong (hwnd, GWL_WNDPROC);
129 if (!oe_main_proc_old)
130 show_error (NULL, "GPGOE", MB_ICONERROR|MB_OK,
131 "Could not get window procedure ec=%d",
132 (int)GetLastError ());
133 else if (!SetWindowLong (hwnd, GWL_WNDPROC, (LONG)(WNDPROC)oe_main_proc))
134 show_error (NULL, "GPGOE", MB_ICONERROR|MB_OK,
135 "Could not set window procedure: ec=%d",
136 (int)GetLastError ());
137 }
138 break;
139
140 case HCBT_ACTIVATE:
141 #if 0 /* Disable the attachment related code for now. */
142 if (plugin_active != NULL &&
143 WaitForSingleObject (plugin_active, 0) == WAIT_OBJECT_0) {
144
145 if (GetClassName (hwnd, wclass, sizeof (wclass)-1) <= 0 ||
146 !strstr (wclass, "#32770") || !is_common_file_dlg (hwnd))
147 break;
148 of_proc_old = (WNDPROC)GetWindowLong (hwnd, GWL_WNDPROC);
149 SetWindowLong (hwnd, GWL_WNDPROC, (LONG)(WNDPROC)of_proc);
150 }
151 #endif
152 break;
153 }
154 return CallNextHookEx (ctb_hook, code, wparam, lparam);
155 }
156
157
158 /* Initialize the hooks; a named mutex prevents that the
159 initialisation is done twice.
160 Return value: 0 on success. */
161 int
162 gpgoe_initialize (void)
163 {
164 reset_pass_cache ();
165 CreateMutex (NULL, TRUE, "gpgoe");
166 if (GetLastError () == ERROR_ALREADY_EXISTS)
167 return 0;
168 ctb_hook = SetWindowsHookEx (WH_CBT, ctb_proc, mod_hinst_dll, 0);
169 return ctb_hook? 0 : (int)GetLastError ();
170 }
171
172
173 /* Deinitialize the hooks and close all handles.
174 Return value: 0 on success. */
175 int
176 gpgoe_remove (void)
177 {
178 HANDLE hd;
179 int rc;
180
181 hd = CreateMutex (NULL, TRUE, "gpgoe");
182 if (GetLastError() == ERROR_ALREADY_EXISTS) {
183 oe_hwnd = NULL;
184 CloseHandle (hd);
185 }
186 SetWindowLong (oe_hwnd, GWL_WNDPROC, (LONG)(WNDPROC)oe_proc_old);
187 rc = UnhookWindowsHookEx (ctb_hook);
188
189 /* reset global variables. */
190 reset_pass_cache ();
191 gpgoe_active_modes = 0;
192
193 return rc ? 0 : (int)GetLastError ();
194 }
195
196
197 /* Change the active plug-in modes, enable mode @mode. */
198 void
199 gpgoe_set_active_modes (int mode)
200 {
201 gpgoe_active_modes = mode;
202 }
203
204
205 int
206 gpgoe_get_active_modes (void)
207 {
208 return gpgoe_active_modes;
209 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26