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

Diff of /trunk/Src/wptSigList.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 133 by twoaday, Mon Jan 9 09:15:29 2006 UTC revision 299 by twoaday, Sun Mar 18 19:58:12 2007 UTC
# Line 13  Line 13 
13   * but WITHOUT ANY WARRANTY; without even the implied warranty of   * but WITHOUT ANY WARRANTY; without even the implied warranty of
14   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15   * General Public License for more details.   * General Public License for more details.
  *  
  * You should have received a copy of the GNU General Public License  
  * along with WinPT; if not, write to the Free Software Foundation,  
  * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA  
16   */   */
17    
18  #ifdef HAVE_CONFIG_H  #ifdef HAVE_CONFIG_H
# Line 26  Line 22 
22  #include <windows.h>  #include <windows.h>
23  #include <time.h>  #include <time.h>
24    
25    #include "resource.h"
26  #include "wptGPG.h"  #include "wptGPG.h"
27  #include "wptCommonCtl.h"  #include "wptCommonCtl.h"
28  #include "wptKeylist.h"  #include "wptKeylist.h"
29  #include "wptNLS.h"  #include "wptNLS.h"
 #include "wptUTF8.h"  
30  #include "wptErrors.h"  #include "wptErrors.h"
31  #include "wptTypes.h"  #include "wptTypes.h"
32  #include "wptW32API.h"  #include "wptW32API.h"
33    #include "wptVersion.h"
34    #include "wptContext.h"
35    
36    
37  /* Is the given signature an user-id signature? */  /* Is the given signature an user-id signature? */
# Line 43  Line 41 
41  /* Create a signature list control in @lv with the parent window  /* Create a signature list control in @lv with the parent window
42     given in @ctrl.     given in @ctrl.
43     Return value: 0 on success. */     Return value: 0 on success. */
44  static int  static void
45  siglist_build (listview_ctrl_t * lv, HWND ctrl)  siglist_build (listview_ctrl_t *lv, HWND ctrl)
46  {  {
47      struct listview_ctrl_s *c;      listview_ctrl_t c;
48      struct listview_column_s implist[] = {      struct listview_column_s implist[] = {
49          {0, 240, (char *)_("User ID")},          {0, 240, (char *)_("User ID")},
50          {1,  50, (char *)_("Valid")},          {1,  50, (char *)_("Valid")},
# Line 56  siglist_build (listview_ctrl_t * lv, HWN Line 54  siglist_build (listview_ctrl_t * lv, HWN
54          {5,  68, (char *)_("Expiration")},          {5,  68, (char *)_("Expiration")},
55          {6,  56, (char *)_("Algorithm")},          {6,  56, (char *)_("Algorithm")},
56          {0,   0, NULL}          {0,   0, NULL}
57      };        };
58      int j, rc = 0;      int j;
59        
60      rc = listview_new (&c);      listview_new (&c, ctrl);
     if (rc)  
         return rc;  
     c->ctrl = ctrl;  
61      for  (j=0; implist[j].fieldname != NULL; j++)      for  (j=0; implist[j].fieldname != NULL; j++)
62          listview_add_column (c, &implist[j]);          listview_add_column (c, &implist[j]);
63      listview_set_ext_style (c);      listview_set_ext_style (c);
64        listview_del_all_items (c);
65      *lv = c;      *lv = c;
     return 0;  
66  }  }
67    
68    
69  /* Delete the signature control in @lv. */  /* 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);
# Line 83  siglist_delete( listview_ctrl_t lv ) Line 78  siglist_delete( listview_ctrl_t lv )
78    
79  /* Indent the string in @old with the level @ilvl.  /* Indent the string in @old with the level @ilvl.
80      Return value: indented string. */      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];
# Line 99  indent_string (const char * old, int ilv Line 94  indent_string (const char * old, int ilv
94  }  }
95    
96    
97    /* Add an item at the given pos @pos with the opaque param @ks. */
98    int
99    add_keysig_item (listview_ctrl_t ctx, int pos, gpgme_key_sig_t ks)
100    {
101        LV_ITEM lvi;
102    
103        memset (&lvi, 0, sizeof (lvi));
104        lvi.iItem = pos;
105        lvi.lParam = (LPARAM)ks;
106        lvi.mask = LVIF_PARAM;
107        if (ListView_InsertItem (ctx->ctrl, &lvi) != pos)
108            return -1;
109        return 0;
110    }
111    
112    
113  /* Add an userid signature @ks from the userid @uid to the sig list  /* Add an userid signature @ks from the userid @uid to the sig list
114     control @lv.     control @lv.
115     Return value: 0 on success. */     Return value: 0 on success. */
116  static int  static int
117  siglist_add_key (listview_ctrl_t lv, gpgme_user_id_t uid,  siglist_add_key (listview_ctrl_t lv, struct native_uid_s *uid,
118                   gpgme_key_sig_t ks, int pos)                   gpgme_key_sig_t ks, int pos)
119  {  {
120      gpgme_key_t key=NULL;      struct winpt_key_s key;    
     char t[128];  
121      const char *attr;      const char *attr;
122      const char *s;      const char *s;
123      int key_attr;      char t[128];
124      int rc = 0;      int no_uid = 0;
125        int rc;
126    
127      if (ks && !IS_UID_CERT (ks->sig_class))      if (ks && !IS_UID_CERT (ks->sig_class))
128          return 0;          return 0;
129            
130      rc = listview_add_item_pos (lv, pos);      rc = add_keysig_item (lv, pos, ks);
131      if (rc)      if (rc)
132          return rc;          return rc;
133    
134      attr = NULL;      attr = NULL;
135      if (!uid) {      if (!uid) {
136          get_pubkey (ks->keyid, &key);          memset (&key, 0, sizeof (key));
137          if (key)          winpt_get_pubkey (ks->keyid, &key);
138              attr = key->uids->uid;          if (key.ext != NULL)
139                attr = key.ext->uids->uid;
140      }      }
141      else      else
142          attr = uid->uid;          attr = uid->uid;
143      if (attr && strlen (attr)) {      if (attr && strlen (attr)) {
144          char *uid_utf8 = utf8_to_wincp (attr, strlen (attr));          char *p = uid? m_strdup (attr) : indent_string (attr, 2);
145          char *p = uid? m_strdup (uid_utf8) : indent_string (uid_utf8, 2);          listview_add_sub_item (lv, pos, SL_COL_UID, p);
         listview_add_sub_item (lv, pos, 0, p);  
         free (uid_utf8);  
146          free_if_alloc (p);          free_if_alloc (p);
147      }      }
148      else      else {
149          listview_add_sub_item (lv, pos, 0, _("  user ID not found"));          listview_add_sub_item (lv, pos, SL_COL_UID, _("  user ID not found"));
150            no_uid = 1;
151        }
152    
153        /* Return immediately for root items. */
154      if (uid)      if (uid)
155          return 0;          return 0;
156    
157        /* TRANSLATORS: these strings should be in capital letters. */
158      switch (gpgme_err_code (ks->status)) {      switch (gpgme_err_code (ks->status)) {
159      case GPG_ERR_NO_ERROR:     s = "YES";   break;      case GPG_ERR_NO_ERROR:     s = _("YES");   break;
160      case GPG_ERR_NO_PUBKEY:    s = "NOKEY"; break;      case GPG_ERR_NO_PUBKEY:    s = _("NOKEY"); break;
161      case GPG_ERR_BAD_SIGNATURE:s = "NO";    break;      case GPG_ERR_BAD_SIGNATURE:s = _("NO");    break;
162      default:                   s = "ERROR"; break;      default:                   s = _("ERROR"); break;
163      }      }
164      listview_add_sub_item (lv, pos, 1, s);      if (no_uid)
165            s = _("NOKEY");
166        listview_add_sub_item (lv, pos, SL_COL_VALID, s);
167    
168      switch (ks->sig_class) {      switch (ks->sig_class) {
169      case 0x10: strcpy (t, " "); break;      case 0x10: strcpy (t, " "); break;
# Line 155  siglist_add_key (listview_ctrl_t lv, gpg Line 171  siglist_add_key (listview_ctrl_t lv, gpg
171      case 0x12: strcpy (t, "2"); break;      case 0x12: strcpy (t, "2"); break;
172      case 0x13: strcpy (t, "3"); break;      case 0x13: strcpy (t, "3"); break;
173      }      }
174            
175      strcat (t, " ");      strcat (t, " ");
176      if (!ks->exportable)      if (!ks->exportable)
177          strcat (t, "L");          strcat (t, "L");
178      /*if (key_attr & GPGME_SIGF_NREV)      /* XXX: if gpgme supports non-revocable status, add 'R' */
179          strcat (t, "R");*/      listview_add_sub_item (lv, pos, SL_COL_CLASS, t);
180      listview_add_sub_item (lv, pos, 2, t);  
181        s = get_key_created (ks->timestamp);
182      key_attr = ks->timestamp;      listview_add_sub_item (lv, pos, SL_COL_CREATE, s);
183      if( key_attr ) {  
184          s = get_key_created (key_attr);      if (ks->keyid && strlen (ks->keyid) == 16) {
185          listview_add_sub_item (lv, pos, 3, s);          _snprintf (t, DIM (t) -1, "0x%s", ks->keyid + 8);
186      }          listview_add_sub_item (lv, pos, SL_COL_KEYID, t);
       
     attr = ks->keyid;  
     if (attr && strlen (attr) == 16) {  
         _snprintf (t, sizeof (t) -1, "0x%s", attr + 8);  
         listview_add_sub_item (lv, pos, 4, t);  
187      }      }
188    
189      key_attr = ks->expires;      if (ks->expires > 0) {
190      if (key_attr) {          s = get_key_created (ks->expires);
191          s = get_key_created (key_attr);          listview_add_sub_item (lv, pos, SL_COL_EXPIRE, s);
         listview_add_sub_item (lv, pos, 5, s);  
192      }      }
193    
194      attr = get_key_pubalgo (ks->pubkey_algo);      attr = get_key_pubalgo (ks->pubkey_algo);
# Line 195  siglist_add_key (listview_ctrl_t lv, gpg Line 205  siglist_add_key (listview_ctrl_t lv, gpg
205  listview_ctrl_t  listview_ctrl_t
206  siglist_load (HWND ctrl, const char *keyid)  siglist_load (HWND ctrl, const char *keyid)
207  {      {    
     gpgme_key_t key;  
     gpgme_user_id_t u;  
208      gpgme_key_sig_t s;      gpgme_key_sig_t s;
209        struct native_uid_s *u;
210        winpt_key_s key;
211      listview_ctrl_t lv;      listview_ctrl_t lv;
212      int pos = 0;      int pos = 0;
213      int rc;      int rc = 0;
214    
215      if (siglist_build (&lv, ctrl))      siglist_build (&lv, ctrl);
216          BUG (NULL);      memset (&key, 0, sizeof (key));
217      rc = get_pubkey(keyid, &key);      if (winpt_get_pubkey (keyid, &key))
     if (rc)  
218          BUG (NULL);          BUG (NULL);
219    
220      for (u=key->uids; u; u = u->next) {      for (u=key.ext->uids; u; u = u->next) {
221          siglist_add_key (lv, u, NULL, pos++);          siglist_add_key (lv, u, NULL, pos++);
222          for (s = u->signatures; s; s = s->next) {          for (s = u->signatures; s; s = s->next) {
223              if (!IS_UID_CERT (s->sig_class))              if (!IS_UID_CERT (s->sig_class))
# Line 224  siglist_load (HWND ctrl, const char *key Line 233  siglist_load (HWND ctrl, const char *key
233      }      }
234      return lv;      return lv;
235  }  }
236    
237    
238    /* Integer comparsion of @a and @b.
239       Return values: same as in strcmp. */
240    static inline int
241    int_cmp (int a, int b)
242    {
243        if (a == b) return 0;      
244        else if (a > b) return 1;
245        else return -1;
246        return 0;
247    }
248    
249    
250    /* Sorting callback for the signature list. */
251    static int CALLBACK
252    siglist_cmp_cb (LPARAM first, LPARAM second, LPARAM sortby)
253    {
254        gpgme_key_sig_t a, b;
255        int cmpresult=0;
256    
257        a = (gpgme_key_sig_t)first;
258        b = (gpgme_key_sig_t)second;
259        if (!a || !b)
260            return -1; /* this indicates that one item is a root item. */
261    
262        switch (sortby) {
263        case KEY_SORT_KEYID:
264            cmpresult = strcmp (a->keyid, b->keyid);
265            break;
266    
267        case KEY_SORT_CREATED:
268            cmpresult = int_cmp (a->timestamp, b->timestamp);
269            break;
270    
271        case KEY_SORT_ALGO:
272            cmpresult = int_cmp (a->pubkey_algo, b->pubkey_algo);
273            break;
274    
275        case KEY_SORT_VALIDITY:
276            cmpresult = int_cmp (a->status, b->status);
277            break;
278    
279        case SIG_SORT_EXPIRE:
280            cmpresult = int_cmp (a->expires, a->expires);
281            break;
282    
283        case SIG_SORT_CLASS:
284            cmpresult = int_cmp (a->sig_class, b->sig_class);
285            break;
286        }
287        return cmpresult;
288    }
289    
290    
291    /* Sort the signature list @sigl by @sortby. */
292    void
293    siglist_sort (listview_ctrl_t sigl, int sortby)
294    {
295        listview_sort_items (sigl, sortby, siglist_cmp_cb);
296    }

Legend:
Removed from v.133  
changed lines
  Added in v.299

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26