digest_auth_check(): added support for username in extended notation

This commit is contained in:
Evgeny Grin (Karlson2k)
2022-07-21 15:07:06 +03:00
parent e1e5a39568
commit b528bec9c1
+36 -3
View File
@@ -1937,8 +1937,15 @@ digest_auth_check_all_inner (struct MHD_Connection *connection,
return MHD_DAUTH_WRONG_HEADER;
/* ** A quick check for presence of all required parameters ** */
if (NULL == params->username.value.str)
if ((NULL == params->username.value.str) &&
(NULL == params->username_ext.value.str))
return MHD_DAUTH_WRONG_HEADER;
else if ((NULL != params->username.value.str) &&
(NULL != params->username_ext.value.str))
return MHD_DAUTH_WRONG_HEADER; /* Parameters cannot be used together */
else if ((NULL != params->username_ext.value.str) &&
(MHD_DAUTH_EXT_PARAM_MIN_LEN > params->username_ext.value.len))
return MHD_DAUTH_WRONG_HEADER; /* Broken extended notation */
if (NULL == params->realm.value.str)
return MHD_DAUTH_WRONG_HEADER;
@@ -1989,8 +1996,34 @@ digest_auth_check_all_inner (struct MHD_Connection *connection,
/* Check 'username' */
username_len = strlen (username);
if (! is_param_equal (&params->username, username, username_len))
return MHD_DAUTH_WRONG_USERNAME;
if (NULL != params->username.value.str)
{ /* Username in standard notation */
if (! is_param_equal (&params->username, username, username_len))
return MHD_DAUTH_WRONG_USERNAME;
}
else
{ /* Username in extended notation */
char *r_uname;
size_t buf_size = params->username_ext.value.len;
ssize_t res;
mhd_assert (NULL != params->username_ext.value.str);
mhd_assert (MHD_DAUTH_EXT_PARAM_MIN_LEN <= buf_size); /* It was checked already */
buf_size += 1; /* For zero-termination */
buf_size -= MHD_DAUTH_EXT_PARAM_MIN_LEN;
r_uname = get_buffer_for_size (tmp1, ptmp2, &tmp2_size, buf_size);
if (NULL == r_uname)
return (_MHD_AUTH_DIGEST_MAX_PARAM_SIZE < buf_size) ?
MHD_DAUTH_TOO_LARGE : MHD_DAUTH_ERROR;
res = get_rq_extended_uname_copy_z (params->username_ext.value.str,
params->username_ext.value.len,
r_uname, buf_size);
if (0 > res)
return MHD_DAUTH_WRONG_HEADER; /* Broken extended notation */
if ((username_len != (size_t) res) ||
(0 != memcmp (username, r_uname, username_len)))
return MHD_DAUTH_WRONG_USERNAME;
}
/* 'username' valid */
/* Check 'realm' */