summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Zidek <mzidek@redhat.com>2013-01-07 15:40:08 +0100
committerJakub Hrozek <jhrozek@redhat.com>2013-01-07 18:00:48 +0100
commit9ba38a3f75ae9e0715f89444c7d9c28c027dd073 (patch)
treed665b65b25f60028465d9dae2cc49824d10f98e6
parentc97a7ff6f7ddbbf6b892e86088058a8f74a7ecb4 (diff)
downloadsssd-9ba38a3f75ae9e0715f89444c7d9c28c027dd073.tar.gz
sssd-9ba38a3f75ae9e0715f89444c7d9c28c027dd073.tar.xz
sssd-9ba38a3f75ae9e0715f89444c7d9c28c027dd073.zip
sss_userdel and sss_groupdel with use_fully_qualified_names
If use_fully_qualified_names is used, we need to pass fqdn to sss_mmap_cache_*_invalidate.
-rw-r--r--src/responder/nss/nsssrv_cmd.c65
1 files changed, 50 insertions, 15 deletions
diff --git a/src/responder/nss/nsssrv_cmd.c b/src/responder/nss/nsssrv_cmd.c
index 0fb726712..0631bcd9a 100644
--- a/src/responder/nss/nsssrv_cmd.c
+++ b/src/responder/nss/nsssrv_cmd.c
@@ -646,6 +646,47 @@ static void nsssrv_dp_send_acct_req_done(struct tevent_req *req)
static void nss_cmd_getpwnam_dp_callback(uint16_t err_maj, uint32_t err_min,
const char *err_msg, void *ptr);
+static int delete_entry_from_memcache(struct sss_domain_info *dom, char *name,
+ struct sss_mc_ctx *mc_ctx)
+{
+ TALLOC_CTX *tmp_ctx = NULL;
+ struct sized_string delete_name;
+ char *fqdn = NULL;
+ int ret;
+
+ tmp_ctx = talloc_new(NULL);
+ if (tmp_ctx == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Out of memory.\n"));
+ return ENOMEM;
+ }
+
+ if (dom->fqnames) {
+ fqdn = talloc_asprintf(tmp_ctx, dom->names->fq_fmt, name, dom->name);
+ if (fqdn == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Out of memory.\n"));
+ ret = ENOMEM;
+ goto done;
+ }
+ to_sized_string(&delete_name, fqdn);
+ } else {
+ to_sized_string(&delete_name, name);
+ }
+
+ ret = sss_mmap_cache_pw_invalidate(mc_ctx, &delete_name);
+ if (ret != EOK && ret != ENOENT) {
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ ("Internal failure in memory cache code: %d [%s]\n",
+ ret, strerror(ret)));
+ goto done;
+ }
+
+ ret = EOK;
+done:
+ talloc_free(tmp_ctx);
+ return ret;
+
+}
+
/* search for a user.
* Returns:
* ENOENT, if user is definitely not found
@@ -660,7 +701,6 @@ static int nss_cmd_getpwnam_search(struct nss_dom_ctx *dctx)
struct sss_domain_info *dom = dctx->domain;
struct cli_ctx *cctx = cmdctx->cctx;
char *name = NULL;
- struct sized_string delete_usrname;
struct sysdb_ctx *sysdb;
struct nss_ctx *nctx;
int ret;
@@ -746,16 +786,13 @@ static int nss_cmd_getpwnam_search(struct nss_dom_ctx *dctx)
DEBUG(2, ("No results for getpwnam call\n"));
/* User not found in ldb -> delete user from memory cache. */
- to_sized_string(&delete_usrname, name);
- ret = sss_mmap_cache_pw_invalidate(nctx->pwd_mc_ctx,
- &delete_usrname);
- if (ret != EOK && ret != ENOENT) {
+ ret = delete_entry_from_memcache(dctx->domain, name,
+ nctx->pwd_mc_ctx);
+ if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE,
- ("Internal failure in memory cache code: %d [%s]\n",
- ret, strerror(ret)));
+ ("Deleting user from memcache failed.\n"));
}
-
return ENOENT;
}
@@ -2260,7 +2297,6 @@ static int nss_cmd_getgrnam_search(struct nss_dom_ctx *dctx)
struct sss_domain_info *dom = dctx->domain;
struct cli_ctx *cctx = cmdctx->cctx;
char *name = NULL;
- struct sized_string delete_grpname;
struct sysdb_ctx *sysdb;
struct nss_ctx *nctx;
int ret;
@@ -2346,15 +2382,14 @@ static int nss_cmd_getgrnam_search(struct nss_dom_ctx *dctx)
DEBUG(2, ("No results for getgrnam call\n"));
/* Group not found in ldb -> delete group from memory cache. */
- to_sized_string(&delete_grpname, name);
- ret = sss_mmap_cache_gr_invalidate(nctx->grp_mc_ctx,
- &delete_grpname);
- if (ret != EOK && ret != ENOENT) {
+ ret = delete_entry_from_memcache(dctx->domain, name,
+ nctx->grp_mc_ctx);
+ if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE,
- ("Internal failure in memory cache code: %d [%s]\n",
- ret, strerror(ret)));
+ ("Deleting user from memcache failed.\n"));
}
+
return ENOENT;
}