/[winpt]/trunk/MyGPGME/decrypt.c
ViewVC logotype

Diff of /trunk/MyGPGME/decrypt.c

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

revision 2 by twoaday, Mon Jan 31 11:02:21 2005 UTC revision 22 by twoaday, Wed Aug 10 11:33:35 2005 UTC
# Line 1  Line 1 
1  /* decrypt.c -  decrypt functions  /* decrypt.c -  decrypt functions
2   *      Copyright (C) 2000 Werner Koch (dd9jn)   *      Copyright (C) 2000 Werner Koch (dd9jn)
3   *      Copyright (C) 2001-2004 Timo Schulz   *      Copyright (C) 2001-2005 Timo Schulz
4   *   *
5   * This file is part of MyGPGME.   * This file is part of MyGPGME.
6   *   *
# Line 46  struct decrypt_result_s { Line 46  struct decrypt_result_s {
46      int file_done;      int file_done;
47      char keyid[16+1];      char keyid[16+1];
48      char cardno[32+1];      char cardno[32+1];
49      void * last_pw_handle;      void *last_pw_handle;
50      char * userid_hint;      char *userid_hint;
51      char * passphrase_info;      char *passphrase_info;
52      char * file_name;          char *file_name;
53        struct {
54            int mode;
55            long times;
56            char *name;
57        } plain;
58  };  };
59    
60    
# Line 69  gpgme_decrypt_get_sig_ctx (gpgme_ctx_t c Line 74  gpgme_decrypt_get_sig_ctx (gpgme_ctx_t c
74    
75    
76  void  void
77  gpgme_decrypt_get_status( gpgme_ctx_t ctx, char * keyid,  gpgme_decrypt_get_status (gpgme_ctx_t ctx, char * keyid,
78                            gpgme_op_flags_t * r_flags )                            gpgme_op_flags_t * r_flags)
79  {  {
80      gpgme_op_flags_t flags = 0;      gpgme_op_flags_t flags = 0;
81      _decrypt_result_t res;          _decrypt_result_t res;    
82    
83      if( !keyid )      if (!keyid)
84          return;          return;
85      if( ctx->result_type != RESULT_TYPE_DECRYPT )      if (ctx->result_type != RESULT_TYPE_DECRYPT)
86          return;          return;
87      if( !ctx->result.decrypt->okay      if (!ctx->result.decrypt->okay
88          && ctx->result.decrypt->no_seckey ) {          && ctx->result.decrypt->no_seckey) {
89          strcpy( keyid, ctx->result.decrypt->keyid );          strcpy (keyid, ctx->result.decrypt->keyid);
90          flags |= GPGME_OPFLAG_NOSECKEY;          flags |= GPGME_OPFLAG_NOSECKEY;
91      }      }
92      res = ctx->result.decrypt;        res = ctx->result.decrypt;  
# Line 95  gpgme_decrypt_get_status( gpgme_ctx_t ct Line 100  gpgme_decrypt_get_status( gpgme_ctx_t ct
100    
101    
102  void  void
103  _gpgme_release_decrypt_result( _decrypt_result_t res )  _gpgme_release_decrypt_result (_decrypt_result_t res)
104  {  {
105      if( res ) {      if (res) {
106          safe_free( res->passphrase_info );          safe_free (res->passphrase_info);
107          safe_free( res->userid_hint );          safe_free (res->userid_hint);
108          gpgme_sig_release( res->sig );          safe_free (res->file_name);
109          safe_free( res );          safe_free (res->plain.name);
110            gpgme_sig_release(res->sig);
111            safe_free (res);
112      }      }
113  } /* _gpgme_release_decrypt_result */  } /* _gpgme_release_decrypt_result */
114    
# Line 164  add_signature( gpgme_ctx_t ctx ) Line 171  add_signature( gpgme_ctx_t ctx )
171    
172    
173  static void  static void
174  decrypt_status_handler( gpgme_ctx_t ctx, gpg_status_code_t code, char *args )  decrypt_status_handler (gpgme_ctx_t ctx, gpg_status_code_t code, char *args)
175  {    {  
176      static gpgme_sig_t sig = NULL;      static gpgme_sig_t sig = NULL;
177      static char keyid[16+1];      static char keyid[16+1];
# Line 181  decrypt_status_handler( gpgme_ctx_t ctx, Line 188  decrypt_status_handler( gpgme_ctx_t ctx,
188              return;              return;
189          }          }
190      }      }
   
