31 |
#include "wptW32API.h" |
#include "wptW32API.h" |
32 |
|
|
33 |
|
|
34 |
|
/* Is the given signature an user-id signature? */ |
35 |
#define IS_UID_CERT(_class) ((_class) >= 0x10 && (_class) <= 0x13) |
#define IS_UID_CERT(_class) ((_class) >= 0x10 && (_class) <= 0x13) |
36 |
|
|
37 |
|
|
38 |
|
/* Create a signature list control in @lv with the parent window |
39 |
|
given in @ctrl. |
40 |
|
Return value: 0 on success. */ |
41 |
static int |
static int |
42 |
siglist_build( listview_ctrl_t * lv, HWND ctrl ) |
siglist_build (listview_ctrl_t * lv, HWND ctrl) |
43 |
{ |
{ |
44 |
struct listview_ctrl_s *c; |
struct listview_ctrl_s *c; |
45 |
struct listview_column_s implist[] = { |
struct listview_column_s implist[] = { |
63 |
listview_set_ext_style( c ); |
listview_set_ext_style( c ); |
64 |
*lv = c; |
*lv = c; |
65 |
return 0; |
return 0; |
66 |
} /* siglist_build */ |
} |
67 |
|
|
68 |
|
|
69 |
|
/* Delete the signature control in @lv. */ |
70 |
void |
void |
71 |
siglist_delete( listview_ctrl_t lv ) |
siglist_delete( listview_ctrl_t lv ) |
72 |
{ |
{ |
73 |
if( lv ) { |
if( lv ) { |
74 |
listview_release( lv ); |
listview_release( lv ); |
75 |
} |
} |
76 |
} /* siglist_delete */ |
} |
77 |
|
|
78 |
|
|
79 |
|
/* Indent the string in @old with the level @ilvl. |
80 |
|
Return value: indented string. */ |
81 |
static char * |
static char * |
82 |
indent_string( const char * old, int ilvl ) |
indent_string (const char * old, int ilvl) |
83 |
{ |
{ |
84 |
char * p; |
char * p; |
85 |
int i; |
int i; |
86 |
|
|
87 |
p = new char[strlen( old ) + 1 + ilvl]; |
p = new char[strlen (old) + 1 + ilvl]; |
88 |
if( !p ) |
if (!p) |
89 |
BUG( NULL ); |
BUG (NULL); |
90 |
for( i = 0; i < ilvl; i++ ) |
for (i = 0; i < ilvl; i++) |
91 |
p[i] = ' '; |
p[i] = ' '; |
92 |
strcpy( p+i, old ); |
strcpy (p+i, old); |
93 |
return p; |
return p; |
94 |
} /* indent_string */ |
} |
95 |
|
|
96 |
|
|
97 |
|
/* Add an userid signature with the index @idx from the userid @uid |
98 |
|
to the sig list control @lv. |
99 |
|
Return value: 0 on success. */ |
100 |
static int |
static int |
101 |
siglist_add_key( listview_ctrl_t lv, gpgme_key_t key, int idx ) |
siglist_add_key( listview_ctrl_t lv, gpgme_user_id_t uid, int idx) |
102 |
{ |
{ |
103 |
|
gpgme_key_sig_t ks; |
104 |
|
gpgme_key_t key=NULL; |
105 |
char t[128]; |
char t[128]; |
106 |
const char *attr; |
const char *attr; |
107 |
const char *s; |
const char *s; |
|
int sig_class; |
|
108 |
int rc = 0, key_attr, root = 0; |
int rc = 0, key_attr, root = 0; |
109 |
|
|
110 |
s = gpgme_key_get_string_attr( key, GPGME_ATTR_SIG_KEYID, NULL, idx ); |
ks = get_nth_uid_sig (uid, idx); |
|
root = s && strlen( s )? 0 : 1; |
|
111 |
|
|
112 |
sig_class = gpgme_key_get_ulong_attr( key, GPGME_ATTR_SIG_CLASS, NULL, idx ); |
if( !IS_UID_CERT( ks->sig_class ) ) |
|
if( !IS_UID_CERT( sig_class ) && !root ) |
|
113 |
return 0; |
return 0; |
114 |
|
|
115 |
rc = listview_add_item( lv, " " ); |
rc = listview_add_item (lv, " "); |
116 |
if( rc ) |
if( rc ) |
117 |
return rc; |
return rc; |
118 |
|
|
119 |
attr = gpgme_key_get_string_attr( key, GPGME_ATTR_SIG_ISSUER, NULL, idx ); |
get_pubkey (ks->keyid, &key); |
120 |
if( attr && strlen( attr ) ) { |
if (key) { |
121 |
char * uid = utf8_to_wincp (attr, strlen (attr)), * p; |
attr = key->uids->uid; |
122 |
p = root? m_strdup( uid ) : indent_string( uid, 2 ); |
if( attr && strlen( attr ) ) { |
123 |
listview_add_sub_item( lv, 0, 0, p ); |
char * uid = utf8_to_wincp (attr, strlen (attr)), * p; |
124 |
free( uid ); |
p = indent_string( uid, 2 ); |
125 |
free_if_alloc( p ); |
listview_add_sub_item( lv, 0, 0, p ); |
126 |
|
free( uid ); |
127 |
|
free_if_alloc( p ); |
128 |
|
} |
129 |
|
else |
130 |
|
listview_add_sub_item( lv, 0, 0, _(" user ID not found") ); |
131 |
} |
} |
|
else |
|
|
listview_add_sub_item( lv, 0, 0, _(" user ID not found") ); |
|
132 |
|
|
133 |
if( root ) |
if( root ) |
134 |
return 0; |
return 0; |
135 |
|
|
136 |
key_attr = gpgme_key_get_ulong_attr( key, GPGME_ATTR_SIG_STAT, NULL, idx ); |
switch (gpg_error ((gpg_err_code_t)ks->status)) { |
137 |
if( key_attr == GPGME_SIG_STAT_NONE ) |
case GPG_ERR_NO_ERROR: s = "YES"; break; |
138 |
return WPTERR_GENERAL; |
case GPG_ERR_NO_PUBKEY: s = "NOKEY"; break; |
139 |
switch (key_attr) { |
case GPG_ERR_BAD_SIGNATURE:s = "NO"; break; |
140 |
case GPGME_SIG_STAT_GOOD: s = "YES"; break; |
default: s = "ERROR"; break; |
|
case GPGME_SIG_STAT_NOKEY:s = "NOKEY"; break; |
|
|
case GPGME_SIG_STAT_BAD: s = "NO"; break; |
|
|
case GPGME_SIG_STAT_NOSIG:s = "NOSIG"; break; |
|
|
case GPGME_SIG_STAT_ERROR: |
|
|
default: s = "ERROR"; break; |
|
141 |
} |
} |
142 |
listview_add_sub_item( lv, 0, 1, s ); |
listview_add_sub_item( lv, 0, 1, s ); |
143 |
|
|
144 |
switch (sig_class) { |
switch (ks->sig_class) { |
145 |
case 0x10: strcpy (t, " "); break; |
case 0x10: strcpy (t, " "); break; |
146 |
case 0x11: strcpy (t, "1"); break; |
case 0x11: strcpy (t, "1"); break; |
147 |
case 0x12: strcpy (t, "2"); break; |
case 0x12: strcpy (t, "2"); break; |
148 |
case 0x13: strcpy (t, "3"); break; |
case 0x13: strcpy (t, "3"); break; |
149 |
} |
} |
150 |
key_attr = gpgme_key_get_ulong_attr (key, GPGME_ATTR_SIG_FLAGS, NULL, idx); |
|
151 |
if (key_attr) |
strcat (t, " "); |
152 |
strcat (t, " "); |
if (!ks->exportable) |
|
if (key_attr & GPGME_SIGF_LOCAL) |
|
153 |
strcat (t, "L"); |
strcat (t, "L"); |
154 |
if (key_attr & GPGME_SIGF_NREV) |
/*if (key_attr & GPGME_SIGF_NREV) |
155 |
strcat (t, "R"); |
strcat (t, "R");*/ |
156 |
listview_add_sub_item (lv, 0, 2, t); |
listview_add_sub_item (lv, 0, 2, t); |
157 |
|
|
158 |
key_attr = gpgme_key_get_ulong_attr( key, GPGME_ATTR_SIG_CREATED, NULL, idx ); |
key_attr = ks->timestamp; |
159 |
if( key_attr ) { |
if( key_attr ) { |
160 |
s = get_key_created( key_attr ); |
s = get_key_created( key_attr ); |
161 |
listview_add_sub_item( lv, 0, 3, s ); |
listview_add_sub_item( lv, 0, 3, s ); |
162 |
} |
} |
163 |
|
|
164 |
attr = gpgme_key_get_string_attr( key, GPGME_ATTR_SIG_KEYID, NULL, idx ); |
attr = ks->keyid; |
165 |
if( attr && strlen( attr ) == 16 ) { |
if( attr && strlen( attr ) == 16 ) { |
166 |
_snprintf( t, sizeof t -1, "0x%s", attr + 8 ); |
_snprintf( t, sizeof t -1, "0x%s", attr + 8 ); |
167 |
listview_add_sub_item( lv, 0, 4, t ); |
listview_add_sub_item( lv, 0, 4, t ); |
168 |
} |
} |
169 |
|
|
170 |
key_attr = gpgme_key_get_ulong_attr (key, GPGME_ATTR_SIG_EXPIRES, NULL, idx); |
key_attr = ks->expires; |
171 |
if (key_attr) |
if (key_attr) { |
|
{ |
|
172 |
s = get_key_created (key_attr); |
s = get_key_created (key_attr); |
173 |
listview_add_sub_item (lv, 0, 5, s); |
listview_add_sub_item (lv, 0, 5, s); |
174 |
} |
} |
175 |
|
|
176 |
key_attr = gpgme_key_get_ulong_attr( key, GPGME_ATTR_SIG_ALGO, NULL, idx ); |
attr = get_key_pubalgo (ks->pubkey_algo); |
|
attr = gpgme_key_expand_attr( GPGME_ATTR_ALGO, key_attr ); |
|
177 |
if( attr ) |
if( attr ) |
178 |
listview_add_sub_item( lv, 0, 6, (char *)attr ); |
listview_add_sub_item( lv, 0, 6, (char *)attr ); |
179 |
|
|
180 |
return 0; |
return 0; |
181 |
} /* siglist_add_key */ |
} |
182 |
|
|
183 |
|
|
184 |
|
/* Load a signature list with the signatures of the key with |
185 |
|
the keyID @keyid. The parent window is in @ctrl. |
186 |
|
Return value is the handle to the listview control. */ |
187 |
listview_ctrl_t |
listview_ctrl_t |
188 |
siglist_load( HWND ctrl, const char *keyid ) |
siglist_load (HWND ctrl, const char *keyid) |
189 |
{ |
{ |
190 |
gpgme_key_t key; |
gpgme_key_t key; |
191 |
|
gpgme_user_id_t u; |
192 |
listview_ctrl_t lv; |
listview_ctrl_t lv; |
193 |
int rc = 0, i; |
int rc = 0, i; |
194 |
|
|
195 |
if( siglist_build( &lv, ctrl ) ) |
if (siglist_build (&lv, ctrl)) |
196 |
BUG( NULL ); |
BUG (NULL); |
197 |
rc = get_pubkey( keyid, &key ); |
rc = get_pubkey(keyid, &key); |
198 |
if( rc ) |
if (rc) |
199 |
BUG( NULL ); |
BUG (NULL); |
200 |
for( i = 0; i < gpgme_key_count_items( key, GPGME_ATTR_SIG_KEYID ); i++ ) { |
|
201 |
rc = siglist_add_key( lv, key, i ); |
for (u=key->uids; u; u = u->next) { |
202 |
if( rc ) |
rc = listview_add_item (lv, " "); |
203 |
|
if( rc ) |
204 |
break; |
break; |
205 |
|
listview_add_sub_item (lv, 0, 0, u->uid); |
206 |
|
for (i=0; i < count_uid_sigs (u); i++) { |
207 |
|
rc = siglist_add_key( lv, u, i ); |
208 |
|
if( rc ) |
209 |
|
break; |
210 |
|
} |
211 |
} |
} |
212 |
if( rc ) { |
if( rc ) { |
213 |
siglist_delete( lv ); |
siglist_delete( lv ); |
214 |
lv = NULL; |
lv = NULL; |
215 |
} |
} |
216 |
return lv; |
return lv; |
217 |
} /* siglist_load */ |
} |