mirror of
https://github.com/curl/curl.git
synced 2026-08-26 21:24:08 +03:00
creds: hold credentials
Authorizdation credentials are kept in `struct Curl_creds`. This contains: * `user`: the username, maybe the empty string * `passwd`: the password, maybe the empty string * `sasl_authzid`: the SASL authz value, maybe the empty string * `oauth_bearer`: the OAUTH bearer token, maybe the empty string * `source`: where the credentials from from * `refcount`: a reference counter to link/unkink creds A `creds` with all values empty is equivalent to NULL, e.g. no `creds` instance. With reference counting, `creds` can be linked/unlinked in several places. See docs/internals/CREDENTIALS.md for use. Closes #21548
This commit is contained in:
parent
a32a2b0b77
commit
8f71d0fde5
47 changed files with 1138 additions and 962 deletions
|
|
@ -40,24 +40,21 @@
|
|||
*
|
||||
* Parameters:
|
||||
*
|
||||
* authzid [in] - The authorization identity.
|
||||
* authcid [in] - The authentication identity.
|
||||
* creds [in] - The credentials.
|
||||
* passwd [in] - The password.
|
||||
* out [out] - The result storage.
|
||||
*
|
||||
* Returns CURLE_OK on success.
|
||||
*/
|
||||
CURLcode Curl_auth_create_plain_message(const char *authzid,
|
||||
const char *authcid,
|
||||
const char *passwd,
|
||||
CURLcode Curl_auth_create_plain_message(struct Curl_creds *creds,
|
||||
struct bufref *out)
|
||||
{
|
||||
size_t len;
|
||||
char *auth;
|
||||
|
||||
size_t zlen = (authzid == NULL ? 0 : strlen(authzid));
|
||||
size_t clen = strlen(authcid);
|
||||
size_t plen = strlen(passwd);
|
||||
size_t zlen = strlen(Curl_creds_sasl_authzid(creds));
|
||||
size_t clen = strlen(Curl_creds_user(creds));
|
||||
size_t plen = strlen(Curl_creds_passwd(creds));
|
||||
|
||||
if((zlen > CURL_MAX_INPUT_LENGTH) || (clen > CURL_MAX_INPUT_LENGTH) ||
|
||||
(plen > CURL_MAX_INPUT_LENGTH))
|
||||
|
|
@ -65,8 +62,10 @@ CURLcode Curl_auth_create_plain_message(const char *authzid,
|
|||
|
||||
len = zlen + clen + plen + 2;
|
||||
|
||||
auth = curl_maprintf("%s%c%s%c%s", authzid ? authzid : "", '\0',
|
||||
authcid, '\0', passwd);
|
||||
auth = curl_maprintf("%s%c%s%c%s",
|
||||
Curl_creds_sasl_authzid(creds), '\0',
|
||||
Curl_creds_user(creds), '\0',
|
||||
Curl_creds_passwd(creds));
|
||||
if(!auth)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
Curl_bufref_set(out, auth, len, curl_free);
|
||||
|
|
|
|||
|
|
@ -47,18 +47,19 @@
|
|||
* Returns CURLE_OK on success.
|
||||
*/
|
||||
CURLcode Curl_auth_create_cram_md5_message(const struct bufref *chlg,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
struct bufref *out)
|
||||
{
|
||||
struct HMAC_context *ctxt;
|
||||
unsigned char digest[MD5_DIGEST_LEN];
|
||||
char *response;
|
||||
const char *user = Curl_creds_user(creds);
|
||||
const char *passwd = Curl_creds_passwd(creds);
|
||||
|
||||
/* Compute the digest using the password as the key */
|
||||
ctxt = Curl_HMAC_init(&Curl_HMAC_MD5,
|
||||
(const unsigned char *)passwdp,
|
||||
curlx_uztoui(strlen(passwdp)));
|
||||
(const unsigned char *)passwd,
|
||||
curlx_uztoui(strlen(passwd)));
|
||||
if(!ctxt)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
|
||||
|
|
@ -73,7 +74,7 @@ CURLcode Curl_auth_create_cram_md5_message(const struct bufref *chlg,
|
|||
/* Generate the response */
|
||||
response = curl_maprintf(
|
||||
"%s %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
|
||||
userp, digest[0], digest[1], digest[2], digest[3], digest[4],
|
||||
user, digest[0], digest[1], digest[2], digest[3], digest[4],
|
||||
digest[5], digest[6], digest[7], digest[8], digest[9], digest[10],
|
||||
digest[11], digest[12], digest[13], digest[14], digest[15]);
|
||||
if(!response)
|
||||
|
|
|
|||
|
|
@ -332,13 +332,14 @@ bool Curl_auth_is_digest_supported(void)
|
|||
*/
|
||||
CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
|
||||
const struct bufref *chlg,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
const char *service,
|
||||
struct bufref *out)
|
||||
{
|
||||
size_t i;
|
||||
struct MD5_context *ctxt;
|
||||
const char *userp = Curl_creds_user(creds);
|
||||
const char *passwdp = Curl_creds_passwd(creds);
|
||||
char *response = NULL;
|
||||
unsigned char digest[MD5_DIGEST_LEN];
|
||||
char HA1_hex[(2 * MD5_DIGEST_LEN) + 1];
|
||||
|
|
@ -666,8 +667,7 @@ CURLcode Curl_auth_decode_digest_http_message(const char *chlg,
|
|||
* Parameters:
|
||||
*
|
||||
* data [in] - The session handle.
|
||||
* userp [in] - The username.
|
||||
* passwdp [in] - The user's password.
|
||||
* creds [in] - The credentials
|
||||
* request [in] - The HTTP request.
|
||||
* uripath [in] - The path of the HTTP uri.
|
||||
* digest [in/out] - The digest data struct being used and modified.
|
||||
|
|
@ -679,8 +679,7 @@ CURLcode Curl_auth_decode_digest_http_message(const char *chlg,
|
|||
*/
|
||||
static CURLcode auth_create_digest_http_message(
|
||||
struct Curl_easy *data,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
const unsigned char *request,
|
||||
const unsigned char *uripath,
|
||||
struct digestdata *digest,
|
||||
|
|
@ -689,6 +688,8 @@ static CURLcode auth_create_digest_http_message(
|
|||
CURLcode (*hash)(unsigned char *, const unsigned char *, const size_t))
|
||||
{
|
||||
CURLcode result;
|
||||
const char *userp = Curl_creds_user(creds);
|
||||
const char *passwdp = Curl_creds_passwd(creds);
|
||||
unsigned char hashbuf[32]; /* 32 bytes/256 bits */
|
||||
unsigned char request_digest[65];
|
||||
unsigned char ha1[65]; /* 64 digits and 1 zero byte */
|
||||
|
|
@ -986,29 +987,28 @@ oom:
|
|||
* Returns CURLE_OK on success.
|
||||
*/
|
||||
CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
const unsigned char *request,
|
||||
const unsigned char *uripath,
|
||||
struct digestdata *digest,
|
||||
char **outptr, size_t *outlen)
|
||||
{
|
||||
if(digest->algo <= ALGO_MD5SESS)
|
||||
return auth_create_digest_http_message(data, userp, passwdp,
|
||||
return auth_create_digest_http_message(data, creds,
|
||||
request, uripath, digest,
|
||||
outptr, outlen,
|
||||
auth_digest_md5_to_ascii,
|
||||
Curl_md5it);
|
||||
|
||||
if(digest->algo <= ALGO_SHA256SESS)
|
||||
return auth_create_digest_http_message(data, userp, passwdp,
|
||||
return auth_create_digest_http_message(data, creds,
|
||||
request, uripath, digest,
|
||||
outptr, outlen,
|
||||
auth_digest_sha256_to_ascii,
|
||||
Curl_sha256it);
|
||||
#ifdef CURL_HAVE_SHA512_256
|
||||
if(digest->algo <= ALGO_SHA512_256SESS)
|
||||
return auth_create_digest_http_message(data, userp, passwdp,
|
||||
return auth_create_digest_http_message(data, creds,
|
||||
request, uripath, digest,
|
||||
outptr, outlen,
|
||||
auth_digest_sha256_to_ascii,
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
#if defined(USE_WINDOWS_SSPI) && !defined(CURL_DISABLE_DIGEST_AUTH)
|
||||
|
||||
#include "creds.h"
|
||||
#include "vauth/vauth.h"
|
||||
#include "vauth/digest.h"
|
||||
#include "curlx/multibyte.h"
|
||||
|
|
@ -83,8 +84,7 @@ bool Curl_auth_is_digest_supported(void)
|
|||
*/
|
||||
CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
|
||||
const struct bufref *chlg,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
const char *service,
|
||||
struct bufref *out)
|
||||
{
|
||||
|
|
@ -137,9 +137,10 @@ CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
|
|||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
if(userp && *userp) {
|
||||
if(Curl_creds_has_user(creds)) {
|
||||
/* Populate our identity structure */
|
||||
result = Curl_create_sspi_identity(userp, passwdp, &identity);
|
||||
result = Curl_create_sspi_identity(creds->user, creds->passwd,
|
||||
&identity);
|
||||
if(result) {
|
||||
curlx_free(spn);
|
||||
curlx_free(output_token);
|
||||
|
|
@ -381,8 +382,7 @@ CURLcode Curl_auth_decode_digest_http_message(const char *chlg,
|
|||
* Returns CURLE_OK on success.
|
||||
*/
|
||||
CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
const unsigned char *request,
|
||||
const unsigned char *uripath,
|
||||
struct digestdata *digest,
|
||||
|
|
@ -421,16 +421,12 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
|
|||
|
||||
/* If the user/passwd that was used to make the identity for http_context
|
||||
has changed then delete that context. */
|
||||
if((userp && !digest->user) || (!userp && digest->user) ||
|
||||
(passwdp && !digest->passwd) || (!passwdp && digest->passwd) ||
|
||||
(userp && digest->user && Curl_timestrcmp(userp, digest->user)) ||
|
||||
(passwdp && digest->passwd && Curl_timestrcmp(passwdp, digest->passwd))) {
|
||||
if(!Curl_creds_same(creds, digest->creds)) {
|
||||
if(digest->http_context) {
|
||||
Curl_pSecFn->DeleteSecurityContext(digest->http_context);
|
||||
curlx_safefree(digest->http_context);
|
||||
}
|
||||
curlx_safefree(digest->user);
|
||||
curlx_safefree(digest->passwd);
|
||||
Curl_creds_unlink(&digest->creds);
|
||||
}
|
||||
|
||||
if(digest->http_context) {
|
||||
|
|
@ -473,13 +469,13 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
|
|||
unsigned long attrs;
|
||||
TCHAR *spn;
|
||||
|
||||
/* free the copy of user/passwd used to make the previous identity */
|
||||
curlx_safefree(digest->user);
|
||||
curlx_safefree(digest->passwd);
|
||||
/* free the credentials used to make the previous identity */
|
||||
Curl_creds_unlink(&digest->creds);
|
||||
|
||||
if(userp && *userp) {
|
||||
if(Curl_creds_has_user(creds)) {
|
||||
/* Populate our identity structure */
|
||||
if(Curl_create_sspi_identity(userp, passwdp, &identity)) {
|
||||
if(Curl_create_sspi_identity(creds->user, creds->passwd,
|
||||
&identity)) {
|
||||
curlx_free(output_token);
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
|
|
@ -499,26 +495,8 @@ CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
|
|||
/* Use the current Windows user */
|
||||
p_identity = NULL;
|
||||
|
||||
if(userp) {
|
||||
digest->user = curlx_strdup(userp);
|
||||
|
||||
if(!digest->user) {
|
||||
curlx_free(output_token);
|
||||
Curl_sspi_free_identity(p_identity);
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
}
|
||||
|
||||
if(passwdp) {
|
||||
digest->passwd = curlx_strdup(passwdp);
|
||||
|
||||
if(!digest->passwd) {
|
||||
curlx_free(output_token);
|
||||
Curl_sspi_free_identity(p_identity);
|
||||
curlx_safefree(digest->user);
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
}
|
||||
if(creds)
|
||||
Curl_creds_link(&digest->creds, creds);
|
||||
|
||||
/* Acquire our credentials handle */
|
||||
status = Curl_pSecFn->AcquireCredentialsHandle(NULL,
|
||||
|
|
@ -649,8 +627,7 @@ void Curl_auth_digest_cleanup(struct digestdata *digest)
|
|||
}
|
||||
|
||||
/* Free the copy of user/passwd used to make the identity for http_context */
|
||||
curlx_safefree(digest->user);
|
||||
curlx_safefree(digest->passwd);
|
||||
Curl_creds_unlink(&digest->creds);
|
||||
}
|
||||
|
||||
#endif /* USE_WINDOWS_SSPI && !CURL_DISABLE_DIGEST_AUTH */
|
||||
|
|
|
|||
|
|
@ -54,15 +54,14 @@ bool Curl_auth_gsasl_is_supported(struct Curl_easy *data,
|
|||
}
|
||||
|
||||
CURLcode Curl_auth_gsasl_start(struct Curl_easy *data,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
struct gsasldata *gsasl)
|
||||
{
|
||||
#if GSASL_VERSION_NUMBER >= 0x010b00
|
||||
int res;
|
||||
res =
|
||||
#endif
|
||||
gsasl_property_set(gsasl->client, GSASL_AUTHID, userp);
|
||||
gsasl_property_set(gsasl->client, GSASL_AUTHID, creds->user);
|
||||
#if GSASL_VERSION_NUMBER >= 0x010b00
|
||||
if(res != GSASL_OK) {
|
||||
failf(data, "setting AUTHID failed: %s", gsasl_strerror(res));
|
||||
|
|
@ -73,7 +72,7 @@ CURLcode Curl_auth_gsasl_start(struct Curl_easy *data,
|
|||
#if GSASL_VERSION_NUMBER >= 0x010b00
|
||||
res =
|
||||
#endif
|
||||
gsasl_property_set(gsasl->client, GSASL_PASSWORD, passwdp);
|
||||
gsasl_property_set(gsasl->client, GSASL_PASSWORD, creds->passwd);
|
||||
#if GSASL_VERSION_NUMBER >= 0x010b00
|
||||
if(res != GSASL_OK) {
|
||||
failf(data, "setting PASSWORD failed: %s", gsasl_strerror(res));
|
||||
|
|
|
|||
|
|
@ -74,8 +74,7 @@ bool Curl_auth_is_gssapi_supported(void)
|
|||
* Returns CURLE_OK on success.
|
||||
*/
|
||||
CURLcode Curl_auth_create_gssapi_user_message(struct Curl_easy *data,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
const char *service,
|
||||
const char *host,
|
||||
const bool mutual_auth,
|
||||
|
|
@ -90,8 +89,7 @@ CURLcode Curl_auth_create_gssapi_user_message(struct Curl_easy *data,
|
|||
gss_buffer_desc input_token = GSS_C_EMPTY_BUFFER;
|
||||
gss_buffer_desc output_token = GSS_C_EMPTY_BUFFER;
|
||||
|
||||
(void)userp;
|
||||
(void)passwdp;
|
||||
(void)creds;
|
||||
|
||||
if(!krb5->spn) {
|
||||
gss_buffer_desc spn_token = GSS_C_EMPTY_BUFFER;
|
||||
|
|
|
|||
|
|
@ -79,8 +79,7 @@ bool Curl_auth_is_gssapi_supported(void)
|
|||
* Returns CURLE_OK on success.
|
||||
*/
|
||||
CURLcode Curl_auth_create_gssapi_user_message(struct Curl_easy *data,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
const char *service,
|
||||
const char *host,
|
||||
const bool mutual_auth,
|
||||
|
|
@ -128,9 +127,10 @@ CURLcode Curl_auth_create_gssapi_user_message(struct Curl_easy *data,
|
|||
|
||||
if(!krb5->credentials) {
|
||||
/* Do we have credentials to use or are we using single sign-on? */
|
||||
if(userp && *userp) {
|
||||
if(Curl_creds_has_user(creds)) {
|
||||
/* Populate our identity structure */
|
||||
result = Curl_create_sspi_identity(userp, passwdp, &krb5->identity);
|
||||
result = Curl_create_sspi_identity(
|
||||
creds->user, creds->passwd, &krb5->identity);
|
||||
if(result)
|
||||
return result;
|
||||
|
||||
|
|
|
|||
|
|
@ -421,8 +421,7 @@ static void unicodecpy(unsigned char *dest, const char *src, size_t length)
|
|||
* Returns CURLE_OK on success.
|
||||
*/
|
||||
CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
const char *service,
|
||||
const char *host,
|
||||
struct ntlmdata *ntlm,
|
||||
|
|
@ -453,8 +452,7 @@ CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
|
|||
size_t domoff = hostoff + hostlen; /* This is 0: remember that host and
|
||||
domain are empty */
|
||||
(void)data;
|
||||
(void)userp;
|
||||
(void)passwdp;
|
||||
(void)creds;
|
||||
(void)service;
|
||||
(void)host;
|
||||
|
||||
|
|
@ -542,8 +540,7 @@ CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
|
|||
* Returns CURLE_OK on success.
|
||||
*/
|
||||
CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
struct ntlmdata *ntlm,
|
||||
struct bufref *out)
|
||||
{
|
||||
|
|
@ -579,6 +576,8 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
|
|||
/* The fixed hostname we provide, in order to not leak our real local host
|
||||
name. Copy the name used by Firefox. */
|
||||
static const char host[] = "WORKSTATION";
|
||||
const char *userp = Curl_creds_user(creds);
|
||||
const char *passwdp = Curl_creds_passwd(creds);
|
||||
const char *user;
|
||||
const char *domain = "";
|
||||
size_t hostoff = 0;
|
||||
|
|
|
|||
|
|
@ -76,8 +76,7 @@ bool Curl_auth_is_ntlm_supported(void)
|
|||
* Returns CURLE_OK on success.
|
||||
*/
|
||||
CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
const char *service,
|
||||
const char *host,
|
||||
struct ntlmdata *ntlm,
|
||||
|
|
@ -111,11 +110,12 @@ CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
|
|||
if(!ntlm->output_token)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
|
||||
if(userp && *userp) {
|
||||
if(Curl_creds_has_user(creds)) {
|
||||
CURLcode result;
|
||||
|
||||
/* Populate our identity structure */
|
||||
result = Curl_create_sspi_identity(userp, passwdp, &ntlm->identity);
|
||||
result = Curl_create_sspi_identity(
|
||||
creds->user, creds->passwd, &ntlm->identity);
|
||||
if(result)
|
||||
return result;
|
||||
|
||||
|
|
@ -227,8 +227,7 @@ CURLcode Curl_auth_decode_ntlm_type2_message(struct Curl_easy *data,
|
|||
* Returns CURLE_OK on success.
|
||||
*/
|
||||
CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
struct ntlmdata *ntlm,
|
||||
struct bufref *out)
|
||||
{
|
||||
|
|
@ -240,8 +239,7 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
|
|||
SECURITY_STATUS status;
|
||||
unsigned long attrs;
|
||||
|
||||
(void)passwdp;
|
||||
(void)userp;
|
||||
(void)creds;
|
||||
|
||||
/* Setup the type-2 "input" security buffer */
|
||||
type_2_desc.ulVersion = SECBUFFER_VERSION;
|
||||
|
|
|
|||
|
|
@ -47,21 +47,22 @@
|
|||
*
|
||||
* Returns CURLE_OK on success.
|
||||
*/
|
||||
CURLcode Curl_auth_create_oauth_bearer_message(const char *user,
|
||||
CURLcode Curl_auth_create_oauth_bearer_message(struct Curl_creds *creds,
|
||||
const char *host,
|
||||
const long port,
|
||||
const char *bearer,
|
||||
struct bufref *out)
|
||||
{
|
||||
char *oauth;
|
||||
|
||||
/* Generate the message */
|
||||
if(port == 0 || port == 80)
|
||||
oauth = curl_maprintf("n,a=%s,\1host=%s\1auth=Bearer %s\1\1", user, host,
|
||||
bearer);
|
||||
oauth = curl_maprintf("n,a=%s,\1host=%s\1auth=Bearer %s\1\1",
|
||||
Curl_creds_user(creds), host,
|
||||
Curl_creds_oauth_bearer(creds));
|
||||
else
|
||||
oauth = curl_maprintf("n,a=%s,\1host=%s\1port=%ld\1auth=Bearer %s\1\1",
|
||||
user, host, port, bearer);
|
||||
Curl_creds_user(creds), host, port,
|
||||
Curl_creds_oauth_bearer(creds));
|
||||
if(!oauth)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
|
||||
|
|
@ -83,12 +84,13 @@ CURLcode Curl_auth_create_oauth_bearer_message(const char *user,
|
|||
*
|
||||
* Returns CURLE_OK on success.
|
||||
*/
|
||||
CURLcode Curl_auth_create_xoauth_bearer_message(const char *user,
|
||||
const char *bearer,
|
||||
CURLcode Curl_auth_create_xoauth_bearer_message(struct Curl_creds *creds,
|
||||
struct bufref *out)
|
||||
{
|
||||
/* Generate the message */
|
||||
char *xoauth = curl_maprintf("user=%s\1auth=Bearer %s\1\1", user, bearer);
|
||||
char *xoauth = curl_maprintf("user=%s\1auth=Bearer %s\1\1",
|
||||
Curl_creds_user(creds),
|
||||
Curl_creds_oauth_bearer(creds));
|
||||
if(!xoauth)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
|
||||
|
|
|
|||
|
|
@ -70,8 +70,7 @@ bool Curl_auth_is_spnego_supported(void)
|
|||
* Returns CURLE_OK on success.
|
||||
*/
|
||||
CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
|
||||
const char *user,
|
||||
const char *password,
|
||||
struct Curl_creds *creds,
|
||||
const char *service,
|
||||
const char *host,
|
||||
const char *chlg64,
|
||||
|
|
@ -90,8 +89,7 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
|
|||
struct gss_channel_bindings_struct chan;
|
||||
#endif
|
||||
|
||||
(void)user;
|
||||
(void)password;
|
||||
(void)creds;
|
||||
|
||||
if(nego->context && nego->status == GSS_S_COMPLETE) {
|
||||
/* We finished successfully our part of authentication, but server
|
||||
|
|
|
|||
|
|
@ -78,8 +78,7 @@ bool Curl_auth_is_spnego_supported(void)
|
|||
* Returns CURLE_OK on success.
|
||||
*/
|
||||
CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
|
||||
const char *user,
|
||||
const char *password,
|
||||
struct Curl_creds *creds,
|
||||
const char *service,
|
||||
const char *host,
|
||||
const char *chlg64,
|
||||
|
|
@ -133,9 +132,10 @@ CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
|
|||
|
||||
if(!nego->credentials) {
|
||||
/* Do we have credentials to use or are we using single sign-on? */
|
||||
if(user && *user) {
|
||||
if(Curl_creds_has_user(creds)) {
|
||||
/* Populate our identity structure */
|
||||
result = Curl_create_sspi_identity(user, password, &nego->identity);
|
||||
result = Curl_create_sspi_identity(creds->user, creds->passwd,
|
||||
&nego->identity);
|
||||
if(result)
|
||||
return result;
|
||||
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
#include "curl_setup.h"
|
||||
|
||||
#include "vauth/vauth.h"
|
||||
#include "creds.h"
|
||||
#include "curlx/multibyte.h"
|
||||
#include "url.h"
|
||||
|
||||
|
|
@ -111,15 +112,16 @@ TCHAR *Curl_auth_build_spn(const char *service, const char *host,
|
|||
*
|
||||
* Returns TRUE on success; otherwise FALSE.
|
||||
*/
|
||||
bool Curl_auth_user_contains_domain(const char *user)
|
||||
bool Curl_auth_user_contains_domain(struct Curl_creds *creds)
|
||||
{
|
||||
bool valid = FALSE;
|
||||
|
||||
if(user && *user) {
|
||||
if(Curl_creds_has_user(creds)) {
|
||||
/* Check we have a domain name or UPN present */
|
||||
const char *p = strpbrk(user, "\\/@");
|
||||
const char *p = strpbrk(creds->user, "\\/@");
|
||||
|
||||
valid = (p != NULL && p > user && p < user + strlen(user) - 1);
|
||||
valid = (p != NULL) && (p > creds->user) &&
|
||||
(p < (creds->user + strlen(creds->user) - 1));
|
||||
}
|
||||
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
|
||||
else
|
||||
|
|
@ -133,14 +135,12 @@ bool Curl_auth_user_contains_domain(const char *user)
|
|||
|
||||
/*
|
||||
* Curl_auth_allowed_to_host() tells if authentication, cookies or other
|
||||
* "sensitive data" can (still) be sent to this host.
|
||||
* "sensitive data" can be sent to the connection's origin.
|
||||
*/
|
||||
bool Curl_auth_allowed_to_host(struct Curl_easy *data)
|
||||
{
|
||||
return !data->state.this_is_a_follow ||
|
||||
data->set.allow_auth_to_other_hosts ||
|
||||
(data->state.first_origin &&
|
||||
Curl_peer_equal(data->state.first_origin, data->conn->origin));
|
||||
return data->set.allow_auth_to_other_hosts ||
|
||||
Curl_peer_equal(data->state.initial_origin, data->conn->origin);
|
||||
}
|
||||
|
||||
#ifdef USE_NTLM
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
#include "urldata.h"
|
||||
|
||||
struct Curl_easy;
|
||||
struct Curl_creds;
|
||||
struct connectdata;
|
||||
|
||||
#ifndef CURL_DISABLE_DIGEST_AUTH
|
||||
|
|
@ -69,12 +70,10 @@ TCHAR *Curl_auth_build_spn(const char *service, const char *host,
|
|||
#endif
|
||||
|
||||
/* This is used to test if the user contains a Windows domain name */
|
||||
bool Curl_auth_user_contains_domain(const char *user);
|
||||
bool Curl_auth_user_contains_domain(struct Curl_creds *creds);
|
||||
|
||||
/* This is used to generate a PLAIN cleartext message */
|
||||
CURLcode Curl_auth_create_plain_message(const char *authzid,
|
||||
const char *authcid,
|
||||
const char *passwd,
|
||||
CURLcode Curl_auth_create_plain_message(struct Curl_creds *creds,
|
||||
struct bufref *out);
|
||||
|
||||
/* This is used to generate a LOGIN cleartext message */
|
||||
|
|
@ -86,8 +85,7 @@ void Curl_auth_create_external_message(const char *user, struct bufref *out);
|
|||
#ifndef CURL_DISABLE_DIGEST_AUTH
|
||||
/* This is used to generate a CRAM-MD5 response message */
|
||||
CURLcode Curl_auth_create_cram_md5_message(const struct bufref *chlg,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
struct bufref *out);
|
||||
|
||||
/* This is used to evaluate if DIGEST is supported */
|
||||
|
|
@ -96,8 +94,7 @@ bool Curl_auth_is_digest_supported(void);
|
|||
/* This is used to generate a base64 encoded DIGEST-MD5 response message */
|
||||
CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data,
|
||||
const struct bufref *chlg,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
const char *service,
|
||||
struct bufref *out);
|
||||
|
||||
|
|
@ -107,8 +104,7 @@ CURLcode Curl_auth_decode_digest_http_message(const char *chlg,
|
|||
|
||||
/* This is used to generate an HTTP DIGEST response message */
|
||||
CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
const unsigned char *request,
|
||||
const unsigned char *uripath,
|
||||
struct digestdata *digest,
|
||||
|
|
@ -140,8 +136,7 @@ bool Curl_auth_gsasl_is_supported(struct Curl_easy *data,
|
|||
struct gsasldata *gsasl);
|
||||
/* This is used to start a gsasl method */
|
||||
CURLcode Curl_auth_gsasl_start(struct Curl_easy *data,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
struct gsasldata *gsasl);
|
||||
|
||||
/* This is used to process and generate a new SASL token */
|
||||
|
|
@ -197,8 +192,7 @@ void Curl_auth_cleanup_ntlm(struct ntlmdata *ntlm);
|
|||
|
||||
/* This is used to generate a base64 encoded NTLM type-1 message */
|
||||
CURLcode Curl_auth_create_ntlm_type1_message(struct Curl_easy *data,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
const char *service,
|
||||
const char *host,
|
||||
struct ntlmdata *ntlm,
|
||||
|
|
@ -211,8 +205,7 @@ CURLcode Curl_auth_decode_ntlm_type2_message(struct Curl_easy *data,
|
|||
|
||||
/* This is used to generate a base64 encoded NTLM type-3 message */
|
||||
CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
struct ntlmdata *ntlm,
|
||||
struct bufref *out);
|
||||
|
||||
|
|
@ -221,15 +214,13 @@ CURLcode Curl_auth_create_ntlm_type3_message(struct Curl_easy *data,
|
|||
#endif /* USE_NTLM */
|
||||
|
||||
/* This is used to generate a base64 encoded OAuth 2.0 message */
|
||||
CURLcode Curl_auth_create_oauth_bearer_message(const char *user,
|
||||
CURLcode Curl_auth_create_oauth_bearer_message(struct Curl_creds *creds,
|
||||
const char *host,
|
||||
const long port,
|
||||
const char *bearer,
|
||||
struct bufref *out);
|
||||
|
||||
/* This is used to generate a base64 encoded XOAuth 2.0 message */
|
||||
CURLcode Curl_auth_create_xoauth_bearer_message(const char *user,
|
||||
const char *bearer,
|
||||
CURLcode Curl_auth_create_xoauth_bearer_message(struct Curl_creds *creds,
|
||||
struct bufref *out);
|
||||
|
||||
#ifdef USE_KERBEROS5
|
||||
|
|
@ -260,8 +251,7 @@ bool Curl_auth_is_gssapi_supported(void);
|
|||
/* This is used to generate a base64 encoded GSSAPI (Kerberos V5) user token
|
||||
message */
|
||||
CURLcode Curl_auth_create_gssapi_user_message(struct Curl_easy *data,
|
||||
const char *userp,
|
||||
const char *passwdp,
|
||||
struct Curl_creds *creds,
|
||||
const char *service,
|
||||
const char *host,
|
||||
const bool mutual_auth,
|
||||
|
|
@ -330,8 +320,7 @@ Curl_auth_nego_get(struct connectdata *conn, bool proxy);
|
|||
/* This is used to decode a base64 encoded SPNEGO (Negotiate) challenge
|
||||
message */
|
||||
CURLcode Curl_auth_decode_spnego_message(struct Curl_easy *data,
|
||||
const char *user,
|
||||
const char *password,
|
||||
struct Curl_creds *creds,
|
||||
const char *service,
|
||||
const char *host,
|
||||
const char *chlg64,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue