2 This file is part of GNUnet.
3 Copyright (C) 2012-2013 GNUnet e.V.
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
21 * @file gnunet-credential.c
22 * @brief command line tool to access command line Credential service
23 * @author Adnan Husain
26 #include <gnunet_util_lib.h>
27 #include <gnunet_identity_service.h>
28 #include <gnunet_credential_service.h>
31 * Configuration we are using.
33 static const struct GNUNET_CONFIGURATION_Handle *cfg;
36 * Handle to Credential service.
38 static struct GNUNET_CREDENTIAL_Handle *credential;
41 * Desired timeout for the lookup (default is no timeout).
43 static struct GNUNET_TIME_Relative timeout;
46 * Credential to lookup. (-u option)
48 static char *lookup_credential;
51 * Handle to lookup request
53 static struct GNUNET_CREDENTIAL_LookupRequest *lookup_request;
56 * Lookup an ego with the identity service.
58 static struct GNUNET_IDENTITY_EgoLookup *el;
61 * Handle for identity service.
63 static struct GNUNET_IDENTITY_Handle *identity;
66 * Active operation on identity service.
68 static struct GNUNET_IDENTITY_Operation *id_op;
71 * Task scheduled to handle timeout.
73 static struct GNUNET_SCHEDULER_Task *tt;
76 * Subject pubkey string
78 static char *subject_key;
81 * Subject pubkey string
83 static char *issuer_key;
88 static int credential_flags;
91 * Maximum delegation depth
93 static int max_delegation_depth;
98 * Identity of the zone to use for the lookup (-z option)
100 static char *zone_ego_name;
104 * Task run on shutdown. Cleans up everything.
109 do_shutdown (void *cls)
113 GNUNET_IDENTITY_ego_lookup_cancel (el);
118 GNUNET_IDENTITY_cancel (id_op);
121 if (NULL != lookup_request)
123 GNUNET_CREDENTIAL_lookup_cancel (lookup_request);
124 lookup_request = NULL;
126 if (NULL != identity)
128 GNUNET_IDENTITY_disconnect (identity);
131 if (NULL != credential)
133 GNUNET_CREDENTIAL_disconnect (credential);
138 GNUNET_SCHEDULER_cancel (tt);
145 * Task run on timeout. Triggers shutdown.
150 do_timeout (void *cls)
153 GNUNET_SCHEDULER_shutdown ();
158 * Function called with the result of a Credential lookup.
160 * @param cls the 'const char *' name that was resolved
161 * @param cd_count number of records returned
162 * @param cd array of @a cd_count records with the results
165 handle_lookup_result (void *cls,
166 struct GNUNET_IDENTITY_Ego *issuer,
168 const struct GNUNET_CREDENTIAL_RecordData *data)
172 lookup_request = NULL;
174 printf ("No results.\n");
180 GNUNET_SCHEDULER_shutdown ();
187 * Perform the actual resolution, with the subject pkey and
188 * the issuer public key
190 * @param pkey public key to use for the zone, can be NULL
191 * @param shorten_key private key used for shortening, can be NULL
194 lookup_credentials (struct GNUNET_IDENTITY_Ego *ego)
197 struct GNUNET_CRYPTO_EcdsaPublicKey subject_pkey;
198 struct GNUNET_CRYPTO_EcdsaPublicKey issuer_pkey;
200 if (NULL != subject_key && NULL != issuer_key && NULL != lookup_credential)
203 GNUNET_CRYPTO_ecdsa_public_key_from_string (subject_key,
204 strlen (subject_key),
208 _("Subject public key `%s' is not well-formed\n"),
210 GNUNET_SCHEDULER_shutdown ();
215 GNUNET_CRYPTO_ecdsa_public_key_from_string (issuer_key,
220 _("Authority public key `%s' is not well-formed\n"),
222 GNUNET_SCHEDULER_shutdown ();
226 lookup_request = GNUNET_CREDENTIAL_lookup(credential,
232 max_delegation_depth,
233 &handle_lookup_result,
240 _("Please specify name to lookup, subject key and issuer key!\n"));
241 GNUNET_SCHEDULER_shutdown ();
248 * Method called to with the ego we are to use for the lookup,
249 * when the ego is the one for the default master zone.
251 * @param cls closure (NULL, unused)
252 * @param ego ego handle, NULL if not found
253 * @param ctx context for application to store data for this ego
254 * (during the lifetime of this process, initially NULL)
255 * @param name name assigned by the user for this ego,
256 * NULL if the user just deleted the ego and it
257 * must thus no longer be used
260 identity_master_cb (void *cls,
261 struct GNUNET_IDENTITY_Ego *ego,
270 _("Ego for `gns-master' not found, cannot perform lookup. Did you run gnunet-gns-import.sh?\n"));
271 GNUNET_SCHEDULER_shutdown ();
275 lookup_credentials(ego);
282 * Main function that will be run.
285 * @param args remaining command-line arguments
286 * @param cfgfile name of the configuration file used (for saving, can be NULL!)
287 * @param c configuration
293 const struct GNUNET_CONFIGURATION_Handle *c)
297 credential = GNUNET_CREDENTIAL_connect (cfg);
298 identity = GNUNET_IDENTITY_connect (cfg, NULL, NULL);
303 if (NULL == credential)
306 _("Failed to connect to CREDENTIAL\n"));
309 if (NULL == identity)
312 _("Failed to connect to IDENTITY\n"));
315 tt = GNUNET_SCHEDULER_add_delayed (timeout,
317 GNUNET_SCHEDULER_add_shutdown (&do_shutdown, NULL);
321 GNUNET_break (NULL == id_op);
322 id_op = GNUNET_IDENTITY_get (identity,
323 "gns-master",//# TODO: Create credential-master
326 GNUNET_assert (NULL != id_op);
335 * The main function for gnunet-gns.
337 * @param argc number of arguments from the command line
338 * @param argv command line arguments
339 * @return 0 ok, 1 on error
342 main (int argc, char *const *argv)
344 static const struct GNUNET_GETOPT_CommandLineOption options[] = {
345 {'u', "lookup", "CREDENTIAL",
346 gettext_noop ("Lookup a record for the given credential"), 1,
347 &GNUNET_GETOPT_set_string, &lookup_credential},
348 /** { 'T', "timeout", "DELAY",
349 gettext_noop ("Specify timeout for the lookup"), 1,
350 &GNUNET_GETOPT_set_relative_time, &timeout },
351 {'t', "type", "TYPE",
352 gettext_noop ("Specify the type of the record to lookup"), 1,
353 &GNUNET_GETOPT_set_string, &lookup_type},**/
354 {'z', "zone", "NAME",
355 gettext_noop ("Specify the name of the ego of the zone to lookup the record in"), 1,
356 &GNUNET_GETOPT_set_string, &zone_ego_name},
357 {'s', "subject", "PKEY",
358 gettext_noop ("Specify the public key of the subject to lookup the credential for"), 1,
359 &GNUNET_GETOPT_set_string, &subject_key},
360 {'i', "issuer", "PKEY",
361 gettext_noop ("Specify the public key of the authority to verify the credential against"), 1,
362 &GNUNET_GETOPT_set_string, &issuer_key},
363 GNUNET_GETOPT_OPTION_END
367 timeout = GNUNET_TIME_UNIT_FOREVER_REL;
368 if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
371 GNUNET_log_setup ("gnunet-credential", "WARNING", NULL);
374 GNUNET_PROGRAM_run (argc, argv, "gnunet-credential",
375 _("GNUnet credential resolver tool"),
377 &run, NULL)) ? 0 : 1;
378 GNUNET_free ((void*) argv);
382 /* end of gnunet-credential.c */