>From 42efd926f41c4691758e5871fd3a3330802e7f41 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com>
Date: Thu, 19 Feb 2015 12:00:52 +0100
Subject: [PATCH 5/6] be_refresh: support users

Resolves:
https://fedorahosted.org/sssd/ticket/2346
---
 src/db/sysdb.c                    |  7 +++++++
 src/db/sysdb.h                    |  2 ++
 src/providers/dp_refresh.c        | 23 +++++++++++++++++++++++
 src/providers/dp_refresh.h        |  1 +
 src/providers/ldap/sdap_refresh.c | 29 +++++++++++++++++++++++++++++
 5 files changed, 62 insertions(+)

diff --git a/src/db/sysdb.c b/src/db/sysdb.c
index 61a2240016b5cb77e6fbbc3286fd1a194c5a0b48..2bb4a41aa4a9e6201ac27ac8d9a1803c1fb5c43e 100644
--- a/src/db/sysdb.c
+++ b/src/db/sysdb.c
@@ -172,6 +172,13 @@ struct ldb_dn *sysdb_user_dn(TALLOC_CTX *mem_ctx, struct sss_domain_info *dom,
     return dn;
 }
 
+struct ldb_dn *sysdb_user_base_dn(TALLOC_CTX *mem_ctx,
+                                  struct sss_domain_info *dom)
+{
+    return ldb_dn_new_fmt(mem_ctx, dom->sysdb->ldb,
+                          SYSDB_TMPL_USER_BASE, dom->name);
+}
+
 struct ldb_dn *sysdb_group_dn(TALLOC_CTX *mem_ctx,
                               struct sss_domain_info *dom, const char *name)
 {
diff --git a/src/db/sysdb.h b/src/db/sysdb.h
index 0574a91fbaa1598a1ef0ff83ee353e7348ba4311..2ee6ee6e6ae7f4b1fe2b0d37ac8b979f4b0126e5 100644
--- a/src/db/sysdb.h
+++ b/src/db/sysdb.h
@@ -383,6 +383,8 @@ errno_t sysdb_get_rdn(struct sysdb_ctx *sysdb, TALLOC_CTX *mem_ctx,
                       const char *dn, char **_name, char **_val);
 struct ldb_dn *sysdb_user_dn(TALLOC_CTX *mem_ctx, struct sss_domain_info *dom,
                              const char *name);
+struct ldb_dn *sysdb_user_base_dn(TALLOC_CTX *mem_ctx,
+                                  struct sss_domain_info *dom);
 struct ldb_dn *sysdb_group_dn(TALLOC_CTX *mem_ctx, struct sss_domain_info *dom,
                               const char *name);
 struct ldb_dn *sysdb_netgroup_dn(TALLOC_CTX *mem_ctx,
diff --git a/src/providers/dp_refresh.c b/src/providers/dp_refresh.c
index bd02d0cd99f9a061109f0c17797c6e018d602dc5..f599618e074e6c0ef29363f014ec0ec422de3a55 100644
--- a/src/providers/dp_refresh.c
+++ b/src/providers/dp_refresh.c
@@ -89,6 +89,26 @@ done:
     return ret;
 }
 
+static errno_t be_refresh_get_users(TALLOC_CTX *mem_ctx,
+                                    struct sss_domain_info *domain,
+                                    time_t period,
+                                    char ***_values)
+{
+    struct ldb_dn *base_dn = NULL;
+    errno_t ret;
+
+    base_dn = sysdb_user_base_dn(mem_ctx, domain);
+    if (base_dn == NULL) {
+        return ENOMEM;
+    }
+
+    ret = be_refresh_get_values(mem_ctx, domain, period, SYSDB_USER_CLASS,
+                                base_dn, SYSDB_NAME, _values);
+
+    talloc_free(base_dn);
+    return ret;
+}
+
 static errno_t be_refresh_get_netgroups(TALLOC_CTX *mem_ctx,
                                         struct sss_domain_info *domain,
                                         time_t period,
@@ -138,6 +158,9 @@ struct be_refresh_ctx *be_refresh_ctx_init(TALLOC_CTX *mem_ctx)
         return NULL;
     }
 
+    ctx->callbacks[BE_REFRESH_TYPE_USERS].name = "users";
+    ctx->callbacks[BE_REFRESH_TYPE_USERS].get_values = be_refresh_get_users;
+
     ctx->callbacks[BE_REFRESH_TYPE_NETGROUPS].name = "netgroups";
     ctx->callbacks[BE_REFRESH_TYPE_NETGROUPS].get_values \
         = be_refresh_get_netgroups;
diff --git a/src/providers/dp_refresh.h b/src/providers/dp_refresh.h
index d7c775fff78455cc016a0419ee4b9b00ba8ec3f7..a0d42734b64e16184a3a2cdfe45057003ddec6cc 100644
--- a/src/providers/dp_refresh.h
+++ b/src/providers/dp_refresh.h
@@ -44,6 +44,7 @@ typedef errno_t
 (*be_refresh_recv_t)(struct tevent_req *req);
 
 enum be_refresh_type {
+    BE_REFRESH_TYPE_USERS,
     BE_REFRESH_TYPE_NETGROUPS,
     BE_REFRESH_TYPE_SENTINEL
 };
diff --git a/src/providers/ldap/sdap_refresh.c b/src/providers/ldap/sdap_refresh.c
index 104ed002c80607fd5c3a77483d338b8b823b13b8..2aaf3e6146a27990d1eb591352ea224dd358fe75 100644
--- a/src/providers/ldap/sdap_refresh.c
+++ b/src/providers/ldap/sdap_refresh.c
@@ -75,6 +75,9 @@ static struct tevent_req *sdap_refresh_send(TALLOC_CTX *mem_ctx,
     }
 
     switch (entry_type) {
+    case BE_REQ_USER:
+        state->type = "user";
+        break;
     case BE_REQ_NETGROUP:
         state->type = "netgroup";
         break;
@@ -200,6 +203,23 @@ static errno_t sdap_refresh_recv(struct tevent_req *req)
 }
 
 static struct tevent_req *
+sdap_refresh_users_send(TALLOC_CTX *mem_ctx,
+                        struct tevent_context *ev,
+                        struct be_ctx *be_ctx,
+                        struct sss_domain_info *domain,
+                        char **names,
+                        void *pvt)
+{
+    return sdap_refresh_send(mem_ctx, ev, be_ctx, domain,
+                             BE_REQ_USER, names, pvt);
+}
+
+static errno_t sdap_refresh_users_recv(struct tevent_req *req)
+{
+    return sdap_refresh_recv(req);
+}
+
+static struct tevent_req *
 sdap_refresh_netgroups_send(TALLOC_CTX *mem_ctx,
                             struct tevent_context *ev,
                             struct be_ctx *be_ctx,
@@ -221,6 +241,15 @@ errno_t sdap_refresh_init(struct be_refresh_ctx *refresh_ctx,
 {
     errno_t ret;
 
+    ret = be_refresh_add_cb(refresh_ctx, BE_REFRESH_TYPE_USERS,
+                            sdap_refresh_users_send,
+                            sdap_refresh_users_recv,
+                            id_ctx);
+    if (ret != EOK && ret != EEXIST) {
+        DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh of users "
+              "will not work [%d]: %s\n", ret, strerror(ret));
+    }
+
     ret = be_refresh_add_cb(refresh_ctx, BE_REFRESH_TYPE_NETGROUPS,
                             sdap_refresh_netgroups_send,
                             sdap_refresh_netgroups_recv,
-- 
1.9.3

