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

Contents of /trunk/Src/wptSigList.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: 5397 byte(s)
First set of changes to use autotools for building.
1 /* wptSigList.cpp - Listview for key signatures
2 * Copyright (C) 2001-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
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <windows.h>
27 #include <windows.h>
28 #include <time.h>
29
30 #include "wptGPG.h"
31 #include "wptCommonCtl.h"
32 #include "wptKeylist.h"
33 #include "wptNLS.h"
34 #include "wptUTF8.h"
35 #include "wptErrors.h"
36 #include "wptTypes.h"
37 #include "wptW32API.h"
38
39
40 /* Is the given signature an user-id signature? */
41 #define IS_UID_CERT(_class) ((_class) >= 0x10 && (_class) <= 0x13)
42
43
44 /* Create a signature list control in @lv with the parent window
45 given in @ctrl.
46 Return value: 0 on success. */
47 static int
48 siglist_build (listview_ctrl_t * lv, HWND ctrl)
49 {
50 struct listview_ctrl_s *c;
51 struct listview_column_s implist[] = {
52 {0, 240, (char *)_("User ID")},
53 {1, 50, (char *)_("Valid")},
54 {2, 40, (char *)_("Class")},
55 {3, 68, (char *)_("Creation")},
56 {4, 80, (char *)_("Key ID")},
57 {5, 68, (char *)_("Expiration")},
58 {6, 56, (char *)_("Algorithm")},
59 {0, 0, NULL}
60 };
61 int j, rc = 0;
62
63 rc = listview_new (&c);
64 if (rc)
65 return rc;
66 c->ctrl = ctrl;
67 for ( j=0; implist[j].fieldname != NULL; j++ )
68 listview_add_column( c, &implist[j] );
69 listview_set_ext_style( c );
70 *lv = c;
71 return 0;
72 }
73
74
75 /* Delete the signature control in @lv. */
76 void
77 siglist_delete( listview_ctrl_t lv )
78 {
79 if( lv ) {
80 listview_release( lv );
81 }
82 }
83
84
85 /* Indent the string in @old with the level @ilvl.
86 Return value: indented string. */
87 static char *
88 indent_string (const char * old, int ilvl)
89 {
90 char * p;
91 int i;
92
93 p = new char[strlen (old) + 1 + ilvl];
94 if (!p)
95 BUG (NULL);
96 for (i = 0; i < ilvl; i++)
97 p[i] = ' ';
98 strcpy (p+i, old);
99 return p;
100 }
101
102
103 /* Add an userid signature @ks from the userid @uid to the sig list
104 control @lv.
105 Return value: 0 on success. */
106 static int
107 siglist_add_key (listview_ctrl_t lv, gpgme_user_id_t uid, gpgme_key_sig_t ks)
108 {
109 gpgme_key_t key=NULL;
110 char t[128];
111 const char *attr;
112 const char *s;
113 int rc = 0, key_attr;
114
115 if (ks && !IS_UID_CERT (ks->sig_class))
116 return 0;
117
118 rc = listview_add_item (lv, " ");
119 if( rc )
120 return rc;
121
122 attr = NULL;
123 if (!uid) {
124 get_pubkey (ks->keyid, &key);
125 if (key)
126 attr = key->uids->uid;
127 }
128 else
129 attr = uid->uid;
130 if (attr && strlen (attr)) {
131 char *uid_utf8 = utf8_to_wincp (attr, strlen (attr));
132 char *p = uid? m_strdup (uid_utf8) : indent_string (uid_utf8, 2);
133 listview_add_sub_item (lv, 0, 0, p);
134 free (uid_utf8);
135 free_if_alloc (p);
136 }
137 else
138 listview_add_sub_item (lv, 0, 0, _(" user ID not found"));
139
140 if (uid)
141 return 0;
142
143 switch (gpgme_err_code (ks->status)) {
144 case GPG_ERR_NO_ERROR: s = "YES"; break;
145 case GPG_ERR_NO_PUBKEY: s = "NOKEY"; break;
146 case GPG_ERR_BAD_SIGNATURE:s = "NO"; break;
147 default: s = "ERROR"; break;
148 }
149 listview_add_sub_item( lv, 0, 1, s );
150
151 switch (ks->sig_class) {
152 case 0x10: strcpy (t, " "); break;
153 case 0x11: strcpy (t, "1"); break;
154 case 0x12: strcpy (t, "2"); break;
155 case 0x13: strcpy (t, "3"); break;
156 }
157
158 strcat (t, " ");
159 if (!ks->exportable)
160 strcat (t, "L");
161 /*if (key_attr & GPGME_SIGF_NREV)
162 strcat (t, "R");*/
163 listview_add_sub_item (lv, 0, 2, t);
164
165 key_attr = ks->timestamp;
166 if( key_attr ) {
167 s = get_key_created( key_attr );
168 listview_add_sub_item( lv, 0, 3, s );
169 }
170
171 attr = ks->keyid;
172 if( attr && strlen( attr ) == 16 ) {
173 _snprintf (t, sizeof t -1, "0x%s", attr + 8);
174 listview_add_sub_item( lv, 0, 4, t );
175 }
176
177 key_attr = ks->expires;
178 if (key_attr) {
179 s = get_key_created (key_attr);
180 listview_add_sub_item (lv, 0, 5, s);
181 }
182
183 attr = get_key_pubalgo (ks->pubkey_algo);
184 if( attr )
185 listview_add_sub_item( lv, 0, 6, (char *)attr );
186
187 return 0;
188 }
189
190
191 /* Load a signature list with the signatures of the key with
192 the keyID @keyid. The parent window is in @ctrl.
193 Return value is the handle to the listview control. */
194 listview_ctrl_t
195 siglist_load (HWND ctrl, const char *keyid)
196 {
197 gpgme_key_t key;
198 gpgme_user_id_t u;
199 gpgme_key_sig_t s;
200 listview_ctrl_t lv;
201 int rc, i=0;
202
203 if (siglist_build (&lv, ctrl))
204 BUG (NULL);
205 rc = get_pubkey(keyid, &key);
206 if (rc)
207 BUG (NULL);
208
209 /* XXX: the root item is at the end but should come first. */
210 for (u=key->uids; u; u = u->next) {
211 siglist_add_key (lv, u, NULL);
212 for (s = u->signatures; s; s = s->next) {
213 rc = siglist_add_key (lv, NULL, s);
214 if (rc)
215 break;
216 }
217 }
218 if (rc) {
219 siglist_delete (lv);
220 lv = NULL;
221 }
222 return lv;
223 }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26