Commit ce406a73 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

krb4 support

new GetHost() usage
new base64 encoder usage
parent a82eb0fc
Loading
Loading
Loading
Loading
+40 −20
Original line number Diff line number Diff line
@@ -124,6 +124,10 @@
#define _MPRINTF_REPLACE /* use our functions only */
#include <curl/mprintf.h>

#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 */
@@ -575,6 +583,11 @@ CURLcode curl_write(CURLconnect *c_conn, char *buf, size_t amount,
    bytes_written = SSL_write(data->ssl, buf, amount);
  }
  else {
#endif
#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
@@ -601,6 +614,11 @@ CURLcode curl_read(CURLconnect *c_conn, char *buf, size_t buffersize,
    nread = SSL_read (data->ssl, buf, buffersize);
  }
  else {
#endif
#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
@@ -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,20 +1208,21 @@ 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) {
        /* 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) {