Author: brane
Date: Thu Jun 26 01:43:39 2025
New Revision: 1926727
URL: http://svn.apache.org/viewvc?rev=1926727&view=rev
Log:
On the user-defined-authn branch: Parse Basid and Digest parameters
with the new parser.
* auth/auth_basic.c
(serf__handle_basic_auth): Create a scratch pool and use it with
serf__parse_authn_parameters to parse the parameters.
* auth/auth_digest.c
(serf__handle_digest_auth): Likewise.
Modified:
serf/branches/user-defined-authn/auth/auth_basic.c
serf/branches/user-defined-authn/auth/auth_digest.c
Modified: serf/branches/user-defined-authn/auth/auth_basic.c
URL:
http://svn.apache.org/viewvc/serf/branches/user-defined-authn/auth/auth_basic.c?rev=1926727&r1=1926726&r2=1926727&view=diff
==============================================================================
--- serf/branches/user-defined-authn/auth/auth_basic.c (original)
+++ serf/branches/user-defined-authn/auth/auth_basic.c Thu Jun 26 01:43:39 2025
@@ -52,9 +52,10 @@ serf__handle_basic_auth(const serf__auth
serf__authn_info_t *authn_info;
basic_authn_info_t *basic_info;
apr_status_t status;
- apr_pool_t *cred_pool;
- char *username, *password, *realm_name;
- const char *eq, *realm = NULL;
+ apr_pool_t *scratch_pool;
+ apr_hash_t *attr_dict;
+ char *username, *password;
+ const char *realm_name, *realm = NULL;
/* Can't do Basic authentication if there's no callback to get
username & password. */
@@ -69,45 +70,32 @@ serf__handle_basic_auth(const serf__auth
}
basic_info = authn_info->baton;
- realm_name = NULL;
- eq = strchr(auth_attr, '=');
-
- if (eq && strncasecmp(auth_attr, "realm", 5) == 0) {
- realm_name = apr_pstrdup(pool, eq + 1);
- if (realm_name[0] == '\"') {
- apr_size_t realm_len;
-
- realm_len = strlen(realm_name);
- if (realm_name[realm_len - 1] == '\"') {
- realm_name[realm_len - 1] = '\0';
- realm_name++;
- }
- }
-
- if (!realm_name) {
- return SERF_ERROR_AUTHN_MISSING_ATTRIBUTE;
- }
-
- realm = serf__construct_realm(SERF__PEER_FROM_CODE(code),
- conn, realm_name,
- pool);
+ /* Construct the realm from the parameters */
+ apr_pool_create(&scratch_pool, pool);
+ attr_dict = serf__parse_authn_parameters(auth_attr, scratch_pool);
+ realm_name = apr_hash_get(attr_dict, "realm", 5);
+ if (!realm_name) {
+ apr_pool_destroy(scratch_pool);
+ return SERF_ERROR_AUTHN_MISSING_ATTRIBUTE;
}
+ realm = serf__construct_realm(code == 401 ? HOST : PROXY,
+ conn, realm_name,
+ pool);
/* Ask the application for credentials */
- apr_pool_create(&cred_pool, pool);
status = serf__provide_credentials(ctx,
&username, &password,
request,
code, scheme->name,
- realm, cred_pool);
+ realm, scratch_pool);
if (status) {
- apr_pool_destroy(cred_pool);
+ apr_pool_destroy(scratch_pool);
return status;
}
tmp = apr_pstrcat(conn->pool, username, ":", password, NULL);
tmp_len = strlen(tmp);
- apr_pool_destroy(cred_pool);
+ apr_pool_destroy(scratch_pool);
serf__encode_auth_header(&basic_info->value,
scheme->name,
Modified: serf/branches/user-defined-authn/auth/auth_digest.c
URL:
http://svn.apache.org/viewvc/serf/branches/user-defined-authn/auth/auth_digest.c?rev=1926727&r1=1926726&r2=1926727&view=diff
==============================================================================
--- serf/branches/user-defined-authn/auth/auth_digest.c (original)
+++ serf/branches/user-defined-authn/auth/auth_digest.c Thu Jun 26 01:43:39 2025
@@ -242,20 +242,18 @@ serf__handle_digest_auth(const serf__aut
const char *auth_attr,
apr_pool_t *pool)
{
- char *attrs;
- char *nextkv;
const char *realm, *realm_name = NULL;
const char *nonce = NULL;
const char *algorithm = NULL;
const char *qop = NULL;
const char *opaque = NULL;
- const char *key;
serf_connection_t *conn = request->conn;
serf_context_t *ctx = conn->ctx;
serf__authn_info_t *authn_info;
digest_authn_info_t *digest_info;
apr_status_t status;
- apr_pool_t *cred_pool;
+ apr_hash_t *auth_params;
+ apr_pool_t *scratch_pool;
char *username, *password;
/* Can't do Digest authentication if there's no callback to get
@@ -271,50 +269,22 @@ serf__handle_digest_auth(const serf__aut
}
digest_info = authn_info->baton;
- /* Need a copy cuz we're going to write NUL characters into the string. */
- attrs = apr_pstrdup(pool, auth_attr);
-
/* We're expecting a list of key=value pairs, separated by a comma.
Ex. realm="SVN Digest",
nonce="f+zTl/leBAA=e371bd3070adfb47b21f5fc64ad8cc21adc371a5",
algorithm=MD5, qop="auth" */
- for ( ; (key = apr_strtok(attrs, ",", &nextkv)) != NULL; attrs = NULL) {
- char *val;
-
- val = strchr(key, '=');
- if (val == NULL)
- continue;
- *val++ = '\0';
-
- /* skip leading spaces */
- while (*key == ' ')
- key++;
-
- /* If the value is quoted, then remove the quotes. */
- if (*val == '"') {
- apr_size_t last = strlen(val) - 1;
-
- if (val[last] == '"') {
- val[last] = '\0';
- val++;
- }
- }
-
- if (strcmp(key, "realm") == 0)
- realm_name = val;
- else if (strcmp(key, "nonce") == 0)
- nonce = val;
- else if (strcmp(key, "algorithm") == 0)
- algorithm = val;
- else if (strcmp(key, "qop") == 0)
- qop = val;
- else if (strcmp(key, "opaque") == 0)
- opaque = val;
+ apr_pool_create(&scratch_pool, pool);
+ auth_params = serf__parse_authn_parameters(auth_attr, scratch_pool);
+ realm_name = apr_hash_get(auth_params, "realm", 5);
+ nonce = apr_hash_get(auth_params, "nonce", 5);
+ algorithm = apr_hash_get(auth_params, "algorithm", 9);
+ qop = apr_hash_get(auth_params, "qop", 3);
+ opaque = apr_hash_get(auth_params, "opaque", 6);
- /* Ignore all unsupported attributes. */
- }
+ /* Ignore all unsupported attributes. */
if (!realm_name) {
+ apr_pool_destroy(scratch_pool);
return SERF_ERROR_AUTHN_MISSING_ATTRIBUTE;
}
@@ -323,14 +293,13 @@ serf__handle_digest_auth(const serf__aut
pool);
/* Ask the application for credentials */
- apr_pool_create(&cred_pool, pool);
status = serf__provide_credentials(ctx,
&username, &password,
request,
code, scheme->name,
- realm, cred_pool);
+ realm, scratch_pool);
if (status) {
- apr_pool_destroy(cred_pool);
+ apr_pool_destroy(scratch_pool);
return status;
}
@@ -355,7 +324,7 @@ serf__handle_digest_auth(const serf__aut
status = build_digest_ha1(&digest_info->ha1, username, password,
digest_info->realm, digest_info->pool);
- apr_pool_destroy(cred_pool);
+ apr_pool_destroy(scratch_pool);
/* If the handshake is finished tell serf it can send as much requests as
it
likes. */