summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2016-11-16 17:00:57 +0100
committerJakub Hrozek <jhrozek@redhat.com>2017-02-15 14:51:16 +0100
commitaf28fa659f7ffcd12ecf8bda64e79cf5dd225651 (patch)
treefa279a3e52b1ea3173947c5865688774c4ba2f58
parentb3ee4be9e1794fa823696d70d4958f3b0269939c (diff)
downloadsssd-af28fa659f7ffcd12ecf8bda64e79cf5dd225651.tar.gz
sssd-af28fa659f7ffcd12ecf8bda64e79cf5dd225651.tar.xz
sssd-af28fa659f7ffcd12ecf8bda64e79cf5dd225651.zip
DP: Add internal interface to reset negative cache from DP
Adds a an interface that allows the Data Provider to notify responders to drop their negative cache. Reviewed-by: Pavel Březina <pbrezina@redhat.com>
-rw-r--r--src/providers/data_provider/dp.h5
-rw-r--r--src/providers/data_provider/dp_resp_client.c65
2 files changed, 69 insertions, 1 deletions
diff --git a/src/providers/data_provider/dp.h b/src/providers/data_provider/dp.h
index 68db75521..79d02d469 100644
--- a/src/providers/data_provider/dp.h
+++ b/src/providers/data_provider/dp.h
@@ -166,4 +166,9 @@ void dp_sbus_domain_active(struct data_provider *provider,
void dp_sbus_domain_inconsistent(struct data_provider *provider,
struct sss_domain_info *dom);
+void dp_sbus_reset_users_ncache(struct data_provider *provider,
+ struct sss_domain_info *dom);
+void dp_sbus_reset_groups_ncache(struct data_provider *provider,
+ struct sss_domain_info *dom);
+
#endif /* _DP_H_ */
diff --git a/src/providers/data_provider/dp_resp_client.c b/src/providers/data_provider/dp_resp_client.c
index 3d386eac1..6828610ac 100644
--- a/src/providers/data_provider/dp_resp_client.c
+++ b/src/providers/data_provider/dp_resp_client.c
@@ -26,7 +26,23 @@
#include "providers/data_provider.h"
#include "providers/data_provider/dp_private.h"
#include "responder/common/iface/responder_iface.h"
-#include "src/responder/nss/nss_iface.h"
+#include "responder/nss/nss_iface.h"
+
+/* List of DP clients that deal with users or groups */
+/* FIXME - it would be much cleaner to implement sbus signals
+ * and let the responder subscribe to these messages rather than
+ * keep a list here..
+ * https://fedorahosted.org/sssd/ticket/2233
+ */
+static enum dp_clients user_clients[] = {
+ DPC_NSS,
+ DPC_PAM,
+ DPC_IFP,
+ DPC_PAC,
+ DPC_SUDO,
+
+ DP_CLIENT_SENTINEL
+};
static void send_msg_to_all_clients(struct data_provider *provider,
struct DBusMessage *msg)
@@ -42,6 +58,21 @@ static void send_msg_to_all_clients(struct data_provider *provider,
}
}
+static void send_msg_to_selected_clients(struct data_provider *provider,
+ struct DBusMessage *msg,
+ enum dp_clients *clients)
+{
+ struct dp_client *cli;
+ int i;
+
+ for (i = 0; clients[i] != DP_CLIENT_SENTINEL; i++) {
+ cli = provider->clients[clients[i]];
+ if (cli != NULL) {
+ sbus_conn_send_reply(dp_client_conn(cli), msg);
+ }
+ }
+}
+
static void dp_sbus_set_domain_state(struct data_provider *provider,
struct sss_domain_info *dom,
enum sss_domain_state state)
@@ -91,3 +122,35 @@ void dp_sbus_domain_inconsistent(struct data_provider *provider,
{
return dp_sbus_set_domain_state(provider, dom, DOM_INCONSISTENT);
}
+
+static void dp_sbus_reset_ncache(struct data_provider *provider,
+ struct sss_domain_info *dom,
+ const char *method)
+{
+ DBusMessage *msg;
+
+ msg = sbus_create_message(NULL, NULL, RESPONDER_PATH,
+ IFACE_RESPONDER_NCACHE, method);
+ if (msg == NULL) {
+ DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory?!\n");
+ return;
+ }
+
+ send_msg_to_selected_clients(provider, msg, user_clients);
+ dbus_message_unref(msg);
+ return;
+}
+
+void dp_sbus_reset_users_ncache(struct data_provider *provider,
+ struct sss_domain_info *dom)
+{
+ return dp_sbus_reset_ncache(provider, dom,
+ IFACE_RESPONDER_NCACHE_RESETUSERS);
+}
+
+void dp_sbus_reset_groups_ncache(struct data_provider *provider,
+ struct sss_domain_info *dom)
+{
+ return dp_sbus_reset_ncache(provider, dom,
+ IFACE_RESPONDER_NCACHE_RESETGROUPS);
+}