thttp_header_t *thttp_challenge_create_header_authorization(thttp_challenge_t *self, const char* username, const char* password, const thttp_request_t *request) { char* response = tsk_null; tsk_size_t response_size = 0; nonce_count_t nc; char *uristring = tsk_null; thttp_header_t *header = 0; if (!self || !request || !request->line.request.url){ goto bail; } /* Sets URI: hpath do not start with / ==> append a '/'*/ tsk_sprintf(&uristring, "/%s", request->line.request.url->hpath ? request->line.request.url->hpath : ""); /* We compute the nc here because @ref thttp_challenge_get_response function will increment it's value. */ if (self->nc){ THTTP_NCOUNT_2_STRING(self->nc, nc); } /* Computes the response (Basic and Digest)*/ if (THTTP_CHALLENGE_IS_DIGEST(self)){ if (thttp_challenge_get_digest_response(self, username, password, request->line.request.method, uristring, request->Content, &response)){ goto bail; } response_size = (TSK_MD5_DIGEST_SIZE * 2); } else if (THTTP_CHALLENGE_IS_BASIC(self)){ response_size = thttp_auth_basic_response(username, password, &response); } else{ TSK_DEBUG_ERROR("%s not supported as scheme.", self->scheme); goto bail; } #define THTTP_AUTH_COPY_VALUES(hdr) \ hdr->username = tsk_strdup(username); \ hdr->scheme = tsk_strdup(self->scheme); \ hdr->realm = tsk_strdup(self->realm); \ hdr->nonce = tsk_strdup(self->nonce); \ hdr->qop = tsk_strdup(self->qop); \ hdr->opaque = tsk_strdup(self->opaque); \ hdr->algorithm = self->algorithm ? tsk_strdup(self->algorithm) : tsk_strdup("MD5"); \ hdr->cnonce = self->nc? tsk_strdup(self->cnonce) : 0; \ hdr->uri = tsk_strdup(uristring); \ hdr->nc = self->nc? tsk_strdup(nc) : 0; \ hdr->response = tsk_strndup(response, response_size); \ if (self->isproxy){ thttp_header_Proxy_Authorization_t *proxy_auth = thttp_header_authorization_create(); // Very bad way to create Proxy_auth header. THTTP_HEADER(proxy_auth)->type = thttp_htype_Proxy_Authorization; THTTP_AUTH_COPY_VALUES(proxy_auth); header = THTTP_HEADER(proxy_auth); } else{ thttp_header_Authorization_t *auth = thttp_header_authorization_create(); THTTP_AUTH_COPY_VALUES(auth); header = THTTP_HEADER(auth); } bail: TSK_FREE(uristring); TSK_FREE(response); return header; #undef THTTP_AUTH_COPY_VALUES }
thttp_header_t *thttp_challenge_create_header_authorization_2(thttp_challenge_t *self, const char* username, const char* password, const char* method, const char *uristring, const tsk_buffer_t* entity_body) { char* response = tsk_null; tsk_size_t response_size = 0; nonce_count_t nc; thttp_header_t *header = tsk_null; if (!self || tsk_strnullORempty(uristring)) { TSK_DEBUG_ERROR("Invalid parameter"); goto bail; } /* We compute the nc here because @ref thttp_challenge_get_response function will increment it's value. */ if (self->nc) { THTTP_NCOUNT_2_STRING(self->nc, nc); } /* Computes the response (Basic and Digest)*/ if (THTTP_CHALLENGE_IS_DIGEST(self)) { if (thttp_challenge_get_digest_response(self, username, password, method, uristring, entity_body, &response)) { goto bail; } response_size = (TSK_MD5_DIGEST_SIZE * 2); } else if (THTTP_CHALLENGE_IS_BASIC(self)) { response_size = thttp_auth_basic_response(username, password, &response); } else { TSK_DEBUG_ERROR("%s not supported as scheme.", self->scheme); goto bail; } #define THTTP_AUTH_COPY_VALUES(hdr) \ hdr->username = tsk_strdup(username); \ hdr->scheme = tsk_strdup(self->scheme); \ hdr->realm = tsk_strdup(self->realm); \ hdr->nonce = tsk_strdup(self->nonce); \ hdr->qop = tsk_strdup(self->qop); \ hdr->opaque = tsk_strdup(self->opaque); \ hdr->algorithm = self->algorithm ? tsk_strdup(self->algorithm) : tsk_strdup("MD5"); \ hdr->cnonce = self->nc? tsk_strdup(self->cnonce) : 0; \ hdr->uri = tsk_strdup(uristring); \ hdr->nc = self->nc? tsk_strdup(nc) : 0; \ hdr->response = tsk_strndup(response, response_size); \ if (self->isproxy) { thttp_header_Proxy_Authorization_t *proxy_auth = thttp_header_authorization_create(); // Very bad way to create Proxy_auth header. THTTP_HEADER(proxy_auth)->type = thttp_htype_Proxy_Authorization; THTTP_AUTH_COPY_VALUES(proxy_auth); header = THTTP_HEADER(proxy_auth); } else { thttp_header_Authorization_t *auth = thttp_header_authorization_create(); THTTP_AUTH_COPY_VALUES(auth); header = THTTP_HEADER(auth); } bail: TSK_FREE(response); return header; #undef THTTP_AUTH_COPY_VALUES }