cpp: Add wrapper for gpgme_set_global_flag
[gpgme.git] / tests / run-export.c
1 /* pgp-export.c  - Helper to run an export command
2  * Copyright (C) 2008, 2009 g10 Code GmbH
3  *
4  * This file is part of GPGME.
5  *
6  * GPGME is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as
8  * published by the Free Software Foundation; either version 2.1 of
9  * the License, or (at your option) any later version.
10  *
11  * GPGME is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, see <https://gnu.org/licenses/>.
18  * SPDX-License-Identifier: LGPL-2.1-or-later
19  */
20
21 /* We need to include config.h so that we know whether we are building
22    with large file system (LFS) support. */
23 #ifdef HAVE_CONFIG_H
24 #include <config.h>
25 #endif
26
27 #include <stdlib.h>
28 #include <stdio.h>
29 #include <string.h>
30
31 #include <gpgme.h>
32
33 #define PGM "run-export"
34
35 #include "run-support.h"
36
37
38 static int verbose;
39
40
41 static int
42 show_usage (int ex)
43 {
44   fputs ("usage: " PGM " [options] USERIDS\n\n"
45          "Options:\n"
46          "  --verbose        run in verbose mode\n"
47          "  --openpgp        use OpenPGP protocol (default)\n"
48          "  --cms            use X.509 protocol\n"
49          "  --extern         send keys to the keyserver (TAKE CARE!)\n"
50          "  --secret         export secret keys instead of public keys\n"
51          "  --raw            use PKCS#1 as secret key format\n"
52          "  --pkcs12         use PKCS#12 as secret key format\n"
53          , stderr);
54   exit (ex);
55 }
56
57 int
58 main (int argc, char **argv)
59 {
60   int last_argc = -1;
61   gpgme_error_t err;
62   gpgme_ctx_t ctx;
63   gpgme_key_t key;
64   gpgme_keylist_result_t result;
65   gpgme_key_t keyarray[100];
66   int keyidx = 0;
67   gpgme_data_t out;
68   gpgme_protocol_t protocol = GPGME_PROTOCOL_OpenPGP;
69   gpgme_export_mode_t mode = 0;
70
71   if (argc)
72     { argc--; argv++; }
73
74   while (argc && last_argc != argc )
75     {
76       last_argc = argc;
77       if (!strcmp (*argv, "--"))
78         {
79           argc--; argv++;
80           break;
81         }
82       else if (!strcmp (*argv, "--help"))
83         show_usage (0);
84       else if (!strcmp (*argv, "--verbose"))
85         {
86           verbose = 1;
87           argc--; argv++;
88         }
89       else if (!strcmp (*argv, "--openpgp"))
90         {
91           protocol = GPGME_PROTOCOL_OpenPGP;
92           argc--; argv++;
93         }
94       else if (!strcmp (*argv, "--cms"))
95         {
96           protocol = GPGME_PROTOCOL_CMS;
97           argc--; argv++;
98         }
99       else if (!strcmp (*argv, "--extern"))
100         {
101           mode |= GPGME_EXPORT_MODE_EXTERN;
102           argc--; argv++;
103         }
104       else if (!strcmp (*argv, "--secret"))
105         {
106           mode |= GPGME_EXPORT_MODE_SECRET;
107           argc--; argv++;
108         }
109       else if (!strcmp (*argv, "--raw"))
110         {
111           mode |= GPGME_EXPORT_MODE_RAW;
112           argc--; argv++;
113         }
114       else if (!strcmp (*argv, "--pkcs12"))
115         {
116           mode |= GPGME_EXPORT_MODE_PKCS12;
117           argc--; argv++;
118         }
119       else if (!strncmp (*argv, "--", 2))
120         show_usage (1);
121
122     }
123
124   if (!argc)
125     show_usage (1);
126
127   init_gpgme (protocol);
128
129   err = gpgme_new (&ctx);
130   fail_if_err (err);
131   gpgme_set_protocol (ctx, protocol);
132
133   /* Lookup the keys.  */
134   err = gpgme_op_keylist_ext_start (ctx, (const char**)argv, 0, 0);
135   fail_if_err (err);
136
137   while (!(err = gpgme_op_keylist_next (ctx, &key)))
138     {
139       printf ("keyid: %s  (fpr: %s)\n",
140               key->subkeys?nonnull (key->subkeys->keyid):"?",
141               key->subkeys?nonnull (key->subkeys->fpr):"?");
142
143       if (keyidx < DIM (keyarray)-1)
144         keyarray[keyidx++] = key;
145       else
146         {
147           fprintf (stderr, PGM": too many keys"
148                    "- skipping this key\n");
149           gpgme_key_unref (key);
150         }
151     }
152   if (gpgme_err_code (err) != GPG_ERR_EOF)
153     fail_if_err (err);
154   err = gpgme_op_keylist_end (ctx);
155   fail_if_err (err);
156   keyarray[keyidx] = NULL;
157
158   result = gpgme_op_keylist_result (ctx);
159   if (result->truncated)
160     {
161       fprintf (stderr, PGM ": key listing unexpectedly truncated\n");
162       exit (1);
163     }
164
165   /* Now for the actual export.  */
166   if ((mode & GPGME_EXPORT_MODE_EXTERN))
167     printf ("sending keys to keyserver\n");
168   if ((mode & GPGME_EXPORT_MODE_SECRET))
169     printf ("exporting secret keys!\n");
170
171   err = gpgme_data_new (&out);
172   fail_if_err (err);
173
174   gpgme_set_armor (ctx, 1);
175   err = gpgme_op_export_keys (ctx, keyarray, mode,
176                               (mode & GPGME_KEYLIST_MODE_EXTERN)? NULL:out);
177   fail_if_err (err);
178
179   fflush (NULL);
180   if (!(mode & GPGME_KEYLIST_MODE_EXTERN))
181     {
182       fputs ("Begin Result:\n", stdout);
183       print_data (out);
184       fputs ("End Result.\n", stdout);
185     }
186
187   /* Cleanup.  */
188   gpgme_data_release (out);
189
190   for (keyidx=0; keyarray[keyidx]; keyidx++)
191     gpgme_key_unref (keyarray[keyidx]);
192
193   gpgme_release (ctx);
194   return 0;
195 }