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

Diff of /trunk/Src/wptVerifyList.cpp

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

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

Legend:
Removed from v.32  
changed lines
  Added in v.48

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26