1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-09-22 15:11:41 +02:00

* http.c (make_radix64_string, do_parse_uri, send_request): Add basic auth

for proxies and direct requests.  Suggested by Florent Thoumie.
This commit is contained in:
David Shaw 2004-09-10 21:16:47 +00:00
parent 5494eb1bb6
commit 440e9a9979
2 changed files with 82 additions and 16 deletions

View File

@ -1,5 +1,9 @@
2004-09-10 David Shaw <dshaw@jabberwocky.com> 2004-09-10 David Shaw <dshaw@jabberwocky.com>
* http.c (make_radix64_string, do_parse_uri, send_request): Add
basic auth for proxies and direct requests. Suggested by Florent
Thoumie.
* http.c (main): Fix test code for http-test. * http.c (main): Fix test code for http-test.
2004-09-09 Werner Koch <wk@g10code.com> 2004-09-09 Werner Koch <wk@g10code.com>

View File

@ -107,6 +107,40 @@ init_sockets (void)
} }
#endif /*_WIN32*/ #endif /*_WIN32*/
static byte bintoasc[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";
/****************
* create a radix64 encoded string.
*/
/* TODO: This is a duplicate of code in g10/armor.c. Better to use a
single copy in strgutil.c */
static char *
make_radix64_string( const byte *data, size_t len )
{
char *buffer, *p;
buffer = p = m_alloc( (len+2)/3*4 + 1 );
for( ; len >= 3 ; len -= 3, data += 3 ) {
*p++ = bintoasc[(data[0] >> 2) & 077];
*p++ = bintoasc[(((data[0] <<4)&060)|((data[1] >> 4)&017))&077];
*p++ = bintoasc[(((data[1]<<2)&074)|((data[2]>>6)&03))&077];
*p++ = bintoasc[data[2]&077];
}
if( len == 2 ) {
*p++ = bintoasc[(data[0] >> 2) & 077];
*p++ = bintoasc[(((data[0] <<4)&060)|((data[1] >> 4)&017))&077];
*p++ = bintoasc[((data[1]<<2)&074)];
}
else if( len == 1 ) {
*p++ = bintoasc[(data[0] >> 2) & 077];
*p++ = bintoasc[(data[0] <<4)&060];
}
*p = 0;
return buffer;
}
int int
http_open( HTTP_HD hd, HTTP_REQ_TYPE reqtype, const char *url, http_open( HTTP_HD hd, HTTP_REQ_TYPE reqtype, const char *url,
@ -294,6 +328,15 @@ do_parse_uri( PARSED_URI uri, int only_local_part )
p++; p++;
if( (p2 = strchr(p, '/')) ) if( (p2 = strchr(p, '/')) )
*p2++ = 0; *p2++ = 0;
/* Check for username/password encoding */
if((p3=strchr(p,'@')))
{
uri->auth=p;
*p3++='\0';
p=p3;
}
strlwr( p ); strlwr( p );
uri->host = p; uri->host = p;
if( (p3=strchr( p, ':' )) ) { if( (p3=strchr( p, ':' )) ) {
@ -465,6 +508,7 @@ send_request( HTTP_HD hd, const char *proxy )
byte *request, *p; byte *request, *p;
ushort port; ushort port;
int rc; int rc;
char *auth=NULL;
server = *hd->uri->host? hd->uri->host : "localhost"; server = *hd->uri->host? hd->uri->host : "localhost";
port = hd->uri->port? hd->uri->port : 80; port = hd->uri->port? hd->uri->port : 80;
@ -482,34 +526,52 @@ send_request( HTTP_HD hd, const char *proxy )
} }
hd->sock = connect_server( *uri->host? uri->host : "localhost", hd->sock = connect_server( *uri->host? uri->host : "localhost",
uri->port? uri->port : 80, 0 ); uri->port? uri->port : 80, 0 );
if(uri->auth)
{
char *x=make_radix64_string(uri->auth,strlen(uri->auth));
auth=m_alloc(50+strlen(x));
sprintf(auth,"Proxy-Authorization: Basic %s\r\n",x);
m_free(x);
}
release_parsed_uri( uri ); release_parsed_uri( uri );
} }
else else
hd->sock = connect_server( server, port, hd->flags ); {
hd->sock = connect_server( server, port, hd->flags );
if(hd->uri->auth)
{
char *x=make_radix64_string(hd->uri->auth,strlen(hd->uri->auth));
auth=m_alloc(50+strlen(x));
sprintf(auth,"Authorization: Basic %s\r\n",x);
m_free(x);
}
}
if( hd->sock == -1 ) if( hd->sock == -1 )
return G10ERR_NETWORK; return G10ERR_NETWORK;
p = build_rel_path( hd->uri ); p = build_rel_path( hd->uri );
request = m_alloc( strlen(server)*2 + strlen(p) + 50 );
if( proxy ) { request=m_alloc(strlen(server)*2 + strlen(p) + (auth?strlen(auth):0) + 50);
sprintf( request, "%s http://%s:%hu%s%s HTTP/1.0\r\n", if( proxy )
hd->req_type == HTTP_REQ_GET ? "GET" : sprintf( request, "%s http://%s:%hu%s%s HTTP/1.0\r\n%s",
hd->req_type == HTTP_REQ_HEAD? "HEAD": hd->req_type == HTTP_REQ_GET ? "GET" :
hd->req_type == HTTP_REQ_POST? "POST": "OOPS", hd->req_type == HTTP_REQ_HEAD? "HEAD":
server, port, *p == '/'? "":"/", p ); hd->req_type == HTTP_REQ_POST? "POST": "OOPS",
} server, port, *p == '/'? "":"/", p, auth?auth:"" );
else { else
sprintf( request, "%s %s%s HTTP/1.0\r\nHost: %s\r\n", sprintf( request, "%s %s%s HTTP/1.0\r\nHost: %s\r\n%s",
hd->req_type == HTTP_REQ_GET ? "GET" : hd->req_type == HTTP_REQ_GET ? "GET" :
hd->req_type == HTTP_REQ_HEAD? "HEAD": hd->req_type == HTTP_REQ_HEAD? "HEAD":
hd->req_type == HTTP_REQ_POST? "POST": "OOPS", hd->req_type == HTTP_REQ_POST? "POST": "OOPS",
*p == '/'? "":"/", p, server); *p == '/'? "":"/", p, server, auth?auth:"");
}
m_free(p); m_free(p);
rc = write_server( hd->sock, request, strlen(request) ); rc = write_server( hd->sock, request, strlen(request) );
m_free( request ); m_free( request );
m_free(auth);
return rc; return rc;
} }