https://fedorahosted.org/sssd/ticket/734

Patches 1 and 2 adds support sysdb functions.
Patch 3 uses them to remove those entries.
From 8c753e06aba409aafead7a989577ad42b255c313 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrez...@redhat.com>
Date: Tue, 7 Aug 2012 13:27:55 +0200
Subject: [PATCH 1/3] Add sysdb_delete_filter()

Deletes all entries that satisfies the filter.

Delete sysdb entries with entryUSN > lastUSN when USN change

https://fedorahosted.org/sssd/ticket/734
---
 src/db/sysdb.h     |    5 ++++
 src/db/sysdb_ops.c |   67 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 71 insertions(+), 1 deletions(-)

diff --git a/src/db/sysdb.h b/src/db/sysdb.h
index 43ac61c2132c18db9beccf68e488e0132a98d58c..127dcc4a0c5917c5cd3431fbf409ad10f2dc372c 100644
--- a/src/db/sysdb.h
+++ b/src/db/sysdb.h
@@ -546,6 +546,10 @@ int sysdb_delete_recursive(struct sysdb_ctx *sysdb,
                            struct ldb_dn *dn,
                            bool ignore_not_found);
 
+int sysdb_delete_filter(struct sysdb_ctx *sysdb,
+                        struct ldb_dn *base_dn,
+                        const char *filter);
+
 /* Search Entry */
 int sysdb_search_entry(TALLOC_CTX *mem_ctx,
                        struct sysdb_ctx *sysdb,
@@ -812,6 +816,7 @@ int sysdb_search_users(TALLOC_CTX *mem_ctx,
 int sysdb_delete_user(struct sysdb_ctx *sysdb,
                       const char *name, uid_t uid);
 
+
 int sysdb_search_groups(TALLOC_CTX *mem_ctx,
                         struct sysdb_ctx *sysdb,
                         const char *sub_filter,
diff --git a/src/db/sysdb_ops.c b/src/db/sysdb_ops.c
index ed7b37e32acdb1d4032ec0815769902ebca3ec5b..6a696fb28734a01db5698c8eb3d32184492e1e77 100644
--- a/src/db/sysdb_ops.c
+++ b/src/db/sysdb_ops.c
@@ -165,6 +165,72 @@ done:
 }
 
 
+/* =Delete-entries-by-filter============================================ */
+
+int sysdb_delete_filter(struct sysdb_ctx *sysdb,
+                        struct ldb_dn *base_dn,
+                        const char *filter)
+{
+    TALLOC_CTX *tmp_ctx = NULL;
+    bool in_transaction = false;
+    const char *attrs[] = {SYSDB_OBJECTCLASS, NULL};
+    struct ldb_message **msgs;
+    size_t count = 0;
+    int sret;
+    int ret;
+    int i;
+
+    tmp_ctx = talloc_new(NULL);
+    if (tmp_ctx == NULL) {
+        DEBUG(SSSDBG_CRIT_FAILURE, ("talloc_new() failed\n"));
+        return ENOMEM;
+    }
+
+    ret = sysdb_search_entry(tmp_ctx, sysdb, base_dn, LDB_SCOPE_SUBTREE, filter,
+                             attrs, &count, &msgs);
+    if (ret == ENOENT || count == 0) {
+        DEBUG(SSSDBG_TRACE_FUNC, ("Nothing to delete\n"));
+        ret = EOK;
+        goto done;
+    } else if (ret != EOK) {
+        DEBUG(SSSDBG_OP_FAILURE, ("Unable to search sysdb [%d]: %s\n",
+                                  ret, strerror(ret)));
+        goto done;
+    }
+
+    ret = sysdb_transaction_start(sysdb);
+    if (ret != EOK) {
+        goto done;
+    }
+    in_transaction = true;
+
+    for (i = 0; i < count; i++) {
+        ret = sysdb_delete_entry(sysdb, msgs[i]->dn, true);
+        if (ret != EOK) {
+            DEBUG(SSSDBG_OP_FAILURE, ("Unable to delete entry \"%s\" [%d]: %s\n",
+                  ldb_dn_get_linearized(msgs[i]->dn), ret, strerror(ret)));
+            goto done;
+        }
+    }
+
+    ret = sysdb_transaction_commit(sysdb);
+    if (ret == EOK) {
+        in_transaction = false;
+    }
+
+done:
+    if (in_transaction) {
+        sret = sysdb_transaction_cancel(sysdb);
+        if (sret != EOK) {
+            DEBUG(SSSDBG_OP_FAILURE, ("Could not cancel transaction\n"));
+        }
+    }
+
+    talloc_free(tmp_ctx);
+    return ret;
+}
+
+
 /* =Search-Entry========================================================== */
 
 int sysdb_search_entry(TALLOC_CTX *mem_ctx,
@@ -2377,7 +2443,6 @@ fail:
     return ret;
 }
 
-
 /* =Search-Groups-with-Custom-Filter===================================== */
 
 int sysdb_search_groups(TALLOC_CTX *mem_ctx,
-- 
1.7.6.5

From 2b234d7a8b68fe4a95e17350e16723d2422cc52e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrez...@redhat.com>
Date: Tue, 7 Aug 2012 14:21:10 +0200
Subject: [PATCH 2/3] Add sysdb_domain_delete_larger_usn()

Deletes all entries from entire domain with entryUSN > last_usn.
---
 src/db/sysdb.h     |    3 +++
 src/db/sysdb_ops.c |   36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/src/db/sysdb.h b/src/db/sysdb.h
index 127dcc4a0c5917c5cd3431fbf409ad10f2dc372c..a5f3dd2a6e1d477330b291129ae0d6541697c5b5 100644
--- a/src/db/sysdb.h
+++ b/src/db/sysdb.h
@@ -550,6 +550,9 @@ int sysdb_delete_filter(struct sysdb_ctx *sysdb,
                         struct ldb_dn *base_dn,
                         const char *filter);
 
+int sysdb_domain_delete_larger_usn(struct sysdb_ctx *sysdb,
+                                   unsigned long last_usn);
+
 /* Search Entry */
 int sysdb_search_entry(TALLOC_CTX *mem_ctx,
                        struct sysdb_ctx *sysdb,
diff --git a/src/db/sysdb_ops.c b/src/db/sysdb_ops.c
index 6a696fb28734a01db5698c8eb3d32184492e1e77..efcbf1fd5cc31829c83f2f10843698cd1ca01bca 100644
--- a/src/db/sysdb_ops.c
+++ b/src/db/sysdb_ops.c
@@ -231,6 +231,42 @@ done:
 }
 
 
+/* =Delete-entries-with-usn-higher-than-last-usn========================== */
+
+int sysdb_domain_delete_larger_usn(struct sysdb_ctx *sysdb, unsigned long last_usn)
+{
+    TALLOC_CTX *tmp_ctx = NULL;
+    struct ldb_dn *base_dn = NULL;
+    char *filter = NULL;
+    int ret;
+
+    tmp_ctx = talloc_new(NULL);
+    if (tmp_ctx == NULL) {
+        DEBUG(SSSDBG_CRIT_FAILURE, ("talloc_new() failed\n"));
+        return ENOMEM;
+    }
+
+    base_dn = sysdb_domain_dn(sysdb, tmp_ctx, sysdb->domain->name);
+    if (base_dn == NULL) {
+        ret = ENOMEM;
+        goto done;
+    }
+
+    filter = talloc_asprintf(tmp_ctx, "(&(%s>=%lu)(!(%s=%lu)))",
+                             SYSDB_USN, last_usn, SYSDB_USN, last_usn);
+    if (filter == NULL) {
+        ret = ENOMEM;
+        goto done;
+    }
+
+    ret = sysdb_delete_filter(sysdb, base_dn, filter);
+
+done:
+    talloc_free(tmp_ctx);
+    return ret;
+}
+
+
 /* =Search-Entry========================================================== */
 
 int sysdb_search_entry(TALLOC_CTX *mem_ctx,
-- 
1.7.6.5

From a015dace2bee079435bafe240a9207052ba7d0d7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrez...@redhat.com>
Date: Tue, 7 Aug 2012 14:34:57 +0200
Subject: [PATCH 3/3] Delete sysdb entries with entryUSN > lastUSN when USN
 changes

https://fedorahosted.org/sssd/ticket/734
---
 src/providers/ldap/ldap_id.c    |   20 +++++++++++++++-----
 src/providers/ldap/sdap_id_op.c |   11 +++++++++++
 2 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/src/providers/ldap/ldap_id.c b/src/providers/ldap/ldap_id.c
index 9515219cbba4621600a8e9b01e6044248afcb4d2..b442fce307da3d8a928ab9922dd7aaeef4c4bc45 100644
--- a/src/providers/ldap/ldap_id.c
+++ b/src/providers/ldap/ldap_id.c
@@ -810,11 +810,7 @@ static void sdap_check_online_done(struct tevent_req *req)
     ret = sdap_cli_connect_recv(req, NULL, &can_retry, NULL, &srv_opts);
     talloc_zfree(req);
 
-    if (ret != EOK) {
-        if (!can_retry) {
-            dp_err = DP_ERR_OFFLINE;
-        }
-    } else {
+    if (ret == EOK) {
         dp_err = DP_ERR_OK;
 
         if (!check_ctx->id_ctx->srv_opts) {
@@ -830,11 +826,25 @@ static void sdap_check_online_done(struct tevent_req *req)
             check_ctx->id_ctx->srv_opts->max_service_value = 0;
             check_ctx->id_ctx->srv_opts->max_sudo_value = 0;
             check_ctx->id_ctx->srv_opts->last_usn = srv_opts->last_usn;
+
+            ret = sysdb_domain_delete_larger_usn(check_ctx->id_ctx->be->sysdb,
+                                                 check_ctx->id_ctx->srv_opts->last_usn);
+            if (ret != EOK) {
+                DEBUG(SSSDBG_MINOR_FAILURE, ("Unable to clear cache from "
+                      "entries with larger USN than new value [%d]: "
+                      "%s\n", ret, strerror(ret)));
+                goto done;
+            }
         }
 
         sdap_steal_server_opts(check_ctx->id_ctx, &srv_opts);
     }
 
+done:
+    if (ret != EOK && !can_retry) {
+        dp_err = DP_ERR_OFFLINE;
+    }
+
     be_req = check_ctx->be_req;
     talloc_free(check_ctx);
     sdap_handler_done(be_req, dp_err, 0, NULL);
diff --git a/src/providers/ldap/sdap_id_op.c b/src/providers/ldap/sdap_id_op.c
index 3036d0cc144111b89319a7bf075c37789cb911d0..9103e1f671b26f4a623a39c26a896e47bbd41b60 100644
--- a/src/providers/ldap/sdap_id_op.c
+++ b/src/providers/ldap/sdap_id_op.c
@@ -570,8 +570,19 @@ static void sdap_id_op_connect_done(struct tevent_req *subreq)
                 current_srv_opts->max_service_value = 0;
                 current_srv_opts->max_sudo_value = 0;
                 current_srv_opts->last_usn = srv_opts->last_usn;
+
+                ret = sysdb_domain_delete_larger_usn(conn_cache->id_ctx->be->sysdb,
+                                                     current_srv_opts->last_usn);
+                if (ret != EOK) {
+                    DEBUG(SSSDBG_MINOR_FAILURE, ("Unable to clear cache from "
+                          "entries with larger USN than new value [%d]: "
+                          "%s\n", ret, strerror(ret)));
+                }
             }
         }
+    }
+
+    if (ret == EOK) {
         ret = sdap_id_conn_data_set_expire_timer(conn_data);
         sdap_steal_server_opts(conn_cache->id_ctx, &srv_opts);
     }
-- 
1.7.6.5

_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/sssd-devel

Reply via email to