/* The associated response */
struct MHD_Response *response;
+
+ /* Cookies to set */
+ struct ProxySetCookieHeader *set_cookies_head;
+
+ /* Cookies to set */
+ struct ProxySetCookieHeader *set_cookies_tail;
};
+/**
+ * Struct for set-cookies
+ */
+struct ProxySetCookieHeader
+{
+ /* DLL */
+ struct ProxySetCookieHeader *next;
+
+ /* DLL */
+ struct ProxySetCookieHeader *prev;
+
+ /* the cookie */
+ char *cookie;
+};
+
/* The port the proxy is running on (default 7777) */
static unsigned long port = GNUNET_GNS_PROXY_PORT;
{
size_t bytes = size * nmemb;
struct ProxyCurlTask *ctask = cls;
- int len = strlen (HTML_HDR_CONTENT);
- char hdr[len+1];
+ int html_mime_len = strlen (HTML_HDR_CONTENT);
+ int cookie_hdr_len = strlen (MHD_HTTP_HEADER_SET_COOKIE);
+ char hdr_mime[html_mime_len+1];
+ char hdr_cookie[size+1];
+ struct ProxySetCookieHeader *pch;
+ size_t len;
- if ( (len+1) > bytes)
- return bytes;
+ if (html_mime_len <= size)
+ {
+ memcpy (hdr_mime, buffer, html_mime_len);
+ hdr_mime[html_mime_len] = '\0';
- memcpy (hdr, buffer, len);
- hdr[len] = '\0';
+ if (0 == strcmp (hdr_mime, HTML_HDR_CONTENT))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Got HTML HTTP response header\n");
+ ctask->parse_content = GNUNET_YES;
+ }
+ }
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Got header %s\n", buffer);
- if (0 == strcmp (hdr, HTML_HDR_CONTENT))
+ if (cookie_hdr_len <= size)
{
+ memcpy (hdr_cookie, buffer, size);
+ hdr_cookie[size] = '\0';
+
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Got HTML HTTP response header\n");
- ctask->parse_content = GNUNET_YES;
+ "Got Set-Cookie HTTP header %s\n", hdr_cookie);
+ GNUNET_assert (0);
+
+ pch = GNUNET_malloc (sizeof (struct ProxySetCookieHeader));
+ len = strlen (hdr_cookie) - strlen (MHD_HTTP_HEADER_SET_COOKIE);
+ pch->cookie = GNUNET_malloc (len + 1);
+ memset (pch->cookie, 0, len + 1);
+ memcpy (pch->cookie, hdr_cookie+strlen (MHD_HTTP_HEADER_SET_COOKIE), len);
+ GNUNET_CONTAINER_DLL_insert (ctask->set_cookies_head,
+ ctask->set_cookies_tail,
+ pch);
}
return bytes;
int nomatch;
char *hostptr;
regmatch_t m[RE_N_MATCHES];
+ struct ProxySetCookieHeader *pch;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"MHD: content cb %s\n", ctask->url);
+
+ pch = ctask->set_cookies_head;
+ while (pch != NULL)
+ {
+ if (GNUNET_NO == MHD_add_response_header (ctask->response,
+ MHD_HTTP_HEADER_SET_COOKIE,
+ pch->cookie))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "MHD: Error adding set-cookie header field %s\n",
+ pch->cookie);
+ }
+ GNUNET_free (pch->cookie);
+ GNUNET_CONTAINER_DLL_remove (ctask->set_cookies_head,
+ ctask->set_cookies_tail,
+ pch);
+ pch = ctask->set_cookies_head;
+ }
if (ctask->download_successful &&
(ctask->buf_status == BUF_WAIT_FOR_CURL))
struct sockaddr *addr;
socklen_t len;
- fd = GNUNET_NETWORK_get_fd (h);
+ fd = dup (GNUNET_NETWORK_get_fd (h));
addr = GNUNET_NETWORK_get_addr (h);
len = GNUNET_NETWORK_get_addrlen (h);
char* proxy_sockfile;
char* cafile_cfg = NULL;
char* cafile;
- char* shorten_keyfile;
curl_multi = NULL;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Loading Template\n");
- if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (cfg, "gns-proxy",
- "PROXY_CACERT",
- &shorten_keyfile))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Unable to load shorten zonekey config value!\n");
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "No shorten key provided!\n");
- return;
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Loading shorten zonekey %s!\n",
- shorten_keyfile);
- shorten_zonekey = GNUNET_CRYPTO_rsa_key_create_from_file (shorten_keyfile);
- GNUNET_free (shorten_keyfile);
- }
-
compile_regex (&re_dotplus, (char*) RE_A_HREF);
gns_handle = GNUNET_GNS_connect (cfg);
mhd_unix_sock_addr.sun_family = AF_UNIX;
strcpy (mhd_unix_sock_addr.sun_path, proxy_sockfile);
- if (0 != unlink (proxy_sockfile))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Unable to unlink sockfile!\n");
- return;
- }
+
+#if LINUX
+ mhd_unix_sock_addr.sun_path[0] = '\0';
+#endif
+#if HAVE_SOCKADDR_IN_SIN_LEN
+ mhd_unix_sock_addr.sun_len = (u_char) sizeof (struct sockaddr_un);
+#endif
len = strlen (proxy_sockfile) + sizeof(AF_UNIX);
GNUNET_NETWORK_socket_close (rh->dns_sock);
if (NULL != rh->dns_resolver_handle)
GNUNET_RESOLVER_request_cancel (rh->dns_resolver_handle);
+
+ if (NULL != rh->rd.data)
+ GNUNET_free ((void*)(rh->rd.data));
GNUNET_free(rh);
}
rh->private_local_zone,
GNUNET_GNS_RECORD_REV,
GNUNET_GNS_TLD,
- rh->priv_key,
+ NULL,
GNUNET_TIME_UNIT_FOREVER_REL,
GNUNET_NO,
&background_lookup_result_processor,
* else resolve again with new authority
*/
if (strcmp (rh->name, "") == 0)
- rh->proc (rh->proc_cls, rh, 0, NULL);
+ rh->proc (rh->proc_cls, rh, rh->rd_count, &rh->rd);
else
resolve_delegation_ns (rh);
+
return;
}
rh->authority_chain_tail,
auth);
+ if (NULL != rh->rd.data)
+ GNUNET_free ((void*)rh->rd.data);
+
+ rh->rd.data = GNUNET_malloc (rd[i].data_size);
+ memcpy (&rh->rd, &rd[i], sizeof (struct GNUNET_NAMESTORE_RecordData));
+ memcpy ((void*)(rh->rd.data), rd[i].data, rd[i].data_size);
+ rh->rd_count = 1;
+
/** try to import pkey if private key available */
//if (rh->priv_key && is_canonical (rh->name))
// process_discovered_authority(name, auth->zone,
else
rh->proc = &handle_delegation_ns;
+
/* Check for key revocation and delegate */
rh->namestore_task = GNUNET_NAMESTORE_lookup_record (namestore_handle,
&rh->authority,
}
else if (rlh->record_type == GNUNET_GNS_RECORD_PKEY)
{
- GNUNET_assert(rd_count == 1);
GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
"GNS_PHASE_DELEGATE_NS-%llu: Resolved queried PKEY in NS.\n",
rh->id);
GNUNET_CONTAINER_DLL_insert (rh->authority_chain_head,
rh->authority_chain_tail,
auth);
+ if (NULL != rh->rd.data)
+ GNUNET_free ((void*)(rh->rd.data));
+ rh->rd.data = GNUNET_malloc (rd[i].data_size);
+ memcpy (&rh->rd, &rd[i], sizeof (struct GNUNET_NAMESTORE_RecordData));
+ memcpy ((void*)rh->rd.data, rd[i].data, rd[i].data_size);
+ rh->rd_count = 1;
/* Check for key revocation and delegate */
rh->namestore_task = GNUNET_NAMESTORE_lookup_record (namestore_handle,
&rh->authority,
rh->private_local_zone = pzone;
rh->only_cached = only_cached;
rh->namestore_task = NULL;
+ rh->rd.data = NULL;
GNUNET_CONTAINER_DLL_insert (rlh_head, rlh_tail, rh);