Patch 1: (sssd_nss part) In functions nss_cmd_getXXnam, if working with a local domain and no results were found in sysdb, the entries are invalidated in memory cache too.

Patch 2: (tools part) Tools sss_userdel and sss_groupdel send SSS_NSS_GETXXNAM requests after the entry was removed from sysdb. With the first patch, this invalidates the entry in memory cache.

Patches are in attachment.

Thanks
Michal
>From 08aa1af5629b1015e1fc4202c3f1dd8812309979 Mon Sep 17 00:00:00 2001
From: Michal Zidek <[email protected]>
Date: Thu, 13 Dec 2012 17:38:55 +0100
Subject: [PATCH 1/2] sssd_nss: Remove entries from memory cache if not found
 in sysdb

Functions nss_cmd_getXXnam remove entries from memory cache if
not found in sysdb cache of a local domain.
---
 src/responder/nss/nsssrv_cmd.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/src/responder/nss/nsssrv_cmd.c b/src/responder/nss/nsssrv_cmd.c
index 14bb3af..c30e21e 100644
--- a/src/responder/nss/nsssrv_cmd.c
+++ b/src/responder/nss/nsssrv_cmd.c
@@ -660,6 +660,7 @@ 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;
@@ -744,6 +745,17 @@ 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) {
+                DEBUG(SSSDBG_CRIT_FAILURE,
+                      ("Internal failure in memory cache code: %d [%s]\n",
+                       ret, strerror(ret)));
+            }
+
+
             return ENOENT;
         }
 
@@ -2250,6 +2262,7 @@ 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;
@@ -2334,6 +2347,16 @@ 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) {
+                DEBUG(SSSDBG_CRIT_FAILURE,
+                      ("Internal failure in memory cache code: %d [%s]\n",
+                       ret, strerror(ret)));
+            }
+
             return ENOENT;
         }
 
-- 
1.7.11.2

>From 9f0ed703ef9eee86a6b0224fce4171f5133fe786 Mon Sep 17 00:00:00 2001
From: Michal Zidek <[email protected]>
Date: Thu, 13 Dec 2012 17:44:36 +0100
Subject: [PATCH 2/2] tools: sss_userdel and groupdel remove entries from
 memory cache

https://fedorahosted.org/sssd/ticket/1659
---
 Makefile.am              |  8 ++++++++
 src/tools/sss_groupdel.c | 24 ++++++++++++++++++++++++
 src/tools/sss_userdel.c  | 23 +++++++++++++++++++++++
 3 files changed, 55 insertions(+)

diff --git a/Makefile.am b/Makefile.am
index 3145f49..337fa63 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -680,12 +680,16 @@ sss_useradd_LDADD = \
     $(TOOLS_LIBS)
 
 sss_userdel_SOURCES = \
+    src/sss_client/common.c \
     src/tools/sss_userdel.c \
     src/util/find_uid.c \
     $(SSSD_TOOLS_OBJ)
 sss_userdel_LDADD = \
     libsss_util.la \
     $(TOOLS_LIBS)
+sss_userdel_CFLAGS = $(AM_CFLAGS)
+sss_userdel_LDFLAGS = \
+    $(CLIENT_LIBS)
 
 sss_groupadd_SOURCES = \
     src/tools/sss_groupadd.c \
@@ -695,11 +699,15 @@ sss_groupadd_LDADD = \
     $(TOOLS_LIBS)
 
 sss_groupdel_SOURCES = \
+    src/sss_client/common.c \
     src/tools/sss_groupdel.c \
     $(SSSD_TOOLS_OBJ)
 sss_groupdel_LDADD = \
     libsss_util.la \
     $(TOOLS_LIBS)
+sss_groupdel_CFLAGS = $(AM_CFLAGS)
+sss_groupdel_LDFLAGS = \
+    $(CLIENT_LIBS)
 
 sss_usermod_SOURCES = \
     src/tools/sss_usermod.c \
