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

Annotation of /trunk/MyGPGME/delete.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2 - (hide annotations)
Mon Jan 31 11:02:21 2005 UTC (20 years, 1 month ago) by twoaday
File MIME type: text/plain
File size: 4760 byte(s)
WinPT initial checkin.


1 twoaday 2 /* delete.c - delete a key
2     * Copyright (C) 2001 Werner Koch (dd9jn), g10 Code GmbH
3     * Copyright (C) 2001-2004 Timo Schulz
4     *
5     * This file is part of MyGPGME.
6     *
7     * MyGPGME is free software; you can redistribute it and/or modify
8     * it under the terms of the GNU General Public License as published by
9     * the Free Software Foundation; either version 2 of the License, or
10     * (at your option) any later version.
11     *
12     * MyGPGME is distributed in the hope that it will be useful,
13     * but WITHOUT ANY WARRANTY; without even the implied warranty of
14     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     * GNU General Public License for more details.
16     *
17     * You should have received a copy of the GNU General Public License
18     * along with this program; if not, write to the Free Software
19     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
20     */
21    
22     #include <stdio.h>
23     #include <stdlib.h>
24     #include <string.h>
25     #include <time.h>
26     #include <assert.h>
27    
28     #include "util.h"
29     #include "context.h"
30     #include "ops.h"
31     #include "key.h"
32    
33    
34     enum delete_problem {
35     No_Such_Key = 1,
36     Delete_Seckey_First = 2,
37     Ambigiuous_Specs = 3
38     };
39    
40    
41     static void
42     delete_status_handler (gpgme_ctx_t ctx, gpg_status_code_t code, char * args)
43     {
44     if (ctx->out_of_core)
45     return;
46    
47     switch (code) {
48     case STATUS_EOF:
49     break;
50    
51     case STATUS_DELETE_PROBLEM:
52     ctx->problem = atol (args);
53     break;
54    
55     default:
56     break; /* ignore all other codes */
57     }
58     } /* delete_status_handler */
59    
60    
61     static const char *
62     delete_command_handler( void * opaque, gpg_status_code_t code, const char * key )
63     {
64     gpgme_ctx_t ctx = opaque;
65    
66     if( !code )
67     return NULL;
68    
69     if( code == STATUS_GET_BOOL && !strcmp( "delete_key.secret.okay", key )
70     || code == STATUS_GET_BOOL && !strcmp( "delete_key.okay", key ) )
71     return "Y";
72    
73     return NULL;
74     } /* delete_command_handler */
75    
76    
77     static gpgme_error_t
78     delete_start( gpgme_ctx_t ctx, const gpgme_key_t key, int allow_secret )
79     {
80     gpgme_error_t rc = 0;
81     const char * s;
82    
83     if( !key ) {
84     rc = mk_error( Invalid_Value );
85     goto leave;
86     }
87    
88     fail_on_pending_request( ctx );
89     ctx->pending = 1;
90    
91     _gpgme_gpg_release( &ctx->gpg );
92     rc = _gpgme_gpg_new( &ctx->gpg );
93     if( rc )
94     goto leave;
95    
96     _gpgme_gpg_set_status_handler ( ctx->gpg, delete_status_handler, ctx );
97     _gpgme_gpg_set_command_handler( ctx->gpg, delete_command_handler, ctx );
98     if( ctx->use_logging )
99     _gpgme_gpg_set_logging_handler( ctx->gpg, ctx );
100    
101     /* build the commandline */
102     _gpgme_gpg_add_arg ( ctx->gpg, allow_secret?
103     "--delete-secret-and-public-key" : "--delete-key" );
104    
105     _gpgme_gpg_add_arg ( ctx->gpg, "--" );
106     s = gpgme_key_get_string_attr ( key, GPGME_ATTR_KEYID, NULL, 0 );
107     if( !s ) {
108     rc = mk_error( Invalid_Key );
109     goto leave;
110     }
111     _gpgme_gpg_add_arg( ctx->gpg, s );
112     rc = _gpgme_gpg_spawn( ctx->gpg, ctx ); /* do it */
113    
114     leave:
115     if( rc ) {
116     ctx->pending = 0;
117     _gpgme_gpg_release( &ctx->gpg );
118     }
119     return rc;
120     } /* delete_start */
121    
122    
123     gpgme_error_t
124     gpgme_op_delete( gpgme_ctx_t ctx, const gpgme_key_t key, int allow_secret )
125     {
126     gpgme_error_t err;
127    
128     err = delete_start( ctx, key, allow_secret );
129     if( !err ) {
130     gpgme_wait( ctx, 1 );
131     ctx->pending = 0;
132     if( ctx->problem == No_Such_Key )
133     err = mk_error( Invalid_Key );
134     else if( ctx->problem == Delete_Seckey_First )
135     err = mk_error( Conflict );
136     else if( gpgme_get_process_rc( ctx ) )
137     err = mk_error( General_Error );
138     }
139    
140     return err;
141     } /* gpgme_op_delete */
142    
143    
144     /* interface */
145     gpgme_error_t
146     gpgme_op_delete_key( const char * keyid, int allow_secret )
147     {
148     gpgme_error_t err = 0;
149     gpgme_key_t key = NULL;
150     gpgme_ctx_t ctx;
151    
152     if( !keyid )
153     return mk_error( Invalid_Value );
154    
155     err = gpgme_new( &ctx );
156     if( !err )
157     key = _gpgme_key_new_fromkeyid( keyid );
158     if( !err && key )
159     err = gpgme_op_delete( ctx, key, allow_secret );
160    
161     gpgme_release( ctx );
162     gpgme_key_release( key );
163     return err;
164     } /* gpgme_op_key_delete */
165    
166    
167     gpgme_error_t
168     gpgme_op_delete_keys (gpgme_recipients_t recp, int allow_secret)
169     {
170     gpgme_error_t err;
171     struct user_id_s * u;
172    
173     if (!recp)
174     return mk_error (Invalid_Value);
175    
176     for (u = recp->list; u; u = u->next) {
177     err = gpgme_op_delete_key (u->name, allow_secret);
178     if (err)
179     break;
180     }
181    
182     return err;
183     } /* gpgme_op_delete_keys */

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26