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

Diff of /trunk/Src/wptFileManager.cpp

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

revision 35 by twoaday, Wed Oct 26 11:20:09 2005 UTC revision 36 by werner, Thu Oct 27 15:25:13 2005 UTC
# Line 1  Line 1 
1  /* wptFileManager.cpp - File Manager routines  /* wptFileManager.cpp - File Manager routines
2   *      Copyright (C) 2001-2005 Timo Schulz   *      Copyright (C) 2001-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  /* TODO:  /* TODO:
22   *    check_armor_type: we should check the whole file and not only the first line!   *    check_armor_type: we should check the whole file and not only the first line!
23   */   */
24    
25  #include <sys/types.h>  #ifdef HAVE_CONFIG_H
26  #include <windows.h>  #include <config.h>
27  #include <commdlg.h>  #endif
28  #include <io.h>  
29    #include <sys/types.h>
30  #include "../resource.h"  #include <sys/types.h>
31  #include "wptTypes.h"  #include <windows.h>
32  #include "wptGPG.h"  #include <commdlg.h>
33  #include "wptAgent.h"  #include <io.h>
34  #include "wptCommonCtl.h"  
35  #include "wptContext.h"  #include "../resource.h"
36  #include "wptErrors.h"  #include "wptTypes.h"
37  #include "wptKeylist.h"  #include "wptGPG.h"
38  #include "wptFileManager.h"  #include "wptAgent.h"
39  #include "wptNLS.h"  #include "wptCommonCtl.h"
40  #include "wptW32API.h"  #include "wptContext.h"
41  #include "wptVersion.h"  #include "wptErrors.h"
42  #include "wptDlgs.h"  #include "wptKeylist.h"
43  #include "wptZIP.h"  #include "wptFileManager.h"
44  #include "wptUTF8.h"  #include "wptNLS.h"
45  #include "wptRegistry.h"  #include "wptW32API.h"
46  #include "wptImport.h"  #include "wptVersion.h"
47    #include "wptDlgs.h"
48  #include "openpgp.h"  #include "wptZIP.h"
49    #include "wptUTF8.h"
50  #define op_begin()  SetCursor (LoadCursor (NULL, IDC_WAIT))  #include "wptRegistry.h"
51  #define op_end()    SetCursor (LoadCursor (NULL, IDC_ARROW))  #include "wptImport.h"
52    
53  void progress_cleanup (progress_filter_s *pfx);  #include "openpgp.h"
54  BOOL CALLBACK file_secdel_confirm_dlg_proc (HWND dlg, UINT msg,  
55                                              WPARAM wparam, LPARAM lparam);  #define op_begin()  SetCursor (LoadCursor (NULL, IDC_WAIT))
56  char* gpg_keylist_to_pattern (gpgme_key_t *rset, int n);  #define op_end()    SetCursor (LoadCursor (NULL, IDC_ARROW))
57  gpgme_error_t sym_passphrase_cb (void *hook, const char *hint, const char *pass_inf,  
58                                   int prev_was_bad, int fd);  void progress_cleanup (progress_filter_s *pfx);
59    BOOL CALLBACK file_secdel_confirm_dlg_proc (HWND dlg, UINT msg,
60  /*-- wptFileVerifyDlg.cpp --*/                                              WPARAM wparam, LPARAM lparam);
61  void file_verify_add_state (file_sig_ctx_t c);  char* gpg_keylist_to_pattern (gpgme_key_t *rset, int n);
62  void file_verify_use_event (void);  gpgme_error_t sym_passphrase_cb (void *hook, const char *hint, const char *pass_inf,
63  void file_verify_wait (void);                                   int prev_was_bad, int fd);
64    
65  static const char * mm_files[] = {".mov", ".avi", ".mpg", ".mpeg",  /*-- wptFileVerifyDlg.cpp --*/
66                                    ".mp3", ".wav", ".mid", ".wma",  void file_verify_add_state (file_sig_ctx_t c);
67                                    ".gif", ".jpg", ".png", ".jpeg", ".dib", 0};  void file_verify_use_event (void);
68    void file_verify_wait (void);
69    
70  /* Check if the drive given by @fname is a floppy disc.  static const char * mm_files[] = {".mov", ".avi", ".mpg", ".mpeg",
71     Return value: 1 for success. */                                    ".mp3", ".wav", ".mid", ".wma",
72  static int                                    ".gif", ".jpg", ".png", ".jpeg", ".dib", 0};
73  is_floppy_disc (const char * fname)  
74  {  
75      char drv[32] = {0};  /* Check if the drive given by @fname is a floppy disc.
76      int i=0;     Return value: 1 for success. */
77    static int
78      if (!strstr (fname, ":\\"))  is_floppy_disc (const char * fname)
79          return 0;  {
80        char drv[32] = {0};
81      while (fname && *fname && *fname != '\\')      int i=0;
82          drv[i++] = *fname++;  
83      drv[i++] = '\\';      if (!strstr (fname, ":\\"))
84      drv[i++] = '\0';          return 0;
85      i = GetDriveType (drv);  
86      if (i == DRIVE_REMOVABLE)      while (fname && *fname && *fname != '\\')
87          return -1;          drv[i++] = *fname++;
88      return 0;      drv[i++] = '\\';
89  }      drv[i++] = '\0';
90        i = GetDriveType (drv);
91        if (i == DRIVE_REMOVABLE)
92  /* Ask the user to overwrite file @fname.          return -1;
93     Return value: 0 for cancel. */      return 0;
94  int  }
95  overwrite_file (const char *fname)  
96  {  
97      int id;  /* Ask the user to overwrite file @fname.
98       Return value: 0 for cancel. */
99      if (file_exist_check (fname))  int
100          return -1;  overwrite_file (const char *fname)
101      id = log_box (_("File Manager"), MB_YESNO,  {
102                    _("\"%s\" already exists.\n"      int id;
103                      "Replace existing file?"), fname);  
104      return id == IDNO ? 0 : -1;      if (file_exist_check (fname))
105  }          return -1;
106        id = log_box (_("File Manager"), MB_YESNO,
107                      _("\"%s\" already exists.\n"
108  /* Removes 'critical' attributes from the file @fname.                      "Replace existing file?"), fname);
109     If @force is 1, the user is not asked for permission. */      return id == IDNO ? 0 : -1;
110  static void  }
111  remove_crit_file_attrs (const char *fname, int force)  
112  {  
113      u32 f_attr;  /* Removes 'critical' attributes from the file @fname.
114      int id;     If @force is 1, the user is not asked for permission. */
115    static void
116      if (file_exist_check (fname))  remove_crit_file_attrs (const char *fname, int force)
117          return; /* Does not exist */  {
118                u32 f_attr;
119      f_attr = GetFileAttributes (fname);      int id;
120      if ((f_attr & FILE_ATTRIBUTE_READONLY) && force)  
121          SetFileAttributes (fname, FILE_ATTRIBUTE_NORMAL);      if (file_exist_check (fname))
122      else if (f_attr & FILE_ATTRIBUTE_READONLY) {          return; /* Does not exist */
123          id = log_box (_("File Manager"), MB_YESNO,                    
124                        _("\"%s\" has read-only attribute.\n"      f_attr = GetFileAttributes (fname);
125                          "Set attribute to normal?"), fname);      if ((f_attr & FILE_ATTRIBUTE_READONLY) && force)
126          if (id == IDYES)          SetFileAttributes (fname, FILE_ATTRIBUTE_NORMAL);
127              SetFileAttributes (fname, FILE_ATTRIBUTE_NORMAL);      else if (f_attr & FILE_ATTRIBUTE_READONLY) {
128      }          id = log_box (_("File Manager"), MB_YESNO,          
129  }                        _("\"%s\" has read-only attribute.\n"
130                            "Set attribute to normal?"), fname);
131            if (id == IDYES)
132  static int inline              SetFileAttributes (fname, FILE_ATTRIBUTE_NORMAL);
133  is_directory (const char *fname)      }
134  {      }
135      return GetFileAttributes (fname) & FILE_ATTRIBUTE_DIRECTORY? 1 : 0;  
136  }  
137    static int inline
138    is_directory (const char *fname)
139  static int inline  {    
140  is_openpgp_ext (const char *name)      return GetFileAttributes (fname) & FILE_ATTRIBUTE_DIRECTORY? 1 : 0;
141  {  }
142      if (strstr (name, ".gpg") || strstr (name, ".asc")  
143          || strstr (name, ".sig") || strstr (name, ".pgp"))  
144          return -1;  static int inline
145      return 0;  is_openpgp_ext (const char *name)
146  }  {
147        if (strstr (name, ".gpg") || strstr (name, ".asc")
148            || strstr (name, ".sig") || strstr (name, ".pgp"))
149  static int          return -1;
150  is_multi_media (const char * name)      return 0;
151  {      }
152      const char * val;  
153      char * p;  
154      int i;  static int
155      int ans=0;  is_multi_media (const char * name)
156    {    
157      i = get_reg_winpt_single (CFG_NOZIP_MMEDIA);      const char * val;
158      if (i == -1)      char * p;
159      {      int i;
160          ans = msg_box (NULL, _("Multi-Media files are already compressed, GPG would compress\n"      int ans=0;
161                                 "them anyway and this costs a lot of time.\n"  
162                                 "It is possible to disable compression for these files.\n"      i = get_reg_winpt_single (CFG_NOZIP_MMEDIA);
163                                 "Do you want to disable it?"),      if (i == -1)
164                                 _("File Manager"), MB_YESNO|MB_INFO);      {
165          set_reg_winpt_single (CFG_NOZIP_MMEDIA, ans == IDYES? 1 : 0);          ans = msg_box (NULL, _("Multi-Media files are already compressed, GPG would compress\n"
166          if (ans == IDNO)                                 "them anyway and this costs a lot of time.\n"
167              return 0;                                 "It is possible to disable compression for these files.\n"
168      }                                 "Do you want to disable it?"),
169      else if (i == 0)                                 _("File Manager"), MB_YESNO|MB_INFO);
170          return 0;          set_reg_winpt_single (CFG_NOZIP_MMEDIA, ans == IDYES? 1 : 0);
171            if (ans == IDNO)
172      p = strrchr (name, '.');              return 0;
173      if (!p)      }
174          return 0;      else if (i == 0)
175      for (i=0; (val = mm_files[i]); i++)          return 0;
176      {  
177          if (!stricmp (p, val))      p = strrchr (name, '.');
178              return -1;      if (!p)
179      }          return 0;
180      return 0;      for (i=0; (val = mm_files[i]); i++)
181  }      {
182            if (!stricmp (p, val))
183                return -1;
184  const char*      }
185  file_get_extension (gpgme_ctx_t ctx, gpgme_sig_mode_t sigmode)      return 0;
186  {  }
187      int use_armor = gpgme_get_armor (ctx);  
188    
189      if (use_armor || sigmode == GPGME_SIG_MODE_CLEAR)  const char*
190          return ".asc";  file_get_extension (gpgme_ctx_t ctx, gpgme_sig_mode_t sigmode)
191      if (!use_armor && sigmode == GPGME_SIG_MODE_DETACH)  {
192          return ".sig";      int use_armor = gpgme_get_armor (ctx);
193      return ".gpg";  
194  }      if (use_armor || sigmode == GPGME_SIG_MODE_CLEAR)
195            return ".asc";
196        if (!use_armor && sigmode == GPGME_SIG_MODE_DETACH)
197  char*          return ".sig";
198  fm_quote_file (const char * name)      return ".gpg";
199  {  }
200      char * p;  
201      size_t len = strlen (name) + 8;  
202    char*
203      if (*name == '"')  fm_quote_file (const char * name)
204          return m_strdup (name); /* avoid double quotes */  {
205      p = new char[len + 1];      char * p;
206      if (!p)      size_t len = strlen (name) + 8;
207          BUG (0);  
208      _snprintf (p, len, "\"%s\"", name);      if (*name == '"')
209            return m_strdup (name); /* avoid double quotes */
210      return p;      p = new char[len + 1];
211  } /* fm_quote_file */      if (!p)
212            BUG (0);
213        _snprintf (p, len, "\"%s\"", name);
214    
215  /* Check the armor type of the file @fname and return      return p;
216     a string representation of it. */  } /* fm_quote_file */
217  static const char *  
218  fm_check_armor_type (const char *fname, int *r_type)  
219  {  
220      FILE * fp;  /* Check the armor type of the file @fname and return
221      char header[768], * p;     a string representation of it. */
222        static const char *
223      if (r_type)  fm_check_armor_type (const char *fname, int *r_type)
224          *r_type = PGP_NONE;  {
225      fp = fopen (fname, "rb");      FILE * fp;
226      if (!fp)      char header[768], * p;
227          return "UNKNOWN";      
228      p = fgets (header, sizeof (header) - 1, fp);      if (r_type)
229      fclose (fp);          *r_type = PGP_NONE;
230      if (!p)      fp = fopen (fname, "rb");
231          return "UNKNOWN";      if (!fp)
232            return "UNKNOWN";
233      if (strncmp (header, "-----", 5))      p = fgets (header, sizeof (header) - 1, fp);
234          goto leave;      fclose (fp);
235      if (strstr( header, "BEGIN PGP PUBLIC KEY" )) {      if (!p)
236          if (r_type) *r_type = PGP_PUBKEY;          return "UNKNOWN";
237          return "PUBKEY";  
238      }      if (strncmp (header, "-----", 5))
239      else if (strstr (header, "BEGIN PGP PRIVATE KEY") ||          goto leave;
240               strstr (header, "BEGIN PGP SECRET KEY")) {      if (strstr( header, "BEGIN PGP PUBLIC KEY" )) {
241          if (r_type) *r_type = PGP_SECKEY;          if (r_type) *r_type = PGP_PUBKEY;
242          return "SECKEY";          return "PUBKEY";
243      }      }
244      else if (strstr (header, "BEGIN PGP MESSAGE")) {      else if (strstr (header, "BEGIN PGP PRIVATE KEY") ||
245          if (r_type) *r_type = PGP_MESSAGE;               strstr (header, "BEGIN PGP SECRET KEY")) {
246          return "ENCRYPTED";          if (r_type) *r_type = PGP_SECKEY;
247      }          return "SECKEY";
248      else if (strstr( header, "BEGIN PGP SIGNED MESSAGE")) {      }
249          if (r_type) *r_type = PGP_CLEARSIG;      else if (strstr (header, "BEGIN PGP MESSAGE")) {
250          return "SIGNED-CLEAR";          if (r_type) *r_type = PGP_MESSAGE;
251      }          return "ENCRYPTED";
252      else if (strstr(header, "BEGIN PGP SIGNATURE")) {      }
253          if (r_type) *r_type = PGP_SIG;      else if (strstr( header, "BEGIN PGP SIGNED MESSAGE")) {
254          return "SIGNED-DETACH";          if (r_type) *r_type = PGP_CLEARSIG;
255      }          return "SIGNED-CLEAR";
256        }
257  leave:      else if (strstr(header, "BEGIN PGP SIGNATURE")) {
258      return "UNKNOWN";          if (r_type) *r_type = PGP_SIG;
259  }          return "SIGNED-DETACH";
260        }
261    
262  /* Extract file type from @fname. If @r_type is valid,  leave:
263     it contains the PGP type on success. */      return "UNKNOWN";
264  static const char *  }
265  fm_get_file_type (const char *fname, int *r_type)  
266  {          
267      gpg_iobuf_t inp;  /* Extract file type from @fname. If @r_type is valid,
268      armor_filter_context_t afx;     it contains the PGP type on success. */
269      PACKET * pkt = (PACKET *)calloc (1, sizeof *pkt);  static const char *
270      int i = 0, rc = 0;  fm_get_file_type (const char *fname, int *r_type)
271      const char *s = NULL;  {        
272        gpg_iobuf_t inp;
273      if (r_type)      armor_filter_context_t afx;
274          *r_type = PGP_NONE;      PACKET * pkt = (PACKET *)calloc (1, sizeof *pkt);
275      if (!fname) {      int i = 0, rc = 0;
276          safe_free (pkt);      const char *s = NULL;
277          return NULL;  
278      }      if (r_type)
279            *r_type = PGP_NONE;
280      if (is_floppy_disc (fname))      if (!fname) {
281          return fm_check_armor_type (fname, r_type);          safe_free (pkt);
282            return NULL;
283      inp = gpg_iobuf_open (fname);      }
284      if (!inp) {  
285          const char *s = winpt_strerror (WPTERR_FILE_OPEN);      if (is_floppy_disc (fname))
286          log_box( _("File Manager"), MB_ERR, "\"%s\": %s", fname, s );          return fm_check_armor_type (fname, r_type);
287          safe_free( pkt );  
288          return NULL;      inp = gpg_iobuf_open (fname);
289      }      if (!inp) {
290      gpg_iobuf_ioctl (inp, 3, 1, NULL); /* disable cache */          const char *s = winpt_strerror (WPTERR_FILE_OPEN);
291      if (gpg_iobuf_get_filelength (inp) > 32000000 /* 32MB */          log_box( _("File Manager"), MB_ERR, "\"%s\": %s", fname, s );
292          && !is_openpgp_ext (fname)) {          safe_free( pkt );
293          gpg_iobuf_close (inp);          return NULL;
294          return "UNKNOWN";      }
295      }      gpg_iobuf_ioctl (inp, 3, 1, NULL); /* disable cache */
296        if (gpg_iobuf_get_filelength (inp) > 32000000 /* 32MB */
297      if (gpg_use_armor_filter(inp)) {          && !is_openpgp_ext (fname)) {
298          memset (&afx, 0, sizeof (afx));          gpg_iobuf_close (inp);
299          gpg_iobuf_push_filter (inp, gpg_armor_filter, &afx);          return "UNKNOWN";
300      }      }
301        
302      gpg_init_packet (pkt);      if (gpg_use_armor_filter(inp)) {
303      while (!(rc = gpg_parse_packet (inp, pkt))) {          memset (&afx, 0, sizeof (afx));
304          switch (pkt->pkttype) {          gpg_iobuf_push_filter (inp, gpg_armor_filter, &afx);
305          case PKT_PUBKEY_ENC:      }
306              s = "ENCRYPTED";rc = -2;      
307              if (r_type) *r_type = PGP_MESSAGE;      gpg_init_packet (pkt);
308              break;      while (!(rc = gpg_parse_packet (inp, pkt))) {
309          case PKT_SYMKEY_ENC:          switch (pkt->pkttype) {
310          case PKT_ENCRYPTED:          case PKT_PUBKEY_ENC:
311              s = "SYMKEYENC";rc = -2;              s = "ENCRYPTED";rc = -2;
312              if (r_type) *r_type = PGP_MESSAGE;              if (r_type) *r_type = PGP_MESSAGE;
313              break;              break;
314          case PKT_SIGNATURE:          case PKT_SYMKEY_ENC:
315          case PKT_ONEPASS_SIG:          case PKT_ENCRYPTED:
316              s = "SIGNED";   rc = -2;              s = "SYMKEYENC";rc = -2;
317              if (r_type) *r_type = PGP_SIG;              if (r_type) *r_type = PGP_MESSAGE;
318              break;              break;
319          case PKT_PUBLIC_KEY:          case PKT_SIGNATURE:
320              s = "PUBKEY";   rc = -2;          case PKT_ONEPASS_SIG:
321              if (r_type) *r_type = PGP_PUBKEY;              s = "SIGNED";   rc = -2;
322              break;              if (r_type) *r_type = PGP_SIG;
323          case PKT_SECRET_KEY:              break;
324              s = "SECKEY";   rc = -2;          case PKT_PUBLIC_KEY:
325              if (r_type) *r_type = PGP_SECKEY;              s = "PUBKEY";   rc = -2;
326              break;              if (r_type) *r_type = PGP_PUBKEY;
327          }              break;
328          gpg_free_packet (pkt);          case PKT_SECRET_KEY:
329          gpg_init_packet (pkt);              s = "SECKEY";   rc = -2;
330          if (rc == -2)              if (r_type) *r_type = PGP_SECKEY;
331              break; /* found */              break;
332      }          }
333      safe_free (pkt);          gpg_free_packet (pkt);
334      gpg_iobuf_close (inp);          gpg_init_packet (pkt);
335      if (!s)          if (rc == -2)
336          s = fm_check_armor_type (fname, r_type);              break; /* found */
337      if (!s)      }
338          s = "UNKNOWN";      safe_free (pkt);
339      if (!strcmp (s, "SIGNED")      gpg_iobuf_close (inp);
340          && strcmp (fm_check_armor_type (fname, r_type), "SIGNED-CLEAR ")) {      if (!s)
341          if (r_type) *r_type = PGP_SIG;          s = fm_check_armor_type (fname, r_type);
342          s = "SIGNED-DETACH";      if (!s)
343      }          s = "UNKNOWN";
344      return s;      if (!strcmp (s, "SIGNED")
345  }          && strcmp (fm_check_armor_type (fname, r_type), "SIGNED-CLEAR ")) {
346            if (r_type) *r_type = PGP_SIG;
347            s = "SIGNED-DETACH";
348  int      }
349  fm_build (listview_ctrl_t *lv, HWND ctrl)      return s;
350  {  }
351      int i, rc = 0;  
352      listview_ctrl_t c;  
353      struct listview_column_s col[] =  int
354      {  fm_build (listview_ctrl_t *lv, HWND ctrl)
355          {0,  80, (char *)_("Status") },  {
356          {1, 256, (char *)_("Name") },      int i, rc = 0;
357          {2, 128, (char *)_("Operation") },      listview_ctrl_t c;
358          {0,   0, NULL }      struct listview_column_s col[] =
359      };      {
360                    {0,  80, (char *)_("Status") },
361      rc = listview_new( &c );          {1, 256, (char *)_("Name") },
362      if( rc )          {2, 128, (char *)_("Operation") },
363          BUG( NULL );          {0,   0, NULL }
364      c->ctrl = ctrl;      };
365      for ( i = 0; col[i].width; i++ )          
366          listview_add_column( c, &col[i] );      rc = listview_new( &c );
367      listview_set_ext_style( c );      if( rc )
368      if( lv )          BUG( NULL );
369          *lv = c;      c->ctrl = ctrl;
370      return 0;      for ( i = 0; col[i].width; i++ )
371  } /* fm_build */          listview_add_column( c, &col[i] );
372        listview_set_ext_style( c );
373        if( lv )
374  void          *lv = c;
375  fm_delete( listview_ctrl_t lv )      return 0;
376  {  } /* fm_build */
377      if( lv ) {  
378          listview_release( lv );  
379      }  void
380  } /* fm_delete */  fm_delete( listview_ctrl_t lv )
381    {
382        if( lv ) {
383  int          listview_release( lv );
384  fm_state_new (fm_state_t * ctx)      }
385  {  } /* fm_delete */
386      gpgme_error_t rc;  
387      fm_state_s * c;  
388    int
389      c = new fm_state_s;  fm_state_new (fm_state_t * ctx)
390      if (!c)  {
391          BUG (0);      gpgme_error_t rc;
392      memset (c, 0, sizeof * c);      fm_state_s * c;
393      rc = gpgme_new (&c->ctx);  
394      if (rc)      c = new fm_state_s;
395          BUG (0);      if (!c)
396      /* XXX rc = gpgme_recipients_new (&c->recp);*/          BUG (0);
397      /* XXX gpgme_set_comment (c->ctx, "Generated by WinPT "PGM_VERSION); */      memset (c, 0, sizeof * c);
398      *ctx = c;      rc = gpgme_new (&c->ctx);
399      return 0;      if (rc)
400  } /* fm_state_new */          BUG (0);
401        /* XXX rc = gpgme_recipients_new (&c->recp);*/
402        /* XXX gpgme_set_comment (c->ctx, "Generated by WinPT "PGM_VERSION); */
403  /* Release the FM state handle @c. */      *ctx = c;
404  void      return 0;
405  fm_state_release (fm_state_t c)  } /* fm_state_new */
406  {  
407      if (!c)  
408          return;  /* Release the FM state handle @c. */
409      if (c->recp)  void
410          free (c->recp);  fm_state_release (fm_state_t c)
411      if (c->ctx) {  {
412          gpgme_release (c->ctx);      if (!c)
413          c->ctx = NULL;            return;
414      }      if (c->recp)
415      free_if_alloc (c->opaque);          free (c->recp);
416      free_if_alloc (c->output);      if (c->ctx) {
417      delete c; c = NULL;              gpgme_release (c->ctx);
418  }          c->ctx = NULL;  
419        }
420  static int      free_if_alloc (c->opaque);
421  fm_check_for_entry( listview_ctrl_t lv, const char *file )      free_if_alloc (c->output);
422  {      delete c; c = NULL;    
423      char name[512];  }
424      int i;  
425    static int
426      memset (name, 0, sizeof (name));  fm_check_for_entry( listview_ctrl_t lv, const char *file )
427      for( i = 0; i < listview_count_items( lv, 0 ); i++ )  {
428      {      char name[512];
429          listview_get_item_text( lv, i, 1, name, sizeof (name) - 1 );      int i;
430          if( !strcmp( name, file ) )  
431              return 1; /* found */            memset (name, 0, sizeof (name));
432      }      for( i = 0; i < listview_count_items( lv, 0 ); i++ )
433        {
434      return 0;          listview_get_item_text( lv, i, 1, name, sizeof (name) - 1 );
435  } /* fm_check_for_entry */          if( !strcmp( name, file ) )
436                return 1; /* found */      
437        }
438  static int  
439  fm_set_ftype (listview_ctrl_t lv, const char *name)      return 0;
440  {  } /* fm_check_for_entry */
441      const char *type;  
442      int rc;  
443    static int
444      rc = fm_check_for_entry (lv, name);  fm_set_ftype (listview_ctrl_t lv, const char *name)
445      if (rc)  {
446          return 0;      const char *type;
447      type = fm_get_file_type (name, NULL);      int rc;
448      if (!type || !strcmp (type, "UNKNOWN"))  
449          type = gnupg_check_file_ext (name, NULL);      rc = fm_check_for_entry (lv, name);
450      rc = listview_add_item (lv, " ");      if (rc)
451      if (rc)          return 0;
452          return -1;      type = fm_get_file_type (name, NULL);
453      listview_add_sub_item (lv, 0, 0, type);      if (!type || !strcmp (type, "UNKNOWN"))
454      listview_add_sub_item (lv, 0, 1, name);          type = gnupg_check_file_ext (name, NULL);
455      return 0;      rc = listview_add_item (lv, " ");
456  }      if (rc)
457            return -1;
458        listview_add_sub_item (lv, 0, 0, type);
459  static int      listview_add_sub_item (lv, 0, 1, name);
460  fm_add_dir_files (listview_ctrl_t lv, char *path)      return 0;
461  {  }
462      struct _finddata_t fd;  
463      char * p;  
464      long hd;  static int
465    fm_add_dir_files (listview_ctrl_t lv, char *path)
466      strcat (path, "\\*");  {
467      hd = _findfirst (path, &fd);      struct _finddata_t fd;
468      do {      char * p;
469          p = new char [(strlen (path) + strlen (fd.name))+1];      long hd;
470          if (!p)  
471              BUG (0);      strcat (path, "\\*");
472          memcpy (p, path, strlen (path)-1);      hd = _findfirst (path, &fd);
473          p[strlen (path)-1] = 0;      do {
474          strcat (p, fd.name);          p = new char [(strlen (path) + strlen (fd.name))+1];
475          if (!is_directory (p))          if (!p)
476              fm_set_ftype (lv, p);              BUG (0);
477          free_if_alloc (p);          memcpy (p, path, strlen (path)-1);
478                    p[strlen (path)-1] = 0;
479      } while (_findnext (hd, &fd) == 0);          strcat (p, fd.name);
480      _findclose (hd);          if (!is_directory (p))
481      return 0;              fm_set_ftype (lv, p);
482  }          free_if_alloc (p);
483            
484        } while (_findnext (hd, &fd) == 0);
485  /* Add the drag & drop files from @dd_files to the      _findclose (hd);
486     list view control @lv. */      return 0;
487  int  }
488  fm_add_dropped_files (listview_ctrl_t lv, HDROP dd_files)  
489  {  
490      char name[384+4];  /* Add the drag & drop files from @dd_files to the
491      int nfiles, rc, i;     list view control @lv. */
492        int
493      memset (name, 0, sizeof (name));  fm_add_dropped_files (listview_ctrl_t lv, HDROP dd_files)
494      nfiles = DragQueryFile (dd_files, 0xFFFFFFFF, NULL, 0);  {
495      for (i = 0;  i < nfiles; i++) {      char name[384+4];
496          DragQueryFile (dd_files, i, name, sizeof (name) -1);      int nfiles, rc, i;
497          if (is_directory (name))      
498              rc = fm_add_dir_files (lv, name);      memset (name, 0, sizeof (name));
499          else      nfiles = DragQueryFile (dd_files, 0xFFFFFFFF, NULL, 0);
500              rc = fm_set_ftype (lv, name);      for (i = 0;  i < nfiles; i++) {
501          if (rc == -1)          DragQueryFile (dd_files, i, name, sizeof (name) -1);
502              break;          if (is_directory (name))
503      }              rc = fm_add_dir_files (lv, name);
504      return rc;          else
505  }              rc = fm_set_ftype (lv, name);
506            if (rc == -1)
507                break;
508  int      }
509  fm_add_opened_files (listview_ctrl_t lv, HWND dlg)      return rc;
510  {  }
511      OPENFILENAME open;  
512      const char *type;    
513      char file[512] = "";  int
514      int rc;  fm_add_opened_files (listview_ctrl_t lv, HWND dlg)
515        {
516      /* XXX: support to add multiple files. */      OPENFILENAME open;
517      memset (&open, 0, sizeof (open));      const char *type;  
518      open.lStructSize = sizeof (OPENFILENAME);      char file[512] = "";
519      open.hInstance = glob_hinst;      int rc;
520      open.lpstrTitle = _("File Open");      
521      open.lpstrFilter = _("All Files (*.*)\0*.*\0\0");      /* XXX: support to add multiple files. */
522      open.hwndOwner = dlg;      memset (&open, 0, sizeof (open));
523      open.lpstrFile = file;      open.lStructSize = sizeof (OPENFILENAME);
524      open.nMaxFile = sizeof (file) - 1;      open.hInstance = glob_hinst;
525      open.Flags = 0;      open.lpstrTitle = _("File Open");
526            open.lpstrFilter = _("All Files (*.*)\0*.*\0\0");
527      if (GetOpenFileName (&open)) {      open.hwndOwner = dlg;
528          type = fm_get_file_type (open.lpstrFile, NULL);      open.lpstrFile = file;
529          if (!type)      open.nMaxFile = sizeof (file) - 1;
530              return WPTERR_FILE_OPEN;      open.Flags = 0;
531          if (!strcmp (type, "UNKNOWN"))      
532              type = gnupg_check_file_ext (open.lpstrFile, NULL);      if (GetOpenFileName (&open)) {
533          rc = listview_add_item (lv, "");          type = fm_get_file_type (open.lpstrFile, NULL);
534          if (!rc) {          if (!type)
535              listview_add_sub_item (lv, 0, 0, type);              return WPTERR_FILE_OPEN;
536              listview_add_sub_item (lv, 0, 1, open.lpstrFile);          if (!strcmp (type, "UNKNOWN"))
537          }              type = gnupg_check_file_ext (open.lpstrFile, NULL);
538      }          rc = listview_add_item (lv, "");
539                if (!rc) {
540      return rc;              listview_add_sub_item (lv, 0, 0, type);
541  }              listview_add_sub_item (lv, 0, 1, open.lpstrFile);
542            }
543        }
544  int      
545  fm_assume_onepass_sig (const char * fname)      return rc;
546  {  }
547      gpgme_data_t dat;  
548      armor_filter_context_t afx;  
549      gpg_iobuf_t fp;  int
550      PACKET * pkt = (PACKET *)calloc (1, sizeof *pkt);  fm_assume_onepass_sig (const char * fname)
551      int check = 0;  {
552        gpgme_data_t dat;
553      if (!fname) {      armor_filter_context_t afx;
554          gpg_data_new_from_clipboard (&dat, 0);      gpg_iobuf_t fp;
555          gpg_data_release_and_set_file (dat, "gpgme.tmp");      PACKET * pkt = (PACKET *)calloc (1, sizeof *pkt);
556        int check = 0;
557          fp = gpg_iobuf_open ("gpgme.tmp");  
558          if (!fp)      if (!fname) {
559              return 0;          gpg_data_new_from_clipboard (&dat, 0);
560          gpg_iobuf_ioctl (fp, 3, 1, NULL);          gpg_data_release_and_set_file (dat, "gpgme.tmp");
561          if (gpg_use_armor_filter(fp)) {  
562              memset (&afx, 0, sizeof (afx));          fp = gpg_iobuf_open ("gpgme.tmp");
563              gpg_iobuf_push_filter (fp, gpg_armor_filter, &afx);          if (!fp)
564          }              return 0;
565          gpg_init_packet (pkt);          gpg_iobuf_ioctl (fp, 3, 1, NULL);
566          if (!gpg_parse_packet (fp, pkt)          if (gpg_use_armor_filter(fp)) {
567              && pkt->pkttype == PKT_COMPRESSED)              memset (&afx, 0, sizeof (afx));
568              check = 1;                gpg_iobuf_push_filter (fp, gpg_armor_filter, &afx);
569          gpg_free_packet (pkt);          }
570          safe_free (pkt);          gpg_init_packet (pkt);
571          gpg_iobuf_close (fp);          if (!gpg_parse_packet (fp, pkt)
572          unlink ("gpgme.tmp");              && pkt->pkttype == PKT_COMPRESSED)
573      }              check = 1;  
574      /* XXX: implement it for real files */          gpg_free_packet (pkt);
575      return check;          safe_free (pkt);
576  }          gpg_iobuf_close (fp);
577            unlink ("gpgme.tmp");
578        }
579  int      /* XXX: implement it for real files */
580  fm_get_current_pos (listview_ctrl_t lv)      return check;
581  {  }
582      int i = 0, items;  
583    
584      items = listview_count_items (lv, 0);  int
585      if (!items)  fm_get_current_pos (listview_ctrl_t lv)
586          return -1;  {
587      else if (items == 1)      int i = 0, items;
588      {  
589          listview_select_one (lv, 0);      items = listview_count_items (lv, 0);
590          return 0;      if (!items)
591      }          return -1;
592      else if (items > 1)      else if (items == 1)
593      {      {
594          i = listview_get_curr_pos (lv);          listview_select_one (lv, 0);
595          if (i == -1)          return 0;
596          {      }
597              msg_box (lv->ctrl, _("Please select a file."), _("File Manager"), MB_ERR);      else if (items > 1)
598              return -1;      {
599          }          i = listview_get_curr_pos (lv);
600          return i;          if (i == -1)
601      }          {
602                msg_box (lv->ctrl, _("Please select a file."), _("File Manager"), MB_ERR);
603      return -1;              return -1;
604  } /* fm_get_current_pos */          }
605            return i;
606        }
607  static int  
608  fm_check_detached_sig( listview_ctrl_t lv, int pos )      return -1;
609  {  } /* fm_get_current_pos */
610      char type[128];  
611    
612      listview_get_item_text( lv, pos, 0, type, 127 );  static int
613      return !strcmp( type, "SIGNED-DETACH" )? 1 : 0;  fm_check_detached_sig( listview_ctrl_t lv, int pos )
614  } /* fm_check_detached_sig */  {
615        char type[128];
616    
617  int      listview_get_item_text( lv, pos, 0, type, 127 );
618  fm_check_file_type (listview_ctrl_t lv, int pos, int fm_cmd)      return !strcmp( type, "SIGNED-DETACH" )? 1 : 0;
619  {  } /* fm_check_detached_sig */
620      char status[128];  
621      int rc = 0;  
622        int
623      listview_get_item_text (lv, pos, 0, status, sizeof (status) - 1);  fm_check_file_type (listview_ctrl_t lv, int pos, int fm_cmd)
624        {
625      switch (fm_cmd) {      char status[128];
626      case FM_ENCRYPT:      int rc = 0;
627      case FM_ENCRYPT_DIR:      
628      case FM_SIGNENCRYPT:        listview_get_item_text (lv, pos, 0, status, sizeof (status) - 1);
629          if (strcmp (status, "ENCRYPTED")      
630              && strcmp (status, "SYMKEYENC"))      switch (fm_cmd) {
631              rc = 1;      case FM_ENCRYPT:
632          break;      case FM_ENCRYPT_DIR:
633                case FM_SIGNENCRYPT:  
634      case FM_DECRYPT:          if (strcmp (status, "ENCRYPTED")
635          if (!strcmp (status, "DATA")              && strcmp (status, "SYMKEYENC"))
636              || !strcmp (status, "ENCRYPTED")              rc = 1;
637              || !strcmp (status, "SYMKEYENC")          break;
638              || !strcmp (status, "ARMORED"))          
639              rc = 1;      case FM_DECRYPT:
640          break;          if (!strcmp (status, "DATA")
641                        || !strcmp (status, "ENCRYPTED")
642      case FM_SIGN:              || !strcmp (status, "SYMKEYENC")
643          if( strncmp( status, "SIGNED", 6 ) )              || !strcmp (status, "ARMORED"))
644              rc = 1;              rc = 1;
645          break;          break;
646                    
647      case FM_VERIFY:      case FM_SIGN:
648          if( !strncmp( status, "SIGNED", 6 )          if( strncmp( status, "SIGNED", 6 ) )
649               || !strcmp( status, "COMPRESSED" ) )              rc = 1;
650              rc = 1;          break;
651          break;          
652                case FM_VERIFY:
653      case FM_SYMENC:          if( !strncmp( status, "SIGNED", 6 )
654          if( strcmp( status, "SYMKEYENC" ) )               || !strcmp( status, "COMPRESSED" ) )
655              rc = 1;              rc = 1;
656          break;          break;
657                    
658      case FM_IMPORT:      case FM_SYMENC:
659          if( !strcmp( status, "PUBKEY" )          if( strcmp( status, "SYMKEYENC" ) )
660              || !strcmp( status, "SECKEY" ) )              rc = 1;
661              rc = 1;          break;
662          break;          
663                case FM_IMPORT:
664      case FM_WIPE:          if( !strcmp( status, "PUBKEY" )
665      case FM_LIST:              || !strcmp( status, "SECKEY" ) )
666          rc = 1;              rc = 1;
667          break;            break;
668      }          
669            case FM_WIPE:
670      return rc;      case FM_LIST:
671  } /* fm_check_file_type */          rc = 1;
672            break;  
673        }
674  static void      
675  fm_set_status (listview_ctrl_t lv, int pos, int fm_cmd, int success,      return rc;
676                 const char * output)  } /* fm_check_file_type */
677  {  
678      char status[128], operat[128];  
679      int update = 1;  static void
680      const char *s;  fm_set_status (listview_ctrl_t lv, int pos, int fm_cmd, int success,
681                   const char * output)
682      if ( fm_cmd == FM_LIST )  {
683          return;      char status[128], operat[128];
684      success ? s = "SUCCESS" : s = "FAILED";      int update = 1;
685      strcpy( operat, s );      const char *s;
686    
687      switch (fm_cmd) {      if ( fm_cmd == FM_LIST )
688      case FM_ENCRYPT:          return;
689      case FM_ENCRYPT_DIR:      success ? s = "SUCCESS" : s = "FAILED";
690      case FM_SIGNENCRYPT: strcpy( status, "ENCRYPTED" ); break;      strcpy( operat, s );
691      case FM_DECRYPT:     strcpy( status, "UNKNOWN" );   break;  
692      case FM_SIGN:        strcpy( status, "SIGNED" );    break;      switch (fm_cmd) {
693      case FM_VERIFY:      update = 0;                    break;      case FM_ENCRYPT:
694      case FM_SYMENC:      strcpy( status, "SYMKEYENC" ); break;      case FM_ENCRYPT_DIR:
695      case FM_IMPORT:      update = 0;                    break;      case FM_SIGNENCRYPT: strcpy( status, "ENCRYPTED" ); break;
696      case FM_WIPE:        strcpy( status, "WIPED" );     break;      case FM_DECRYPT:     strcpy( status, "UNKNOWN" );   break;
697      default:             strcpy( status, "UNKNOWN");    break;      case FM_SIGN:        strcpy( status, "SIGNED" );    break;
698      }      case FM_VERIFY:      update = 0;                    break;
699        case FM_SYMENC:      strcpy( status, "SYMKEYENC" ); break;
700      if (success) {      case FM_IMPORT:      update = 0;                    break;
701          if (update) {      case FM_WIPE:        strcpy( status, "WIPED" );     break;
702              listview_add_sub_item (lv, pos, 0, status);      default:             strcpy( status, "UNKNOWN");    break;
703              listview_add_sub_item (lv, pos, 1, output);      }
704          }  
705      }      if (success) {
706      listview_add_sub_item( lv, pos, 2, operat );          if (update) {
707  } /* fm_set_status */              listview_add_sub_item (lv, pos, 0, status);
708                listview_add_sub_item (lv, pos, 1, output);
709            }
710  int      }
711  fm_clearsign_8bit (listview_ctrl_t lv, fm_state_s *ctx)      listview_add_sub_item( lv, pos, 2, operat );
712  {  } /* fm_set_status */
713      FILE *f;  
714      byte buf[32];  
715      char name[256];  int
716      int i, n, cnt=0;  fm_clearsign_8bit (listview_ctrl_t lv, fm_state_s *ctx)
717    {
718      if (ctx->sigmode != GPGME_SIG_MODE_CLEAR)      FILE *f;
719          return 0;      byte buf[32];
720      listview_get_item_text (lv, -1, 1, name, sizeof (name)-1);      char name[256];
721      if (stristr (name, ".TXT"))      int i, n, cnt=0;
722          return 0;  
723      f = fopen (name, "rb");      if (ctx->sigmode != GPGME_SIG_MODE_CLEAR)
724      if (!f)          return 0;
725          return -1; /* should never happen */      listview_get_item_text (lv, -1, 1, name, sizeof (name)-1);
726      n = fread (buf, 1, 32, f);      if (stristr (name, ".TXT"))
727      for (i = 0; i < n; i++) {          return 0;
728          if (buf[i] == 0x00 || buf[i] > 170)      f = fopen (name, "rb");
729              cnt++;      if (!f)
730      }          return -1; /* should never happen */
731      fclose (f);      n = fread (buf, 1, 32, f);
732      if (!cnt)      for (i = 0; i < n; i++) {
733          return 0;          if (buf[i] == 0x00 || buf[i] > 170)
734      n = -1;              cnt++;
735      i = log_box (_("File Manager"), MB_WARN|MB_YESNO,      }
736                   _("\"%s\" does not seems to be a text file.\n"      fclose (f);
737                     "Do you really want to clearsign it?"), name);      if (!cnt)
738      if (i == IDYES)          return 0;
739          n = 0;      n = -1;
740      return n;      i = log_box (_("File Manager"), MB_WARN|MB_YESNO,
741  }                   _("\"%s\" does not seems to be a text file.\n"
742                       "Do you really want to clearsign it?"), name);
743  int      if (i == IDYES)
744  fm_parse_files (listview_ctrl_t lv, HWND dlg, int cmd)          n = 0;
745  {      return n;
746      struct secdel_confirm_s confirm = {0};  }
747      struct progress_filter_s pfx, pfx2;  
748      fm_state_s * ctx;  int
749      int fm_cmd, sig_detached = 0;  fm_parse_files (listview_ctrl_t lv, HWND dlg, int cmd)
750      int rc = 0, i, n, ndel = 0;  {
751      char fname[512], status[128];      struct secdel_confirm_s confirm = {0};
752            struct progress_filter_s pfx, pfx2;
753      switch (cmd) {      fm_state_s * ctx;
754      case ID_FILEMISC_ENCRYPT: fm_cmd = FM_ENCRYPT; break;      int fm_cmd, sig_detached = 0;
755      case ID_FILEMISC_DECRYPT: fm_cmd = FM_DECRYPT; break;      int rc = 0, i, n, ndel = 0;
756      case ID_FILEMISC_SYMENC:  fm_cmd = FM_SYMENC;  break;      char fname[512], status[128];
757      case ID_FILEMISC_SIGN:    fm_cmd = FM_SIGN;    break;          
758      case ID_FILEMISC_VERIFY:  fm_cmd = FM_VERIFY;  break;      switch (cmd) {
759      case ID_FILEMISC_IMPORT:  fm_cmd = FM_IMPORT;  break;      case ID_FILEMISC_ENCRYPT: fm_cmd = FM_ENCRYPT; break;
760      case ID_FILEMISC_WIPE:    fm_cmd = FM_WIPE;    break;      case ID_FILEMISC_DECRYPT: fm_cmd = FM_DECRYPT; break;
761      case ID_FILEMISC_LIST:    fm_cmd = FM_LIST;    break;      case ID_FILEMISC_SYMENC:  fm_cmd = FM_SYMENC;  break;
762      case ID_FILEMISC_SIGNENC: fm_cmd = FM_SIGNENCRYPT; break;      case ID_FILEMISC_SIGN:    fm_cmd = FM_SIGN;    break;    
763      default: return 1; /* unknown command */      case ID_FILEMISC_VERIFY:  fm_cmd = FM_VERIFY;  break;
764      }      case ID_FILEMISC_IMPORT:  fm_cmd = FM_IMPORT;  break;
765            case ID_FILEMISC_WIPE:    fm_cmd = FM_WIPE;    break;
766      if (fm_get_current_pos (lv) == -1)      case ID_FILEMISC_LIST:    fm_cmd = FM_LIST;    break;
767          return WPTERR_GENERAL;          case ID_FILEMISC_SIGNENC: fm_cmd = FM_SIGNENCRYPT; break;
768      rc = fm_state_new (&ctx);      default: return 1; /* unknown command */
769      if (rc)      }
770          BUG (0);      
771      ctx->dlg = dlg;      if (fm_get_current_pos (lv) == -1)
772            return WPTERR_GENERAL;    
773      // XXX: for file operations the progress dialog will be      rc = fm_state_new (&ctx);
774      //       reloaded somewhere and thus a 'dummy' dialog remains      if (rc)
775            BUG (0);
776      /* we use it here to make sure that pfx_cleanup will not use      ctx->dlg = dlg;
777         any weird values. */  
778      memset (&pfx, 0, sizeof (pfx));      // XXX: for file operations the progress dialog will be
779      ctx->prog_cb = NULL;      //       reloaded somewhere and thus a 'dummy' dialog remains
780      if (cmd != FM_VERIFY && cmd != FM_SIGN /*&& reg_prefs.fm.progress > 0*/) {  
781          pfx.hwnd = dlg;      /* we use it here to make sure that pfx_cleanup will not use
782          /*gpgme_set_progress_cb (ctx->ctx, progress_callback, &pfx);*/         any weird values. */
783          /*ctx->prog_cb = &pfx;*/      memset (&pfx, 0, sizeof (pfx));
784      }      ctx->prog_cb = NULL;
785            if (cmd != FM_VERIFY && cmd != FM_SIGN /*&& reg_prefs.fm.progress > 0*/) {
786      /* Commands we need before we can perform the main command */          pfx.hwnd = dlg;
787      switch (fm_cmd) {          /*gpgme_set_progress_cb (ctx->ctx, progress_callback, &pfx);*/
788      case FM_ENCRYPT:          /*ctx->prog_cb = &pfx;*/
789      case FM_SIGNENCRYPT:      }
790          if (fm_cmd == FM_SIGNENCRYPT)      
791              ctx->req_signer = 1;      /* Commands we need before we can perform the main command */
792          DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_FILE_ENCRYPT, ctx->dlg,      switch (fm_cmd) {
793                          file_encrypt_dlg_proc, (LPARAM)ctx);      case FM_ENCRYPT:
794          if (ctx->cancel == 1) {      case FM_SIGNENCRYPT:
795              rc = WPTERR_GENERAL;          if (fm_cmd == FM_SIGNENCRYPT)
796              goto leave;              ctx->req_signer = 1;
797          }          DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_FILE_ENCRYPT, ctx->dlg,
798          break;                          file_encrypt_dlg_proc, (LPARAM)ctx);
799                    if (ctx->cancel == 1) {
800      case FM_SIGN:              rc = WPTERR_GENERAL;
801          DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FILE_SIGN, dlg,              goto leave;
802                          file_sign_dlg_proc, (LPARAM) ctx);          }
803          if (ctx->cancel == 1 || fm_clearsign_8bit (lv, ctx)) {          break;
804              rc = WPTERR_GENERAL;          
805              goto leave;      case FM_SIGN:
806          }          DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FILE_SIGN, dlg,
807          break;                          file_sign_dlg_proc, (LPARAM) ctx);
808            if (ctx->cancel == 1 || fm_clearsign_8bit (lv, ctx)) {
809      case FM_WIPE:              rc = WPTERR_GENERAL;
810          memset (&pfx2, 0, sizeof (pfx2));              goto leave;
811          secure_unlink_set_cb (progress_callback, &pfx2);          }
812          break;          break;
813      }  
814            case FM_WIPE:
815      for( i = 0, n = 0;  i < listview_count_items( lv, 0 ); i++ ) {          memset (&pfx2, 0, sizeof (pfx2));
816          if( !listview_get_item_state( lv, i ) )          secure_unlink_set_cb (progress_callback, &pfx2);
817              continue;          break;
818          listview_get_item_text( lv, i, 0, status, sizeof (status) -1 );      }
819          if (!strcmp( status, "ENCRYPTED" ) && fm_cmd == FM_DECRYPT)      
820              n++;      for( i = 0, n = 0;  i < listview_count_items( lv, 0 ); i++ ) {
821          if (!strcmp( status, "UNKNOWN" ) && fm_cmd == FM_SIGN)          if( !listview_get_item_state( lv, i ) )
822              n++;              continue;
823          if (fm_cmd == FM_WIPE)          listview_get_item_text( lv, i, 0, status, sizeof (status) -1 );
824              ndel++;          if (!strcmp( status, "ENCRYPTED" ) && fm_cmd == FM_DECRYPT)
825      }              n++;
826                if (!strcmp( status, "UNKNOWN" ) && fm_cmd == FM_SIGN)
827      if (n > 1 && fm_cmd != FM_SYMENC)              n++;
828          ctx->cache_cb = 1;          if (fm_cmd == FM_WIPE)
829                ndel++;
830      if (fm_cmd == FM_WIPE && ndel > 0) {      }
831          memset (&confirm, 0, sizeof confirm);      
832          confirm.lv_files = lv;      if (n > 1 && fm_cmd != FM_SYMENC)
833          DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_FILES_SECDEL, ctx->dlg,          ctx->cache_cb = 1;
834                              file_secdel_confirm_dlg_proc, (LPARAM)&confirm);  
835          if (!confirm.yes)      if (fm_cmd == FM_WIPE && ndel > 0) {
836              goto leave;          memset (&confirm, 0, sizeof confirm);
837      }          confirm.lv_files = lv;
838                DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_FILES_SECDEL, ctx->dlg,
839      for( i = 0; i < listview_count_items( lv, 0 ); i++ ) {                              file_secdel_confirm_dlg_proc, (LPARAM)&confirm);
840          if( !listview_get_item_state( lv, i ) )          if (!confirm.yes)
841              continue;              goto leave;
842          listview_get_item_text( lv, i, 1, fname, sizeof (fname) - 1 );      }
843          if( file_exist_check( fname ) && !is_directory( fname ) ) {      
844              log_box( _("File Manager"), MB_ERR, _("\"%s\" does not exist"), fname );      for( i = 0; i < listview_count_items( lv, 0 ); i++ ) {
845              continue;          if( !listview_get_item_state( lv, i ) )
846          }              continue;
847          if( is_directory( fname ) )          listview_get_item_text( lv, i, 1, fname, sizeof (fname) - 1 );
848              fm_cmd = FM_ENCRYPT_DIR;                  if( file_exist_check( fname ) && !is_directory( fname ) ) {
849          if( !fm_check_file_type( lv, i, fm_cmd ) )              log_box( _("File Manager"), MB_ERR, _("\"%s\" does not exist"), fname );
850              continue;              continue;
851          sig_detached = fm_check_detached_sig( lv, i );          }
852          switch( fm_cmd ) {          if( is_directory( fname ) )
853          case FM_LIST:        rc = fm_list( fname, dlg );       break;              fm_cmd = FM_ENCRYPT_DIR;        
854          case FM_WIPE:        rc = fm_wipe( fname );            break;          if( !fm_check_file_type( lv, i, fm_cmd ) )
855          case FM_ENCRYPT:     rc = fm_encrypt( ctx, fname, 0 ); break;              continue;
856          case FM_ENCRYPT_DIR: rc = fm_encrypt_directory( ctx, fname ); break;          sig_detached = fm_check_detached_sig( lv, i );
857          case FM_SIGNENCRYPT: rc = fm_encrypt( ctx, fname, 1 ); break;          switch( fm_cmd ) {
858          case FM_DECRYPT:     rc = fm_decrypt( ctx, fname );    break;          case FM_LIST:        rc = fm_list( fname, dlg );       break;
859          case FM_SIGN:        rc = fm_sign( ctx, fname );       break;          case FM_WIPE:        rc = fm_wipe( fname );            break;
860          case FM_SYMENC:      rc = fm_sym_encrypt( ctx, fname );break;          case FM_ENCRYPT:     rc = fm_encrypt( ctx, fname, 0 ); break;
861          case FM_VERIFY:      rc = fm_verify (ctx, sig_detached, fname);break;          case FM_ENCRYPT_DIR: rc = fm_encrypt_directory( ctx, fname ); break;
862          case FM_IMPORT:          case FM_SIGNENCRYPT: rc = fm_encrypt( ctx, fname, 1 ); break;
863              free_if_alloc (ctx->opaque);          case FM_DECRYPT:     rc = fm_decrypt( ctx, fname );    break;
864              ctx->opaque = m_strdup (fname);          case FM_SIGN:        rc = fm_sign( ctx, fname );       break;
865              if (!ctx->opaque)          case FM_SYMENC:      rc = fm_sym_encrypt( ctx, fname );break;
866                  BUG (0);          case FM_VERIFY:      rc = fm_verify (ctx, sig_detached, fname);break;
867              DialogBoxParam( glob_hinst, (LPCSTR)IDD_WINPT_IMPORT, dlg,          case FM_IMPORT:
868                             file_import_dlg_proc, (LPARAM)ctx );              free_if_alloc (ctx->opaque);
869              if (ctx->cancel == 1)              ctx->opaque = m_strdup (fname);
870                  continue;              if (!ctx->opaque)
871              rc = fm_import (ctx, fname);                  BUG (0);
872              break;              DialogBoxParam( glob_hinst, (LPCSTR)IDD_WINPT_IMPORT, dlg,
873          }                             file_import_dlg_proc, (LPARAM)ctx );
874          fm_set_status (lv, i, fm_cmd, !rc, ctx->output);              if (ctx->cancel == 1)
875          free_if_alloc (ctx->output);                  continue;
876          progress_cleanup (&pfx);              rc = fm_import (ctx, fname);
877      }              break;
878      if (fm_cmd == FM_WIPE) {          }
879          secure_unlink_set_cb (NULL, NULL);          fm_set_status (lv, i, fm_cmd, !rc, ctx->output);
880          progress_cleanup (&pfx2);          free_if_alloc (ctx->output);
881      }          progress_cleanup (&pfx);
882      if (ctx->cache_cb) {      }
883          release_gpg_passphrase_cb (&ctx->pass_cb);      if (fm_cmd == FM_WIPE) {
884          ctx->cache_cb = 0; /* make sure it's only used for this session! */          secure_unlink_set_cb (NULL, NULL);
885      }          progress_cleanup (&pfx2);
886            }
887      /* remove wipe files from the list */      if (ctx->cache_cb) {
888      n = listview_count_items (lv, 0);          release_gpg_passphrase_cb (&ctx->pass_cb);
889      while (n--) {          ctx->cache_cb = 0; /* make sure it's only used for this session! */
890          char status[128];      }
891          listview_get_item_text (lv, n, 0, status, sizeof (status) - 1);      
892          if( !strcmp (status, "WIPED"))      /* remove wipe files from the list */
893              listview_del_item (lv, n);      n = listview_count_items (lv, 0);
894      }      while (n--) {
895                char status[128];
896  leave:          listview_get_item_text (lv, n, 0, status, sizeof (status) - 1);
897      if (!rc)          if( !strcmp (status, "WIPED"))
898          fm_state_release (ctx);              listview_del_item (lv, n);
899      progress_cleanup (&pfx);      }
900      return rc;      
901  } /* fm_parse_files */  leave:
902        if (!rc)
903            fm_state_release (ctx);
904  /* Wipe the given file @name with the delete mode      progress_cleanup (&pfx);
905     from the configuration.      return rc;
906     Return value: 0 on success. */  } /* fm_parse_files */
907  int  
908  fm_wipe (const char *name)  
909  {  /* Wipe the given file @name with the delete mode
910      int rc;     from the configuration.
911       Return value: 0 on success. */
912      SetCursor (LoadCursor (NULL, IDC_WAIT));  int
913      remove_crit_file_attrs (name, 1);  fm_wipe (const char *name)
914      rc = secure_unlink (name, reg_prefs.wipe_mode);  {
915      SetCursor (LoadCursor (NULL, IDC_ARROW));      int rc;
916      return rc;  
917  }      SetCursor (LoadCursor (NULL, IDC_WAIT));
918        remove_crit_file_attrs (name, 1);
919        rc = secure_unlink (name, reg_prefs.wipe_mode);
920  /* Dump out the given PGP packets from file @name in a dialog. */      SetCursor (LoadCursor (NULL, IDC_ARROW));
921  int      return rc;
922  fm_list (const char *name, HWND dlg)  }
923  {  
924      dialog_box_param( glob_hinst, (LPCTSTR)IDD_WINPT_FILE_STAT, dlg,  
925                        file_stat_dlg_proc, (LPARAM)name, _("File Status"),  /* Dump out the given PGP packets from file @name in a dialog. */
926                        IDS_WINPT_FILE_STAT );  int
927      return 0;  fm_list (const char *name, HWND dlg)
928  }  {
929        dialog_box_param( glob_hinst, (LPCTSTR)IDD_WINPT_FILE_STAT, dlg,
930                          file_stat_dlg_proc, (LPARAM)name, _("File Status"),
931  static int                        IDS_WINPT_FILE_STAT );
932  ask_filename (fm_state_t c, const char *msg, char **dst)      return 0;
933  {  }
934      const char * s;  
935    
936      s = get_filename_dlg (c->dlg, FILE_SAVE, msg, NULL, NULL);  static int
937      if (!s)  ask_filename (fm_state_t c, const char *msg, char **dst)
938          return WPTERR_GENERAL;  {
939        const char * s;
940      if (dst != NULL)  
941          free_if_alloc (*dst);      s = get_filename_dlg (c->dlg, FILE_SAVE, msg, NULL, NULL);
942      free_if_alloc (c->output);      if (!s)
943      c->output = m_strdup (s);          return WPTERR_GENERAL;
944      if (!c->output)  
945          BUG (0);      if (dst != NULL)
946      if (dst)          free_if_alloc (*dst);
947          *dst = fm_quote_file (s);      free_if_alloc (c->output);
948      return 0;      c->output = m_strdup (s);
949  }      if (!c->output)
950            BUG (0);
951        if (dst)
952  int          *dst = fm_quote_file (s);
953  fm_encrypt (fm_state_t c, const char *name, int sign)      return 0;
954  {  }
955      gpgme_error_t err;  
956      gpgme_key_t key = NULL;  
957      gpgme_ctx_t ctx = c->ctx;  int
958      file_data_t in=NULL, out=NULL;  fm_encrypt (fm_state_t c, const char *name, int sign)
959      char *keyid = NULL, ext[5];  {
960      int no_compr = 0;      gpgme_error_t err;
961      int rc = 0;      gpgme_key_t key = NULL;
962        gpgme_ctx_t ctx = c->ctx;
963      c->output = new char[strlen (name) + 5 + 1];      file_data_t in=NULL, out=NULL;
964      if (!c->output)      char *keyid = NULL, ext[5];
965          BUG (0);      int no_compr = 0;
966      strcpy (ext, file_get_extension (ctx, c->sigmode));      int rc = 0;
967      strcpy (c->output, name);  
968      strcat (c->output, ext);              c->output = new char[strlen (name) + 5 + 1];
969            if (!c->output)
970      if (!overwrite_file (c->output)) {          BUG (0);
971          rc = ask_filename (c, _("Enter filename for encrypted file"), NULL);      strcpy (ext, file_get_extension (ctx, c->sigmode));
972          if (rc)      strcpy (c->output, name);
973              goto leave;      strcat (c->output, ext);        
974      }      
975        if (!overwrite_file (c->output)) {
976      err = gpg_file_data_new (name, 1, &in);          rc = ask_filename (c, _("Enter filename for encrypted file"), NULL);
977      if (err)          if (rc)
978          goto leave;              goto leave;
979      err = gpg_file_data_new (c->output, 0, &out);      }
980      if (err)  
981          goto leave;      err = gpg_file_data_new (name, 1, &in);
982        if (err)
983      /*          goto leave;
984      if (c->prog_cb) {      err = gpg_file_data_new (c->output, 0, &out);
985          c->prog_cb->what = name;      if (err)
986          gpg_file_data_set_cb (in, c->prog_cb);          goto leave;
987      }  
988      */      /*
989            if (c->prog_cb) {
990      /* XXX          c->prog_cb->what = name;
991      no_compr = is_multi_media (name);          gpg_file_data_set_cb (in, c->prog_cb);
992      gpgme_control (ctx, GPGME_CTRL_NO_COMPR, no_compr);      }
993      */      */
994        
995      if (sign) {      /* XXX
996          if (gpgme_signers_enum (ctx, 0) == NULL) {      no_compr = is_multi_media (name);
997              keyid = get_gnupg_default_key ();      gpgme_control (ctx, GPGME_CTRL_NO_COMPR, no_compr);
998              if (!keyid) {      */
999                  msg_box (c->dlg, _("Could not get default secret key."),  
1000                           _("Signing"), MB_ERR);      if (sign) {
1001                  rc = WPTERR_GENERAL;          if (gpgme_signers_enum (ctx, 0) == NULL) {
1002                  goto leave;              keyid = get_gnupg_default_key ();
1003              }              if (!keyid) {
1004              if (get_seckey (keyid, &key))                  msg_box (c->dlg, _("Could not get default secret key."),
1005                  BUG (0);                           _("Signing"), MB_ERR);
1006              gpgme_signers_add (ctx, key);                  rc = WPTERR_GENERAL;
1007          }                  goto leave;
1008          else {              }
1009              gpgme_key_t key = gpgme_signers_enum (ctx, 0);              if (get_seckey (keyid, &key))
1010              if (key && key->subkeys) {                  BUG (0);
1011                  keyid = m_strdup (key->subkeys->keyid);              gpgme_signers_add (ctx, key);
1012                  if (!keyid)          }
1013                      BUG (NULL);          else {
1014              }              gpgme_key_t key = gpgme_signers_enum (ctx, 0);
1015          }              if (key && key->subkeys) {
1016          if (!c->init_cb || !c->cache_cb) {                  keyid = m_strdup (key->subkeys->keyid);
1017              set_gpg_passphrase_cb (&c->pass_cb, c->ctx, GPG_CMD_SIGN,                  if (!keyid)
1018                                     c->dlg, _("Signing"));                      BUG (NULL);
1019              c->init_cb = 1;              }
1020          }          }
1021          op_begin ();          if (!c->init_cb || !c->cache_cb) {
1022          err = gpgme_op_encrypt_sign (ctx, c->recp, GPGME_ENCRYPT_ALWAYS_TRUST,              set_gpg_passphrase_cb (&c->pass_cb, c->ctx, GPG_CMD_SIGN,
1023                                       in->dat, out->dat);                                     c->dlg, _("Signing"));
1024          op_end ();              c->init_cb = 1;
1025          if (!c->cache_cb)          }
1026              release_gpg_passphrase_cb (&c->pass_cb);          op_begin ();
1027          if (c->pass_cb.cancel) {          err = gpgme_op_encrypt_sign (ctx, c->recp, GPGME_ENCRYPT_ALWAYS_TRUST,
1028              rc = WPTERR_GENERAL;                                       in->dat, out->dat);
1029              goto leave;          op_end ();
1030          }          if (!c->cache_cb)
1031          if (err) {              release_gpg_passphrase_cb (&c->pass_cb);
1032              msg_box (c->dlg, gpgme_strerror (err), _("Sign"), MB_ERR);          if (c->pass_cb.cancel) {
1033              if (gpgme_err_code (err) == GPG_ERR_BAD_PASSPHRASE)              rc = WPTERR_GENERAL;
1034                  agent_del_cache (keyid);              goto leave;
1035              rc = WPTERR_GENERAL;          }
1036              goto leave;          if (err) {
1037          }              msg_box (c->dlg, gpgme_strerror (err), _("Sign"), MB_ERR);
1038      }              if (gpgme_err_code (err) == GPG_ERR_BAD_PASSPHRASE)
1039      else {                  agent_del_cache (keyid);
1040          op_begin ();              rc = WPTERR_GENERAL;
1041          err = gpgme_op_encrypt (ctx, c->recp, GPGME_ENCRYPT_ALWAYS_TRUST,              goto leave;
1042                                  in->dat, out->dat);          }
1043          op_end ();      }
1044          if (err) {      else {
1045              msg_box (c->dlg, gpgme_strerror (err), _("Encrypt"), MB_ERR);          op_begin ();
1046              rc = WPTERR_GENERAL;          err = gpgme_op_encrypt (ctx, c->recp, GPGME_ENCRYPT_ALWAYS_TRUST,
1047              goto leave;                                  in->dat, out->dat);
1048          }          op_end ();
1049      }          if (err) {
1050      if (c->wipe)              msg_box (c->dlg, gpgme_strerror (err), _("Encrypt"), MB_ERR);
1051          secure_unlink (name, WIPE_MODE_SIMPLE);              rc = WPTERR_GENERAL;
1052                    goto leave;
1053  leave:          }
1054      if (in)      }
1055          gpg_file_data_release (in);      if (c->wipe)
1056      if (out)          secure_unlink (name, WIPE_MODE_SIMPLE);
1057          gpg_file_data_release (out);      
1058      free_if_alloc (keyid);  leave:
1059      return rc;      if (in)
1060  }          gpg_file_data_release (in);
1061        if (out)
1062            gpg_file_data_release (out);
1063  int      free_if_alloc (keyid);
1064  fm_sym_encrypt (fm_state_t c, const char * name)      return rc;
1065  {  }
1066      gpgme_ctx_t ctx = c->ctx;  
1067      gpgme_error_t err;      
1068      file_data_t in=NULL, out=NULL;  int
1069      int rc = 0, cancel = 0;  fm_sym_encrypt (fm_state_t c, const char * name)
1070      char * src = NULL, * dst = NULL;  {
1071      char ext[5], * pass;          gpgme_ctx_t ctx = c->ctx;
1072            gpgme_error_t err;    
1073      pass = request_passphrase2 (_("Symmetric"), 0, &cancel);      file_data_t in=NULL, out=NULL;
1074      if (cancel)      int rc = 0, cancel = 0;
1075          return 0;      char * src = NULL, * dst = NULL;
1076            char ext[5], * pass;    
1077      /* XXX gpgme_control (ctx, GPGME_CTRL_CIPHER, -1);*/      
1078      c->output = new char[strlen (name) + 5 + 1];      pass = request_passphrase2 (_("Symmetric"), 0, &cancel);
1079      if (!c->output)      if (cancel)
1080          BUG (0);          return 0;
1081      strcpy (ext, file_get_extension (ctx, c->sigmode));      
1082      strcpy (c->output, name);      /* XXX gpgme_control (ctx, GPGME_CTRL_CIPHER, -1);*/
1083      strcat (c->output, ext);      c->output = new char[strlen (name) + 5 + 1];
1084        if (!c->output)
1085      if (overwrite_file (c->output) == 0) {          BUG (0);
1086          rc = WPTERR_GENERAL;      strcpy (ext, file_get_extension (ctx, c->sigmode));
1087          goto leave;          strcpy (c->output, name);
1088      }      strcat (c->output, ext);
1089    
1090      gpgme_set_passphrase_cb (ctx, sym_passphrase_cb, pass);          if (overwrite_file (c->output) == 0) {
1091            rc = WPTERR_GENERAL;
1092      err = gpg_file_data_new (name, 1, &in);          goto leave;    
1093      if (err)      }
1094          goto leave;  
1095      err = gpg_file_data_new (c->output, 0, &out);      gpgme_set_passphrase_cb (ctx, sym_passphrase_cb, pass);    
1096      if (err)  
1097          goto leave;      err = gpg_file_data_new (name, 1, &in);
1098        if (err)
1099      op_begin ();          goto leave;
1100      err = gpgme_op_encrypt (ctx, NULL, GPGME_ENCRYPT_ALWAYS_TRUST,      err = gpg_file_data_new (c->output, 0, &out);
1101                              in->dat, out->dat);      if (err)
1102      op_end ();          goto leave;
1103      if (err) {  
1104          msg_box (c->dlg, gpgme_strerror (err), _("Symmetric"), MB_ERR);      op_begin ();
1105          rc = WPTERR_GENERAL;      err = gpgme_op_encrypt (ctx, NULL, GPGME_ENCRYPT_ALWAYS_TRUST,
1106          goto leave;                              in->dat, out->dat);
1107      }      op_end ();
1108      if (file_exist_check (c->output)) {      if (err) {
1109          msg_box (c->dlg, _("Encryption failed."), _("Symmetric"), MB_ERR);          msg_box (c->dlg, gpgme_strerror (err), _("Symmetric"), MB_ERR);
1110          rc = WPTERR_GENERAL;          rc = WPTERR_GENERAL;
1111      }          goto leave;
1112            }
1113  leave:      if (file_exist_check (c->output)) {
1114      if (in)          msg_box (c->dlg, _("Encryption failed."), _("Symmetric"), MB_ERR);
1115          gpg_file_data_release (in);          rc = WPTERR_GENERAL;
1116      if (out)      }
1117          gpg_file_data_release (out);      
1118      sfree_if_alloc (pass);  leave:
1119      return rc;      if (in)
1120  } /* fm_sym_encrypt */          gpg_file_data_release (in);
1121        if (out)
1122            gpg_file_data_release (out);
1123  /* Show the human readable verify result from @sigres. */      sfree_if_alloc (pass);
1124  static void      return rc;
1125  show_verify_result (gpgme_verify_result_t sigres)  } /* fm_sym_encrypt */
1126  {  
1127      gpgme_key_t key=NULL;  
1128      gpgme_signature_t sig=sigres->signatures;  /* Show the human readable verify result from @sigres. */
1129      const char *s, *keyid;  static void
1130      int sigok = 0;  show_verify_result (gpgme_verify_result_t sigres)
1131      int type;  {
1132      char buf[384];      gpgme_key_t key=NULL;
1133        gpgme_signature_t sig=sigres->signatures;
1134      sig = sigres->signatures;      const char *s, *keyid;
1135      sigok = sig->summary & GPGME_SIGSUM_GREEN;      int sigok = 0;
1136      s = sigok? _("Good signature") : _("BAD signature");      int type;
1137      type = sigok? MB_OK: MB_ICONWARNING|MB_OK;      char buf[384];
1138      keyid = sig->fpr;    
1139      if (!keyid)      sig = sigres->signatures;
1140          return;      sigok = sig->summary & GPGME_SIGSUM_GREEN;
1141        s = sigok? _("Good signature") : _("BAD signature");
1142      keyid = strlen (sig->fpr) == 40? sig->fpr+32 : sig->fpr + 24;      type = sigok? MB_OK: MB_ICONWARNING|MB_OK;
1143      get_pubkey (sig->fpr, &key);      keyid = sig->fpr;  
1144      _snprintf (buf, sizeof (buf)-1, "Signature made %s using %s key ID %s\n"      if (!keyid)
1145                                      "%s from \"%s\"",          return;
1146                  strtimestamp (sig->timestamp), get_key_pubalgo (sig->pubkey_algo),  
1147                  keyid, s, key? key->uids->uid : _("user ID not found"));      keyid = strlen (sig->fpr) == 40? sig->fpr+32 : sig->fpr + 24;
1148      msg_box (NULL, buf, _("Decrypt Verify"), type);      get_pubkey (sig->fpr, &key);
1149  }      _snprintf (buf, sizeof (buf)-1, "Signature made %s using %s key ID %s\n"
1150                                        "%s from \"%s\"",
1151                    strtimestamp (sig->timestamp), get_key_pubalgo (sig->pubkey_algo),
1152  /* Check the recipients if we have at least one secret key. */                  keyid, s, key? key->uids->uid : _("user ID not found"));
1153  bool      msg_box (NULL, buf, _("Decrypt Verify"), type);
1154  secret_key_available (gpgme_recipient_t rset)  }
1155  {  
1156      gpgme_recipient_t r;  
1157      gpgme_key_t key;  /* Check the recipients if we have at least one secret key. */
1158    bool
1159      for (r=rset; r; r = r->next) {        secret_key_available (gpgme_recipient_t rset)
1160          if (gpgme_err_code (r->status) == GPG_ERR_NO_SECKEY)  {
1161              continue;      gpgme_recipient_t r;
1162          else {      gpgme_key_t key;
1163              /* extra check to make sure the key is available right now. */  
1164              if (!get_seckey (r->keyid, &key))      for (r=rset; r; r = r->next) {      
1165                  return true;          if (gpgme_err_code (r->status) == GPG_ERR_NO_SECKEY)
1166          }              continue;
1167      }          else {
1168      return false;              /* extra check to make sure the key is available right now. */
1169  }              if (!get_seckey (r->keyid, &key))
1170                    return true;
1171            }
1172  /* Decrypt the file @name. */      }
1173  int      return false;
1174  fm_decrypt (fm_state_t c, const char *name)  }
1175  {  
1176      gpgme_error_t err;  
1177      gpgme_ctx_t ctx = c->ctx;      /* Decrypt the file @name. */
1178      gpgme_decrypt_result_t res;  int
1179      gpgme_verify_result_t sigres;  fm_decrypt (fm_state_t c, const char *name)
1180      file_data_t in =NULL, out=NULL;  {
1181      int is_signed = 0;      gpgme_error_t err;
1182      int rc = 0;      gpgme_ctx_t ctx = c->ctx;    
1183            gpgme_decrypt_result_t res;
1184      if (!c->init_cb || !c->cache_cb) {      gpgme_verify_result_t sigres;
1185          set_gpg_passphrase_cb (&c->pass_cb, c->ctx, GPG_CMD_DECRYPT,      file_data_t in =NULL, out=NULL;
1186                                 c->dlg, _("Decryption"));      int is_signed = 0;
1187          c->init_cb = 1;      int rc = 0;
1188      }          
1189            if (!c->init_cb || !c->cache_cb) {
1190      c->output = m_strdup (name);          set_gpg_passphrase_cb (&c->pass_cb, c->ctx, GPG_CMD_DECRYPT,
1191      if (!c->output)                                 c->dlg, _("Decryption"));
1192          BUG (0);          c->init_cb = 1;
1193      if (is_openpgp_ext (c->output))      }    
1194          c->output[strlen (c->output)-4] = '\0';      
1195      else {      c->output = m_strdup (name);
1196          const char *s = get_filesave_dlg (c->dlg, _("Choose Filename for Output"),      if (!c->output)
1197                                            NULL, NULL);          BUG (0);
1198          if (s) {      if (is_openpgp_ext (c->output))
1199              free_if_alloc (c->output);          c->output[strlen (c->output)-4] = '\0';
1200              c->output = m_strdup (s);      else {
1201              if (!c->output)          const char *s = get_filesave_dlg (c->dlg, _("Choose Filename for Output"),
1202                  BUG (NULL);                                            NULL, NULL);
1203          }          if (s) {
1204      }              free_if_alloc (c->output);
1205                c->output = m_strdup (s);
1206      if (overwrite_file (c->output) == 0) {              if (!c->output)
1207          rc = ask_filename (c, _("Please enter filename for plaintext file"), NULL);                  BUG (NULL);
1208          if (rc)          }
1209              goto leave;      }
1210      }      
1211        if (overwrite_file (c->output) == 0) {
1212      remove_crit_file_attrs (c->output, 0);          rc = ask_filename (c, _("Please enter filename for plaintext file"), NULL);
1213            if (rc)
1214      err = gpg_file_data_new (name, 1, &in);              goto leave;
1215      if (err)      }    
1216          goto leave;  
1217      err = gpg_file_data_new (c->output, 0, &out);      remove_crit_file_attrs (c->output, 0);
1218      if (err)  
1219          goto leave;      err = gpg_file_data_new (name, 1, &in);
1220        if (err)
1221      op_begin ();          goto leave;
1222      err = gpgme_op_decrypt_verify (ctx, in->dat, out->dat);      err = gpg_file_data_new (c->output, 0, &out);
1223      op_end ();      if (err)
1224      if (!c->cache_cb)          goto leave;
1225          release_gpg_passphrase_cb (&c->pass_cb);  
1226      if (c->pass_cb.cancel) {      op_begin ();
1227          rc = WPTERR_GENERAL;      err = gpgme_op_decrypt_verify (ctx, in->dat, out->dat);
1228          goto leave;      op_end ();
1229      }      if (!c->cache_cb)
1230            release_gpg_passphrase_cb (&c->pass_cb);
1231      res = gpgme_op_decrypt_result (ctx);      if (c->pass_cb.cancel) {
1232      if (res && res->recipients && !secret_key_available (res->recipients)) {          rc = WPTERR_GENERAL;
1233          const char *keyid = res->recipients->keyid;          goto leave;
1234          char *p = get_key_userid (keyid+8);      }
1235          gpgme_pubkey_algo_t pkalgo = res->recipients->pubkey_algo;  
1236                res = gpgme_op_decrypt_result (ctx);
1237          log_box( _("Decryption"), MB_ERR,      if (res && res->recipients && !secret_key_available (res->recipients)) {
1238                   _("Encrypted with %s key, ID %s.%s\n"          const char *keyid = res->recipients->keyid;
1239                     "Decryption failed: secret key not available."),          char *p = get_key_userid (keyid+8);
1240                     get_key_pubalgo (pkalgo), keyid+8, p);          gpgme_pubkey_algo_t pkalgo = res->recipients->pubkey_algo;
1241          rc = WPTERR_GENERAL;          
1242          free_if_alloc (p);          log_box( _("Decryption"), MB_ERR,
1243          goto leave;                   _("Encrypted with %s key, ID %s.%s\n"
1244      }                     "Decryption failed: secret key not available."),
1245      else if (err) {                     get_key_pubalgo (pkalgo), keyid+8, p);
1246          msg_box (c->dlg, gpgme_strerror (err), _("Decrypt"), MB_ERR);          rc = WPTERR_GENERAL;
1247          rc = WPTERR_GENERAL;          free_if_alloc (p);
1248          goto leave;          goto leave;
1249      }      }
1250      if (file_exist_check (c->output)) {      else if (err) {
1251          log_box ("Decrypt", MB_ERR, _("Decryption failed.\n%s: does not exist."), c->output);          msg_box (c->dlg, gpgme_strerror (err), _("Decrypt"), MB_ERR);
1252          rc = WPTERR_GENERAL;          rc = WPTERR_GENERAL;
1253      }          goto leave;
1254            }
1255      sigres = gpgme_op_verify_result (ctx);      if (file_exist_check (c->output)) {
1256      if (sigres && sigres->signatures)          log_box ("Decrypt", MB_ERR, _("Decryption failed.\n%s: does not exist."), c->output);
1257          show_verify_result (sigres);          rc = WPTERR_GENERAL;
1258        }
1259            
1260  leave:      sigres = gpgme_op_verify_result (ctx);
1261      if (in)      if (sigres && sigres->signatures)
1262          gpg_file_data_release (in);          show_verify_result (sigres);
1263      if (out)  
1264          gpg_file_data_release (out);      
1265      return rc;  leave:
1266  }      if (in)
1267            gpg_file_data_release (in);
1268        if (out)
1269  int          gpg_file_data_release (out);
1270  fm_sign (fm_state_t c, const char * name)      return rc;
1271  {        }
1272      int rc = 0;  
1273      gpgme_ctx_t ctx = c->ctx;  
1274      gpgme_error_t err;  int
1275      file_data_t in=NULL, out=NULL;  fm_sign (fm_state_t c, const char * name)
1276      char ext[5];  {      
1277        int rc = 0;
1278      if (!c->init_cb || !c->cache_cb) {      gpgme_ctx_t ctx = c->ctx;
1279          set_gpg_passphrase_cb (&c->pass_cb, c->ctx, GPG_CMD_SIGN, c->dlg, _("Signing") );      gpgme_error_t err;
1280          c->init_cb = 1;      file_data_t in=NULL, out=NULL;
1281      }      char ext[5];
1282        
1283      free_if_alloc (c->output);      if (!c->init_cb || !c->cache_cb) {
1284      c->output = new char[strlen (name) + 5 + 1];          set_gpg_passphrase_cb (&c->pass_cb, c->ctx, GPG_CMD_SIGN, c->dlg, _("Signing") );
1285      if( !c->output)          c->init_cb = 1;
1286          BUG( NULL );      }
1287      strcpy (ext, file_get_extension (ctx, c->sigmode));      
1288      strcpy (c->output, name);      free_if_alloc (c->output);
1289      strcat (c->output, ext);      c->output = new char[strlen (name) + 5 + 1];
1290            if( !c->output)
1291      if (!overwrite_file (c->output)) {          BUG( NULL );
1292          rc = ask_filename (c, _("Enter filename for signed file"), NULL);      strcpy (ext, file_get_extension (ctx, c->sigmode));
1293          if (rc)      strcpy (c->output, name);
1294              goto leave;      strcat (c->output, ext);
1295      }      
1296      remove_crit_file_attrs (c->output, 0);      if (!overwrite_file (c->output)) {
1297            rc = ask_filename (c, _("Enter filename for signed file"), NULL);
1298      err = gpg_file_data_new (name, 1, &in);          if (rc)
1299      if (err)              goto leave;
1300          goto leave;      }
1301      err = gpg_file_data_new (c->output, 0, &out);      remove_crit_file_attrs (c->output, 0);
1302      if (err)  
1303          goto leave;      err = gpg_file_data_new (name, 1, &in);
1304        if (err)
1305      op_begin ();          goto leave;
1306      err = gpgme_op_sign (ctx, in->dat, out->dat, c->sigmode);      err = gpg_file_data_new (c->output, 0, &out);
1307      op_end ();      if (err)
1308      if( !c->cache_cb )          goto leave;
1309          release_gpg_passphrase_cb (&c->pass_cb);  
1310      if( c->pass_cb.cancel ) {      op_begin ();
1311          rc = WPTERR_GENERAL;      err = gpgme_op_sign (ctx, in->dat, out->dat, c->sigmode);
1312          goto leave;      op_end ();
1313      }      if( !c->cache_cb )
1314      if( err ) {          release_gpg_passphrase_cb (&c->pass_cb);
1315          msg_box( c->dlg, gpgme_strerror( err ), _("Sign"), MB_ERR );      if( c->pass_cb.cancel ) {
1316          rc = WPTERR_GENERAL;          rc = WPTERR_GENERAL;
1317          goto leave;              goto leave;
1318      }      }
1319        if( err ) {
1320  leave:          msg_box( c->dlg, gpgme_strerror( err ), _("Sign"), MB_ERR );
1321      if (in)          rc = WPTERR_GENERAL;
1322          gpg_file_data_release (in);          goto leave;    
1323      if (out)      }
1324          gpg_file_data_release (out);  
1325      return rc;  leave:
1326  }      if (in)
1327            gpg_file_data_release (in);
1328        if (out)
1329  static int          gpg_file_data_release (out);
1330  fm_add_sig_stat (file_sig_ctx_t log)      return rc;
1331  {  }
1332      gpgme_key_t key;      
1333      const char *kid;  
1334      int not_found = 0;  static int
1335    fm_add_sig_stat (file_sig_ctx_t log)
1336      kid = log->sig->fpr;  {
1337      if (!kid)      gpgme_key_t key;    
1338          BUG (NULL);      const char *kid;
1339      if (strlen (kid) == 40)      int not_found = 0;
1340          kid += 32;        
1341      else if (strlen (kid) == 32)      kid = log->sig->fpr;
1342          kid += 24;      if (!kid)
1343      if (get_pubkey (kid, &key))          BUG (NULL);
1344          log->use_uid = 0;      if (strlen (kid) == 40)
1345      else {          kid += 32;      
1346          log->user_id = key->uids->uid;      else if (strlen (kid) == 32)
1347          log->use_uid = 1;          kid += 24;
1348      }      if (get_pubkey (kid, &key))
1349      file_verify_add_state (log);          log->use_uid = 0;
1350      return 0;      else {
1351  }          log->user_id = key->uids->uid;
1352            log->use_uid = 1;
1353        }
1354  static int      file_verify_add_state (log);
1355  verify_pasted (listview_ctrl_t lv, fm_state_t ctx, const char * dat,      return 0;
1356                 int i, HWND dlg)  }
1357  {  
1358      FILE * fp;  
1359      char stat[32];  static int
1360      char file[256], * fname = NULL;  verify_pasted (listview_ctrl_t lv, fm_state_t ctx, const char * dat,
1361      int del_end=0;                 int i, HWND dlg)
1362    {
1363      listview_get_item_text (lv, i, 0, stat, sizeof (stat)-1);      FILE * fp;
1364      listview_get_item_text (lv, i, 1, file, sizeof (file)-1);      char stat[32];
1365      if (strcmp (stat, "UNKNOWN"))      char file[256], * fname = NULL;
1366          return 0;      int del_end=0;
1367      fname = make_filename (NULL, file, "asc");  
1368      if (file_exist_check (fname) != 0) {      listview_get_item_text (lv, i, 0, stat, sizeof (stat)-1);
1369          fp = fopen (fname, "wb");      listview_get_item_text (lv, i, 1, file, sizeof (file)-1);
1370          if (fp == NULL) {      if (strcmp (stat, "UNKNOWN"))
1371              log_box (_("File Manager"), MB_ERR, "could not create '%s'", fname);          return 0;
1372              free_if_alloc (fname);      fname = make_filename (NULL, file, "asc");
1373              return WPTERR_GENERAL;            if (file_exist_check (fname) != 0) {
1374          }                fp = fopen (fname, "wb");
1375          fwrite (dat, 1, strlen (dat), fp);          if (fp == NULL) {
1376          fclose (fp);              log_box (_("File Manager"), MB_ERR, "could not create '%s'", fname);
1377          del_end = 1;              free_if_alloc (fname);
1378      }              return WPTERR_GENERAL;      
1379      fm_verify (ctx, 1, fname);          }      
1380      if (del_end)          fwrite (dat, 1, strlen (dat), fp);
1381          unlink (fname);          fclose (fp);
1382      free_if_alloc (fname);          del_end = 1;
1383      return 0;      }
1384  }      fm_verify (ctx, 1, fname);
1385        if (del_end)
1386            unlink (fname);
1387  int      free_if_alloc (fname);
1388  fm_verify_pasted_detsig (listview_ctrl_t lv, HWND dlg)      return 0;
1389  {  }
1390      fm_state_t ctx = NULL;  
1391      char * dat=NULL;  
1392      int i, fnd = 0;  int
1393    fm_verify_pasted_detsig (listview_ctrl_t lv, HWND dlg)
1394      dat = get_clip_text (NULL);  {
1395      if (!dat || !strstr (dat, "BEGIN PGP SIGNATURE")) {      fm_state_t ctx = NULL;
1396          msg_box (dlg, _("Could not find detached signature in the clipboard."),      char * dat=NULL;
1397                   _("File Manager"), MB_ERR);      int i, fnd = 0;
1398          free_if_alloc (dat);  
1399          return WPTERR_GENERAL;      dat = get_clip_text (NULL);
1400      }      if (!dat || !strstr (dat, "BEGIN PGP SIGNATURE")) {
1401      /* XXX find a way to filter out bad signatures or just ignore all in          msg_box (dlg, _("Could not find detached signature in the clipboard."),
1402             this case */                   _("File Manager"), MB_ERR);
1403      fm_state_new (&ctx);          free_if_alloc (dat);
1404      if ((i=listview_get_curr_pos (lv)) != -1) {          return WPTERR_GENERAL;
1405          verify_pasted (lv, ctx, dat, i, dlg);      }
1406          fnd = 1;      /* XXX find a way to filter out bad signatures or just ignore all in
1407      }             this case */
1408      else {      fm_state_new (&ctx);
1409          for (i=0; i < listview_count_items (lv, 0); i++) {      if ((i=listview_get_curr_pos (lv)) != -1) {
1410              verify_pasted (lv, ctx, dat, i, dlg);          verify_pasted (lv, ctx, dat, i, dlg);
1411              fnd = 1;          fnd = 1;
1412          }      }
1413      }      else {
1414      if (!fnd)          for (i=0; i < listview_count_items (lv, 0); i++) {
1415          msg_box (dlg, _("No files to check."), _("File Manager"), MB_INFO);              verify_pasted (lv, ctx, dat, i, dlg);
1416      free_if_alloc (dat);              fnd = 1;
1417      fm_state_release (ctx);          }
1418      return 0;      }
1419  }      if (!fnd)
1420            msg_box (dlg, _("No files to check."), _("File Manager"), MB_INFO);
1421        free_if_alloc (dat);
1422  /* Extract automatically the output file name from @name.      fm_state_release (ctx);
1423     If @detached is 1, a detached sig is assumed. */      return 0;
1424  static int  }
1425  get_output_file (fm_state_t c, const char *name, int detached)  
1426  {  
1427      const char *file = NULL;  /* Extract automatically the output file name from @name.
1428      const char *title;     If @detached is 1, a detached sig is assumed. */
1429      char fname[384];  static int
1430        get_output_file (fm_state_t c, const char *name, int detached)
1431      if (detached)  {
1432          title = _("Select Data File");      const char *file = NULL;
1433      else      const char *title;
1434          title = _("Selected Output File");      char fname[384];
1435        
1436      if (strstr (name, ".sig") || strstr (name, ".asc") || strstr (name, ".gpg")) {      if (detached)
1437          _snprintf (fname, sizeof (fname) - 1, "%s", name);          title = _("Select Data File");
1438          fname[strlen (fname) - 4] = '\0';      else
1439          if (file_exist_check (fname) == 0 && detached)            title = _("Selected Output File");
1440              file = fname;  
1441          else if (!detached) {      if (strstr (name, ".sig") || strstr (name, ".asc") || strstr (name, ".gpg")) {
1442              /* If the signature is clear or normal, make sure we do not          _snprintf (fname, sizeof (fname) - 1, "%s", name);
1443                 overwrite the original file if it exists. */          fname[strlen (fname) - 4] = '\0';
1444              if (file_exist_check (fname) == 0 && !overwrite_file (fname)) {          if (file_exist_check (fname) == 0 && detached)  
1445                  file = get_filesave_dlg (c->dlg, title, NULL, NULL);              file = fname;
1446                  if (!file)          else if (!detached) {
1447                      return WPTERR_GENERAL;              /* If the signature is clear or normal, make sure we do not
1448              }                 overwrite the original file if it exists. */
1449              else              if (file_exist_check (fname) == 0 && !overwrite_file (fname)) {
1450                  file = fname;                  file = get_filesave_dlg (c->dlg, title, NULL, NULL);
1451          }                  if (!file)
1452      }                      return WPTERR_GENERAL;
1453      if (!file)              }
1454          file = get_fileopen_dlg (c->dlg, title, NULL, NULL);              else
1455      if (file) {                      file = fname;
1456          free_if_alloc (c->output);              }
1457          c->output = m_strdup (file);      }
1458          if (!c->output)      if (!file)
1459              BUG (NULL);          file = get_fileopen_dlg (c->dlg, title, NULL, NULL);
1460      }      if (file) {    
1461      else {          free_if_alloc (c->output);    
1462          msg_box (c->dlg, _("Invalid file name. Exit"), _("Verify"), MB_ERR);          c->output = m_strdup (file);
1463          return WPTERR_GENERAL;            if (!c->output)
1464      }              BUG (NULL);
1465      if (detached)      }
1466          c->sigmode = GPGME_SIG_MODE_DETACH;      else {
1467      else {          msg_box (c->dlg, _("Invalid file name. Exit"), _("Verify"), MB_ERR);
1468          if (strstr (name, ".asc"))          return WPTERR_GENERAL;  
1469              c->sigmode = GPGME_SIG_MODE_CLEAR;      }
1470          else      if (detached)
1471              c->sigmode = GPGME_SIG_MODE_NORMAL;          c->sigmode = GPGME_SIG_MODE_DETACH;
1472      }      else {
1473      return 0;          if (strstr (name, ".asc"))
1474  }              c->sigmode = GPGME_SIG_MODE_CLEAR;
1475            else
1476                c->sigmode = GPGME_SIG_MODE_NORMAL;
1477  /* Verify the signature from the file @name. If @detached 1,      }
1478     it is assumed that a detached signature should be checked. */      return 0;
1479  int  }
1480  fm_verify (fm_state_t c, int detached, const char *name)  
1481  {  
1482      gpgme_ctx_t ctx = c->ctx;  /* Verify the signature from the file @name. If @detached 1,
1483      gpgme_error_t err;     it is assumed that a detached signature should be checked. */
1484      gpgme_signature_t s;  int
1485      gpgme_verify_result_t res;  fm_verify (fm_state_t c, int detached, const char *name)
1486      struct file_sig_ctx_s log;  {
1487      file_data_t in=NULL, out=NULL;      gpgme_ctx_t ctx = c->ctx;
1488      int rc = 0;      gpgme_error_t err;
1489        gpgme_signature_t s;
1490      if (strstr (name, ".sig"))      gpgme_verify_result_t res;
1491          detached = 1;      struct file_sig_ctx_s log;
1492        file_data_t in=NULL, out=NULL;
1493      if (get_output_file (c, name, detached))      int rc = 0;
1494          return WPTERR_GENERAL;  
1495        if (strstr (name, ".sig"))
1496      memset (&log, 0, sizeof (log));          detached = 1;
1497      log.file = m_strdup (name);  
1498      if (!log.file)      if (get_output_file (c, name, detached))
1499          BUG (NULL);          return WPTERR_GENERAL;
1500      file_verify_create_dlg ();  
1501        memset (&log, 0, sizeof (log));
1502      err = gpg_file_data_new (name, 1, &in);      log.file = m_strdup (name);
1503      if (err)      if (!log.file)
1504          goto leave;          BUG (NULL);
1505      err = gpg_file_data_new (c->output, detached? 1 : 0, &out);      file_verify_create_dlg ();
1506      if (err)  
1507          goto leave;      err = gpg_file_data_new (name, 1, &in);
1508        if (err)
1509      op_begin ();          goto leave;
1510      if (c->sigmode == GPGME_SIG_MODE_DETACH)      err = gpg_file_data_new (c->output, detached? 1 : 0, &out);
1511          err = gpgme_op_verify (ctx, in->dat, out->dat, NULL);      if (err)
1512      else          goto leave;
1513          err = gpgme_op_verify (ctx, in->dat, in->dat, out->dat);  
1514      op_end ();      op_begin ();
1515      if (err) {      if (c->sigmode == GPGME_SIG_MODE_DETACH)
1516          msg_box (c->dlg, gpgme_strerror (err), _("Verify"), MB_ERR);          err = gpgme_op_verify (ctx, in->dat, out->dat, NULL);
1517          rc = WPTERR_GENERAL;      else
1518          goto leave;          err = gpgme_op_verify (ctx, in->dat, in->dat, out->dat);
1519      }          op_end ();
1520        if (err) {
1521      res = gpgme_op_verify_result (ctx);          msg_box (c->dlg, gpgme_strerror (err), _("Verify"), MB_ERR);
1522      for (s=res->signatures; s; s=s->next) {          rc = WPTERR_GENERAL;
1523          log.sig = s;          goto leave;
1524          fm_add_sig_stat (&log);      }    
1525      }  
1526      if (!c->output)      res = gpgme_op_verify_result (ctx);
1527          c->output = m_strdup (name); /* for later use */      for (s=res->signatures; s; s=s->next) {
1528            log.sig = s;
1529  leave:          fm_add_sig_stat (&log);
1530      if (in)      }
1531          gpg_file_data_release (in);      if (!c->output)
1532      if (out)          c->output = m_strdup (name); /* for later use */
1533          gpg_file_data_release (out);  
1534      if (log.file)  leave:
1535          delete []log.file;      if (in)
1536      return rc;          gpg_file_data_release (in);
1537  }      if (out)
1538            gpg_file_data_release (out);
1539        if (log.file)
1540  int          delete []log.file;
1541  fm_import (fm_state_t c, const char *name)      return rc;
1542  {  }
1543      gpgme_ctx_t ctx = c->ctx;  
1544      gpgme_error_t err;  
1545      gpgme_import_result_t res;  int
1546      file_data_t keydata = NULL;  fm_import (fm_state_t c, const char *name)
1547      int rc = 0;  {
1548        gpgme_ctx_t ctx = c->ctx;
1549      free_if_alloc (c->output);      gpgme_error_t err;
1550      c->output = m_strdup (name);      gpgme_import_result_t res;
1551      if (!c->output)      file_data_t keydata = NULL;
1552          BUG (NULL);      int rc = 0;
1553    
1554      err = gpg_file_data_new (name, 1, &keydata);      free_if_alloc (c->output);
1555      if (err)      c->output = m_strdup (name);
1556          goto leave;      if (!c->output)
1557            BUG (NULL);
1558      op_begin ();  
1559      err = gpgme_op_import (ctx, keydata->dat);      err = gpg_file_data_new (name, 1, &keydata);
1560      op_end ();      if (err)
1561      if (err) {          goto leave;
1562          msg_box (c->dlg, gpgme_strerror (err), _("Import"), MB_ERR);  
1563          rc = WPTERR_GENERAL;      op_begin ();
1564          goto leave;      err = gpgme_op_import (ctx, keydata->dat);
1565      }      op_end ();
1566        if (err) {
1567      res = gpgme_op_import_result (ctx);          msg_box (c->dlg, gpgme_strerror (err), _("Import"), MB_ERR);
1568      print_import_status (res);          rc = WPTERR_GENERAL;
1569      if (res->no_user_id > 0) {          goto leave;
1570          msg_box (c->dlg, _("Key without a self signature was dectected!\n"            }
1571                             "(This key is NOT usable for encryption, etc)\n"  
1572                             "\n"      res = gpgme_op_import_result (ctx);
1573                             "Cannot import these key(s)!"), _("Import"), MB_INFO);      print_import_status (res);
1574      }      if (res->no_user_id > 0) {
1575            msg_box (c->dlg, _("Key without a self signature was dectected!\n"      
1576  leave:                             "(This key is NOT usable for encryption, etc)\n"
1577      if (keydata)                             "\n"
1578          gpg_file_data_release (keydata);                             "Cannot import these key(s)!"), _("Import"), MB_INFO);
1579      return rc;      }
1580  } /* fm_import */  
1581    leave:
1582        if (keydata)
1583  /* Export the selected keys from the File Manager to a file. */          gpg_file_data_release (keydata);
1584  int      return rc;
1585  fm_export (fm_state_t c)  } /* fm_import */
1586  {  
1587      int rc = 0, id = 0;  
1588      gpgme_ctx_t ctx = c->ctx;  /* Export the selected keys from the File Manager to a file. */
1589      gpgme_error_t err;  int
1590      gpgme_key_t *rset = c->recp;  fm_export (fm_state_t c)
1591      file_data_t keydata = NULL;  {
1592      const char *name, *s = NULL;      int rc = 0, id = 0;
1593      char *p = NULL, *patt = NULL;      gpgme_ctx_t ctx = c->ctx;
1594        gpgme_error_t err;
1595      if (!rset || !rset[0]) {      gpgme_key_t *rset = c->recp;
1596          msg_box (c->dlg, _("No key was selected for export."), _("Export"), MB_ERR);      file_data_t keydata = NULL;
1597          rc = WPTERR_GENERAL;      const char *name, *s = NULL;
1598          goto leave;      char *p = NULL, *patt = NULL;
1599      }  
1600        if (!rset || !rset[0]) {
1601      if (rset[1] == NULL) { /* count == 1*/          msg_box (c->dlg, _("No key was selected for export."), _("Export"), MB_ERR);
1602          gpgme_key_t k = rset[0];          rc = WPTERR_GENERAL;
1603          const char *s = k->uids->name;          goto leave;
1604          p = new char[strlen (s)+1+8];      }
1605          if (!p)  
1606              BUG (NULL);      if (rset[1] == NULL) { /* count == 1*/
1607          strcpy (p, s );          gpgme_key_t k = rset[0];
1608          strcat (p, ".asc");          const char *s = k->uids->name;
1609      }          p = new char[strlen (s)+1+8];
1610            if (!p)
1611      name = get_filename_dlg (c->dlg, FILE_SAVE, _("Choose Name for Key File"),              BUG (NULL);
1612                               NULL, p? p : NULL);          strcpy (p, s );
1613                                        strcat (p, ".asc");
1614      if (!name)      }
1615          name = "keys.gpg";  
1616        name = get_filename_dlg (c->dlg, FILE_SAVE, _("Choose Name for Key File"),
1617      patt = gpg_keylist_to_pattern (rset, c->n_recp);                               NULL, p? p : NULL);
1618                                
1619      err = gpg_file_data_new (name, 0, &keydata);      if (!name)
1620      if (err)          name = "keys.gpg";
1621          goto leave;  
1622        patt = gpg_keylist_to_pattern (rset, c->n_recp);
1623      op_begin ();  
1624      err = gpgme_op_export (ctx, patt, 0, keydata->dat);      err = gpg_file_data_new (name, 0, &keydata);
1625      op_end ();      if (err)
1626      if (err) {          goto leave;
1627          msg_box (c->dlg, gpgme_strerror (err), _("Export"), MB_ERR);  
1628          rc = WPTERR_GENERAL;      op_begin ();
1629          goto leave;          err = gpgme_op_export (ctx, patt, 0, keydata->dat);
1630      }      op_end ();
1631      log_box (_("GnuPG status"), MB_OK, _("Finished (Output: %s)"),  name);      if (err) {
1632            msg_box (c->dlg, gpgme_strerror (err), _("Export"), MB_ERR);
1633  leave:          rc = WPTERR_GENERAL;
1634      if (keydata)          goto leave;    
1635          gpg_file_data_release (keydata);      }
1636      if (patt)      log_box (_("GnuPG status"), MB_OK, _("Finished (Output: %s)"),  name);
1637          free (patt);  
1638      free_if_alloc (p);  leave:
1639                if (keydata)
1640      return rc;          gpg_file_data_release (keydata);
1641  }      if (patt)
1642            free (patt);
1643        free_if_alloc (p);
1644  /* Parse the command line and process the given file. */            
1645  int      return rc;
1646  fm_parse_command_line (char *cmdl)  }
1647  {  
1648      fm_state_t ctx;  
1649      const char *s;  /* Parse the command line and process the given file. */  
1650      char *p, *fn = NULL;  int
1651      int count = 0, detached = 0;  fm_parse_command_line (char *cmdl)
1652      int type;  {
1653            fm_state_t ctx;
1654      if (!cmdl || !*cmdl)      const char *s;
1655          return 0;      char *p, *fn = NULL;
1656        int count = 0, detached = 0;
1657      fm_state_new (&ctx);          int type;
1658      ctx->dlg = GetActiveWindow ();      
1659      ctx->cache_cb = 1;      if (!cmdl || !*cmdl)
1660                return 0;
1661      p = cmdl;  
1662      if (p && *p > 32 && !stristr (p, "winpt.exe")      fm_state_new (&ctx);    
1663                       && !strstr (p, "--" )) {      ctx->dlg = GetActiveWindow ();
1664          count++;      ctx->cache_cb = 1;
1665          if (*p == '"') { /* need to remove quotes */      
1666              fn = new char[strlen (p)];      p = cmdl;
1667              if (!fn)      if (p && *p > 32 && !stristr (p, "winpt.exe")
1668                  BUG (NULL);                       && !strstr (p, "--" )) {
1669              memcpy (fn, p+1, strlen (p) - 2);          count++;
1670              fn[strlen (p) -2] = '\0';          if (*p == '"') { /* need to remove quotes */
1671          }              fn = new char[strlen (p)];
1672          else              if (!fn)
1673              fn = m_strdup (p);                  BUG (NULL);
1674          s = fm_get_file_type (fn, &type);              memcpy (fn, p+1, strlen (p) - 2);
1675          if (!s || !strcmp (s, "UNKNOWN"))              fn[strlen (p) -2] = '\0';
1676              s = gnupg_check_file_ext (fn, &type);          }
1677          if (type == PGP_NONE) {          else
1678              log_box (_("File Manager"), MB_ERR,              fn = m_strdup (p);
1679                       _("%s: no valid OpenPGP data found."), p);          s = fm_get_file_type (fn, &type);
1680              free_if_alloc (fn);          if (!s || !strcmp (s, "UNKNOWN"))
1681              return count;              s = gnupg_check_file_ext (fn, &type);
1682          }          if (type == PGP_NONE) {
1683          switch (type) {              log_box (_("File Manager"), MB_ERR,
1684          case PGP_MESSAGE:                       _("%s: no valid OpenPGP data found."), p);
1685              fm_decrypt (ctx, fn);              free_if_alloc (fn);
1686              break;              return count;
1687            }
1688          case PGP_PUBKEY:          switch (type) {
1689          case PGP_SECKEY:          case PGP_MESSAGE:
1690              fm_import (ctx, fn);              fm_decrypt (ctx, fn);
1691              break;              break;
1692    
1693          case PGP_SIG:          case PGP_PUBKEY:
1694          case PGP_CLEARSIG:          case PGP_SECKEY:
1695              file_verify_use_event ();              fm_import (ctx, fn);
1696              if (type == PGP_SIG)                  break;
1697                  detached = 1;  
1698              fm_verify (ctx, detached, fn);          case PGP_SIG:
1699              file_verify_wait ();          case PGP_CLEARSIG:
1700              break;              file_verify_use_event ();
1701          }              if (type == PGP_SIG)    
1702      }                  detached = 1;
1703                fm_verify (ctx, detached, fn);
1704      wipememory (&ctx->pass_cb, sizeof (ctx->pass_cb));              file_verify_wait ();
1705      free_if_alloc (fn);              break;
1706      fm_state_release (ctx);          }
1707      return count;      }
1708  }  
1709        wipememory (&ctx->pass_cb, sizeof (ctx->pass_cb));
1710        free_if_alloc (fn);
1711  const char*      fm_state_release (ctx);
1712  default_dirname (const char *name)      return count;
1713  {  }
1714      char * p = strrchr( name, '\\' );  
1715      if( !p )  
1716          return NULL;  const char*
1717      return p+1;  default_dirname (const char *name)
1718  } /* default_dirname */  {
1719        char * p = strrchr( name, '\\' );
1720        if( !p )
1721  int          return NULL;
1722  fm_encrypt_directory( fm_state_t c, const char * name )      return p+1;
1723  {  } /* default_dirname */
1724      PK_FILE_LIST list = NULL;  
1725      WIN32_FIND_DATA findbuf;  
1726      HANDLE hd;  int
1727      const char * s;  fm_encrypt_directory( fm_state_t c, const char * name )
1728      char * patt = NULL, * p;  {
1729      int rc = 0;      PK_FILE_LIST list = NULL;
1730            WIN32_FIND_DATA findbuf;
1731      if( !is_directory( name ) )          HANDLE hd;
1732          return -1;      const char * s;
1733      patt = new char[strlen( name ) + 4];      char * patt = NULL, * p;
1734      if( !patt )      int rc = 0;
1735          BUG( NULL );      
1736      strcpy( patt, name );      if( !is_directory( name ) )    
1737      strcat( patt, "\\*" );          return -1;
1738      hd = FindFirstFile( patt, &findbuf );          patt = new char[strlen( name ) + 4];
1739      if( !hd ) {      if( !patt )
1740          free_if_alloc( patt );            BUG( NULL );
1741          return -1;            strcpy( patt, name );
1742      }      strcat( patt, "\\*" );
1743      if( strcmp( findbuf.cFileName, "." ) && strcmp( findbuf.cFileName, ".." ) ) {      hd = FindFirstFile( patt, &findbuf );    
1744          p = make_filename( name, findbuf.cFileName, NULL );      if( !hd ) {
1745          pk_list_add( &list, p );          free_if_alloc( patt );  
1746          free_if_alloc( p );          return -1;      
1747      }      }
1748      while( FindNextFile( hd, &findbuf ) ) {      if( strcmp( findbuf.cFileName, "." ) && strcmp( findbuf.cFileName, ".." ) ) {
1749          if( strcmp( findbuf.cFileName, "." ) && strcmp( findbuf.cFileName, ".." ) ) {          p = make_filename( name, findbuf.cFileName, NULL );
1750              p = make_filename( name, findbuf.cFileName, NULL );          pk_list_add( &list, p );
1751              pk_list_add( &list, p );          free_if_alloc( p );
1752              free_if_alloc( p );      }
1753          }      while( FindNextFile( hd, &findbuf ) ) {
1754      }          if( strcmp( findbuf.cFileName, "." ) && strcmp( findbuf.cFileName, ".." ) ) {
1755      s = get_filename_dlg( c->dlg, FILE_SAVE, _("Choose a Name for the Archive"),              p = make_filename( name, findbuf.cFileName, NULL );
1756                            NULL, default_dirname( name ) );              pk_list_add( &list, p );
1757      if( !s ) {              free_if_alloc( p );
1758          msg_box( c->dlg, _("Invalid archive name. Exit."), _("Encrypt Directory"), MB_ERR );          }
1759          rc = -1;      }
1760          goto leave;      s = get_filename_dlg( c->dlg, FILE_SAVE, _("Choose a Name for the Archive"),
1761      }                            NULL, default_dirname( name ) );
1762        if( !s ) {
1763      rc = pk_archiv_create( list, s );          msg_box( c->dlg, _("Invalid archive name. Exit."), _("Encrypt Directory"), MB_ERR );
1764      if( rc )          rc = -1;
1765          msg_box( c->dlg, _("Could not create zip archive."), _("Encrypt Directory"), MB_ERR );          goto leave;
1766      else {      }
1767          fm_encrypt( c, s, 0 );  
1768          unlink( s );      rc = pk_archiv_create( list, s );
1769      }      if( rc )
1770  leave:          msg_box( c->dlg, _("Could not create zip archive."), _("Encrypt Directory"), MB_ERR );
1771      FindClose (hd);      else {
1772      pk_list_free( list );          fm_encrypt( c, s, 0 );
1773      free_if_alloc( patt );          unlink( s );
1774      return rc;      }
1775  } /* fm_encrypt_directory */  leave:
1776        FindClose (hd);
1777        pk_list_free( list );
1778  static int CALLBACK      free_if_alloc( patt );
1779  fm_cmp_cb( LPARAM first, LPARAM second, LPARAM sortby )      return rc;
1780  {  } /* fm_encrypt_directory */
1781      const char * a = 0, * b = 0;  
1782    
1783      switch( (int)sortby ) {  static int CALLBACK
1784      case FM_SORT_STAT:  fm_cmp_cb( LPARAM first, LPARAM second, LPARAM sortby )
1785          break;  {
1786      case FM_SORT_NAME:      const char * a = 0, * b = 0;
1787          break;  
1788      case FM_SORT_OP:      switch( (int)sortby ) {
1789          break;      case FM_SORT_STAT:
1790      }          break;
1791      return stricmp( a, b );      case FM_SORT_NAME:
1792  } /* fm_cmp_cb */          break;
1793                case FM_SORT_OP:
1794            break;
1795  int      }
1796  fm_sort( listview_ctrl_t lv, int sortby )      return stricmp( a, b );
1797  {  } /* fm_cmp_cb */
1798      return listview_sort_items( lv, sortby, fm_cmp_cb );          
1799  } /* fm_sort */  
1800    int
1801    fm_sort( listview_ctrl_t lv, int sortby )
1802  void  {
1803  fm_print_md( listview_ctrl_t lv, HWND dlg, int mdalgo )      return listview_sort_items( lv, sortby, fm_cmp_cb );
1804  {  } /* fm_sort */
1805      struct md_file_s mdctx;  
1806    
1807      if( listview_count_items( lv, 0 ) == 0 )  void
1808          return;  fm_print_md( listview_ctrl_t lv, HWND dlg, int mdalgo )
1809      memset (&mdctx, 0, sizeof (mdctx));  {
1810      mdctx.lv = lv;      struct md_file_s mdctx;
1811      mdctx.mdalgo = mdalgo;  
1812      DialogBoxParam( glob_hinst, (LPCTSTR)IDD_WINPT_FILE_MDSUM, dlg,      if( listview_count_items( lv, 0 ) == 0 )
1813                      mdsum_dlg_proc, (LPARAM)&mdctx );          return;
1814  } /* fm_print_md */      memset (&mdctx, 0, sizeof (mdctx));
1815        mdctx.lv = lv;
1816        mdctx.mdalgo = mdalgo;
1817  int      DialogBoxParam( glob_hinst, (LPCTSTR)IDD_WINPT_FILE_MDSUM, dlg,
1818  fm_send_file (listview_ctrl_t lv)                      mdsum_dlg_proc, (LPARAM)&mdctx );
1819  {  } /* fm_print_md */
1820      char buf[128];  
1821      int rc;  
1822    int
1823      rc = listview_get_item_text (lv, -1, 1, buf, sizeof (buf)-1);  fm_send_file (listview_ctrl_t lv)
1824      if (rc == -1)  {
1825          return 0;      char buf[128];
1826      /*mapi_send_ascfile (buf); XXX */      int rc;
1827      return 0;  
1828  }      rc = listview_get_item_text (lv, -1, 1, buf, sizeof (buf)-1);
1829        if (rc == -1)
1830            return 0;
1831        /*mapi_send_ascfile (buf); XXX */
1832        return 0;
1833    }

Legend:
Removed from v.35  
changed lines
  Added in v.36

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26