From 54a298da897504c59b7eb334357a6626b2e81406 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 16 Jul 2013 08:40:53 +0000 Subject: [PATCH] initial version of gnunet-identity command-line tool --- doc/man/Makefile.am | 1 + doc/man/gnunet-identity.1 | 44 +++++++ src/identity/gnunet-identity.c | 174 +++++++++++++++++++++++-- src/identity/gnunet-service-identity.c | 4 + src/include/gnunet_disk_lib.h | 4 +- 5 files changed, 218 insertions(+), 9 deletions(-) create mode 100644 doc/man/gnunet-identity.1 diff --git a/doc/man/Makefile.am b/doc/man/Makefile.am index 4f4d736d6..db26f0d6a 100644 --- a/doc/man/Makefile.am +++ b/doc/man/Makefile.am @@ -15,6 +15,7 @@ man_MANS = \ gnunet-gns.1 \ gnunet-gns-fcfsd.1 \ gnunet-gns-proxy.1 \ + gnunet-identity.1 \ gnunet-namestore.1 \ gnunet-nat-server.1 \ gnunet-peerinfo.1 \ diff --git a/doc/man/gnunet-identity.1 b/doc/man/gnunet-identity.1 new file mode 100644 index 000000000..6c48c8e2a --- /dev/null +++ b/doc/man/gnunet-identity.1 @@ -0,0 +1,44 @@ +.TH GNUNET-IDENTITY "1" "16 Jul 2013" "GNUnet" +.SH NAME +gnunet\-identity \- create, delete or list egos +.SH SYNOPSIS +.B gnunet\-identity +[options] +.SH DESCRIPTION +.PP +gnunet\-identity is a tool for managing egos. An ego is the persona that controls a namespace. It is identical to a public\-private ECC key pair. + +gnunet\-identity can be used to list all of the egos that were created locally, to create new egos, and to delete existing egos (the namespace will continue to exist, but it will be impossible to add additional data to it). + +Creating a new ego requires using the \-C option together with an identifier (name) that is to be used for the new ego. This identifier is only used locally for this peer and not shared with other peers. + +.TP +\fB\-C NAME\fR, \fB\-\-create=NAME\fR +Creates a new ego with the given NAME. + +.TP +\fB\-D NAME\fR, \fB\-\-delete=NAME\fR +Delete the ego with the given NAME. + +.TP +\fB\-h\fR, \fB\-\-help\fR +Print help page. + +.TP +\fB\-L\fR, \fB\-\-list\fR +list all ouf our egos + +.TP +\fB\-m\fR, \fB\-\-monitor\fR +run in monitor mode, listing all ouf our egos until CTRL-C is pressed + + +.SH FILES +.TP +~/.gnunet/egos/ +Directory where the egos are stored (by default) + +.SH "REPORTING BUGS" +Report bugs by using Mantis or by sending electronic mail to +.SH "SEE ALSO" +\fBgnunet\-pseudonym\fP(1), \fBgnunet\-gns\fP(1) diff --git a/src/identity/gnunet-identity.c b/src/identity/gnunet-identity.c index 77ba6c2cd..15cb17d1b 100644 --- a/src/identity/gnunet-identity.c +++ b/src/identity/gnunet-identity.c @@ -19,7 +19,7 @@ */ /** * @file identity/gnunet-identity.c - * @brief IDENTITY monitoring command line tool + * @brief IDENTITY management command line tool * @author Christian Grothoff */ #include "platform.h" @@ -32,9 +32,34 @@ static struct GNUNET_IDENTITY_Handle *sh; /** - * Was verbose specified? + * Was "list" specified? */ -static int verbose; +static int list; + +/** + * Was "monitor" specified? + */ +static int monitor; + +/** + * -C option + */ +static char *create_ego; + +/** + * -D option + */ +static char *delete_ego; + +/** + * Handle for create operation. + */ +static struct GNUNET_IDENTITY_Operation *create_op; + +/** + * Handle for delete operation. + */ +static struct GNUNET_IDENTITY_Operation *delete_op; /** @@ -52,6 +77,119 @@ shutdown_task (void *cls, } + +/** + * Test if we are finished yet. + */ +static void +test_finished () +{ + if ( (NULL == create_op) && + (NULL == delete_op) && + (! list) && + (! monitor) ) + GNUNET_SCHEDULER_shutdown (); +} + + +/** + * Deletion operation finished. + * + * @param cls pointer to operation handle + * @param emsg NULL on success, otherwise an error message + */ +static void +delete_finished (void *cls, + const char *emsg) +{ + struct GNUNET_IDENTITY_Operation **op = cls; + + *op = NULL; + if (NULL != emsg) + fprintf (stderr, + "%s\n", + gettext (emsg)); + test_finished (); +} + + +/** + * Creation operation finished. + * + * @param cls pointer to operation handle + * @param ego ego handle + * @param ego_ctx context for application to store data for this ego + * (during the lifetime of this process, initially NULL) + * @param identifier identifier assigned by the user for this ego + */ +static void +create_finished (void *cls, + struct GNUNET_IDENTITY_Ego *ego, + void **ctx, + const char *identifier) +{ + struct GNUNET_IDENTITY_Operation **op = cls; + + *op = NULL; + if (NULL == ego) + fprintf (stderr, + "%s\n", + _("Failed to create ego\n")); + test_finished (); +} + + +/** + * If listing is enabled, prints information about the egos. + * + * This function is initially called for all egos and then again + * whenever a ego's identifier changes or if it is deleted. At the + * end of the initial pass over all egos, the function is once called + * with 'NULL' for 'ego'. That does NOT mean that the callback won't + * be invoked in the future or that there was an error. + * + * When used with 'GNUNET_IDENTITY_create' or 'GNUNET_IDENTITY_get', + * this function is only called ONCE, and 'NULL' being passed in + * 'ego' does indicate an error (i.e. name is taken or no default + * value is known). If 'ego' is non-NULL and if '*ctx' + * is set in those callbacks, the value WILL be passed to a subsequent + * call to the identity callback of 'GNUNET_IDENTITY_connect' (if + * that one was not NULL). + * + * When an identity is renamed, this function is called with the + * (known) ego but the NEW identifier. + * + * When an identity is deleted, this function is called with the + * (known) ego and "NULL" for the 'identifier'. In this case, + * the 'ego' is henceforth invalid (and the 'ctx' should also be + * cleaned up). + * + * @param cls closure + * @param ego ego handle + * @param ego_ctx context for application to store data for this ego + * (during the lifetime of this process, initially NULL) + * @param identifier identifier assigned by the user for this ego, + * NULL if the user just deleted the ego and it + * must thus no longer be used +*/ +static void +print_ego (void *cls, + struct GNUNET_IDENTITY_Ego *ego, + void **ctx, + const char *identifier) +{ + + if (! (list | monitor)) + return; + if ( (NULL == ego) && (! monitor) ) + { + GNUNET_SCHEDULER_shutdown (); + return; + } + fprintf (stderr, "%s\n", identifier); +} + + /** * Main function that will be run by the scheduler. * @@ -64,9 +202,20 @@ static void run (void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) { - sh = GNUNET_IDENTITY_connect (cfg, NULL, NULL); + sh = GNUNET_IDENTITY_connect (cfg, &print_ego, NULL); + if (NULL != delete_ego) + delete_op = GNUNET_IDENTITY_delete (sh, + delete_ego, + &delete_finished, + &delete_op); + if (NULL != create_ego) + create_op = GNUNET_IDENTITY_create (sh, + create_ego, + &create_finished, + &create_op); GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task, NULL); + test_finished (); } @@ -83,9 +232,18 @@ main (int argc, char *const *argv) int res; static const struct GNUNET_GETOPT_CommandLineOption options[] = { - {'V', "verbose", NULL, - gettext_noop ("verbose output"), - 0, &GNUNET_GETOPT_set_one, &verbose}, + {'C', "create", "NAME", + gettext_noop ("create ego NAME"), + 1, &GNUNET_GETOPT_set_string, &create_ego}, + {'D', "delete", "NAME", + gettext_noop ("delete ego NAME "), + 1, &GNUNET_GETOPT_set_string, &delete_ego}, + {'L', "list", NULL, + gettext_noop ("list all egos"), + 0, &GNUNET_GETOPT_set_one, &list}, + {'m', "monitor", NULL, + gettext_noop ("run in monitor mode egos"), + 0, &GNUNET_GETOPT_set_one, &monitor}, GNUNET_GETOPT_OPTION_END }; @@ -93,7 +251,7 @@ main (int argc, char *const *argv) return 2; res = GNUNET_PROGRAM_run (argc, argv, "gnunet-identity", - gettext_noop ("Print information about IDENTITY state"), + gettext_noop ("Maintain egos"), options, &run, NULL); GNUNET_free ((void *) argv); diff --git a/src/identity/gnunet-service-identity.c b/src/identity/gnunet-service-identity.c index 4de7746b0..6c94f1c88 100644 --- a/src/identity/gnunet-service-identity.c +++ b/src/identity/gnunet-service-identity.c @@ -25,6 +25,10 @@ * * The purpose of this service is to manage private keys that * represent the various egos/pseudonyms/identities of a GNUnet user. + * + * FIXME: + * - hint for 'end of initial list' is not implemented + * (might ALSO be missing in client library!) */ #include "platform.h" #include "gnunet_util_lib.h" diff --git a/src/include/gnunet_disk_lib.h b/src/include/gnunet_disk_lib.h index c26f9dcda..5359e9d49 100644 --- a/src/include/gnunet_disk_lib.h +++ b/src/include/gnunet_disk_lib.h @@ -585,7 +585,9 @@ GNUNET_DISK_file_write (const struct GNUNET_DISK_FileHandle *h, */ ssize_t GNUNET_DISK_file_write_blocking (const struct GNUNET_DISK_FileHandle * h, - const void *buffer, size_t n); + const void *buffer, + size_t n); + /** * Write a buffer to a file. If the file is longer than -- 2.25.1