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

Contents of /trunk/Src/wptVerifyList.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 36 - (show annotations)
Thu Oct 27 15:25:13 2005 UTC (19 years, 4 months ago) by werner
File size: 6727 byte(s)
First set of changes to use autotools for building.
1 /* wptVerifyList.cpp - Listview for verifying signatures
2 * Copyright (C) 2001, 2002, 2003, 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
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (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 GNU
15 * 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 #ifdef HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24
25 #include <windows.h>
26 #include <windows.h>
27 #include <time.h>
28
29 #include "wptTypes.h"
30 #include "wptGPG.h"
31 #include "wptCommonCtl.h"
32 #include "wptKeylist.h"
33 #include "wptNLS.h"
34 #include "wptErrors.h"
35 #include "wptUTF8.h"
36 #include "wptW32API.h"
37
38
39 /* Extract the file name part out of the given path in @path.
40 Return value: file part or NULL on error. */
41 static char*
42 extract_filename (const char *path)
43 {
44 char * fname, *p;
45 int n, len = 0;
46
47 p = strrchr (path, '\\');
48 if (!p)
49 return m_strdup (path);
50 n = p - path;
51 len = strlen (path) - n;
52 fname = new char[len+1];
53 if (!fname)
54 BUG (NULL);
55 memcpy (fname, path+n+1, len);
56 fname[len] = '\0';
57 return fname;
58 }
59
60
61 /* String representaton of the time in @timestamp.
62 Format YEAR-MON-DAY HOUR:MIN:SEC.
63 Return value: time as formatted string. */
64 const char *
65 strtimestamp (long timestamp)
66 {
67 static char timebuf[64] = {0};
68 struct tm *warp;
69
70 warp = localtime (&timestamp);
71 _snprintf (timebuf, sizeof timebuf - 1, "%04d-%02d-%02d %02d:%02d:%02d",
72 warp->tm_year+1900, warp->tm_mon+1, warp->tm_mday,
73 warp->tm_hour, warp->tm_min, warp->tm_sec);
74 return timebuf;
75 }
76
77
78 /* Map the signature summary in @sum to signature status table index.
79 Return value: index to table. */
80 int
81 sigsum_to_index (gpgme_sigsum_t sum)
82 {
83 if ((sum & GPGME_SIGSUM_VALID) && (sum & GPGME_SIGSUM_KEY_REVOKED))
84 return 7;
85 if ((sum & GPGME_SIGSUM_VALID) && (sum & GPGME_SIGSUM_SIG_EXPIRED))
86 return 6;
87 if (sum & GPGME_SIGSUM_GREEN)
88 return 1;
89 else if (sum & GPGME_SIGSUM_RED)
90 return 2;
91 else if (sum & GPGME_SIGSUM_KEY_MISSING)
92 return 3;
93 return 0;
94 }
95
96
97 /* Build a verify signature list control. With the parent window
98 from @ctrl and the mod given in @fm_mode. @lv contains the
99 new control on success.
100 Return value: 0 on success. */
101 int
102 verlist_build (listview_ctrl_t *lv, HWND ctrl, int fm_mode)
103 {
104 int j, rc = 0;
105 struct listview_ctrl_s * c;
106 struct listview_column_s fm_verlist[] = {
107 {0, 100, (char *)_("Name") },
108 {1, 120, (char *)_("Status") },
109 {2, 115, (char *)_("Signed") },
110 {3, 58, (char *)_("Trust") },
111 {4, 160, (char *)_("User ID") },
112 {5, 0, NULL}
113
114 };
115 struct listview_column_s verlist[] = {
116 {0, 140, (char *)_("Status") },
117 {1, 120, (char *)_("Signed") },
118 {2, 58, (char *)_("Trust") },
119 {3, 80, (char *)_("Key ID" )},
120 {4, 160, (char *)_("User ID") },
121 {5, 0, NULL}
122 };
123
124 rc = listview_new (&c);
125 if (rc)
126 return rc;
127
128 c->ctrl = ctrl;
129 if( fm_mode ) {
130 for( j = 0; fm_verlist[j].fieldname; j++ )
131 listview_add_column( c, &fm_verlist[j] );
132 }
133 else {
134 for( j = 0; verlist[j].fieldname; j++ )
135 listview_add_column( c, &verlist[ j ] );
136 }
137 listview_set_ext_style( c );
138 *lv = c;
139 return 0;
140 }
141
142
143 /* Delete the given verify control in @lv. */
144 void
145 verlist_delete (listview_ctrl_t lv)
146 {
147 if (lv) {
148 listview_release (lv);
149 }
150 }
151
152
153 /* Add the given signature in @sig to the verify control @lv.
154 Return value: 0 on success. */
155 int
156 verlist_add_sig (listview_ctrl_t lv, gpgme_signature_t sig)
157 {
158 gpgme_key_t key = NULL;
159 const char * attr;
160 u32 key_attr;
161 char keyid[32+1];
162 char * uid = NULL;
163
164 if (listview_add_item (lv, " "))
165 return WPTERR_GENERAL;
166
167 get_pubkey (sig->fpr, &key);
168
169 attr = get_gpg_sigstat (sig->summary);
170 if( attr )
171 listview_add_sub_item (lv, 0, 0, (char *)attr);
172
173 attr = strtimestamp (sig->timestamp);
174 listview_add_sub_item (lv, 0, 1, (char *)attr);
175
176 attr = _("Unknown");
177 if (key) {
178 key_attr = key->uids->validity;
179 attr = get_key_trust2 (NULL, key_attr, 0, 0);
180 }
181 listview_add_sub_item (lv, 0, 2, (char *)attr);
182
183 attr = sig->fpr;
184 if (!attr || strlen (attr) < 8)
185 listview_add_sub_item (lv, 0, 3, "????????");
186 else {
187 if (strlen (attr) == 40)
188 attr += 32;
189 else
190 attr += 24;
191 _snprintf (keyid, sizeof keyid -1, "0x%s", attr);
192 listview_add_sub_item (lv, 0, 3, keyid);
193 }
194
195 if (!key) {
196 attr = _("Invalid User ID");
197 listview_add_sub_item( lv, 0, 4, (char *)attr );
198 }
199 else {
200 attr = key->uids->name;
201 uid = utf8_to_wincp (attr, strlen (attr));
202 if (uid) {
203 listview_add_sub_item( lv, 0, 4, (char *)uid );
204 free (uid);
205 }
206 }
207
208 return 0;
209 }
210
211
212 /* Add the given file signature in @log to the verify control @lv.
213 Return value: 0 on success. */
214 int
215 verlist_add_sig_log (listview_ctrl_t lv, file_sig_ctx_t log)
216 {
217 gpgme_signature_t sig = log->sig;
218 gpgme_key_t key = NULL;
219 const char *attr;
220 char t[64], *name;
221
222 if (listview_add_item (lv, ""))
223 return WPTERR_GENERAL;
224
225 get_pubkey (sig->fpr, &key);
226
227 name = extract_filename (log->file);
228 if (name)
229 listview_add_sub_item (lv, 0, 0, name);
230 else
231 listview_add_sub_item (lv, 0, 0, log->file);
232 free_if_alloc (name);
233
234 attr = get_gpg_sigstat (sig->summary);
235 if (attr)
236 listview_add_sub_item (lv, 0, 1, attr);
237
238 if (sig->timestamp > 0) {
239 attr = strtimestamp (sig->timestamp);
240 listview_add_sub_item (lv, 0, 2, attr);
241 }
242 else
243 listview_add_sub_item (lv, 0, 2, "No time");
244
245 attr = _("Unknown");
246 if (key)
247 attr = get_key_trust2 (NULL, key->uids->validity, 0, 0);
248 listview_add_sub_item (lv, 0, 3, attr);
249
250 attr = sig->fpr;
251 if (!log->use_uid && strlen (attr) == 40) {
252 _snprintf (t, sizeof (t)-1, "0x%s", attr + 32);
253 listview_add_sub_item (lv, 0, 4, t);
254 }
255 else if( !log->use_uid && strlen( attr ) == 32 ) {
256 _snprintf (t, sizeof (t)-1, "0x%s", attr + 24);
257 listview_add_sub_item (lv, 0, 4, t);
258 }
259 else if (log->user_id) {
260 char *p = utf8_to_wincp (log->user_id, strlen (log->user_id));
261 if (p) {
262 listview_add_sub_item (lv, 0, 4, p);
263 free (p);
264 }
265 }
266 return 0;
267 }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26