}
}
-static void auth_fields_import_prefixed_args(struct auth_fields *fields,
- const char *prefix,
- const char *const *args,
- enum auth_field_flags flags)
+static int auth_fields_import_prefixed_args(struct auth_fields *fields,
+ const char *prefix,
+ const char *const *args,
+ enum auth_field_flags flags)
{
const char *key, *value;
+ int ret = 0;
for (; *args != NULL; args++) {
value = strchr(*args, '=');
if (*prefix != '\0')
key = t_strconcat(prefix, key, NULL);
}
+ if (key[0] == '\0')
+ ret = -1;
auth_fields_add(fields, key, value, flags);
}
+ return ret;
}
-void auth_fields_import_prefixed(struct auth_fields *fields, const char *prefix,
- const char *str, enum auth_field_flags flags)
+int auth_fields_import_prefixed(struct auth_fields *fields, const char *prefix,
+ const char *str, enum auth_field_flags flags)
{
+ int ret;
T_BEGIN {
const char *const *arg = t_strsplit_tabescaped(str);
- auth_fields_import_prefixed_args(fields, prefix, arg, flags);
+ ret = auth_fields_import_prefixed_args(fields, prefix, arg, flags);
} T_END;
+ return ret;
}
-void auth_fields_import_args(struct auth_fields *fields,
- const char *const *args,
- enum auth_field_flags flags)
+int auth_fields_import_args(struct auth_fields *fields,
+ const char *const *args,
+ enum auth_field_flags flags)
{
+ int ret;
T_BEGIN {
- auth_fields_import_prefixed_args(fields, "", args, flags);
+ ret = auth_fields_import_prefixed_args(fields, "", args, flags);
} T_END;
+ return ret;
}
const ARRAY_TYPE(auth_field) *auth_fields_export(struct auth_fields *fields)
const char *auth_fields_find(struct auth_fields *fields, const char *key);
bool auth_fields_exists(struct auth_fields *fields, const char *key);
-void auth_fields_import_args(struct auth_fields *fields,
- const char *const *args,
- enum auth_field_flags flags);
-void auth_fields_import_prefixed(struct auth_fields *fields, const char *prefix,
- const char *str, enum auth_field_flags flags);
+int auth_fields_import_args(struct auth_fields *fields,
+ const char *const *args,
+ enum auth_field_flags flags);
+int auth_fields_import_prefixed(struct auth_fields *fields, const char *prefix,
+ const char *str, enum auth_field_flags flags);
const ARRAY_TYPE(auth_field) *auth_fields_export(struct auth_fields *fields);
/* Append fields where (flag & flags_mask) == flags_result. */
void auth_fields_append(struct auth_fields *fields, string_t *dest,
fields->client_id = p_strdup(request->pool, value);
event_add_str(event, "client_id", value);
} else if (strcmp(key, "forward_fields") == 0) {
- auth_fields_import_prefixed(fields->extra_fields,
- "forward_", value, 0);
+ if (auth_fields_import_prefixed(fields->extra_fields,
+ "forward_", value, 0) < 0) {
+ e_error(request->event,
+ "Invalid forward_fields: %s", value);
+ }
/* make sure the forward_ fields aren't deleted by
auth_fields_rollback() if the first passdb lookup fails. */
auth_fields_snapshot(fields->extra_fields);
}
if (args != NULL && args[0] != NULL && *args[0] != '\0') {
- auth_fields_import_args(request->fields.userdb_reply, args, 0);
+ if (auth_fields_import_args(request->fields.userdb_reply,
+ args, 0) < 0) {
+ e_error(authdb_event(request),
+ "BUG: auth-worker sent invalid args");
+ }
if (auth_fields_exists(request->fields.userdb_reply, "tempfail"))
request->userdb_lookup_tempfailed = TRUE;
}