From ce406a732f3363a6c500d5a49f742ac680727018 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Thu, 21 Sep 2000 08:50:05 +0000 Subject: [PATCH] krb4 support new GetHost() usage new base64 encoder usage --- lib/url.c | 60 ++++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/lib/url.c b/lib/url.c index 1a42dd7..514a648 100644 --- a/lib/url.c +++ b/lib/url.c @@ -124,6 +124,10 @@ #define _MPRINTF_REPLACE /* use our functions only */ #include +#ifdef KRB4 +#include "security.h" +#endif + /* -- -- */ @@ -500,6 +504,10 @@ CURLcode curl_setopt(CURL *curl, CURLoption option, ...) case CURLOPT_INTERFACE: data->device = va_arg(param, char *); break; + case CURLOPT_KRB4LEVEL: + data->krb4_level = va_arg(param, char *); + data->bits.krb4=data->krb4_level?TRUE:FALSE; + break; default: /* unknown tag and its companion, just ignore: */ return CURLE_READ_ERROR; /* correct this */ @@ -576,7 +584,12 @@ CURLcode curl_write(CURLconnect *c_conn, char *buf, size_t amount, } else { #endif - bytes_written = swrite(conn->writesockfd, buf, amount); +#ifdef KRB4 + if(conn->sec_complete) + bytes_written = sec_write(conn, conn->sockfd, buf, amount); + else +#endif + bytes_written = swrite(conn->writesockfd, buf, amount); #ifdef USE_SSLEAY } #endif /* USE_SSLEAY */ @@ -602,7 +615,12 @@ CURLcode curl_read(CURLconnect *c_conn, char *buf, size_t buffersize, } else { #endif - nread = sread (conn->sockfd, buf, buffersize); +#ifdef KRB4 + if(conn->sec_complete) + nread = sec_read(conn, conn->sockfd, buf, buffersize); + else +#endif + nread = sread (conn->sockfd, buf, buffersize); #ifdef USE_SSLEAY } #endif /* USE_SSLEAY */ @@ -616,6 +634,9 @@ CURLcode curl_disconnect(CURLconnect *c_connect) struct UrlData *data = conn->data; + if(conn->hostent_buf) /* host name info */ + free(conn->hostent_buf); + free(conn); /* free the connection oriented data */ /* clean up the sockets and SSL stuff from the previous "round" */ @@ -652,12 +673,6 @@ CURLcode curl_connect(CURL *curl, CURLconnect **in_connect) struct UrlData *data = curl; struct connectdata *conn; - /* I believe the longest possible name in a DNS is set to 255 letters, FQDN. - Although the buffer required for storing all possible aliases and IP - numbers is according to Stevens' Unix Network Programming 2nd editor, - p. 304: 8192 bytes. Let's go with that! */ - char hostent_buf[8192]; - if(!data || (data->handle != STRUCT_OPEN)) return CURLE_BAD_FUNCTION_ARGUMENT; /* TBD: make error codes */ @@ -1106,7 +1121,8 @@ CURLcode curl_connect(CURL *curl, CURLconnect **in_connect) } /* Connect to target host right on */ - if(!(conn->hp = GetHost(data, conn->name, hostent_buf, sizeof(hostent_buf)))) { + conn->hp = GetHost(data, conn->name, &conn->hostent_buf); + if(!conn->hp) { failf(data, "Couldn't resolv host '%s'", conn->name); return CURLE_COULDNT_RESOLVE_HOST; } @@ -1161,7 +1177,8 @@ CURLcode curl_connect(CURL *curl, CURLconnect **in_connect) } /* connect to proxy */ - if(!(conn->hp = GetHost(data, proxyptr, hostent_buf, sizeof(hostent_buf)))) { + conn->hp = GetHost(data, proxyptr, &conn->hostent_buf); + if(!conn->hp) { failf(data, "Couldn't resolv proxy '%s'", proxyptr); return CURLE_COULDNT_RESOLVE_PROXY; } @@ -1191,21 +1208,22 @@ CURLcode curl_connect(CURL *curl, CURLconnect **in_connect) struct ifreq ifr; struct sockaddr_in sa; struct hostent *h=NULL; + char *hostdataptr; size_t size; unsigned short porttouse; char myhost[256] = ""; unsigned long in; if(if2ip(data->device, myhost, sizeof(myhost))) { - h = GetHost(data, myhost, hostent_buf, sizeof(hostent_buf)); + h = GetHost(data, myhost, &hostdataptr); } else { if(strlen(data->device)>1) { - h = GetHost(data, data->device, hostent_buf, - sizeof(hostent_buf)); + h = GetHost(data, data->device, &hostdataptr); } if(h) { - strcpy(myhost,data->device); + /* we know data->device is shorter than the myhost array */ + strcpy(myhost, data->device); } } @@ -1297,7 +1315,6 @@ CURLcode curl_connect(CURL *curl, CURLconnect **in_connect) failf(data,"could't find my own IP address (%s)", myhost); return CURLE_HTTP_PORT_FAILED; } - } /* end of inet_addr */ else { @@ -1305,6 +1322,8 @@ CURLcode curl_connect(CURL *curl, CURLconnect **in_connect) return CURLE_HTTP_PORT_FAILED; } + free(hostdataptr); /* allocated by GetHost() */ + } /* end of device selection support */ #endif /* end of HAVE_INET_NTOA */ @@ -1371,12 +1390,13 @@ CURLcode curl_connect(CURL *curl, CURLconnect **in_connect) } if(data->bits.proxy_user_passwd) { - char authorization[512]; + char *authorization; sprintf(data->buffer, "%s:%s", data->proxyuser, data->proxypasswd); - base64Encode(data->buffer, authorization); - - data->ptr_proxyuserpwd = maprintf("Proxy-authorization: Basic %s\015\012", - authorization); + if(base64Encode(data->buffer, 0, &authorization) >= 0) { + data->ptr_proxyuserpwd = + maprintf("Proxy-authorization: Basic %s\015\012", authorization); + free(authorization); + } } if((conn->protocol&PROT_HTTP) || data->bits.httpproxy) { if(data->useragent) { -- 2.7.4