191      assert (ctx->result_type == RESULT_TYPE_DECRYPT);      assert (ctx->result_type == RESULT_TYPE_DECRYPT);
192    
193      if (code == STATUS_GOODSIG || code == STATUS_REVKEYSIG      if (code == STATUS_GOODSIG || code == STATUS_REVKEYSIG
# Line 196  decrypt_status_handler( gpgme_ctx_t ctx, Line 202  decrypt_status_handler( gpgme_ctx_t ctx,
202      _gpgme_pass_status_handler (code, args, &ctx->result.decrypt->bad_passphrase,      _gpgme_pass_status_handler (code, args, &ctx->result.decrypt->bad_passphrase,
203                                  &ctx->result.decrypt->no_data,                                  &ctx->result.decrypt->no_data,
204                                  &ctx->result.decrypt->passphrase_info);                                  &ctx->result.decrypt->passphrase_info);
205      if (sig)      if (sig && (code >= STATUS_TRUST_UNDEFINED && code <= STATUS_TRUST_ULTIMATE)) {
206          _gpgme_sigtrust_status_handler (code, args, &sig->trust);          _gpgme_sigtrust_status_handler (code, args, &sig->trust);
207            DEBUG1("sig_trust: %d", sig->trust);
208        }
209    
210      switch( code ) {      switch (code) {
211      case STATUS_EOF:      case STATUS_EOF:
212          break;          break;
213                    
214      case STATUS_USERID_HINT:      case STATUS_USERID_HINT:
215          safe_free( ctx->result.decrypt->userid_hint );          safe_free (ctx->result.decrypt->userid_hint);
216          p = ctx->result.decrypt->userid_hint = strdup( args );          p = ctx->result.decrypt->userid_hint = strdup (args);
217          if (!p) {          if (!p) {
218              ctx->out_of_core = 1;              ctx->out_of_core = 1;
219              return;              return;
# Line 225  decrypt_status_handler( gpgme_ctx_t ctx, Line 233  decrypt_status_handler( gpgme_ctx_t ctx,
233          break;          break;
234                    
235      case STATUS_SIG_ID:      case STATUS_SIG_ID:
236          DEBUG0( "Plaintext was signed!\n" );          DEBUG0 ("Plaintext was signed!\n");
237          break;          break;
238                    
239      case STATUS_NO_SECKEY:      case STATUS_NO_SECKEY:
240          ctx->result.decrypt->no_seckey++;          ctx->result.decrypt->no_seckey++;
241          strncpy( ctx->result.decrypt->keyid, args, 16 );          strncpy (ctx->result.decrypt->keyid, args, 16);
242          break;          break;
243                    
244      case STATUS_NO_PUBKEY:      case STATUS_NO_PUBKEY:
245          sig->sigstat = GPGME_SIG_STAT_NOKEY;          sig->sigstat = GPGME_SIG_STAT_NOKEY;
246          break;          break;
247    
248        case STATUS_PLAINTEXT:
249            i=0;
250            while (args[i] && args[i] == ' ')
251                i++;
252            ctx->result.decrypt->plain.mode = strtoul (args+i, NULL, 10);
253            while (args[i] && args[i] != ' ')
254                i++;
255            i++;
256            ctx->result.decrypt->plain.times = strtoul (args+i, NULL, 10);
257            while (args[i] && args[i] != ' ')
258                i++;
259            i++;
260            safe_free (ctx->result.decrypt->plain.name);
261            if (args[i]) {
262                p = ctx->result.decrypt->plain.name = strdup (args+i);
263                if (!p)
264                    ctx->out_of_core = 1;
265            }
266            break;
267                    
268      case STATUS_VALIDSIG:      case STATUS_VALIDSIG:
269          p = fpr;          p = fpr;
# Line 254  decrypt_status_handler( gpgme_ctx_t ctx, Line 282  decrypt_status_handler( gpgme_ctx_t ctx,
282                    
283      case STATUS_GOODSIG:      case STATUS_GOODSIG:
284      case STATUS_BADSIG:      case STATUS_BADSIG:
285          if( code == STATUS_GOODSIG )          if (code == STATUS_GOODSIG)
286              sig->sigstat = GPGME_SIG_STAT_GOOD;              sig->sigstat = GPGME_SIG_STAT_GOOD;
287          else          else
288              sig->sigstat = GPGME_SIG_STAT_BAD;              sig->sigstat = GPGME_SIG_STAT_BAD;
# Line 283  decrypt_status_handler( gpgme_ctx_t ctx, Line 311  decrypt_status_handler( gpgme_ctx_t ctx,
311              return;              return;
312          }          }
313          j=0;          j=0;
314          while( args[i] )          while (args[i])
315              p[j++] = args[i++];              p[j++] = args[i++];
316          p[j++] = '\0';          p[j++] = '\0';
317          break;          break;
# Line 304  decrypt_status_handler( gpgme_ctx_t ctx, Line 332  decrypt_status_handler( gpgme_ctx_t ctx,
332          if (*args == '3') {          if (*args == '3') {
333              safe_free (ctx->result.decrypt->file_name);              safe_free (ctx->result.decrypt->file_name);
334              p = ctx->result.decrypt->file_name = strdup (args+2);              p = ctx->result.decrypt->file_name = strdup (args+2);
335              if( !p ) {              if (!p) {
336                  ctx->out_of_core = 1;                  ctx->out_of_core = 1;
337                  return;                  return;
338              }              }
# Line 316  decrypt_status_handler( gpgme_ctx_t ctx, Line 344  decrypt_status_handler( gpgme_ctx_t ctx,
344    
345      case STATUS_FILE_DONE:      case STATUS_FILE_DONE:
346          ctx->result.decrypt->file_done++;          ctx->result.decrypt->file_done++;
347          if( ctx->cb.interactiv )          if (ctx->cb.interactiv)
348              ctx->cb.interactiv( ctx->cb.interactiv_value, code, NULL, NULL );              ctx->cb.interactiv (ctx->cb.interactiv_value, code, NULL, NULL);
349          break;          break;
350    
351      case STATUS_CARDCTRL:      case STATUS_CARDCTRL:
# Line 547  file_decrypt_start( gpgme_ctx_t ctx, con Line 575  file_decrypt_start( gpgme_ctx_t ctx, con
575    
576    
577  static gpgme_error_t  static gpgme_error_t
578  decrypt_start( gpgme_ctx_t ctx, gpgme_data_t ciph, gpgme_data_t plain )  decrypt_start (gpgme_ctx_t ctx, gpgme_data_t ciph, gpgme_data_t plain)
579  {  {
580      int rc = 0;      int rc = 0;
581            
582      fail_on_pending_request( ctx );      fail_on_pending_request (ctx);
583      ctx->pending = 1;      ctx->pending = 1;
584            
585      _gpgme_release_result( ctx );      _gpgme_release_result (ctx);
586      ctx->out_of_core = 0;      ctx->out_of_core = 0;
587            
588      /* create a process object */      /* create a process object */
# Line 563  decrypt_start( gpgme_ctx_t ctx, gpgme_da Line 591  decrypt_start( gpgme_ctx_t ctx, gpgme_da
591      if( rc )      if( rc )
592          goto leave;          goto leave;
593            
594      _gpgme_gpg_set_status_handler( ctx->gpg, decrypt_status_handler, ctx );      _gpgme_gpg_set_status_handler (ctx->gpg, decrypt_status_handler, ctx);
595      if( ctx->use_logging )      if (ctx->use_logging)
596          _gpgme_gpg_set_logging_handler( ctx->gpg, ctx );          _gpgme_gpg_set_logging_handler (ctx->gpg, ctx);
597      if( ctx->cb.passphrase ) {      if (ctx->cb.passphrase) {
598          rc = _gpgme_gpg_set_command_handler( ctx->gpg, decrypt_command_handler, ctx );          rc = _gpgme_gpg_set_command_handler (ctx->gpg, decrypt_command_handler, ctx);
599          if ( rc )          if (rc)
600              goto leave;              goto leave;
601      }      }
602      else if( ctx->passphrase_value ) {      else if( ctx->passphrase_value ) {
# Line 636  get_decrypt_result( gpgme_ctx_t ctx ) Line 664  get_decrypt_result( gpgme_ctx_t ctx )
664      else if( !res->okay || !res->no_data )      else if( !res->okay || !res->no_data )
665          err = mk_error( No_Data );          err = mk_error( No_Data );
666      else if( gpgme_get_process_rc( ctx ) )      else if( gpgme_get_process_rc( ctx ) )
667          err = mk_error( Interal_GPG_Problem );          err = mk_error( Internal_GPG_Problem );
668      return err;      return err;
669  } /* get_decrypt_result */  } /* get_decrypt_result */
670    
# Line 703  gpgme_op_files_decrypt( gpgme_ctx_t ctx, Line 731  gpgme_op_files_decrypt( gpgme_ctx_t ctx,
731    
732    
733  gpgme_error_t  gpgme_error_t
734  gpgme_op_clip_decrypt( gpgme_ctx_t ctx )  gpgme_op_clip_decrypt (gpgme_ctx_t ctx)
735  {  {
736      gpgme_error_t err;      gpgme_error_t err;
737      gpgme_data_t ciph = NULL;      gpgme_data_t ciph = NULL;
738      gpgme_data_t plain = NULL;      gpgme_data_t plain = NULL;
739            
740      err = gpgme_data_new_from_clipboard (&ciph);      err = gpgme_data_new_from_clipboard (&ciph);
741      if( !err )                  if (!err)
742          err = gpgme_data_new( &plain );          err = gpgme_data_new (&plain);
743      if( !err )      if (!err)
744          err = gpgme_op_decrypt( ctx, ciph, plain );              err = gpgme_op_decrypt (ctx, ciph, plain);
   
     gpgme_data_release_and_set_clipboard( plain );  
     gpgme_data_release( ciph );  
745    
746        gpgme_data_release_and_set_clipboard (plain);
747        gpgme_data_release (ciph);
748      return err;      return err;
749  } /* gpgme_op_clip_decrypt */  } /* gpgme_op_clip_decrypt */

Legend:
Removed from v.2  
changed lines
  Added in v.22

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26