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

Contents of /trunk/Src/wptKeyEdit.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 304 - (show annotations)
Wed Mar 21 10:59:31 2007 UTC (17 years, 11 months ago) by twoaday
File size: 21855 byte(s)


1 /* wptKeyEdit.cpp - GPG key edit abstraction
2 * Copyright (C) 2005, 2006 Timo Schulz
3 * Copyright (C) 2005 g10 Code GmbH
4 *
5 * This file is part of WinPT.
6 *
7 * WinPT is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * WinPT 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 GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with WinPT; if not, write to the Free Software Foundation,
19 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <windows.h>
27 #include <time.h>
28
29 #include "gpgme.h"
30 #include "wptCommonCtl.h"
31 #include "wptContext.h"
32 #include "wptKeyEdit.h"
33 #include "wptTypes.h"
34 #include "wptW32API.h"
35 #include "wptGPG.h"
36 #include "wptErrors.h"
37 #include "wptUTF8.h"
38
39
40 /* Parse the colon status information of @line and store
41 the information in @rev.
42 Return value: 0 on success. */
43 static gpgme_error_t
44 rev_key_colon_handler (gpg_desig_rev_t *rev, char *line)
45 {
46 char *p, *pend;
47 gpg_desig_rev_t r, t;
48 int field = 0;
49
50 if (!line || strlen (line) < 3)
51 return gpg_error (GPG_ERR_EOF);
52 if (strncmp (line, "rvk", 3))
53 return 0; /* skip this line. */
54
55 log_debug ("rev_key: line=%s\r\n", line);
56
57 r = (gpg_desig_rev_t)calloc (1, sizeof *r);
58 if (!r)
59 return gpg_error (GPG_ERR_ENOMEM);
60 if (!*rev)
61 *rev = r;
62 else {
63 for (t=*rev; t->next; t=t->next)
64 ;
65 t->next = r;
66 }
67
68 p = strdup (line);
69 if (!p)
70 return gpg_error (GPG_ERR_ENOMEM);
71
72 for (;;) {
73 field++;
74 pend = strsep (&p, ":");
75 if (pend == NULL)
76 break;
77 switch (field) {
78 case 4:
79 r->pubkey_algo = (gpgme_pubkey_algo_t)atol (pend);
80 break;
81
82 case 10:
83 strncpy (r->fpr, pend, 40);
84 r->fpr[40] = 0;
85 break;
86 }
87 }
88 if (p)
89 free (p);
90 return 0;
91 }
92
93
94 /* Parse the colon data output of edit key from @line and
95 store the information in the @inf context.
96 Return value: 0 on success. */
97 static gpgme_error_t
98 uid_inf_colon_handler (gpg_uid_info_t *inf, char *line)
99 {
100 gpg_uid_info_t i, t;
101 char *p, *pend;
102 char *name;
103 int field = 0, len = 0;
104
105 if (!line || strlen (line) < 3 || strncmp (line, "uid", 3))
106 return gpg_error (GPG_ERR_EOF);
107
108 i = (gpg_uid_info_t)calloc (1, sizeof *i);
109 if (!i)
110 return gpg_error (GPG_ERR_ENOMEM);
111 if (!*inf)
112 *inf = i;
113 else {
114 for (t=*inf; t->next; t=t->next)
115 ;
116 t->next = i;
117 }
118
119 p = strdup (line);
120 if (!p)
121 return gpg_error (GPG_ERR_ENOMEM);;
122 for (;;) {
123 field++;
124 pend = strsep (&p, ":");
125 if (pend == NULL)
126 break;
127
128 switch (field) {
129 case 2: /* trust info */
130 break;
131
132 case 10: /* user ID */
133 name = (char *)calloc (1, strlen (pend)+1);
134 if (!name)
135 return gpg_error (GPG_ERR_ENOMEM);;
136 gpg_decode_c_string (pend, &name, strlen (pend)+ 1);
137 i->name = utf8_to_native (name);
138 safe_free (name);
139 if (strchr (pend, '<') != NULL && strchr (pend, '>') != NULL) {
140 int pos = strchr (i->name, '<')- i->name + 1;
141 int end = strchr (i->name, '>') - i->name;
142 i->email = (char*) calloc (1, end-pos+2);
143 if (!i->email)
144 return gpg_error (GPG_ERR_ENOMEM);;
145 memcpy (i->email, i->name+pos, (end-pos));
146 }
147 break;
148
149 case 13: /* preferences */
150 if (strstr (pend, "mdc")) {
151 const char *s = "no-ks-modify";
152 len = strlen (pend) - 4; /* ,mdc */
153 if (strstr (pend, s)) {
154 i->flags.no_ks_modify = 1;
155 len -= strlen (s)+1; /* ',' + s */
156 }
157 i->prefs = (char*)calloc (1, len+1);
158 if (!i->prefs)
159 return gpg_error (GPG_ERR_ENOMEM);
160 memcpy (i->prefs, pend, len);
161 i->prefs[len] = '\0';
162 i->flags.mdc = 1;
163 }
164 else {
165 i->prefs = strdup (pend);
166 if (!i->prefs)
167 return gpg_error (GPG_ERR_ENOMEM);
168 i->flags.mdc = 0;
169 }
170 break;
171
172 case 14: /* index/flags */
173 i->index = atoi (pend);
174 if (strchr (pend, 'r'))
175 i->flags.revoked = 1;
176 if (strchr (pend, 'p'))
177 i->flags.primary = 1;
178 break;
179 }
180 }
181 if (p)
182 free (p);
183 return 0;
184 }
185
186
187 /* Release the context in @inf. */
188 void
189 gpg_uid_info_release (gpg_uid_info_t list)
190 {
191 gpg_uid_info_t i;
192
193 while (list) {
194 i = list->next;
195 if (list->name) {
196 if (list->name)
197 free (list->name);
198 list->name = NULL;
199 }
200 if (list->prefs) {
201 if (list->prefs)
202 free (list->prefs);
203 list->prefs = NULL;
204 }
205 free (list);
206 list = i;
207 }
208 }
209
210
211 /* Release the context in @rev. */
212 void
213 gpg_desig_rev_release (gpg_desig_rev_t rev)
214 {
215 gpg_desig_rev_t r;
216
217 while (rev) {
218 r = rev->next;
219 free (rev);
220 rev = r;
221 }
222 }
223
224
225 static gpgme_error_t
226 list2_handler (void *opaque, gpgme_status_code_t code, const char *key, int fd)
227 {
228 DWORD n;
229 const char *s;
230
231 if (!strcmp (key, "keyedit.prompt")) {
232 s = "quit\n";
233 WriteFile ((HANDLE)fd, s, strlen (s), &n, NULL);
234 }
235 return 0;
236 }
237
238
239 /* Dummy handler to get the colon data and then quit. */
240 static gpgme_error_t
241 list_handler (void *opaque, gpgme_status_code_t code, const char *key, int fd)
242 {
243 static int step=0;
244 const char *s="";
245 DWORD n;
246
247 if (!strcmp (key, "keyedit.prompt") && step == 0) {
248 step = 1;
249 s = "list\n";
250 WriteFile ((HANDLE)fd, s, strlen (s), &n, NULL);
251 }
252 else if (!strcmp (key, "keyedit.prompt") && step == 1) {
253 step = 0;
254 s = "quit\n";
255 WriteFile ((HANDLE)fd, s, strlen (s), &n, NULL);
256 }
257
258 return 0;
259 }
260
261
262 /* Return all designated revokers for this key. If no revoker
263 was set, @r_rev is NULL.
264 Return value: 0 on success. */
265 gpgme_error_t
266 GpgKeyEdit::getDesignatedRevoker (gpg_desig_rev_t *r_rev)
267 {
268 gpgme_data_t out = NULL;
269 gpg_desig_rev_t rev = NULL;
270 gpgme_error_t err;
271 char buf[256];
272
273 if (!this->key)
274 return gpg_error (GPG_ERR_INV_OBJ);
275
276 err = gpgme_data_new (&out);
277 if (err)
278 goto leave;
279
280 err = gpgme_op_edit (ctx, key, list2_handler, NULL, out);
281 if (err)
282 goto leave;
283
284 gpgme_data_rewind (out);
285 while (gpg_data_readline (out, buf, DIM (buf)-1) > 0)
286 rev_key_colon_handler (&rev, buf);
287 *r_rev = rev;
288
289 leave:
290 if (out)
291 gpgme_data_release (out);
292 if (err) {
293 gpg_desig_rev_release (rev);
294 *r_rev = NULL;
295 }
296 return err;
297 }
298
299
300 /* Retrieve all user ID information of the key set via setKey
301 in @r_inf. The result also contains the user ID number which
302 is needed to securely delete the user-ID. */
303 gpgme_error_t
304 GpgKeyEdit::getUseridInfo (gpg_uid_info_t *r_uinf)
305 {
306 gpgme_data_t out = NULL;
307 gpgme_error_t err;
308 gpg_uid_info_t inf = NULL;
309 char buf[256];
310
311 if (!this->key)
312 return gpg_error (GPG_ERR_INV_OBJ);
313
314 err = gpgme_data_new (&out);
315 if (err)
316 goto leave;
317
318 err = gpgme_op_edit (ctx, key, list_handler, NULL, out);
319 if (err)
320 goto leave;
321
322 gpgme_data_rewind (out);
323 while (gpg_data_readline (out, buf, DIM (buf) -1) > 0)
324 uid_inf_colon_handler (&inf, buf);
325
326 *r_uinf = inf;
327
328 leave:
329 if (out)
330 gpgme_data_release (out);
331 if (err) {
332 gpg_uid_info_release (inf);
333 *r_uinf = NULL;
334 }
335 return err;
336 }
337
338
339 /* Clear object. */
340 void
341 GpgKeyEdit::clear (void)
342 {
343 pass = NULL;
344 name = NULL;
345 cmt = NULL;
346 email = NULL;
347 type = 0;
348 cnt = 0;
349 cmd_sent = 0;
350 resval = 0;
351 uid_index = sig_index = key_index = -1;
352 key_has_passwd = true;
353 }
354
355
356 GpgKeyEdit::GpgKeyEdit (void)
357 {
358 clear ();
359 key = NULL;
360 gpgme_new (&ctx); /*FIXME */
361 }
362
363
364 /* Construct an object with the given key in @key. */
365 GpgKeyEdit::GpgKeyEdit (gpgme_key_t _key)
366 {
367 clear ();
368 this->key = _key;
369 gpgme_new (&ctx); /* FIXME */
370 }
371
372 /* Construct an object and fetch the key with the keyid @keyid. */
373 GpgKeyEdit::GpgKeyEdit (const char *_keyid)
374 {
375 clear ();
376 get_pubkey (_keyid, &this->key);
377 gpgme_new (&ctx); /* FIXME */
378 }
379
380 /* Delete the given object. */
381 GpgKeyEdit::~GpgKeyEdit (void)
382 {
383 free_if_alloc (name);
384 free_if_alloc (cmt);
385 free_if_alloc (email);
386 gpgme_release (ctx);
387 }
388
389
390 /* Reset the state of the object. */
391 void
392 GpgKeyEdit::reset (void)
393 {
394 cmd_sent = 0;
395 cnt = 0;
396 }
397
398
399 /* Return true if type has a non-zero value. */
400 bool
401 GpgKeyEdit::isValid (void)
402 {
403 return type != 0;
404 }
405
406
407 /* Return the GPGME key. */
408 gpgme_key_t
409 GpgKeyEdit::getKey (void)
410 {
411 return key;
412 }
413
414
415 /* Set the GPGME callback to @cb. The hook value can be
416 given in @cb_value. */
417 void
418 GpgKeyEdit::setCallback (gpgme_progress_cb_t cb, void *cb_value)
419 {
420 gpgme_set_progress_cb (ctx, cb, cb_value);
421 }
422
423
424 /* Clear the stored passphrase. */
425 void
426 GpgKeyEdit::clearPassphrase (void)
427 {
428 if (pass)
429 pass = NULL;
430 }
431
432
433
434 /* Inidicate that a key is protected by a passphrase or not. */
435 void
436 GpgKeyEdit::setNoPassphrase (bool val)
437 {
438 key_has_passwd = !val;
439 }
440
441 /* Set the passphrase to @pass. */
442 void
443 GpgKeyEdit::setPassphrase (const char *_pass)
444 {
445 this->pass = _pass;
446 }
447
448
449 /* Kludge to allow to handle admin and user PINs. */
450 void
451 GpgKeyEdit::setPassphrase2 (const char *_pass2)
452 {
453 this->new_pass = _pass2;
454 }
455
456 /* Set the current key to @key. */
457 void
458 GpgKeyEdit::setKey (gpgme_key_t _key)
459 {
460 this->key = _key;
461 }
462
463 /* Set the keyid of the destination key to @keyid. */
464 void
465 GpgKeyEdit::setKeyID (const char *_keyid)
466 {
467 if (!_keyid)
468 return;
469 get_pubkey (_keyid, &this->key);
470 }
471
472
473 /* Set the local user for the operation to @locusr. */
474 void
475 GpgKeyEdit::setLocalUser (gpgme_key_t locusr)
476 {
477 gpgme_signers_add (ctx, locusr);
478 }
479
480 /* Set the result of the operation to @val. */
481 void
482 GpgKeyEdit::setResult (int val)
483 {
484 resval |= val;
485 }
486
487
488 /* Return the result of the operation. */
489 int
490 GpgKeyEdit::getResult(void)
491 {
492 return resval;
493 }
494
495
496 /* Return the amount of days the key is valid. */
497 int
498 GpgKeyEdit::getValidDays (void)
499 {
500 return valid;
501 }
502
503
504 int
505 GpgKeyEdit::getType (void)
506 {
507 return type;
508 }
509
510
511 /* Add the notation data from @notation to the user ID
512 with the index @_uid_idx.
513 Return value: 0 on success. */
514 gpgme_error_t
515 GpgKeyEdit::addNotation (int _uid_idx, const char *_notation)
516 {
517 if (!key)
518 return gpg_error (GPG_ERR_INV_OBJ);
519 if (key_has_passwd && !this->pass)
520 return gpg_error (GPG_ERR_INV_PASSPHRASE);
521
522 type = GPG_EDITKEY_NOTATION;
523 this->uid_index = _uid_idx;
524 this->notation = (char*)_notation;
525 return gpg_editkey (this->ctx, this->key, this);
526 }
527
528
529 /* Sign the key stored in the object with the
530 signing mode @mode and the signature class @sig_class.
531 Return value: 0 on success. */
532 gpgme_error_t
533 GpgKeyEdit::signKey (int mode, int _sig_class, const char *_exp_date)
534 {
535 if (!this->key)
536 return gpg_error (GPG_ERR_INV_OBJ);
537 if (key_has_passwd && !this->pass)
538 return gpg_error (GPG_ERR_INV_PASSPHRASE);
539
540 type = mode;
541 this->exp_date = _exp_date;
542 this->sig_class = _sig_class;
543 return gpg_editkey (this->ctx, this->key, this);
544 }
545
546
547 /* Sign a single user-id with the index @_uid_index.
548 All other parameters are equal to signKey().
549 Return value: 0 on success. */
550 gpgme_error_t
551 GpgKeyEdit::signUserid (int _uid_idx, int mode, int _sig_class,
552 const char *_exp_date)
553 {
554 if (!this->key)
555 return gpg_error (GPG_ERR_INV_OBJ);
556 if (key_has_passwd && !this->pass)
557 return gpg_error (GPG_ERR_INV_PASSPHRASE);
558
559 this->uid_index = _uid_idx;
560 type = mode;
561 this->exp_date = _exp_date;
562 this->sig_class = _sig_class;
563 return gpg_editkey (this->ctx, this->key, this);
564 }
565
566
567 /* Set the ownertrust of the key stored in the object
568 to the trust value @trust.
569 Return value: 0 on success. */
570 gpgme_error_t
571 GpgKeyEdit::setTrust (gpgme_validity_t trust)
572 {
573 if (!this->key)
574 return gpg_error (GPG_ERR_INV_OBJ);
575
576 type = GPG_EDITKEY_TRUST;
577 this->trust_id = (int)trust;
578 return gpg_editkey (this->ctx, this->key, this);
579 }
580
581 /* Add a user ID to the given key with the @name as the
582 name, @cmt as the comment (or NULL) and @email as the email.
583 Return value: 0 on success. */
584 gpgme_error_t
585 GpgKeyEdit::addUserid (const char *_name, const char *_cmt, const char *_email)
586 {
587 if (!this->key)
588 return gpg_error (GPG_ERR_INV_OBJ);
589 if (key_has_passwd && !this->pass)
590 return gpg_error (GPG_ERR_INV_PASSPHRASE);
591
592 type = GPG_EDITKEY_ADDUID;
593 free_if_alloc (this->name);
594 this->name = m_strdup (_name);
595 free_if_alloc (this->cmt);
596 this->cmt = NULL;
597 if (_cmt != NULL)
598 this->cmt = m_strdup (_cmt);
599 free_if_alloc (this->email);
600 this->email = m_strdup (_email);
601 if (!this->email || !this->name)
602 BUG (NULL);
603 return gpg_editkey (this->ctx, this->key, this);
604 }
605
606 /* Delete the user-ID with the index @uid_index of the given key.
607 Return value: 0 on success. */
608 gpgme_error_t
609 GpgKeyEdit::delUserid (int _uid_index)
610 {
611 if (!this->key)
612 return gpg_error (GPG_ERR_INV_OBJ);
613
614 type = GPG_EDITKEY_DELUID;
615 this->uid_index = _uid_index;
616 return gpg_editkey (this->ctx, this->key, this);
617 }
618
619 /* Delete the subkey with the index @key_index.
620 Return value: 0 on success. */
621 gpgme_error_t
622 GpgKeyEdit::delKey (int _key_index)
623 {
624 if (!this->key)
625 return gpg_error (GPG_ERR_INV_OBJ);
626
627 type = GPG_EDITKEY_DELKEY;
628 this->key_index = _key_index;
629 return gpg_editkey (this->ctx, this->key, this);
630 }
631
632
633 /* Add a new key on a smart card.
634 The type is given in @type. */
635 gpgme_error_t
636 GpgKeyEdit::addCardKey (int _type)
637 {
638 if (!this->key)
639 return gpg_error (GPG_ERR_INV_OBJ);
640 if (!this->pass)
641 return gpg_error (GPG_ERR_INV_PASSPHRASE);
642 if (_type < 1 || _type > 3)
643 return gpg_error (GPG_ERR_INV_VALUE);
644
645 type = GPG_EDITKEY_ADDCARDKEY;
646 this->key_index = _type;
647 return gpg_editkey (this->ctx, this->key, this);
648 }
649
650
651 /* Add a new subkey to the given key.
652 The new key will have @pubkey_algo as the algorithm
653 and a size of @pubkey_size bits. If valid > 0, the
654 key expires in @valid days.
655 Return value: 0 on success. */
656 gpgme_error_t
657 GpgKeyEdit::addSubkey (gpgme_pubkey_algo_t _pubkey_algo,
658 unsigned int _pubkey_size, long _valid)
659 {
660 if (!this->key)
661 return gpg_error (GPG_ERR_INV_OBJ);
662 if (key_has_passwd && !this->pass)
663 return gpg_error (GPG_ERR_INV_PASSPHRASE);
664
665 type = GPG_EDITKEY_ADDKEY;
666 this->pubkey_algo = _pubkey_algo;
667 this->pubkey_size = _pubkey_size;
668 this->valid = _valid;
669 return gpg_editkey (this->ctx, this->key, this);
670 }
671
672 /* Change the passphrase of the given key to @new_pass.
673 If allow_empty != 0, it is allowed to provide an empty passphrase.
674 Return value: 0 on success. */
675 gpgme_error_t
676 GpgKeyEdit::changePassphrase (const char *_new_pass, int allow_empty)
677 {
678 if (!this->key)
679 return gpg_error (GPG_ERR_INV_OBJ);
680 if (key_has_passwd && !this->pass)
681 return gpg_error (GPG_ERR_INV_PASSPHRASE);
682
683 type = GPG_EDITKEY_PASSWD;
684 this->new_pass = _new_pass;
685 this->flags = allow_empty? 1 : 0;
686 return gpg_editkey (this->ctx, this->key, this);
687 }
688
689 /* Set the primary user-ID of the given key to user-ID with
690 the index @uid_index.
691 Return value: 0 on success. */
692 gpgme_error_t
693 GpgKeyEdit::setPrimaryUserid (int _uid_index)
694 {
695 if (!this->key)
696 return gpg_error (GPG_ERR_INV_OBJ);
697 if (key_has_passwd && !this->pass)
698 return gpg_error (GPG_ERR_INV_PASSPHRASE);
699
700 type = GPG_EDITKEY_PRIMARY;
701 this->uid_index = _uid_index;
702 return gpg_editkey (this->ctx, this->key, this);
703 }
704
705 /* Set the expire date of the subkey with the index @key_index.
706 @exp_timestamp is used to calculate the days the key is valid.
707 if @exp_days is true, exp_timestamp is already converted to days.
708 Return value: 0 on success. */
709 gpgme_error_t
710 GpgKeyEdit::setKeyExpireDate (int _key_index, long exp_timestamp,
711 bool exp_days)
712 {
713 if (!this->key)
714 return gpg_error (GPG_ERR_INV_OBJ);
715 if (key_has_passwd && !this->pass)
716 return gpg_error (GPG_ERR_INV_PASSPHRASE);
717 if (!exp_days && exp_timestamp > 0 && exp_timestamp < time (NULL))
718 return gpg_error (GPG_ERR_INV_ARG);
719
720 type = GPG_EDITKEY_EXPIRE;
721 if (!exp_days && exp_timestamp > 0) {
722 valid = exp_timestamp - time (NULL);
723 valid /= 86400;
724 }
725 else
726 valid = exp_timestamp;
727 this->key_index = _key_index;
728 return gpg_editkey (this->ctx, this->key, this);
729 }
730
731 /* Revoke the userid given by the index @uid_index.
732 Return value: 0 on success. */
733 gpgme_error_t
734 GpgKeyEdit::revokeUserid (int _uid_index)
735 {
736 if (!this->key)
737 return gpg_error (GPG_ERR_INV_OBJ);
738 if (key_has_passwd && !this->pass)
739 return gpg_error (GPG_ERR_INV_PASSPHRASE);
740
741 type = GPG_EDITKEY_REVUID;
742 this->uid_index = _uid_index;
743 return gpg_editkey (this->ctx, this->key, this);
744 }
745
746
747 /* Revoke a signature on the user-ID with the index @uid_index
748 and the signature index @sig_index.
749 Return value: 0 on success. */
750 gpgme_error_t
751 GpgKeyEdit::revokeSignature (int _uid_index, int _sig_index)
752 {
753 if (!this->key)
754 return gpg_error (GPG_ERR_INV_OBJ);
755 if (key_has_passwd && !this->pass)
756 return gpg_error (GPG_ERR_INV_PASSPHRASE);
757
758 type = GPG_EDITKEY_REVSIG;
759 this->uid_index = _uid_index;
760 this->sig_index = _sig_index;
761 return gpg_editkey (this->ctx, this->key, this);
762 }
763
764
765 /* Revoke the subkey with the index @key_index. Optionally
766 a reason can be provided in @reason with a text to describe
767 more details in @cmt.
768 Return value: 0 on success. */
769 gpgme_error_t
770 GpgKeyEdit::revokeSubkey (int _key_index, int _reason, const char *_cmt)
771 {
772 if (!this->key)
773 return gpg_error (GPG_ERR_INV_OBJ);
774 if (key_has_passwd && !this->pass)
775 return gpg_error (GPG_ERR_INV_PASSPHRASE);
776
777 type = GPG_EDITKEY_REVKEY;
778 this->key_index = _key_index;
779 this->reason = _reason;
780 free_if_alloc (this->cmt);
781 this->cmt = NULL;
782 if (_cmt)
783 this->cmt = m_strdup (_cmt);
784 return gpg_editkey (this->ctx, this->key, this);
785 }
786
787
788 /* Add a designated revoker to the key. @uid stores
789 the user-ID of the key who is allowed to be a
790 designated revoker.
791 Return value: 0 on success. */
792 gpgme_error_t
793 GpgKeyEdit::addDesignatedRevoker (const char *uid)
794 {
795 if (!this->key)
796 return gpg_error (GPG_ERR_INV_OBJ);
797 if (key_has_passwd && !this->pass)
798 return gpg_error (GPG_ERR_INV_PASSPHRASE);
799
800 type = GPG_EDITKEY_ADDREV;
801 free_if_alloc (this->name);
802 this->name = m_strdup (uid);
803 return gpg_editkey (this->ctx, this->key, this);
804 }
805
806 /* Add a photo-ID to the key. The JPG image is given
807 in the file with the name @jpg_file.
808 Return value: 0 on success. */
809 gpgme_error_t
810 GpgKeyEdit::addPhotoid (const char *jpg_file)
811 {
812 if (!this->key)
813 return gpg_error (GPG_ERR_INV_OBJ);
814 if (key_has_passwd && !this->pass)
815 return gpg_error (GPG_ERR_INV_PASSPHRASE);
816
817 type = GPG_EDITKEY_ADDPHOTO;
818 this->url = jpg_file;
819 return gpg_editkey (this->ctx, this->key, this);
820 }
821
822 /* Enable the given key. */
823 gpgme_error_t
824 GpgKeyEdit::enable (void)
825 {
826 if (!this->key)
827 return gpg_error (GPG_ERR_INV_OBJ);
828 type = GPG_EDITKEY_ENABLE;
829 return gpg_editkey (this->ctx, this->key, this);
830 }
831
832 /* Disable the given key. */
833 gpgme_error_t
834 GpgKeyEdit::disable (void)
835 {
836 if (!this->key)
837 return gpg_error (GPG_ERR_INV_OBJ);
838 type = GPG_EDITKEY_DISABLE;
839 return gpg_editkey (this->ctx, this->key, this);
840 }
841
842
843 /* Remove unusable parts and all signatures from a key. */
844 gpgme_error_t
845 GpgKeyEdit::minimizeKey (void)
846 {
847 if (!this->key)
848 return gpg_error (GPG_ERR_INV_OBJ);
849 type = GPG_EDITKEY_MINIMIZE;
850 return gpg_editkey (this->ctx, this->key, this);
851 }
852
853
854 /* Remove unusable parts from a key. */
855 gpgme_error_t
856 GpgKeyEdit::cleanKey (void)
857 {
858 if (!this->key)
859 return gpg_error (GPG_ERR_INV_OBJ);
860 type = GPG_EDITKEY_CLEAN;
861 return gpg_editkey (this->ctx, this->key, this);
862 }
863
864
865 /* Update the user-ID preferences of the user-ID with the
866 index @uid_index to the prefs given in @new_prefs.
867 Return value: 0 on success. */
868 gpgme_error_t
869 GpgKeyEdit::setUseridPreferences (int _uid_index, const char *_new_prefs)
870 {
871 if (!this->key)
872 return gpg_error (GPG_ERR_INV_OBJ);
873 if (key_has_passwd && !this->pass)
874 return gpg_error (GPG_ERR_INV_PASSPHRASE);
875 type = GPG_EDITKEY_SETPREF;
876 this->uid_index = _uid_index;
877 this->new_prefs = _new_prefs;
878 return gpg_editkey (this->ctx, this->key, this);
879 }
880
881
882 /* Delete a signature from the user-ID with the index @uid_index.
883 The index of the signature is given in @sig_index.
884 Return value: 0 on success. */
885 gpgme_error_t
886 GpgKeyEdit::delUseridSignature (int _uid_index, int _sig_index)
887 {
888 if (!this->key)
889 return gpg_error (GPG_ERR_INV_OBJ);
890 type = GPG_EDITKEY_DELSIG;
891 this->uid_index = _uid_index;
892 this->sig_index = _sig_index;
893 return gpg_editkey (this->ctx, this->key, this);
894 }
895
896 /* Set the preferred keyserver for the given key to @url.
897 If @_uid_index is -1, set the keyserver for all user-ids.
898 Return value: 0 on success. */
899 gpgme_error_t
900 GpgKeyEdit::setPreferredKeyserver (int _uid_index, const char *_url)
901 {
902 if (!this->key)
903 return gpg_error (GPG_ERR_INV_OBJ);
904 if (key_has_passwd && !this->pass)
905 return gpg_error (GPG_ERR_INV_PASSPHRASE);
906 if (!_url)
907 return gpg_error (GPG_ERR_INV_ARG);
908
909 type = GPG_EDITKEY_KEYSERV;
910 this->url = _url;
911 this->uid_index = _uid_index;
912 return gpg_editkey (this->ctx, this->key, this);
913 }
914
915
916 /* Return the saved user-id index. */
917 int
918 GpgKeyEdit::getUseridIndex (void)
919 {
920 return uid_index;
921 }
922
923
924 /* Return the saved key index. */
925 int
926 GpgKeyEdit::getKeyIndex (void)
927 {
928 return key_index;
929 }
930
931
932 /* Return the saved sig index. */
933 int
934 GpgKeyEdit::getSigIndex (void)
935 {
936 return sig_index;
937 }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26