/* SSSD Data Provider Responder client - DP calls responder interface This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "config.h" #include #include #include "confdb/confdb.h" #include "sbus/sssd_dbus.h" #include "providers/data_provider.h" #include "providers/data_provider/dp_private.h" #include "responder/common/iface/responder_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) { struct dp_client *cli; int i; for (i = 0; provider->clients[i] != NULL; i++) { cli = provider->clients[i]; if (cli != NULL) { sbus_conn_send_reply(dp_client_conn(cli), msg); } } } 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) { DBusMessage *msg; const char *method = NULL; switch (state) { case DOM_ACTIVE: DEBUG(SSSDBG_TRACE_FUNC, "Ordering responders to enable domain %s\n", dom->name); method = IFACE_RESPONDER_DOMAIN_SETACTIVE; break; case DOM_INCONSISTENT: DEBUG(SSSDBG_TRACE_FUNC, "Ordering responders to disable domain %s\n", dom->name); method = IFACE_RESPONDER_DOMAIN_SETINCONSISTENT; break; default: /* No other methods provided at the moment */ return; } sss_domain_set_state(dom, state); msg = sbus_create_message(NULL, NULL, RESPONDER_PATH, IFACE_RESPONDER_DOMAIN, method, DBUS_TYPE_STRING, &dom->name); if (msg == NULL) { DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory?!\n"); return; } send_msg_to_all_clients(provider, msg); dbus_message_unref(msg); return; } void dp_sbus_domain_active(struct data_provider *provider, struct sss_domain_info *dom) { return dp_sbus_set_domain_state(provider, dom, DOM_ACTIVE); } void dp_sbus_domain_inconsistent(struct data_provider *provider, struct sss_domain_info *dom) { 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); } static void dp_sbus_reset_memcache(struct data_provider *provider, const char *method) { DBusMessage *msg; msg = sbus_create_message(NULL, NULL, NSS_MEMORYCACHE_PATH, IFACE_NSS_MEMORYCACHE, 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_memcache(struct data_provider *provider) { return dp_sbus_reset_memcache(provider, IFACE_NSS_MEMORYCACHE_INVALIDATEALLUSERS); } void dp_sbus_reset_groups_memcache(struct data_provider *provider) { return dp_sbus_reset_memcache(provider, IFACE_NSS_MEMORYCACHE_INVALIDATEALLGROUPS); } void dp_sbus_reset_initgr_memcache(struct data_provider *provider) { return dp_sbus_reset_memcache(provider, IFACE_NSS_MEMORYCACHE_INVALIDATEALLINITGROUPS); }