const struct var_expand_table *table;
const char *key, *value, *error;
unsigned int i;
+ int ret = 0;
table = auth_request_get_var_expand_table(request, NULL);
+ pool_t pool = pool_alloconly_create("passwd-file fields", 256);
+ struct auth_fields *pwd_fields = auth_fields_init(pool);
for (i = 0; fields[i] != NULL; i++) {
value = strchr(fields[i], '=');
if (value != NULL) {
e_error(authdb_event(request),
"Failed to expand extra field %s: %s",
fields[i], error);
- return -1;
+ ret = -1;
+ break;
}
value = str_c(str);
} else {
key = fields[i];
value = "";
}
- auth_request_set_field(request, key, value, NULL);
+ if (request->passdb->set->fields_import_all)
+ auth_request_set_field(request, key, value, NULL);
+ if (!str_begins_with(fields[i], "userdb_"))
+ auth_fields_add(pwd_fields, key, value, 0);
}
- return 0;
+
+ if (ret == 0 && auth_request_set_passdb_fields(request, pwd_fields) < 0)
+ ret = -1;
+ pool_unref(&pool);
+ return ret;
}
static int passwd_file_save_results(struct auth_request *request,
auth_request_set_field(request, "password",
*crypted_pass_r, *scheme_r);
- if (pu->extra_fields != NULL) {
- if (passwd_file_add_extra_fields(request, pu->extra_fields) < 0)
- return -1;
- }
+ const char *const *extra_fields = pu->extra_fields != NULL ?
+ pu->extra_fields : empty_str_array;
+ if (passwd_file_add_extra_fields(request, extra_fields) < 0)
+ return -1;
return 0;
}
struct passdb_module_interface passdb_passwd_file = {
.name = "passwd-file",
+ .fields_supported = TRUE,
.preinit = passwd_file_preinit,
.init = passwd_file_init,
static int
passwd_file_add_extra_fields(struct auth_request *request,
- const char *const *fields)
+ const char *const *fields,
+ struct auth_fields *pwd_fields)
{
string_t *str = t_str_new(512);
const struct var_expand_table *table;
const char *key, *value, *error;
unsigned int i;
+ int ret = 0;
table = auth_request_get_var_expand_table(request, NULL);
e_error(authdb_event(request),
"Failed to expand extra field %s: %s",
fields[i], error);
- return -1;
+ ret = -1;
+ break;
}
value = str_c(str);
} else {
value = "";
}
- auth_request_set_userdb_field(request, key, value);
+ if (request->userdb->set->fields_import_all)
+ auth_request_set_userdb_field(request, key, value);
+ auth_fields_add(pwd_fields, key, value, 0);
}
- return 0;
+ if (ret == 0 && auth_request_set_userdb_fields(request, pwd_fields) < 0)
+ ret = -1;
+ return ret;
}
static void passwd_file_lookup(struct auth_request *auth_request,
return;
}
+ pool_t pool = pool_alloconly_create("passwd-file fields", 256);
+ struct auth_fields *pwd_fields = auth_fields_init(pool);
+
if (pu->uid != (uid_t)-1) {
- auth_request_set_userdb_field(auth_request, "uid",
- dec2str(pu->uid));
+ const char *value = dec2str(pu->uid);
+ if (auth_request->userdb->set->fields_import_all) {
+ auth_request_set_userdb_field(auth_request, "uid",
+ value);
+ }
+ auth_fields_add(pwd_fields, "uid", value, 0);
}
if (pu->gid != (gid_t)-1) {
- auth_request_set_userdb_field(auth_request, "gid",
- dec2str(pu->gid));
+ const char *value = dec2str(pu->gid);
+ if (auth_request->userdb->set->fields_import_all) {
+ auth_request_set_userdb_field(auth_request, "gid",
+ value);
+ }
+ auth_fields_add(pwd_fields, "gid", value, 0);
}
- if (pu->home != NULL)
- auth_request_set_userdb_field(auth_request, "home", pu->home);
+ if (pu->home != NULL) {
+ if (auth_request->userdb->set->fields_import_all) {
+ auth_request_set_userdb_field(auth_request,
+ "home", pu->home);
+ }
+ auth_fields_add(pwd_fields, "home", pu->home, 0);
+ }
- if (pu->extra_fields != NULL &&
- passwd_file_add_extra_fields(auth_request, pu->extra_fields) < 0) {
+ const char *const *extra_fields = pu->extra_fields != NULL ?
+ pu->extra_fields : empty_str_array;
+ if (passwd_file_add_extra_fields(auth_request, extra_fields,
+ pwd_fields) < 0) {
callback(USERDB_RESULT_INTERNAL_FAILURE, auth_request);
+ pool_unref(&pool);
return;
}
callback(USERDB_RESULT_OK, auth_request);
+ pool_unref(&pool);
}
static struct userdb_iterate_context *
struct userdb_module_interface userdb_passwd_file = {
.name = "passwd-file",
+ .fields_supported = TRUE,
.preinit = passwd_file_preinit,
.init = passwd_file_init,