major adjustments to the new authentication support

This commit is contained in:
Daniel Stenberg 2003-06-26 11:24:55 +00:00
parent 89f4af695e
commit 12859e345f

View File

@ -91,12 +91,13 @@
#include "ssluse.h" #include "ssluse.h"
#include "http_digest.h" #include "http_digest.h"
#include "http_ntlm.h" #include "http_ntlm.h"
#include "http_negotiate.h"
#define _MPRINTF_REPLACE /* use our functions only */ #define _MPRINTF_REPLACE /* use our functions only */
#include <curl/mprintf.h> #include <curl/mprintf.h>
/* The last #include file should be: */ /* The last #include file should be: */
#ifdef MALLOCDEBUG #ifdef CURLDEBUG
#include "memdebug.h" #include "memdebug.h"
#endif #endif
@ -237,7 +238,8 @@ CURLcode add_buffer_send(send_buffer *in,
and wait until it might work again. */ and wait until it might work again. */
size -= amount; size -= amount;
ptr += amount;
ptr = in->buffer + amount;
/* backup the currently set pointers */ /* backup the currently set pointers */
http->backup.fread = conn->fread; http->backup.fread = conn->fread;
@ -640,6 +642,26 @@ CURLcode Curl_http_done(struct connectdata *conn)
return CURLE_OK; return CURLE_OK;
} }
static CURLcode Curl_output_basic(struct connectdata *conn)
{
char *authorization;
struct SessionHandle *data=conn->data;
sprintf(data->state.buffer, "%s:%s",
data->state.user, data->state.passwd);
if(Curl_base64_encode(data->state.buffer, strlen(data->state.buffer),
&authorization) >= 0) {
if(conn->allocptr.userpwd)
free(conn->allocptr.userpwd);
conn->allocptr.userpwd = aprintf( "Authorization: Basic %s\015\012",
authorization);
free(authorization);
}
else
return CURLE_OUT_OF_MEMORY;
return CURLE_OK;
}
CURLcode Curl_http(struct connectdata *conn) CURLcode Curl_http(struct connectdata *conn)
{ {
struct SessionHandle *data=conn->data; struct SessionHandle *data=conn->data;
@ -689,49 +711,50 @@ CURLcode Curl_http(struct connectdata *conn)
conn->allocptr.uagent=NULL; conn->allocptr.uagent=NULL;
} }
#ifdef GSSAPI /* To prevent the user+password to get sent to other than the original
if (data->state.negotiate.context && host due to a location-follow, we do some weirdo checks here */
!GSS_ERROR(data->state.negotiate.status)) { if(!data->state.this_is_a_follow ||
result = Curl_output_negotiate(conn); !data->state.auth_host ||
if (result) curl_strequal(data->state.auth_host, conn->hostname) ||
return result; data->set.http_disable_hostname_check_before_authentication) {
} else
#endif
if(data->state.ntlm.state) {
result = Curl_output_ntlm(conn);
if(result)
return result;
}
else if(data->state.digest.nonce) {
result = Curl_output_digest(conn,
(unsigned char *)request,
(unsigned char *)ppath);
if(result)
return result;
}
else if((data->set.httpauth == CURLAUTH_BASIC) && /* if Basic is desired */
conn->bits.user_passwd &&
!checkheaders(data, "Authorization:")) {
char *authorization;
/* To prevent the user+password to get sent to other than the original #ifdef GSSAPI
host due to a location-follow, we do some weirdo checks here */ if((data->state.authwant == CURLAUTH_GSSNEGOTIATE) &&
if(!data->state.this_is_a_follow || data->state.negotiate.context &&
!data->state.auth_host || !GSS_ERROR(data->state.negotiate.status)) {
curl_strequal(data->state.auth_host, conn->hostname) || result = Curl_output_negotiate(conn);
data->set.http_disable_hostname_check_before_authentication) { if (result)
sprintf(data->state.buffer, "%s:%s", return result;
data->state.user, data->state.passwd); }
if(Curl_base64_encode(data->state.buffer, strlen(data->state.buffer), else
&authorization) >= 0) { #endif
if(conn->allocptr.userpwd) #ifdef USE_SSLEAY
free(conn->allocptr.userpwd); if(data->state.authwant == CURLAUTH_NTLM) {
conn->allocptr.userpwd = aprintf( "Authorization: Basic %s\015\012", result = Curl_output_ntlm(conn);
authorization); if(result)
free(authorization); return result;
}
else
#endif
{
if((data->state.authwant == CURLAUTH_DIGEST) &&
data->state.digest.nonce) {
result = Curl_output_digest(conn,
(unsigned char *)request,
(unsigned char *)ppath);
if(result)
return result;
}
else if((data->state.authwant == CURLAUTH_BASIC) && /* Basic */
conn->bits.user_passwd &&
!checkheaders(data, "Authorization:")) {
result = Curl_output_basic(conn);
if(result)
return result;
} }
} }
} }
if((data->change.referer) && !checkheaders(data, "Referer:")) { if((data->change.referer) && !checkheaders(data, "Referer:")) {
if(conn->allocptr.ref) if(conn->allocptr.ref)
free(conn->allocptr.ref); free(conn->allocptr.ref);