From aef4c55946f6b55d6a5ee536deba12e7583f8af1 Mon Sep 17 00:00:00 2001
From: Jan Zeleny <jzeleny@redhat.com>
Date: Mon, 23 Apr 2012 04:50:36 -0400
Subject: [PATCH 05/10] Ghost members - modifications in memberof plugin

---
 src/ldb_modules/memberof.c |   47 ++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 41 insertions(+), 6 deletions(-)

diff --git a/src/ldb_modules/memberof.c b/src/ldb_modules/memberof.c
index 4fc46fa84529ac1850cdb588ddf69be0f60e8238..f0b5b72ed11ce71aec8ccb6e7a7cbd2d02e9566e 100644
--- a/src/ldb_modules/memberof.c
+++ b/src/ldb_modules/memberof.c
@@ -28,6 +28,7 @@
 #include "dhash.h"
 
 #define DB_MEMBER "member"
+#define DB_GHOST "ghost"
 #define DB_MEMBEROF "memberof"
 #define DB_MEMBERUID "memberuid"
 #define DB_NAME "name"
@@ -191,7 +192,8 @@ static int mbof_append_muop(TALLOC_CTX *memctx,
                             int *_num_muops,
                             int flags,
                             struct ldb_dn *parent,
-                            const char *name)
+                            const char *name,
+                            const char *element_name)
 {
     struct mbof_memberuid_op *muops = *_muops;
     int num_muops = *_num_muops;
@@ -229,7 +231,7 @@ static int mbof_append_muop(TALLOC_CTX *memctx,
         if (!op->el) {
             return LDB_ERR_OPERATIONS_ERROR;
         }
-        op->el->name = talloc_strdup(op->el, DB_MEMBERUID);
+        op->el->name = talloc_strdup(op->el, element_name);
         if (!op->el->name) {
             return LDB_ERR_OPERATIONS_ERROR;
         }
@@ -534,7 +536,8 @@ static int mbof_add_callback(struct ldb_request *req,
 static int mbof_next_add(struct mbof_add_operation *addop)
 {
     static const char *attrs[] = { DB_OC, DB_NAME,
-                                   DB_MEMBER, DB_MEMBEROF, NULL };
+                                   DB_MEMBER, DB_GHOST,
+                                   DB_MEMBEROF, NULL };
     struct ldb_context *ldb;
     struct ldb_request *req;
     struct mbof_add_ctx *add_ctx;
@@ -789,7 +792,8 @@ static int mbof_add_operation(struct mbof_add_operation *addop)
             ret = mbof_append_muop(add_ctx, &add_ctx->muops,
                                    &add_ctx->num_muops,
                                    LDB_FLAG_MOD_ADD,
-                                   parents->dns[i], name);
+                                   parents->dns[i], name,
+                                   DB_MEMBERUID);
             if (ret != LDB_SUCCESS) {
                 return ret;
             }
@@ -806,6 +810,35 @@ static int mbof_add_operation(struct mbof_add_operation *addop)
         return ret;
     }
 
+    el = ldb_msg_find_element(addop->entry, DB_GHOST);
+    if (el) {
+        for (i = 0; i < el->num_values; i++) {
+            /* add memberuid to all group's parents */
+            for (j = 0; j < parents->num; j++) {
+                ret = mbof_append_muop(add_ctx, &add_ctx->muops,
+                                       &add_ctx->num_muops,
+                                       LDB_FLAG_MOD_ADD,
+                                       parents->dns[j],
+                                       (char *)el->values[i].data,
+                                       DB_GHOST);
+                if (ret != LDB_SUCCESS) {
+                    return ret;
+                }
+            }
+
+            /* now add memberuid to the group itself */
+            ret = mbof_append_muop(add_ctx, &add_ctx->muops,
+                                   &add_ctx->num_muops,
+                                   LDB_FLAG_MOD_ADD,
+                                   addop->entry_dn,
+                                   (char *)el->values[i].data,
+                                   DB_GHOST);
+            if (ret != LDB_SUCCESS) {
+                return ret;
+            }
+        }
+    }
+
     /* we are done with the entry now */
     talloc_free(addop->entry);
     addop->entry = NULL;
@@ -2071,7 +2104,8 @@ static int mbof_del_mod_entry(struct mbof_del_operation *delop)
             ret = mbof_append_muop(del_ctx, &del_ctx->muops,
                                    &del_ctx->num_muops,
                                    LDB_FLAG_MOD_DELETE,
-                                   diff[i], name);
+                                   diff[i], name,
+                                   DB_MEMBERUID);
             if (ret != LDB_SUCCESS) {
                 return ret;
             }
@@ -2311,7 +2345,8 @@ static int mbof_del_fill_muop(struct mbof_del_ctx *del_ctx,
         ret = mbof_append_muop(del_ctx, &del_ctx->muops,
                                &del_ctx->num_muops,
                                LDB_FLAG_MOD_DELETE,
-                               valdn, name);
+                               valdn, name,
+                               DB_MEMBERUID);
         if (ret != LDB_SUCCESS) {
             return ret;
         }
-- 
1.7.7.6

