diff options
Diffstat (limited to 'src/gns/gnunet-gns.c')
-rw-r--r-- | src/gns/gnunet-gns.c | 280 |
1 files changed, 203 insertions, 77 deletions
diff --git a/src/gns/gnunet-gns.c b/src/gns/gnunet-gns.c index ca3a594..74212d4 100644 --- a/src/gns/gnunet-gns.c +++ b/src/gns/gnunet-gns.c @@ -22,8 +22,6 @@ * @brief command line tool to access distributed GNS * @author Christian Grothoff * - * TODO: - * - everything */ #include "platform.h" #include <gnunet_util_lib.h> @@ -46,7 +44,6 @@ static char *shorten_name; */ static char *lookup_name; - /** * record type to look up (-t option) */ @@ -60,11 +57,30 @@ static char *auth_name; /** * raw output */ -static int raw = 0; +static int raw; +/** + * Requested record type. + */ static enum GNUNET_GNS_RecordType rtype; /** + * Handle to lookup request + */ +static struct GNUNET_GNS_LookupRequest *lookup_request; + +/** + * Handle to shorten request + */ +static struct GNUNET_GNS_ShortenRequest *shorten_request; + +/** + * Handle to get authority request + */ +static struct GNUNET_GNS_GetAuthRequest *getauth_request; + + +/** * Task run on shutdown. Cleans up everything. * * @param cls unused @@ -74,6 +90,21 @@ static void do_shutdown (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { + if (NULL != lookup_request) + { + GNUNET_GNS_cancel_lookup_request (lookup_request); + lookup_request = NULL; + } + if (NULL != shorten_request) + { + GNUNET_GNS_cancel_shorten_request (shorten_request); + shorten_request = NULL; + } + if (NULL != getauth_request) + { + GNUNET_GNS_cancel_get_auth_request (getauth_request); + getauth_request = NULL; + } if (NULL != gns) { GNUNET_GNS_disconnect (gns); @@ -82,57 +113,84 @@ do_shutdown (void *cls, } +/** + * Function called with the result of a shorten operation. + * Prints the result. + * + * @param cls a 'const char *' with the original (long) name + * @param nshort the shortened name + */ static void -process_shorten_result(void* cls, const char* nshort) +process_shorten_result (void* cls, const char *nshort) { + const char *original_name = cls; + + shorten_request = NULL; if (raw) printf("%s", nshort); else - printf("%s shortened to %s\n", (char*) cls, nshort); - GNUNET_SCHEDULER_add_now (&do_shutdown, NULL); + printf("%s shortened to %s\n", original_name, nshort); + GNUNET_SCHEDULER_shutdown (); } + +/** + * Function called with the result of a GADS lookup. + * + * @param cls the 'const char *' name that was resolved + * @param rd_count number of records returned + * @param rd array of 'rd_count' records with the results + */ static void -process_lookup_result(void* cls, uint32_t rd_count, - const struct GNUNET_NAMESTORE_RecordData *rd) +process_lookup_result (void* cls, uint32_t rd_count, + const struct GNUNET_NAMESTORE_RecordData *rd) { - int i; - char* name = (char*) cls; + const char* name = cls; + uint32_t i; const char* typename; char* string_val; - - if (!raw) { - if (rd_count == 0) + + lookup_request = NULL; + if (!raw) + { + if (0 == rd_count) printf("No results.\n"); else printf("%s:\n", name); } - - - for (i=0; i<rd_count; i++) { typename = GNUNET_NAMESTORE_number_to_typename (rd[i].record_type); - string_val = GNUNET_NAMESTORE_value_to_string(rd[i].record_type, - rd[i].data, - rd[i].data_size); + string_val = GNUNET_NAMESTORE_value_to_string (rd[i].record_type, + rd[i].data, + rd[i].data_size); if (raw) - printf("%s\n", string_val); + printf ("%s\n", string_val); else - printf("Got %s record: %s\n", typename, string_val); - + printf ("Got `%s' record: %s\n", typename, string_val); + GNUNET_free_non_null (string_val); } - - GNUNET_SCHEDULER_add_now (&do_shutdown, NULL); + GNUNET_SCHEDULER_shutdown (); } + +/** + * Function called with the result of an authority lookup. + * + * @param cls the 'const char *' with the name for which the + * authority was resolved + * @param auth name of the authority + */ static void -process_auth_result(void* cls, const char* auth) +process_auth_result (void* cls, + const char *auth) { + getauth_request = NULL; printf ("%s\n", auth); - GNUNET_SCHEDULER_add_now (&do_shutdown, NULL); + GNUNET_SCHEDULER_shutdown (); } + /** * Main function that will be run. * @@ -151,69 +209,135 @@ run (void *cls, char *const *args, const char *cfgfile, struct GNUNET_CRYPTO_ShortHashCode *zone = NULL; struct GNUNET_CRYPTO_ShortHashCode user_zone; struct GNUNET_CRYPTO_ShortHashAsciiEncoded zonename; + struct GNUNET_CRYPTO_RsaPrivateKey *shorten_key = NULL; + struct GNUNET_CRYPTO_RsaPrivateKey *private_key = NULL; + struct GNUNET_CRYPTO_ShortHashCode *private_zone = NULL; + struct GNUNET_CRYPTO_ShortHashCode *shorten_zone = NULL; + gns = GNUNET_GNS_connect (cfg); + if (NULL == gns) + { + fprintf (stderr, + _("Failed to connect to GNS\n")); + return; + } if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (cfg, "gns", "ZONEKEY", &keyfile)) { - if (!raw) + if (! raw) GNUNET_log (GNUNET_ERROR_TYPE_INFO, "No private key for root zone found, using default!\n"); - zone = NULL; } else { - if (GNUNET_YES == GNUNET_DISK_file_test (keyfile)) - { - key = GNUNET_CRYPTO_rsa_key_create_from_file (keyfile); - GNUNET_CRYPTO_rsa_key_get_public (key, &pkey); - GNUNET_CRYPTO_short_hash(&pkey, - sizeof(struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), - &user_zone); - zone = &user_zone; - GNUNET_CRYPTO_short_hash_to_enc (zone, &zonename); - if (!raw) - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Using zone: %s!\n", &zonename); - GNUNET_CRYPTO_rsa_key_free(key); - } + key = GNUNET_CRYPTO_rsa_key_create_from_file (keyfile); + GNUNET_CRYPTO_rsa_key_get_public (key, &pkey); + GNUNET_CRYPTO_short_hash (&pkey, + sizeof(struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), + &user_zone); + zone = &user_zone; + GNUNET_CRYPTO_short_hash_to_enc (zone, &zonename); + if (!raw) + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Using zone: %s!\n", &zonename); + GNUNET_CRYPTO_rsa_key_free (key); GNUNET_free(keyfile); } - - gns = GNUNET_GNS_connect (cfg); - if (lookup_type != NULL) - rtype = GNUNET_NAMESTORE_typename_to_number(lookup_type); + + if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (cfg, "gns", + "SHORTEN_ZONEKEY", &keyfile)) + { + if (! raw) + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "No shorten key found!\n"); + } else - rtype = GNUNET_GNS_RECORD_TYPE_A; - - if (NULL == gns) { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Failed to connect to GNS\n")); - return; + shorten_key = GNUNET_CRYPTO_rsa_key_create_from_file (keyfile); + GNUNET_CRYPTO_rsa_key_get_public (shorten_key, &pkey); + shorten_zone = GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_ShortHashCode)); + GNUNET_CRYPTO_short_hash(&pkey, + sizeof(struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), + shorten_zone); + GNUNET_CRYPTO_short_hash_to_enc (shorten_zone, &zonename); + if (! raw) + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Using shorten zone: %s!\n", &zonename); + GNUNET_free (keyfile); } - - if (shorten_name != NULL) + + if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (cfg, "gns", + "PRIVATE_ZONEKEY", &keyfile)) { - /** shorten name */ - GNUNET_GNS_shorten_zone (gns, shorten_name, zone, &process_shorten_result, - shorten_name); + if (! raw) + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "No private zone key file name specified in configuration!\n"); } - - if (lookup_name != NULL) + else { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Lookup\n"); - GNUNET_GNS_lookup_zone (gns, lookup_name, zone, rtype, - &process_lookup_result, lookup_name); + private_key = GNUNET_CRYPTO_rsa_key_create_from_file (keyfile); + GNUNET_CRYPTO_rsa_key_get_public (private_key, &pkey); + private_zone = GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_ShortHashCode)); + GNUNET_CRYPTO_short_hash(&pkey, + sizeof(struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), + private_zone); + GNUNET_CRYPTO_short_hash_to_enc (private_zone, &zonename); + if (! raw) + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Using private zone: %s!\n", &zonename); + GNUNET_CRYPTO_rsa_key_free (private_key); } + + if (NULL != lookup_type) + rtype = GNUNET_NAMESTORE_typename_to_number (lookup_type); + else + rtype = GNUNET_GNS_RECORD_A; - if (auth_name != NULL) + if ( (NULL != shorten_name) && + (NULL != shorten_zone) && + (NULL != private_zone) ) + { + shorten_request = GNUNET_GNS_shorten_zone (gns, shorten_name, + private_zone, + shorten_zone, + zone, + &process_shorten_result, + shorten_name); + } + if (NULL != lookup_name) { - GNUNET_GNS_get_authority(gns, auth_name, &process_auth_result, auth_name); + lookup_request = GNUNET_GNS_lookup_zone (gns, lookup_name, + zone, + rtype, + GNUNET_NO, /* Use DHT */ + shorten_key, + &process_lookup_result, + lookup_name); } + if (NULL != auth_name) + { + getauth_request = GNUNET_GNS_get_authority (gns, auth_name, + &process_auth_result, auth_name); + } + + if (NULL != shorten_key) + GNUNET_CRYPTO_rsa_key_free (shorten_key); + if (NULL != shorten_zone) + GNUNET_free (shorten_zone); + if (NULL != private_zone) + GNUNET_free (private_zone); - // FIXME: do work here... - //GNUNET_SCHEDULER_add_now (&do_shutdown, NULL); + if ( (NULL == auth_name) && + (NULL == shorten_name) && + (NULL == lookup_name)) + { + fprintf (stderr, + _("Please specify lookup, shorten or authority operation!\n")); + GNUNET_SCHEDULER_add_now (&do_shutdown, NULL); + return; + } + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, + &do_shutdown, NULL); } @@ -228,26 +352,28 @@ int main (int argc, char *const *argv) { static const struct GNUNET_GETOPT_CommandLineOption options[] = { - {'s', "shorten", NULL, - gettext_noop ("try to shorten a given GNS name"), 1, + {'s', "shorten", "NAME", + gettext_noop ("try to shorten a given name"), 1, &GNUNET_GETOPT_set_string, &shorten_name}, - {'u', "lookup", NULL, - gettext_noop ("Lookup a record using GNS (NOT IMPLEMENTED)"), 1, + {'u', "lookup", "NAME", + gettext_noop ("Lookup a record for the given name"), 1, &GNUNET_GETOPT_set_string, &lookup_name}, - {'a', "authority", NULL, + {'a', "authority", "NAME", gettext_noop ("Get the authority of a particular name"), 1, &GNUNET_GETOPT_set_string, &auth_name}, - {'t', "type", NULL, - gettext_noop ("Specify the type of the record lookup"), 1, + {'t', "type", "TYPE", + gettext_noop ("Specify the type of the record to lookup"), 1, &GNUNET_GETOPT_set_string, &lookup_type}, {'r', "raw", NULL, gettext_noop ("No unneeded output"), 0, &GNUNET_GETOPT_set_one, &raw}, GNUNET_GETOPT_OPTION_END }; - int ret; + if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv)) + return 2; + GNUNET_log_setup ("gnunet-gns", "WARNING", NULL); ret = (GNUNET_OK == @@ -255,7 +381,7 @@ main (int argc, char *const *argv) _("GNUnet GNS access tool"), options, &run, NULL)) ? 0 : 1; - + GNUNET_free ((void*) argv); return ret; } |