-fix zkey shortening
authorMartin Schanzenbach <mschanzenbach@posteo.de>
Fri, 23 Mar 2012 17:11:33 +0000 (17:11 +0000)
committerMartin Schanzenbach <mschanzenbach@posteo.de>
Fri, 23 Mar 2012 17:11:33 +0000 (17:11 +0000)
src/gns/gns.conf.in
src/gns/gnunet-service-gns.c
src/gns/gnunet-service-gns_resolver.c

index 9d522b8fe66b0b373c3ced1efe2673487dc6f798..85401cdde9e1053f2b1bb72b4635b7c27f6c0bb5 100644 (file)
@@ -6,7 +6,7 @@ CONFIG = $DEFAULTCONFIG
 BINARY = gnunet-service-gns
 UNIXPATH = /tmp/gnunet-service-gns.sock
 ZONEKEY = $SERVICEHOME/gns/zonekey.zkey
-HIJACK_DNS = NO
+HIJACK_DNS = YES
 AUTO_IMPORT_PKEY = YES
 MAX_PARALLEL_BACKGROUND_QUERIES = 25
 DEFAULT_LOOKUP_TIMEOUT = 10
index c0713154876acceb8e53321034fd41bad698f94a..312827788a3f57ceb36a1fc8804b2890396faac8 100644 (file)
@@ -483,8 +483,7 @@ static void handle_shorten(void *cls,
     return;
   }
   
-  if (strcmp(name+strlen(name)-strlen(GNUNET_GNS_TLD),
-             GNUNET_GNS_TLD) != 0)
+  if (!is_gnunet_tld(name) && !is_zkey_tld(name))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "%s is not our domain. Returning\n", name);
@@ -493,13 +492,6 @@ static void handle_shorten(void *cls,
     return;
   }
   
-  csh->name = GNUNET_malloc(strlen(name)
-                            - strlen(GNUNET_GNS_TLD) + 1);
-  memset(csh->name, 0,
-         strlen(name)-strlen(GNUNET_GNS_TLD) + 1);
-  memcpy(csh->name, name,
-         strlen(name)-strlen(GNUNET_GNS_TLD));
-
   /* Start shortening */
   gns_resolver_shorten_name(zone_hash, name, &send_shorten_response, csh);
 }
