/* Linear whitespace */
#define IS_LWS(c) ((c) == ' ' || (c) == '\t')
-bool auth_digest_parse_keyvalue(char **data, char **key_r, char **value_r)
+bool auth_digest_parse_keyvalue(char **data, const char **key_r,
+ const char **value_r)
{
/* @UNSAFE */
- char *p, *dest;
+ char *p, *dest, *key, *value;
p = *data;
while (IS_LWS(*p)) p++;
/* get key */
- *key_r = p;
+ key = p;
while (*p != '\0' && *p != '=' && *p != ',')
p++;
return FALSE;
}
- *value_r = p+1;
+ value = p+1;
/* skip trailing whitespace in key */
while (p > *data && IS_LWS(p[-1]))
*p = '\0';
/* get value */
- p = *value_r;
+ p = value;
while (IS_LWS(*p)) p++;
if (*p != '"') {
*p = '\0';
} else {
/* quoted string */
- *value_r = dest = ++p;
+ value = dest = ++p;
while (*p != '\0' && *p != '"') {
if (*p == '\\' && p[1] != '\0')
p++;
*dest = '\0';
}
+ *key_r = str_lcase(key);
+ *value_r = value;
return TRUE;
}
* Parsing
*/
-bool auth_digest_parse_keyvalue(char **data, char **key_r, char **value_r);
+bool auth_digest_parse_keyvalue(char **data, const char **key_r,
+ const char **value_r);
/*
* Processing
static bool
auth_handle_response(struct digest_auth_request *request,
- char *key, char *value, const char **error_r)
+ const char *key, const char *value, const char **error_r)
{
struct sasl_server_mech_request *auth_request = &request->auth_request;
unsigned int i;
- (void)str_lcase(key);
-
if (strcmp(key, "realm") == 0) {
if (auth_request->realm == NULL && *value != '\0')
sasl_server_request_set_realm(auth_request, value);
const char **error_r)
{
struct sasl_server_mech_request *auth_request = &request->auth_request;
- char *copy, *key, *value;
+ char *copy;
bool failed;
/*
potential problems with NUL characters in strings. */
copy = t_strdup_noconst(t_strndup(data, size));
while (*copy != '\0') {
+ const char *key, *value;
+
if (auth_digest_parse_keyvalue(©, &key, &value)) {
if (!auth_handle_response(request, key, value,
error_r)) {