summaryrefslogtreecommitdiffstats
path: root/src/providers/ldap/sdap_id_op.c
diff options
context:
space:
mode:
authorPavel Březina <pbrezina@redhat.com>2012-08-15 13:59:37 +0200
committerJakub Hrozek <jhrozek@redhat.com>2012-08-23 14:27:51 +0200
commit41be4e3976cf66823ad2c6880671ac7fbafdc640 (patch)
treea70acd87acba86cd935bd150b66b58b0524d534b /src/providers/ldap/sdap_id_op.c
parente4c29d1f8e3b2c2b268105f169e5156a0a36aebf (diff)
downloadsssd-41be4e3976cf66823ad2c6880671ac7fbafdc640.tar.gz
sssd-41be4e3976cf66823ad2c6880671ac7fbafdc640.tar.xz
sssd-41be4e3976cf66823ad2c6880671ac7fbafdc640.zip
Clean up cache on server reinitialization
https://fedorahosted.org/sssd/ticket/734 We successfully detect when the server is reinitialized by testing the new lastUSN value. The maximum USN values are set to zero, but the current cache content remains. This patch removes records that were deleted from the server. It uses the following approach: 1. remove entryUSN attribute from all entries 2. run enumeration 3. remove records that doesn't have entryUSN attribute updated We don't need to do this for sudo rules, they will be refreshed automatically during next smart/full refresh, or when an expired rule is deleted.
Diffstat (limited to 'src/providers/ldap/sdap_id_op.c')
-rw-r--r--src/providers/ldap/sdap_id_op.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/providers/ldap/sdap_id_op.c b/src/providers/ldap/sdap_id_op.c
index 3036d0cc1..034813012 100644
--- a/src/providers/ldap/sdap_id_op.c
+++ b/src/providers/ldap/sdap_id_op.c
@@ -519,6 +519,8 @@ done:
return ret;
}
+static void sdap_id_op_connect_reinit_done(struct tevent_req *req);
+
/* Subrequest callback for connection completion */
static void sdap_id_op_connect_done(struct tevent_req *subreq)
{
@@ -529,6 +531,8 @@ static void sdap_id_op_connect_done(struct tevent_req *subreq)
struct sdap_server_opts *current_srv_opts = NULL;
bool can_retry = false;
bool is_offline = false;
+ struct tevent_req *reinit_req = NULL;
+ bool reinit = false;
int ret;
ret = sdap_cli_connect_recv(subreq, conn_data, &can_retry,
@@ -570,6 +574,8 @@ 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;
+
+ reinit = true;
}
}
ret = sdap_id_conn_data_set_expire_timer(conn_data);
@@ -694,6 +700,38 @@ static void sdap_id_op_connect_done(struct tevent_req *subreq)
sdap_id_release_conn_data(conn_data);
}
+
+ if (reinit) {
+ DEBUG(SSSDBG_TRACE_FUNC, ("Server reinitialization detected. "
+ "Cleaning cache.\n"));
+ reinit_req = sdap_reinit_cleanup_send(conn_cache->id_ctx->be,
+ conn_cache->id_ctx->be,
+ conn_cache->id_ctx);
+ if (reinit_req == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Unable to perform reinitialization "
+ "clean up.\n"));
+ return;
+ }
+
+ tevent_req_set_callback(reinit_req, sdap_id_op_connect_reinit_done,
+ NULL);
+ }
+}
+
+static void sdap_id_op_connect_reinit_done(struct tevent_req *req)
+{
+ errno_t ret;
+
+ ret = sdap_reinit_cleanup_recv(req);
+ talloc_zfree(req);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_CRIT_FAILURE, ("Unable to perform reinitialization "
+ "clean up [%d]: %s\n", ret, strerror(ret)));
+ /* not fatal */
+ return;
+ }
+
+ DEBUG(SSSDBG_TRACE_FUNC, ("Reinitialization clean up completed\n"));
}
/* Mark operation connection request as complete */