aboutsummaryrefslogtreecommitdiff
path: root/src/gns
diff options
context:
space:
mode:
authorMartin Schanzenbach <mschanzenbach@posteo.de>2012-07-02 15:16:51 +0000
committerMartin Schanzenbach <mschanzenbach@posteo.de>2012-07-02 15:16:51 +0000
commitc7abe0aef79a076e2b82c3173b9419685d65f650 (patch)
treec76b09756a4f09aa15af494a66e872de8dae113b /src/gns
parent4b542aa52ffc63a63dab9e45205484faf64bd214 (diff)
downloadgnunet-c7abe0aef79a076e2b82c3173b9419685d65f650.tar.gz
gnunet-c7abe0aef79a076e2b82c3173b9419685d65f650.zip
-towards cookies... broke resolver
Diffstat (limited to 'src/gns')
-rw-r--r--src/gns/gnunet-gns-proxy.c119
-rw-r--r--src/gns/gnunet-service-gns_resolver.c25
-rw-r--r--src/gns/gnunet-service-gns_resolver.h6
3 files changed, 111 insertions, 39 deletions
diff --git a/src/gns/gnunet-gns-proxy.c b/src/gns/gnunet-gns-proxy.c
index 91fa852cc..bb67b7b26 100644
--- a/src/gns/gnunet-gns-proxy.c
+++ b/src/gns/gnunet-gns-proxy.c
@@ -244,9 +244,30 @@ struct ProxyCurlTask
244 244
245 /* The associated response */ 245 /* The associated response */
246 struct MHD_Response *response; 246 struct MHD_Response *response;
247
248 /* Cookies to set */
249 struct ProxySetCookieHeader *set_cookies_head;
250
251 /* Cookies to set */
252 struct ProxySetCookieHeader *set_cookies_tail;
247 253
248}; 254};
249 255
256/**
257 * Struct for set-cookies
258 */
259struct ProxySetCookieHeader
260{
261 /* DLL */
262 struct ProxySetCookieHeader *next;
263
264 /* DLL */
265 struct ProxySetCookieHeader *prev;
266
267 /* the cookie */
268 char *cookie;
269};
270
250/* The port the proxy is running on (default 7777) */ 271/* The port the proxy is running on (default 7777) */
251static unsigned long port = GNUNET_GNS_PROXY_PORT; 272static unsigned long port = GNUNET_GNS_PROXY_PORT;
252 273
@@ -376,20 +397,46 @@ curl_check_hdr (void *buffer, size_t size, size_t nmemb, void *cls)
376{ 397{
377 size_t bytes = size * nmemb; 398 size_t bytes = size * nmemb;
378 struct ProxyCurlTask *ctask = cls; 399 struct ProxyCurlTask *ctask = cls;
379 int len = strlen (HTML_HDR_CONTENT); 400 int html_mime_len = strlen (HTML_HDR_CONTENT);
380 char hdr[len+1]; 401 int cookie_hdr_len = strlen (MHD_HTTP_HEADER_SET_COOKIE);
402 char hdr_mime[html_mime_len+1];
403 char hdr_cookie[size+1];
404 struct ProxySetCookieHeader *pch;
405 size_t len;
381 406
382 if ( (len+1) > bytes) 407 if (html_mime_len <= size)
383 return bytes; 408 {
409 memcpy (hdr_mime, buffer, html_mime_len);
410 hdr_mime[html_mime_len] = '\0';
384 411
385 memcpy (hdr, buffer, len); 412 if (0 == strcmp (hdr_mime, HTML_HDR_CONTENT))
386 hdr[len] = '\0'; 413 {
414 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
415 "Got HTML HTTP response header\n");
416 ctask->parse_content = GNUNET_YES;
417 }
418 }
419
420 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
421 "Got header %s\n", buffer);
387 422
388 if (0 == strcmp (hdr, HTML_HDR_CONTENT)) 423 if (cookie_hdr_len <= size)
389 { 424 {
425 memcpy (hdr_cookie, buffer, size);
426 hdr_cookie[size] = '\0';
427
390 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 428 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
391 "Got HTML HTTP response header\n"); 429 "Got Set-Cookie HTTP header %s\n", hdr_cookie);
392 ctask->parse_content = GNUNET_YES; 430 GNUNET_assert (0);
431
432 pch = GNUNET_malloc (sizeof (struct ProxySetCookieHeader));
433 len = strlen (hdr_cookie) - strlen (MHD_HTTP_HEADER_SET_COOKIE);
434 pch->cookie = GNUNET_malloc (len + 1);
435 memset (pch->cookie, 0, len + 1);
436 memcpy (pch->cookie, hdr_cookie+strlen (MHD_HTTP_HEADER_SET_COOKIE), len);
437 GNUNET_CONTAINER_DLL_insert (ctask->set_cookies_head,
438 ctask->set_cookies_tail,
439 pch);
393 } 440 }
394 441
395 return bytes; 442 return bytes;
@@ -572,9 +619,28 @@ mhd_content_cb (void *cls,
572 int nomatch; 619 int nomatch;
573 char *hostptr; 620 char *hostptr;
574 regmatch_t m[RE_N_MATCHES]; 621 regmatch_t m[RE_N_MATCHES];
622 struct ProxySetCookieHeader *pch;
575 623
576 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 624 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
577 "MHD: content cb %s\n", ctask->url); 625 "MHD: content cb %s\n", ctask->url);
626
627 pch = ctask->set_cookies_head;
628 while (pch != NULL)
629 {
630 if (GNUNET_NO == MHD_add_response_header (ctask->response,
631 MHD_HTTP_HEADER_SET_COOKIE,
632 pch->cookie))
633 {
634 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
635 "MHD: Error adding set-cookie header field %s\n",
636 pch->cookie);
637 }
638 GNUNET_free (pch->cookie);
639 GNUNET_CONTAINER_DLL_remove (ctask->set_cookies_head,
640 ctask->set_cookies_tail,
641 pch);
642 pch = ctask->set_cookies_head;
643 }
578 644
579 if (ctask->download_successful && 645 if (ctask->download_successful &&
580 (ctask->buf_status == BUF_WAIT_FOR_CURL)) 646 (ctask->buf_status == BUF_WAIT_FOR_CURL))
@@ -1557,7 +1623,7 @@ add_handle_to_mhd (struct GNUNET_NETWORK_Handle *h, struct MHD_Daemon *daemon)
1557 struct sockaddr *addr; 1623 struct sockaddr *addr;
1558 socklen_t len; 1624 socklen_t len;
1559 1625
1560 fd = GNUNET_NETWORK_get_fd (h); 1626 fd = dup (GNUNET_NETWORK_get_fd (h));
1561 addr = GNUNET_NETWORK_get_addr (h); 1627 addr = GNUNET_NETWORK_get_addr (h);
1562 len = GNUNET_NETWORK_get_addrlen (h); 1628 len = GNUNET_NETWORK_get_addrlen (h);
1563 1629
@@ -2444,7 +2510,6 @@ run (void *cls, char *const *args, const char *cfgfile,
2444 char* proxy_sockfile; 2510 char* proxy_sockfile;
2445 char* cafile_cfg = NULL; 2511 char* cafile_cfg = NULL;
2446 char* cafile; 2512 char* cafile;
2447 char* shorten_keyfile;
2448 2513
2449 curl_multi = NULL; 2514 curl_multi = NULL;
2450 2515
@@ -2481,25 +2546,6 @@ run (void *cls, char *const *args, const char *cfgfile,
2481 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2546 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2482 "Loading Template\n"); 2547 "Loading Template\n");
2483 2548
2484 if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (cfg, "gns-proxy",
2485 "PROXY_CACERT",
2486 &shorten_keyfile))
2487 {
2488 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
2489 "Unable to load shorten zonekey config value!\n");
2490 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
2491 "No shorten key provided!\n");
2492 return;
2493 }
2494 else
2495 {
2496 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2497 "Loading shorten zonekey %s!\n",
2498 shorten_keyfile);
2499 shorten_zonekey = GNUNET_CRYPTO_rsa_key_create_from_file (shorten_keyfile);
2500 GNUNET_free (shorten_keyfile);
2501 }
2502
2503 compile_regex (&re_dotplus, (char*) RE_A_HREF); 2549 compile_regex (&re_dotplus, (char*) RE_A_HREF);
2504 2550
2505 gns_handle = GNUNET_GNS_connect (cfg); 2551 gns_handle = GNUNET_GNS_connect (cfg);
@@ -2593,12 +2639,13 @@ run (void *cls, char *const *args, const char *cfgfile,
2593 2639
2594 mhd_unix_sock_addr.sun_family = AF_UNIX; 2640 mhd_unix_sock_addr.sun_family = AF_UNIX;
2595 strcpy (mhd_unix_sock_addr.sun_path, proxy_sockfile); 2641 strcpy (mhd_unix_sock_addr.sun_path, proxy_sockfile);
2596 if (0 != unlink (proxy_sockfile)) 2642
2597 { 2643#if LINUX
2598 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 2644 mhd_unix_sock_addr.sun_path[0] = '\0';
2599 "Unable to unlink sockfile!\n"); 2645#endif
2600 return; 2646#if HAVE_SOCKADDR_IN_SIN_LEN
2601 } 2647 mhd_unix_sock_addr.sun_len = (u_char) sizeof (struct sockaddr_un);
2648#endif
2602 2649
2603 len = strlen (proxy_sockfile) + sizeof(AF_UNIX); 2650 len = strlen (proxy_sockfile) + sizeof(AF_UNIX);
2604 2651
diff --git a/src/gns/gnunet-service-gns_resolver.c b/src/gns/gnunet-service-gns_resolver.c
index 1f103f421..f86b07f67 100644
--- a/src/gns/gnunet-service-gns_resolver.c
+++ b/src/gns/gnunet-service-gns_resolver.c
@@ -906,6 +906,9 @@ free_resolver_handle (struct ResolverHandle* rh)
906 GNUNET_NETWORK_socket_close (rh->dns_sock); 906 GNUNET_NETWORK_socket_close (rh->dns_sock);
907 if (NULL != rh->dns_resolver_handle) 907 if (NULL != rh->dns_resolver_handle)
908 GNUNET_RESOLVER_request_cancel (rh->dns_resolver_handle); 908 GNUNET_RESOLVER_request_cancel (rh->dns_resolver_handle);
909
910 if (NULL != rh->rd.data)
911 GNUNET_free ((void*)(rh->rd.data));
909 GNUNET_free(rh); 912 GNUNET_free(rh);
910} 913}
911 914
@@ -2260,7 +2263,7 @@ process_pkey_revocation_result_ns (void *cls,
2260 rh->private_local_zone, 2263 rh->private_local_zone,
2261 GNUNET_GNS_RECORD_REV, 2264 GNUNET_GNS_RECORD_REV,
2262 GNUNET_GNS_TLD, 2265 GNUNET_GNS_TLD,
2263 rh->priv_key, 2266 NULL,
2264 GNUNET_TIME_UNIT_FOREVER_REL, 2267 GNUNET_TIME_UNIT_FOREVER_REL,
2265 GNUNET_NO, 2268 GNUNET_NO,
2266 &background_lookup_result_processor, 2269 &background_lookup_result_processor,
@@ -2275,9 +2278,10 @@ process_pkey_revocation_result_ns (void *cls,
2275 * else resolve again with new authority 2278 * else resolve again with new authority
2276 */ 2279 */
2277 if (strcmp (rh->name, "") == 0) 2280 if (strcmp (rh->name, "") == 0)
2278 rh->proc (rh->proc_cls, rh, 0, NULL); 2281 rh->proc (rh->proc_cls, rh, rh->rd_count, &rh->rd);
2279 else 2282 else
2280 resolve_delegation_ns (rh); 2283 resolve_delegation_ns (rh);
2284
2281 return; 2285 return;
2282} 2286}
2283 2287
@@ -2447,6 +2451,14 @@ process_delegation_result_dht(void* cls,
2447 rh->authority_chain_tail, 2451 rh->authority_chain_tail,
2448 auth); 2452 auth);
2449 2453
2454 if (NULL != rh->rd.data)
2455 GNUNET_free ((void*)rh->rd.data);
2456
2457 rh->rd.data = GNUNET_malloc (rd[i].data_size);
2458 memcpy (&rh->rd, &rd[i], sizeof (struct GNUNET_NAMESTORE_RecordData));
2459 memcpy ((void*)(rh->rd.data), rd[i].data, rd[i].data_size);
2460 rh->rd_count = 1;
2461
2450 /** try to import pkey if private key available */ 2462 /** try to import pkey if private key available */
2451 //if (rh->priv_key && is_canonical (rh->name)) 2463 //if (rh->priv_key && is_canonical (rh->name))
2452 // process_discovered_authority(name, auth->zone, 2464 // process_discovered_authority(name, auth->zone,
@@ -2520,6 +2532,7 @@ process_delegation_result_dht(void* cls,
2520 else 2532 else
2521 rh->proc = &handle_delegation_ns; 2533 rh->proc = &handle_delegation_ns;
2522 2534
2535
2523 /* Check for key revocation and delegate */ 2536 /* Check for key revocation and delegate */
2524 rh->namestore_task = GNUNET_NAMESTORE_lookup_record (namestore_handle, 2537 rh->namestore_task = GNUNET_NAMESTORE_lookup_record (namestore_handle,
2525 &rh->authority, 2538 &rh->authority,
@@ -3147,7 +3160,6 @@ handle_delegation_ns (void* cls, struct ResolverHandle *rh,
3147 } 3160 }
3148 else if (rlh->record_type == GNUNET_GNS_RECORD_PKEY) 3161 else if (rlh->record_type == GNUNET_GNS_RECORD_PKEY)
3149 { 3162 {
3150 GNUNET_assert(rd_count == 1);
3151 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, 3163 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
3152 "GNS_PHASE_DELEGATE_NS-%llu: Resolved queried PKEY in NS.\n", 3164 "GNS_PHASE_DELEGATE_NS-%llu: Resolved queried PKEY in NS.\n",
3153 rh->id); 3165 rh->id);
@@ -3432,7 +3444,13 @@ process_delegation_result_ns (void* cls,
3432 GNUNET_CONTAINER_DLL_insert (rh->authority_chain_head, 3444 GNUNET_CONTAINER_DLL_insert (rh->authority_chain_head,
3433 rh->authority_chain_tail, 3445 rh->authority_chain_tail,
3434 auth); 3446 auth);
3447 if (NULL != rh->rd.data)
3448 GNUNET_free ((void*)(rh->rd.data));
3435 3449
3450 rh->rd.data = GNUNET_malloc (rd[i].data_size);
3451 memcpy (&rh->rd, &rd[i], sizeof (struct GNUNET_NAMESTORE_RecordData));
3452 memcpy ((void*)rh->rd.data, rd[i].data, rd[i].data_size);
3453 rh->rd_count = 1;
3436 /* Check for key revocation and delegate */ 3454 /* Check for key revocation and delegate */
3437 rh->namestore_task = GNUNET_NAMESTORE_lookup_record (namestore_handle, 3455 rh->namestore_task = GNUNET_NAMESTORE_lookup_record (namestore_handle,
3438 &rh->authority, 3456 &rh->authority,
@@ -3557,6 +3575,7 @@ gns_resolver_lookup_record (struct GNUNET_CRYPTO_ShortHashCode zone,
3557 rh->private_local_zone = pzone; 3575 rh->private_local_zone = pzone;
3558 rh->only_cached = only_cached; 3576 rh->only_cached = only_cached;
3559 rh->namestore_task = NULL; 3577 rh->namestore_task = NULL;
3578 rh->rd.data = NULL;
3560 3579
3561 GNUNET_CONTAINER_DLL_insert (rlh_head, rlh_tail, rh); 3580 GNUNET_CONTAINER_DLL_insert (rlh_head, rlh_tail, rh);
3562 3581
diff --git a/src/gns/gnunet-service-gns_resolver.h b/src/gns/gnunet-service-gns_resolver.h
index e9cbf0d53..b57386f4f 100644
--- a/src/gns/gnunet-service-gns_resolver.h
+++ b/src/gns/gnunet-service-gns_resolver.h
@@ -126,6 +126,12 @@ struct ResolverHandle
126 /* DLL */ 126 /* DLL */
127 struct ResolverHandle *prev; 127 struct ResolverHandle *prev;
128 128
129 /* Last record data found */
130 struct GNUNET_NAMESTORE_RecordData rd;
131
132 /* Number of last record data found */
133 unsigned int rd_count;
134
129 /* The name to resolve */ 135 /* The name to resolve */
130 char name[MAX_DNS_NAME_LENGTH]; 136 char name[MAX_DNS_NAME_LENGTH];
131 137