diff options
Diffstat (limited to 'lib/http_digest.c')
-rw-r--r-- | lib/http_digest.c | 76 |
1 files changed, 53 insertions, 23 deletions
diff --git a/lib/http_digest.c b/lib/http_digest.c index 9d5864496..35ba17180 100644 --- a/lib/http_digest.c +++ b/lib/http_digest.c @@ -47,14 +47,16 @@ #include "memdebug.h" #endif -/* Test example header: +/* Test example headers: WWW-Authenticate: Digest realm="testrealm", nonce="1053604598" +Proxy-Authenticate: Digest realm="testrealm", nonce="1053604598" */ CURLdigest Curl_input_digest(struct connectdata *conn, - char *header) /* rest of the www-authenticate: + bool proxy, + char *header) /* rest of the *-authenticate: header */ { bool more = TRUE; @@ -64,7 +66,14 @@ CURLdigest Curl_input_digest(struct connectdata *conn, bool foundAuthInt = FALSE; struct SessionHandle *data=conn->data; bool before = FALSE; /* got a nonce before */ - struct digestdata *d = &data->state.digest; + struct digestdata *d; + + if(proxy) { + d = &data->state.proxydigest; + } + else { + d = &data->state.digest; + } /* skip initial whitespaces */ while(*header && isspace((int)*header)) @@ -78,7 +87,7 @@ CURLdigest Curl_input_digest(struct connectdata *conn, before = TRUE; /* clear off any former leftovers and init to defaults */ - Curl_digest_cleanup(data); + Curl_digest_cleanup_one(d); while(more) { char value[32]; @@ -183,6 +192,7 @@ static void md5_to_ascii(unsigned char *source, /* 16 bytes */ } CURLcode Curl_output_digest(struct connectdata *conn, + bool proxy, unsigned char *request, unsigned char *uripath) { @@ -198,9 +208,28 @@ CURLcode Curl_output_digest(struct connectdata *conn, char *cnonce; char *tmp = NULL; struct timeval now; + struct auth *authp; + char **userp; struct SessionHandle *data = conn->data; - struct digestdata *d = &data->state.digest; + struct digestdata *d; + + if(proxy) { + d = &data->state.proxydigest; + authp = &data->state.authproxy; + userp = &conn->allocptr.proxyuserpwd; + } + else { + d = &data->state.digest; + authp = &data->state.authhost; + userp = &conn->allocptr.userpwd; + } + + if(!d->nonce) { + authp->done = FALSE; + return CURLE_OK; + } + authp->done = TRUE; ha1 = (unsigned char *)malloc(33); /* 32 digits and 1 zero byte */ @@ -293,8 +322,8 @@ CURLcode Curl_output_digest(struct connectdata *conn, Curl_safefree(conn->allocptr.userpwd); if (d->qop) { - conn->allocptr.userpwd = - aprintf( "Authorization: Digest " + *userp = + aprintf( "%sAuthorization: Digest " "username=\"%s\", " "realm=\"%s\", " "nonce=\"%s\", " @@ -303,6 +332,7 @@ CURLcode Curl_output_digest(struct connectdata *conn, "nc=\"%08x\", " "qop=\"%s\", " "response=\"%s\"", + proxy?"Proxy-":"", conn->user, d->realm, d->nonce, @@ -318,13 +348,14 @@ CURLcode Curl_output_digest(struct connectdata *conn, same nonce in the qop=auth mode. */ } else { - conn->allocptr.userpwd = - aprintf( "Authorization: Digest " + *userp = + aprintf( "%sAuthorization: Digest " "username=\"%s\", " "realm=\"%s\", " "nonce=\"%s\", " "uri=\"%s\", " "response=\"%s\"", + proxy?"Proxy-":"", conn->user, d->realm, d->nonce, @@ -336,36 +367,28 @@ CURLcode Curl_output_digest(struct connectdata *conn, if(d->opaque) { /* append opaque */ tmp = aprintf(", opaque=\"%s\"", d->opaque); - conn->allocptr.userpwd = (char*) - realloc(conn->allocptr.userpwd, - strlen(conn->allocptr.userpwd) + strlen(tmp) + 1); - strcat(conn->allocptr.userpwd, tmp); + *userp = (char*) realloc(*userp, strlen(*userp) + strlen(tmp) + 1); + strcat(*userp, tmp); free(tmp); } if(d->algorithm) { /* append algorithm */ tmp = aprintf(", algorithm=\"%s\"", d->algorithm); - conn->allocptr.userpwd = (char*) - realloc(conn->allocptr.userpwd, - strlen(conn->allocptr.userpwd) + strlen(tmp) + 1); + *userp = (char*) realloc(*userp, strlen(*userp) + strlen(tmp) + 1); strcat(conn->allocptr.userpwd, tmp); free(tmp); } /* append CRLF to the userpwd header */ - conn->allocptr.userpwd = (char*) - realloc(conn->allocptr.userpwd, - strlen(conn->allocptr.userpwd) + 3 + 1); - strcat(conn->allocptr.userpwd, "\r\n"); + *userp = (char*) realloc(*userp, strlen(*userp) + 3 + 1); + strcat(*userp, "\r\n"); return CURLE_OK; } -void Curl_digest_cleanup(struct SessionHandle *data) +void Curl_digest_cleanup_one(struct digestdata *d) { - struct digestdata *d = &data->state.digest; - if(d->nonce) free(d->nonce); d->nonce = NULL; @@ -395,4 +418,11 @@ void Curl_digest_cleanup(struct SessionHandle *data) d->stale = FALSE; /* default means normal, not stale */ } + +void Curl_digest_cleanup(struct SessionHandle *data) +{ + Curl_digest_cleanup_one(&data->state.digest); + Curl_digest_cleanup_one(&data->state.proxydigest); +} + #endif |