userdb-nss.c revision cca4ba2a504d70a9fe9fee37f8433997359de52c
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch* Copyright (c) 2007-2013 Dovecot authors, see the included COPYING file */
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainen/* Currently supports only GLIBC-compatible NSS modules */
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainen enum nss_status (*getpwnam_r)(const char *name, struct passwd *pwd,
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainenuserdb_nss_lookup(struct auth_request *auth_request,
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainen struct userdb_module *_module = auth_request->userdb->userdb;
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainen struct nss_userdb_module *module = (struct nss_userdb_module *)_module;
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainen enum userdb_result result = USERDB_RESULT_INTERNAL_FAILURE;
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainen auth_request_log_debug(auth_request, "nss", "lookup");
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainen status = module->getpwnam_r(auth_request->user, &pw,
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainen auth_request_log_info(auth_request, "nss", "unknown user");
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainen auth_request_set_field(auth_request, "user", pw.pw_name, NULL);
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainen auth_request_set_userdb_field(auth_request, "system_groups_user",
8ccb1a013b07e7ca37b7281732b78c042f128388Timo Sirainen auth_request_set_userdb_field(auth_request, "uid", dec2str(pw.pw_uid));
8ccb1a013b07e7ca37b7281732b78c042f128388Timo Sirainen auth_request_set_userdb_field(auth_request, "gid", dec2str(pw.pw_gid));
8ccb1a013b07e7ca37b7281732b78c042f128388Timo Sirainen auth_request_set_userdb_field(auth_request, "home", pw.pw_dir);
539977f9257bd8985be5a8093658da266ae9cd19Timo Sirainenuserdb_nss_load_module(struct nss_userdb_module *module, pool_t pool)
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainen path = p_strdup_printf(pool, "/usr/lib/libnss_%s.so", name);
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainen module->nss_module.handle = dlopen(path, RTLD_GLOBAL | RTLD_NOW);
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainen i_fatal("dlopen(%s) failed: %s", path, dlerror());
8ccb1a013b07e7ca37b7281732b78c042f128388Timo Sirainen i_fatal("userdb nss: Module %s missing getpwnam_r()", path);
2c7cde7c78ccb28dcaa864d262ed6e991a7e8eb7Timo Sirainenuserdb_nss_preinit(pool_t pool, const char *args)
2c7cde7c78ccb28dcaa864d262ed6e991a7e8eb7Timo Sirainen const char *const *tmp;
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainen module = p_new(pool, struct nss_userdb_module, 1);
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainen module->bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainen module->buf = p_malloc(pool, module->bufsize);
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainen for (tmp = t_strsplit(args, " "); *tmp != NULL; tmp++) {
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainen module->nss_module.name = p_strdup(pool, *tmp + 8);
8ccb1a013b07e7ca37b7281732b78c042f128388Timo Sirainen i_fatal("userdb nss: Unknown setting: %s", *tmp);
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainenstatic void userdb_nss_deinit(struct userdb_module *_module)
56c35c844320b0a157d1aaa6b3e62b7f3851b235Timo Sirainen struct nss_userdb_module *module = (struct nss_userdb_module *)_module;
8ccb1a013b07e7ca37b7281732b78c042f128388Timo Sirainen symbol = t_strdup_printf("_nss_%s_endpwent", module->nss_module.name);