diff --git a/src/tools/sss_groupdel.c b/src/tools/sss_groupdel.c
index 57c3e70..66ea292 100644
--- a/src/tools/sss_groupdel.c
+++ b/src/tools/sss_groupdel.c
@@ -19,6 +19,7 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+#include <nss.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <talloc.h>
@@ -28,6 +29,7 @@
 #include "util/util.h"
 #include "tools/tools_util.h"
 #include "tools/sss_sync_ops.h"
+#include "sss_client/sss_cli.h"
 
 int main(int argc, const char **argv)
 {
@@ -35,6 +37,10 @@ int main(int argc, const char **argv)
     int pc_debug = SSSDBG_DEFAULT;
     const char *pc_groupname = NULL;
     struct tools_ctx *tctx = NULL;
+    struct sss_cli_req_data rd;
+    uint8_t *repbuf = NULL;
+    size_t replen;
+    enum nss_status nret;
 
     poptContext pc = NULL;
     struct poptOption long_options[] = {
@@ -106,6 +112,24 @@ int main(int argc, const char **argv)
 
     /* groupdel */
     ret = groupdel(tctx, tctx->sysdb, tctx->octx);
+    if (ret != EOK) {
+        goto done;
+    }
+
+    rd.data = pc_groupname;
+    rd.len = strlen(pc_groupname) + 1;
+
+    sss_nss_lock();
+    nret = sss_nss_make_request(SSS_NSS_GETGRNAM, &rd,
+                                &repbuf, &replen, &ret);
+    sss_nss_unlock();
+    free(repbuf);
+    if (nret != NSS_STATUS_SUCCESS && nret != NSS_STATUS_NOTFOUND) {
+        ERROR("NSS request failed (%1$d). Entry might remain in memory"
+               " cache.\n",nret);
+    }
+
+    ret = EOK;
 
 done:
     if (ret) {
diff --git a/src/tools/sss_userdel.c b/src/tools/sss_userdel.c
index 5d250f6..53273f6 100644
--- a/src/tools/sss_userdel.c
+++ b/src/tools/sss_userdel.c
@@ -19,6 +19,7 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+#include <nss.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <talloc.h>
@@ -31,6 +32,7 @@
 #include "util/find_uid.h"
 #include "tools/tools_util.h"
 #include "tools/sss_sync_ops.h"
+#include "sss_client/sss_cli.h"
 
 #ifndef KILL_CMD
 #define KILL_CMD "killall"
@@ -119,6 +121,10 @@ int main(int argc, const char **argv)
     int ret = EXIT_SUCCESS;
     struct tools_ctx *tctx = NULL;
     const char *pc_username = NULL;
+    struct sss_cli_req_data rd;
+    uint8_t *repbuf = NULL;
+    size_t replen;
+    enum nss_status nret;
 
     int pc_debug = SSSDBG_DEFAULT;
     int pc_remove = 0;
@@ -285,6 +291,21 @@ int main(int argc, const char **argv)
         goto fini;
     }
 
+    /* Delete user from memory cache */
+    rd.data = pc_username;
+    rd.len = strlen(pc_username) + 1;
+
+    sss_nss_lock();
+    nret = sss_nss_make_request(SSS_NSS_GETPWNAM, &rd,
+                                &repbuf, &replen, &ret);
+
+    sss_nss_unlock();
+    free(repbuf);
+    if (nret != NSS_STATUS_SUCCESS && nret != NSS_STATUS_NOTFOUND) {
+        ERROR("NSS request failed (%1$d). Entry might remain in memory "
+              "cache.\n",nret);
+    }
+
     if (tctx->octx->remove_homedir) {
         ret = remove_homedir(tctx,
                              tctx->octx->home,
@@ -301,6 +322,8 @@ int main(int argc, const char **argv)
         }
     }
 
+    ret = EOK;
+
 done:
     if (ret) {
         DEBUG(1, ("sysdb operation failed (%d)[%s]\n", ret, strerror(ret)));
-- 
1.7.11.2

_______________________________________________
sssd-devel mailing list
[email protected]
https://lists.fedorahosted.org/mailman/listinfo/sssd-devel

Reply via email to