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

Diff of /trunk/Src/wptClipVerifyDlg.cpp

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

revision 6 by twoaday, Mon Apr 4 06:59:24 2005 UTC revision 23 by twoaday, Fri Sep 30 10:10:16 2005 UTC
# Line 33  Line 33 
33  #include "wptErrors.h"  #include "wptErrors.h"
34  #include "wptVersion.h"  #include "wptVersion.h"
35    
36    
37    /* Verify data from the clipboard. If @is_detached is set, a detached
38       signature is assumed with the data the signature was calculated over
39       in @det_data. The context is returned in @r_ctx and the signature
40       in @r_sig.
41       Return value: 0 on success. */
42    gpgme_error_t
43    gpg_clip_verify (int is_detached,
44                     const char *det_data, size_t det_len,
45                     gpgme_ctx_t *r_ctx,
46                     gpgme_signature_t *r_sig)
47    {
48        gpgme_error_t err;
49        gpgme_ctx_t ctx;
50        gpgme_data_t dat = NULL;
51        gpgme_data_t sig = NULL;
52        gpgme_verify_result_t res;
53    
54        if (is_detached) {
55            err = gpgme_data_new_from_mem (&dat, det_data, det_len, 1);
56            if (err)
57                return err;
58        }
59        
60        err = gpgme_new (&ctx);
61        if (err)
62            goto leave;
63        err = gpg_data_new_from_clipboard (&sig, 0);
64        if (err)
65            goto leave;    
66        err = gpgme_op_verify (ctx, sig, dat, NULL);
67        if (err)
68            goto leave;
69        res = gpgme_op_verify_result (ctx);
70        if (!res || !res->signatures) {
71            err = gpg_error (GPG_ERR_NO_DATA);
72            goto leave;
73        }
74        *r_sig = res->signatures;
75        *r_ctx = ctx;
76    
77    leave:
78        if (err) {
79            gpgme_release (ctx);
80            *r_ctx = NULL;
81        }
82        if (dat)
83            gpgme_data_release (dat);
84        gpgme_data_release (sig);
85        return err;
86    }
87    
88    
89    /* Display the policy URL and the notation data of a signature.
90       If @not is NULL, it is assumed there is no data.
91       @dlg is the handle to the calling dialog. */
92    static void
93    show_notation_data (HWND dlg, gpgme_sig_notation_t not)
94    {
95        gpgme_sig_notation_t n;
96        size_t len=0;
97        char *p;
98    
99        for (n=not; n; n = n->next) {
100            if (n->name)
101                len += strlen (n->name) + 1;
102            else
103                len += strlen ("policy URL") + 1;
104            len += strlen (n->value) + 1;
105            len += 6;
106        }
107        p = (char *)calloc (1, len+64);
108        if (!p)
109            BUG (NULL);
110        strcpy (p, "Notation data:\n");
111        for (n=not; n; n = n->next) {
112            if (!n->name)
113                strcat (p, "policy url: ");
114            else {
115                strcat (p, n->name);
116                strcat (p, " : ");
117            }
118            strcat (p, n->value);
119            strcat (p, "\n");
120        }
121    
122        msg_box (dlg, p, _("Signature Information"), MB_INFO);
123        free (p);
124    }
125    
126    
127    /* Dialog procedure for the clipboard verification. */
128  BOOL CALLBACK  BOOL CALLBACK
129  clip_verify_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  clip_verify_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
130  {  {
131      static listview_ctrl_t lv = NULL;      static listview_ctrl_t lv = NULL;
132      static text_input_s *ctx = NULL;      static text_input_s *ctx = NULL;
     const char *ndat, *nurl;  
133      gpgme_error_t err;      gpgme_error_t err;
134      gpgme_sig_t sig = NULL;      gpgme_signature_t sig = NULL, s;
135      gpgme_keycache_t kc = NULL;      gpgme_keycache_t kc = NULL;
136        gpgme_ctx_t c;
137      char keyid[16+1];      char keyid[16+1];
138      u16 port = HKP_PORT;      u16 port = HKP_PORT;
139      int rc = 0, tt, algo;      int rc = 0;
     size_t i;  
140            
141      switch( msg ) {      switch( msg ) {
142      case WM_INITDIALOG:      case WM_INITDIALOG:
143  #ifndef LANG_DE      #ifndef LANG_DE
144          SetWindowText( dlg, _("Verify") );          SetWindowText (dlg, _("Verify"));
145  #endif      #endif
146          kc = keycache_get_ctx( KEYCACHE_PUB );          kc = keycache_get_ctx (KEYCACHE_PUB);
147          if( !kc )          if (!kc)
148              BUG( NULL );              BUG (NULL);
149          ctx = (text_input_s *)lparam;          ctx = (text_input_s *)lparam;
150          if( ctx && ctx->length )          err = gpg_clip_verify (ctx && ctx->length > 0,
151              err = gpgme_op_clip_verify_detached( kc, &sig, ctx->data, ctx->length );                                 ctx->data, ctx->length, &c, &sig);
152          else          if (err) {              
153              err = gpgme_op_clip_verify (kc, &sig);              msg_box (dlg, gpgme_strerror (err), _("Verify"), MB_ERR);
154          if (err) {              gpgme_release (c);
155              if (err == GPGME_Internal_GPG_Problem)              EndDialog (dlg, FALSE);
                 gnupg_display_error ();  
             else  
                 msg_box( dlg, gpgme_strerror( err ), _("Verify"), MB_ERR );  
             gpgme_sig_release( sig );  
             EndDialog( dlg, FALSE );  
156              return FALSE;              return FALSE;
157          }                  }
158    
159          tt = gpgme_sig_get_ulong_attr( sig, 0, GPGME_ATTR_VALIDITY );          if (sig->status == gpg_error (GPG_ERR_NO_PUBKEY)) {
         if( tt == GPGME_SIG_STAT_NOKEY ) {  
160              const char * kserv;              const char * kserv;
161              u32 kid = gpgme_sig_get_ulong_attr( sig, 0, GPGME_ATTR_KEYID );              const char *fpr = sig->fpr;
162              if( kid == 0 )              if (!fpr)
163                  kid = 0xDEADBEEF;                  fpr = "0xDEADBEEF";
164              tt = gpgme_sig_get_ulong_attr( sig, 0, GPGME_ATTR_CREATED );              if (strlen (fpr) == 40)
165              algo = gpgme_sig_get_ulong_attr( sig, 0, GPGME_ATTR_ALGO );                  fpr += 32;
166              _snprintf( keyid, sizeof keyid - 1, "%X", kid );              else
167              rc = log_box( _("Verify"), MB_INFO|MB_YESNO,                  fpr += 24;
168                rc = log_box (_("Verify"), MB_INFO|MB_YESNO,
169                            _("Signature made %s using %s key ID 0x%s\n"                            _("Signature made %s using %s key ID 0x%s\n"
170                            "Cannot check signature: public key not found\n\n"                            "Cannot check signature: public key not found\n\n"
171                            "Do you want to try to retrieve the key from the keyserver?"),                            "Do you want to try to retrieve the key from the keyserver?"),
172                            strtimestamp( tt ),                            strtimestamp (sig->timestamp),
173                            gpgme_key_expand_attr( GPGME_ATTR_ALGO, algo ),                            get_key_pubalgo (sig->pubkey_algo), fpr);
174                            keyid );              if (rc == IDNO) {
175              if( rc == IDNO ) {                  msg_box (dlg, gpg_sigstat[GPGME_SIG_STAT_NOKEY], _("Verify"), MB_WARN);
176                  msg_box( dlg, gpg_sigstat[GPGME_SIG_STAT_NOKEY], _("Verify"), MB_ERR );                  gpgme_release (c);
177                  gpgme_sig_release( sig );                  EndDialog (dlg, FALSE);
                 EndDialog( dlg, FALSE );  
178                  return FALSE;                  return FALSE;
179              }              }
180                if (0) {
181                /* FIXME: does GPGME include the keyserver status
182              kserv = gpgme_sig_get_string_attr (sig, GPGME_ATTR_KEYSERVER);              kserv = gpgme_sig_get_string_attr (sig, GPGME_ATTR_KEYSERVER);
183              if (kserv && strncmp (kserv, "hkp://", 6)) {              if (kserv && strncmp (kserv, "hkp://", 6)) {
184                  rc = log_box (_("Verify"), MB_INFO|MB_YESNO,                  rc = log_box (_("Verify"), MB_INFO|MB_YESNO,
# Line 100  clip_verify_dlg_proc (HWND dlg, UINT msg Line 187  clip_verify_dlg_proc (HWND dlg, UINT msg
187                  if (rc == IDNO) {                  if (rc == IDNO) {
188                      kserv = default_keyserver;                      kserv = default_keyserver;
189                      port = default_keyserver_port;                      port = default_keyserver_port;
190                  }                  }*/
191              }              }
192                
193              else {              else {
194                  kserv = default_keyserver;                  kserv = default_keyserver;
195                  port = default_keyserver_port;                  port = default_keyserver_port;
# Line 111  clip_verify_dlg_proc (HWND dlg, UINT msg Line 199  clip_verify_dlg_proc (HWND dlg, UINT msg
199                  kc = keycache_get_ctx (KEYCACHE_PUB);                  kc = keycache_get_ctx (KEYCACHE_PUB);
200                  if (!kc)                  if (!kc)
201                      BUG (dlg);                      BUG (dlg);
                 gpgme_sig_set_key_ctx (sig, kc);  
202              }              }
203          }          }
204          else if( tt == GPGME_SIG_STAT_BAD &&          else if (sig->status == gpg_error (GPG_ERR_BAD_SIGNATURE) && !sig->timestamp)
                  !gpgme_sig_get_ulong_attr( sig, 0, GPGME_ATTR_CREATED ) )  
205                   ;                   ;
206          else if( !gpgme_sig_get_ulong_attr( sig, 0, GPGME_ATTR_TYPE )          else if (!sig->timestamp || !sig->validity) {
207                   || !gpgme_sig_get_ulong_attr( sig, 0, GPGME_ATTR_CREATED )              msg_box (dlg, _("Invalid signature state."), _("Verify"), MB_ERR);
208                   || !gpgme_sig_get_ulong_attr( sig, 0, GPGME_ATTR_VALIDITY ) ) {              gpgme_release (c);
209              msg_box( dlg, _("Invalid signature state."), _("Verify"), MB_ERR );              EndDialog (dlg, FALSE);
             gpgme_sig_release( sig );  
             EndDialog( dlg, FALSE );  
210              return FALSE;              return FALSE;
211          }          }
212          verlist_build( &lv, GetDlgItem( dlg, IDC_VERIFY_SIGLIST ), 0 );          verlist_build (&lv, GetDlgItem (dlg, IDC_VERIFY_SIGLIST), 0);
213    
214          for( i = 0; i < gpgme_sig_get_ulong_attr( sig, 0, GPGME_ATTR_LEVEL ); i++ ) {          for (s = sig; s; s = s->next) {
215              gpgme_sig_t _sig;              rc = verlist_add_sig (lv, s);
216              _sig = (gpgme_sig_t)gpgme_sig_get_ulong_attr( sig, i, GPGME_ATTR_OPAQUE );              if (rc)
217              rc = verlist_add_sig( lv, _sig );                  msg_box (dlg, _("Could not extract key or signature information."),
218              if( rc )                           _("Verify"), MB_ERR);
                 msg_box( dlg, _("Could not extract key or signature information."),  
                         _("Verify"), MB_ERR );  
219          }          }
220          if( gpgme_sig_get_ulong_attr( sig, 0, GPGME_ATTR_EXPIRE ) )          if (sig->exp_timestamp > (DWORD)time (NULL))
221              SetDlgItemText( dlg, IDC_VERIFY_INFO, _("The signature is expired!") );              SetDlgItemText( dlg, IDC_VERIFY_INFO, _("The signature is expired!") );
222          ndat = gpgme_sig_get_string_attr( sig, GPGME_ATTR_NOTATION );          if (sig->notations)
223          nurl = gpgme_sig_get_string_attr( sig, GPGME_ATTR_POLICY_URL );              show_notation_data (dlg, sig->notations);
224          if( ndat || nurl ) {          gpgme_release (c);
225              size_t n;          SetForegroundWindow (dlg);
226              char * p;          set_active_window (dlg);
             n = ndat? strlen( ndat ) + 1 : 0;  
             n += nurl? strlen( nurl ) + 1 : 0;  
             p = new char[n+40];  
             if( !p )  
                 BUG( NULL );  
             sprintf( p, "%s%s%s%s%s",  
                 ndat? _("Notation Data: ") : "", ndat? ndat : "", ndat? "\n" : "",  
                 nurl? _("Policy URL: ") : "", nurl? nurl : "" );  
             msg_box( dlg, p, _("Signature Information"), MB_INFO );  
             free_if_alloc( p );  
         }  
         gpgme_sig_release( sig );  
         SetForegroundWindow( dlg );  
         set_active_window( dlg );  
227          return TRUE;          return TRUE;
228                    
229      case WM_DESTROY:      case WM_DESTROY:
230          reset_active_window();          reset_active_window ();
231          if( lv ) {          if (lv) {
232              listview_release( lv );              listview_release (lv);
233              lv = NULL;              lv = NULL;
234          }          }
235          return FALSE;          return FALSE;
236                    
237      case WM_SYSCOMMAND:      case WM_SYSCOMMAND:
238          if( LOWORD( wparam ) == SC_CLOSE )          if (LOWORD (wparam) == SC_CLOSE)
239              EndDialog( dlg, TRUE );              EndDialog (dlg, TRUE);
240          return FALSE;          return FALSE;
241                    
242      case WM_COMMAND:      case WM_COMMAND:
243          switch( LOWORD( wparam ) ) {          switch (LOWORD (wparam )) {
244          case IDOK:          case IDOK:
245              EndDialog( dlg, TRUE );              EndDialog (dlg, TRUE);
246              return FALSE;              return FALSE;
247                            
248          case IDC_VERIFY_SAVE:          case IDC_VERIFY_SAVE:
249              dialog_box_param( glob_hinst, (LPCTSTR)IDD_WINPT_FILE_SAVE, dlg,              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_FILE_SAVE, dlg,
250                                file_save_dlg_proc, NULL, _("Save Plaintext"),                                file_save_dlg_proc, NULL, _("Save Plaintext"),
251                                IDS_WINPT_FILE_SAVE );                                IDS_WINPT_FILE_SAVE);
252              break;              break;
253          }          }
254          break;          break;
255      }      }
256            
257      return FALSE;      return FALSE;
258  } /* clip_verify_dlg_proc */  }
259    

Legend:
Removed from v.6  
changed lines
  Added in v.23

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26