From 17ac843871d5f350f26edff0187f94ced923f534 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Wed, 2 Dec 2015 10:12:32 +0100 Subject: [PATCH] http: Enhance parser to detect .onion addresses. * dirmngr/http.h (parsed_uri_s): Add flag 'onion'. * dirmngr/http.c (do_parse_uri): Set that flag. * dirmngr/t-http.c (main): Print flags. Signed-off-by: Werner Koch --- dirmngr/http.c | 72 ++++++++++++++++++++++++++---------------------- dirmngr/http.h | 1 + dirmngr/t-http.c | 5 ++++ 3 files changed, 45 insertions(+), 33 deletions(-) diff --git a/dirmngr/http.c b/dirmngr/http.c index d623f7eaa..642795196 100644 --- a/dirmngr/http.c +++ b/dirmngr/http.c @@ -1086,6 +1086,7 @@ do_parse_uri (parsed_uri_t uri, int only_local_part, uri->is_http = 0; uri->opaque = 0; uri->v6lit = 0; + uri->onion = 0; /* A quick validity check. */ if (strspn (p, VALID_URI_CHARS) != n) @@ -1172,49 +1173,54 @@ do_parse_uri (parsed_uri_t uri, int only_local_part, { uri->opaque = 1; uri->path = p; + if (is_onion_address (uri->path)) + uri->onion = 1; return 0; } } /* End global URI part. */ - /* Parse the pathname part */ - if (!p || !*p) - return 0; /* We don't have a path. Okay. */ - - /* TODO: Here we have to check params. */ - - /* Do we have a query part? */ - if ((p2 = strchr (p, '?'))) - *p2++ = 0; - - uri->path = p; - if ((n = remove_escapes (p)) < 0) - return GPG_ERR_BAD_URI; - if (n != strlen (p)) - return GPG_ERR_BAD_URI; /* Path includes a Nul. */ - p = p2 ? p2 : NULL; - - if (!p || !*p) - return 0; /* We don't have a query string. Okay. */ - - /* Now parse the query string. */ - tail = &uri->query; - for (;;) + /* Parse the pathname part if any. */ + if (p && *p) { - uri_tuple_t elem; + /* TODO: Here we have to check params. */ - if ((p2 = strchr (p, '&'))) - *p2++ = 0; - if (!(elem = parse_tuple (p))) - return GPG_ERR_BAD_URI; - *tail = elem; - tail = &elem->next; + /* Do we have a query part? */ + if ((p2 = strchr (p, '?'))) + *p2++ = 0; - if (!p2) - break; /* Ready. */ - p = p2; + uri->path = p; + if ((n = remove_escapes (p)) < 0) + return GPG_ERR_BAD_URI; + if (n != strlen (p)) + return GPG_ERR_BAD_URI; /* Path includes a Nul. */ + p = p2 ? p2 : NULL; + + /* Parse a query string if any. */ + if (p && *p) + { + tail = &uri->query; + for (;;) + { + uri_tuple_t elem; + + if ((p2 = strchr (p, '&'))) + *p2++ = 0; + if (!(elem = parse_tuple (p))) + return GPG_ERR_BAD_URI; + *tail = elem; + tail = &elem->next; + + if (!p2) + break; /* Ready. */ + p = p2; + } + } } + if (is_onion_address (uri->host)) + uri->onion = 1; + return 0; } diff --git a/dirmngr/http.h b/dirmngr/http.h index 73a423cd5..64f55e12e 100644 --- a/dirmngr/http.h +++ b/dirmngr/http.h @@ -52,6 +52,7 @@ struct parsed_uri_s unsigned int use_tls:1; /* Whether TLS should be used. */ unsigned int opaque:1;/* Unknown scheme; PATH has the rest. */ unsigned int v6lit:1; /* Host was given as a literal v6 address. */ + unsigned int onion:1; /* .onion address given. */ char *auth; /* username/password for basic auth. */ char *host; /* Host (converted to lowercase). */ unsigned short port; /* Port (always set if the host is set). */ diff --git a/dirmngr/t-http.c b/dirmngr/t-http.c index 35858f649..63662a286 100644 --- a/dirmngr/t-http.c +++ b/dirmngr/t-http.c @@ -323,6 +323,11 @@ main (int argc, char **argv) } putchar ('\n'); } + printf ("Flags :%s%s%s%s\n", + uri->is_http? " http":"", + uri->opaque? " opaque":"", + uri->v6lit? " v6lit":"", + uri->onion? " onion":""); printf ("TLS : %s\n", uri->use_tls? "yes": (my_http_flags&HTTP_FLAG_FORCE_TLS)? "forced" : "no");