@@ -856,8 +848,7 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
   }
 
   if (GNUNET_YES ==
-      GNUNET_CONFIGURATION_get_value_yesno (c, "gns",
-                                            "HIJACK_DNS"))
+      GNUNET_CONFIGURATION_get_value_yesno (c, "gns", "HIJACK_DNS"))
   {
     GNUNET_log(GNUNET_ERROR_TYPE_INFO,
                "DNS hijacking enabled... connecting to service.\n");
index b905c73ae1aab1ba20285064e95828e9055cd532..407dc54df40257e055b59939b97d361d3e7906af 100644 (file)
@@ -2191,6 +2191,72 @@ handle_delegation_ns_shorten(void* cls,
 
 }
 
+
+/**
+ * Callback calles by namestore for a zone to name
+ * result
+ *
+ * @param cls the closure
+ * @param zone_key the zone we queried
+ * @param expire the expiration time of the name
+ * @param name the name found or NULL
+ * @param rd_len number of records for the name
+ * @param rd the record data (PKEY) for the name
+ * @param signature the signature for the record data
+ */
+static void
+process_zone_to_name_zkey(void *cls,
+                 const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *zone_key,
+                 struct GNUNET_TIME_Absolute expire,
+                 const char *name,
+                 unsigned int rd_len,
+                 const struct GNUNET_NAMESTORE_RecordData *rd,
+                 const struct GNUNET_CRYPTO_RsaSignature *signature)
+{
+  struct ResolverHandle *rh = cls;
+  struct NameShortenHandle *nsh = rh->proc_cls;
+  struct GNUNET_CRYPTO_ShortHashAsciiEncoded enc;
+  char new_name[MAX_DNS_NAME_LENGTH];
+
+  /* zkey not in our zone */
+  if (name == NULL)
+  {
+    GNUNET_CRYPTO_short_hash_to_enc ((struct GNUNET_CRYPTO_ShortHashCode*)rd,
+                                     &enc);
+    GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
+               "No name found for zkey %s returning verbatim!\n", enc);
+    if (strcmp(rh->name, "") != 0)
+      GNUNET_snprintf(new_name, MAX_DNS_NAME_LENGTH, "%s.%s.%s",
+                      rh->name, enc, GNUNET_GNS_TLD_ZKEY);
+    else
+      GNUNET_snprintf(new_name, MAX_DNS_NAME_LENGTH, "%s.%s",
+                      enc, GNUNET_GNS_TLD_ZKEY);
+    nsh->proc(nsh->proc_cls, new_name);
+    GNUNET_free(nsh);
+    free_resolver_handle(rh);
+    return;
+  }
+  
+  if (strcmp(rh->name, "") != 0)
+    GNUNET_snprintf(new_name, MAX_DNS_NAME_LENGTH, "%s.%s",
+                    rh->name, name);
+  else
+    strcpy(new_name, name);
+
+  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
+             "Continue shorten for %s!\n", new_name);
+
+  strcpy(rh->name, new_name);
+  
+  rh->authority_chain_head = GNUNET_malloc(sizeof(struct AuthorityChain));
+  rh->authority_chain_tail = rh->authority_chain_head;
+  rh->authority_chain_head->zone = rh->authority;
+  
+  
+  /* Start delegation resolution in our namestore */
+  resolve_delegation_ns(rh);
+}
+  
 /**
  * Shorten api from resolver
  *
@@ -2207,7 +2273,9 @@ gns_resolver_shorten_name(struct GNUNET_CRYPTO_ShortHashCode zone,
 {
   struct ResolverHandle *rh;
   struct NameShortenHandle *nsh;
-  char string_hash[MAX_DNS_NAME_LENGTH]; //FIXME LABEL length when shorthash
+  char string_hash[MAX_DNS_LABEL_LENGTH];
+  struct GNUNET_CRYPTO_ShortHashCode zkey;
+
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Starting shorten for %s!\n", name);
@@ -2221,13 +2289,14 @@ gns_resolver_shorten_name(struct GNUNET_CRYPTO_ShortHashCode zone,
   }
 
   nsh = GNUNET_malloc(sizeof (struct NameShortenHandle));
-  
 
   nsh->proc = proc;
   nsh->proc_cls = proc_cls;
   
   rh = GNUNET_malloc(sizeof (struct ResolverHandle));
   rh->authority = zone;
+  rh->proc = &handle_delegation_ns_shorten;
+  rh->proc_cls = nsh;
   
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Checking for TLD...\n");
@@ -2238,6 +2307,7 @@ gns_resolver_shorten_name(struct GNUNET_CRYPTO_ShortHashCode zone,
     /**
      * This is a zkey tld
      * build hash and use as initial authority
+     * FIXME sscanf
      */
     memset(rh->name, 0,
            strlen(name)-strlen(GNUNET_GNS_TLD_ZKEY));
@@ -2249,7 +2319,7 @@ gns_resolver_shorten_name(struct GNUNET_CRYPTO_ShortHashCode zone,
                 "ZKEY is %s!\n", string_hash);
 
     if (GNUNET_OK != GNUNET_CRYPTO_short_hash_from_string(string_hash,
-                                                          &rh->authority))
+                                                          &zkey))
     {
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                   "Cannot convert ZKEY %s to hash!\n", string_hash);
@@ -2259,6 +2329,13 @@ gns_resolver_shorten_name(struct GNUNET_CRYPTO_ShortHashCode zone,
       return;
     }
 
+    GNUNET_NAMESTORE_zone_to_name (namestore_handle,
+                                   &zone, //ours
+                                   &zkey,
+                                   &process_zone_to_name_zkey,
+                                   rh);
+    return;
+
   }
   else
   {
@@ -2276,8 +2353,7 @@ gns_resolver_shorten_name(struct GNUNET_CRYPTO_ShortHashCode zone,
   rh->authority_chain_head = GNUNET_malloc(sizeof(struct AuthorityChain));
   rh->authority_chain_tail = rh->authority_chain_head;
   rh->authority_chain_head->zone = zone;
-  rh->proc = &handle_delegation_ns_shorten;
-  rh->proc_cls = nsh;
+  
   
   /* Start delegation resolution in our namestore */
   resolve_delegation_ns(rh);