auth_request_unref(&request);
}
+static int
+auth_request_fields_var_expand_lookup(const char *data, void *context,
+ const char **value_r,
+ const char **error_r ATTR_UNUSED)
+{
+ struct auth_fields *fields = context;
+ *value_r = NULL;
+
+ const char *default_value = strchr(data, ':');
+ if (default_value == NULL) {
+ if (fields != NULL)
+ *value_r = auth_fields_find(fields, data);
+ else
+ *value_r = "";
+ return 1;
+ }
+ /* If the fields are not initialized do not try to find fields. */
+ if (fields != NULL)
+ *value_r = auth_fields_find(fields,
+ t_strdup_until(data, default_value));
+ default_value++;
+ if (*value_r == NULL)
+ *value_r = default_value;
+ return 1;
+}
+
+int auth_request_set_passdb_fields(struct auth_request *request,
+ struct auth_fields *fields)
+{
+ struct event *event = event_create(authdb_event(request));
+ const struct auth_passdb_post_settings *post_set;
+ const char *error;
+
+ const char *driver_name =
+ t_str_replace(request->passdb->passdb->iface.name, '-', '_');
+ struct var_expand_func_table auth_request_fields_funcs[] = {
+ { driver_name, auth_request_fields_var_expand_lookup },
+ { NULL, NULL }
+ };
+
+ event_set_ptr(event, SETTINGS_EVENT_VAR_EXPAND_FUNC_TABLE,
+ auth_request_fields_funcs);
+ event_set_ptr(event, SETTINGS_EVENT_VAR_EXPAND_FUNC_CONTEXT, fields);
+
+ if (settings_get(event, &auth_passdb_post_setting_parser_info, 0,
+ &post_set, &error) < 0) {
+ e_error(event, "%s", error);
+ event_unref(&event);
+ return -1;
+ }
+ auth_request_set_strlist(request, &post_set->fields,
+ STATIC_PASS_SCHEME);
+ settings_free(post_set);
+ event_unref(&event);
+ return 0;
+}
+
+int auth_request_set_userdb_fields(struct auth_request *request,
+ struct auth_fields *fields)
+{
+ struct event *event = event_create(authdb_event(request));
+ const struct auth_userdb_post_settings *post_set;
+ const char *error;
+
+ const char *driver_name =
+ t_str_replace(request->userdb->userdb->iface->name, '-', '_');
+ struct var_expand_func_table auth_request_fields_funcs[] = {
+ { driver_name, auth_request_fields_var_expand_lookup },
+ { NULL, NULL }
+ };
+
+ event_set_ptr(event, SETTINGS_EVENT_VAR_EXPAND_FUNC_TABLE,
+ auth_request_fields_funcs);
+ event_set_ptr(event, SETTINGS_EVENT_VAR_EXPAND_FUNC_CONTEXT, fields);
+
+ if (settings_get(event, &auth_userdb_post_setting_parser_info, 0,
+ &post_set, &error) < 0) {
+ e_error(event, "%s", error);
+ event_unref(&event);
+ return -1;
+ }
+ auth_request_set_userdb_strlist(request, &post_set->fields);
+ settings_free(post_set);
+ event_unref(&event);
+ return 0;
+}
+
static int auth_request_set_default_fields(struct auth_request *request)
{
struct event *event = authdb_event(request);
const struct auth_passdb_post_settings *post_set;
const char *error;
+ if (request->passdb->passdb->iface.fields_supported) {
+ /* passdb_fields was already processed. It may be referring to
+ %{driver:*} fields that are not available currently, so just
+ skip processing the passdb_override_fields. This setting
+ will go away anyway once all passdbs are converted to use
+ fields. */
+ return 0;
+ }
+
if (settings_get(event, &auth_passdb_post_setting_parser_info, 0,
&post_set, &error) < 0) {
e_error(event, "%s", error);
const struct auth_userdb_post_settings *post_set;
const char *error;
+ if (request->userdb->userdb->iface->fields_supported) {
+ /* userdb_fields was already processed. It may be referring to
+ %{driver:*} fields that are not available currently, so just
+ skip processing the userdb_override_fields. This setting
+ will go away anyway once all userdbs are converted to use
+ fields. */
+ return 0;
+ }
+
+
if (settings_get(event, &auth_userdb_post_setting_parser_info, 0,
&post_set, &error) < 0) {
e_error(event, "%s", error);
DEF(STR, name),
DEF(STR, driver),
DEF(STR_NOVARS, args),
+ DEF(BOOL, fields_import_all),
DEF(BOOLLIST, mechanisms),
DEF(STR, username_filter),
.name = "",
.driver = "",
.args = "",
+ .fields_import_all = TRUE,
.mechanisms = ARRAY_INIT,
.username_filter = "",
};
static const struct setting_define auth_passdb_post_setting_defines[] = {
+ { .type = SET_STRLIST, .key = "passdb_fields",
+ .offset = offsetof(struct auth_passdb_post_settings, fields) },
{ .type = SET_STRLIST, .key = "passdb_override_fields",
.offset = offsetof(struct auth_passdb_post_settings, override_fields) },
};
static const struct auth_passdb_post_settings auth_passdb_post_default_settings = {
+ .fields = ARRAY_INIT,
.override_fields = ARRAY_INIT,
};
DEF(STR, name),
DEF(STR, driver),
DEF(STR_NOVARS, args),
+ DEF(BOOL, fields_import_all),
DEF(ENUM, skip),
DEF(ENUM, result_success),
.name = "",
.driver = "",
.args = "",
+ .fields_import_all = TRUE,
.skip = "never:found:notfound",
.result_success = "return-ok:return:return-fail:continue:continue-ok:continue-fail",
};
static const struct setting_define auth_userdb_post_setting_defines[] = {
+ { .type = SET_STRLIST, .key = "userdb_fields",
+ .offset = offsetof(struct auth_userdb_post_settings, fields) },
{ .type = SET_STRLIST, .key = "userdb_override_fields",
.offset = offsetof(struct auth_userdb_post_settings, override_fields) },
};
static const struct auth_userdb_post_settings auth_userdb_post_default_settings = {
+ .fields = ARRAY_INIT,
.override_fields = ARRAY_INIT,
};