s4:ldb: make it possible to return per entry controls
authorAndrew Bartlett <abartlet@samba.org>
Tue, 16 Dec 2008 07:59:05 +0000 (08:59 +0100)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 17 Dec 2008 01:29:27 +0000 (12:29 +1100)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
25 files changed:
source4/dsdb/samdb/ldb_modules/anr.c
source4/dsdb/samdb/ldb_modules/extended_dn.c
source4/dsdb/samdb/ldb_modules/kludge_acl.c
source4/dsdb/samdb/ldb_modules/local_password.c
source4/dsdb/samdb/ldb_modules/normalise.c
source4/dsdb/samdb/ldb_modules/partition.c
source4/dsdb/samdb/ldb_modules/proxy.c
source4/dsdb/samdb/ldb_modules/ranged_results.c
source4/dsdb/samdb/ldb_modules/rootdse.c
source4/dsdb/samdb/ldb_modules/schema_fsmo.c
source4/dsdb/samdb/ldb_modules/show_deleted.c
source4/lib/ldb/common/ldb_controls.c
source4/lib/ldb/common/ldb_modules.c
source4/lib/ldb/include/ldb.h
source4/lib/ldb/include/ldb_private.h
source4/lib/ldb/ldb_ildap/ldb_ildap.c
source4/lib/ldb/ldb_ldap/ldb_ldap.c
source4/lib/ldb/ldb_map/ldb_map_outbound.c
source4/lib/ldb/ldb_tdb/ldb_index.c
source4/lib/ldb/ldb_tdb/ldb_search.c
source4/lib/ldb/modules/asq.c
source4/lib/ldb/modules/operational.c
source4/lib/ldb/modules/paged_results.c
source4/lib/ldb/modules/paged_searches.c
source4/lib/ldb/modules/sort.c

index da23030ed3a019352732f34ffbbda9644b499252..49e453ffa1e0d3c9fa0b1c6f67b8abc4dccc1fc7 100644 (file)
@@ -289,7 +289,7 @@ static int anr_search_callback(struct ldb_request *req, struct ldb_reply *ares)
 
        switch (ares->type) {
        case LDB_REPLY_ENTRY:
-               return ldb_module_send_entry(ac->req, ares->message);
+               return ldb_module_send_entry(ac->req, ares->message, ares->controls);
 
        case LDB_REPLY_REFERRAL:
                return ldb_module_send_referral(ac->req, ares->referral);
index a0602d9281504db3f8e46672c964f870f4e5efc5..48683db45666ad123ccd91b88312afdebb9f42fb 100644 (file)
@@ -241,7 +241,7 @@ static int extended_callback(struct ldb_request *req, struct ldb_reply *ares)
                        }
                }
 
-               return ldb_module_send_entry(ac->req, ares->message);
+               return ldb_module_send_entry(ac->req, ares->message, ares->controls);
 
        case LDB_REPLY_REFERRAL:
                return ldb_module_send_referral(ac->req, ares->referral);
index 97179a81264d77ab7e9751c99271507d1ebd3af6..275e9b5299c9600c3151bfe05a69446284824c53 100644 (file)
@@ -301,7 +301,7 @@ static int kludge_acl_callback(struct ldb_request *req, struct ldb_reply *ares)
                        }
                }
 
-               return ldb_module_send_entry(ac->req, ares->message);
+               return ldb_module_send_entry(ac->req, ares->message, ares->controls);
 
        case LDB_REPLY_REFERRAL:
                return ldb_module_send_referral(ac->req, ares->referral);
index 4e864e1452db887cd2d6bea835cb869f2ef85fde..55d895791a2fff42ebb09031c4069eada7c926ae 100644 (file)
@@ -820,7 +820,7 @@ static int lpdb_local_search_callback(struct ldb_request *req,
                /* free the rest */
                talloc_free(ares);
 
-               return ldb_module_send_entry(ac->req, merge->message);
+               return ldb_module_send_entry(ac->req, merge->message, merge->controls);
 
        case LDB_REPLY_REFERRAL:
                /* ignore */
@@ -833,7 +833,7 @@ static int lpdb_local_search_callback(struct ldb_request *req,
 
                /* if this entry was not returned yet, return it now */
                if (lr->remote) {
-                       ret = ldb_module_send_entry(ac->req, ac->remote->message);
+                       ret = ldb_module_send_entry(ac->req, ac->remote->message, ac->remote->controls);
                        if (ret != LDB_SUCCESS) {
                                return ldb_module_done(ac->req,
                                                        NULL, NULL, ret);
@@ -899,7 +899,7 @@ static int lpdb_remote_search_callback(struct ldb_request *req,
                                ldb_msg_remove_attr(ares->message, "objectClass");
                        }
                        
-                       return ldb_module_send_entry(ac->req, ares->message);
+                       return ldb_module_send_entry(ac->req, ares->message, ares->controls);
                }
 
                if (ldb_msg_find_ldb_val(ares->message, "objectGUID") == NULL) {
index 2366bc785684aa2bba79085e3f60a9d9c444ffa5..9ead1612db8fd9edfbff189259ea2b1ff926587f 100644 (file)
@@ -134,7 +134,7 @@ static int normalize_search_callback(struct ldb_request *req, struct ldb_reply *
                        }
                }
 
-               return ldb_module_send_entry(ac->req, msg);
+               return ldb_module_send_entry(ac->req, msg, ares->controls);
 
        case LDB_REPLY_REFERRAL:
 
index 5500c75a928e5fb7179be747f131f4d06d4944ed..0d2ce64604df58593235538ed1386fc09a0a99e7 100644 (file)
@@ -186,7 +186,7 @@ static int partition_req_callback(struct ldb_request *req,
                        return ldb_module_done(ac->req, NULL, NULL,
                                                LDB_ERR_OPERATIONS_ERROR);
                }
-               return ldb_module_send_entry(ac->req, ares->message);
+               return ldb_module_send_entry(ac->req, ares->message, ares->controls);
 
        case LDB_REPLY_DONE:
                if (ares->error == LDB_SUCCESS) {
index 2ff42297b7491af70db902c23118a53794d715fe..23116be9ac17032fac520d6def48a2dbb2dd8fb7 100644 (file)
@@ -280,7 +280,7 @@ static int proxy_search_callback(struct ldb_request *req,
                ac->count++;
 #endif
                proxy_convert_record(ac->module->ldb, proxy, ares->message);
-               ret = ldb_module_send_entry(ac->req, ares->message);
+               ret = ldb_module_send_entry(ac->req, ares->message, ares->controls);
                break;
 
        case LDB_REPLY_REFERRAL:
index b8e43a7e886000bcb8fc4922fc9d6736a2d649d3..eeb161bddef541d9de6fa10bf9ea88795c602148 100644 (file)
@@ -164,7 +164,7 @@ static int rr_search_callback(struct ldb_request *req, struct ldb_reply *ares)
                }
        }
 
-       return ldb_module_send_entry(ac->req, ares->message);
+       return ldb_module_send_entry(ac->req, ares->message, ares->controls);
 }
 
 /* search */
index b38e182cf7897ca4bbc8557e987ef57efa4c43fa..04a97fcd3bb66d0ab479a61533a356efddb5bb54 100644 (file)
@@ -278,7 +278,7 @@ static int rootdse_callback(struct ldb_request *req, struct ldb_reply *ares)
                        return ldb_module_done(ac->req, NULL, NULL, ret);
                }
 
-               return ldb_module_send_entry(ac->req, ares->message);
+               return ldb_module_send_entry(ac->req, ares->message, ares->controls);
 
        case LDB_REPLY_REFERRAL:
                /* should we allow the backend to return referrals in this case
index df409a8ae3cea7c36f01b745ec0caa42b8b88e6b..bfcf239f3ab0d014e314c6ea7d7331abf4d1c9bd 100644 (file)
@@ -406,7 +406,7 @@ static int schema_fsmo_search_callback(struct ldb_request *req, struct ldb_reply
        case LDB_REPLY_ENTRY:
 
                if (ldb_dn_compare(ares->message->dn, mc->aggregate_dn) != 0) {
-                       return ldb_module_send_entry(ac->req, ares->message);
+                       return ldb_module_send_entry(ac->req, ares->message, ares->controls);
                }
 
                for (i=0; i < ARRAY_SIZE(generated_attrs); i++) {
@@ -418,7 +418,7 @@ static int schema_fsmo_search_callback(struct ldb_request *req, struct ldb_reply
                        }
                }
 
-               return ldb_module_send_entry(ac->req, ares->message);
+               return ldb_module_send_entry(ac->req, ares->message, ares->controls);
 
        case LDB_REPLY_REFERRAL:
 
index 0e3b46debee4354131f109c3e75d19f2e53296aa..0914e51ebe53afb2dbe63837506abcb9fb4c6782 100644 (file)
@@ -64,7 +64,7 @@ static int show_deleted_search_callback(struct ldb_request *req,
        switch (ares->type) {
        case LDB_REPLY_ENTRY:
 
-               return ldb_module_send_entry(ar->req, ares->message);
+               return ldb_module_send_entry(ar->req, ares->message, ares->controls);
 
        case LDB_REPLY_REFERRAL:
                return ldb_module_send_referral(ar->req, ares->referral);
index e3f8551407a393042af393f3886c95f52857f910..6fad5012b699527c15f199525512fe556e73d07a 100644 (file)
@@ -53,6 +53,26 @@ struct ldb_control *ldb_request_get_control(struct ldb_request *req, const char
        return NULL;
 }
 
+/* check if a control with the specified "oid" exist and return it */
+/* returns NULL if not found */
+struct ldb_control *ldb_reply_get_control(struct ldb_reply *rep, const char *oid)
+{
+       int i;
+
+       /* check if there's a paged request control */
+       if (rep->controls != NULL) {
+               for (i = 0; rep->controls[i]; i++) {
+                       if (strcmp(oid, rep->controls[i]->oid) == 0) {
+                               break;
+                       }
+               }
+
+               return rep->controls[i];
+       }
+
+       return NULL;
+}
+
 /* saves the current controls list into the "saver" and replace the one in req with a new one excluding
 the "exclude" control */
 /* returns False on error */
index ab0f4c51cc27f62a5cbfe719f62658d1012d8e02..8db28d262cf094fb68f11805132e0921d7fa2569 100644 (file)
@@ -587,10 +587,13 @@ struct ldb_handle *ldb_handle_new(TALLOC_CTX *mem_ctx, struct ldb_context *ldb)
  *      req: the original request passed to your module
  *      msg: reply message (must be a talloc pointer, and it will be stolen
  *           on the ldb_reply that is sent to the callback)
+ *     ctrls: controls to send in the reply  (must be a talloc pointer, and it will be stolen
+ *           on the ldb_reply that is sent to the callback)
  */
 
 int ldb_module_send_entry(struct ldb_request *req,
-                         struct ldb_message *msg)
+                         struct ldb_message *msg,
+                         struct ldb_control **ctrls)
 {
        struct ldb_reply *ares;
 
@@ -602,6 +605,7 @@ int ldb_module_send_entry(struct ldb_request *req,
        }
        ares->type = LDB_REPLY_ENTRY;
        ares->message = talloc_steal(ares, msg);
+       ares->controls = talloc_steal(ares, ctrls);
        ares->error = LDB_SUCCESS;
 
        return req->callback(req, ares);
index cd7eb06b4d66be79e9f8e574c910ead4b7150240..e2ec869872ab23fc771443300a16df62f8d60d21 100644 (file)
@@ -326,7 +326,6 @@ typedef int (*ldb_attr_comparison_t)(struct ldb_context *, TALLOC_CTX *mem_ctx,
   attribute handler structure
 
   attr                 -> The attribute name
-  flags                        -> LDB_ATTR_FLAG_*
   ldif_read_fn         -> convert from ldif to binary format
   ldif_write_fn                -> convert from binary to ldif format
   canonicalise_fn      -> canonicalise a value, for use by indexing and dn construction
@@ -1075,6 +1074,15 @@ int ldb_request_add_control(struct ldb_request *req, const char *oid, bool criti
 */
 struct ldb_control *ldb_request_get_control(struct ldb_request *req, const char *oid);
 
+/**
+   check if a control with the specified "oid" exist and return it 
+  \param rep the reply struct where to add the control
+  \param oid the object identifier of the control as string
+
+  \return the control, NULL if not found 
+*/
+struct ldb_control *ldb_reply_get_control(struct ldb_reply *rep, const char *oid);
+
 /**
   Search the database
 
index d1d3587eb7ececc2df7cb72a7bda1828aac76f9c..c0652882796796b4eda55e78cda0fb557bdc9caa 100644 (file)
@@ -265,7 +265,8 @@ int ldb_register_backend(const char *url_prefix, ldb_connect_fn);
 struct ldb_handle *ldb_handle_new(TALLOC_CTX *mem_ctx, struct ldb_context *ldb);
 
 int ldb_module_send_entry(struct ldb_request *req,
-                         struct ldb_message *msg);
+                         struct ldb_message *msg,
+                         struct ldb_control **ctrls);
 
 int ldb_module_send_referral(struct ldb_request *req,
                                           char *ref);
index ae79bdfa481a57517146e6766205da47ffc9ba67..b17d063c0cec64a818a633664793fa7e344a81bf 100644 (file)
@@ -311,7 +311,9 @@ static void ildb_callback(struct ldap_request *req)
                                ldbmsg->num_elements = search->num_attributes;
                                ldbmsg->elements = talloc_move(ldbmsg, &search->attributes);
 
-                               ret = ldb_module_send_entry(ac->req, ldbmsg);
+                               controls = talloc_steal(ac, msg->controls);
+                               
+                               ret = ldb_module_send_entry(ac->req, ldbmsg, controls);
                                if (ret != LDB_SUCCESS) {
                                        callback_failed = true;
                                }
index 7caee10b47f3ed431849dd2e893edb964ff3c03c..9f8b3e9f35fe3d14e88e8bcc7b36e17b23446232 100644 (file)
@@ -515,7 +515,7 @@ static bool lldb_parse_result(struct lldb_context *ac, LDAPMessage *result)
                        }
                        if (berptr) ber_free(berptr, 0);
 
-                       ret = ldb_module_send_entry(ac->req, ldbmsg);
+                       ret = ldb_module_send_entry(ac->req, ldbmsg, NULL /* controls not yet supported */);
                        if (ret != LDB_SUCCESS) {
 
                                callback_failed = true;
index 5f524a8be3c74109974319e6c2e7285f2758bd33..5588eaaf46edbee36cb1b5e9d95de7869c4ced42 100644 (file)
@@ -1077,7 +1077,7 @@ int map_return_entry(struct map_context *ac, struct ldb_reply *ares)
                }
        }
 
-       return ldb_module_send_entry(ac->req, ares->message);
+       return ldb_module_send_entry(ac->req, ares->message, ares->controls);
 }
 
 /* Search a record. */
index de0e9a49d6cbe0c10a933b7e7668c2d166a0de29..d0b9fa27cec58367be109064fec05516dfe06528 100644 (file)
@@ -1037,7 +1037,7 @@ static int ltdb_index_filter(const struct dn_list *dn_list,
                        return LDB_ERR_OPERATIONS_ERROR;
                }
 
-               ret = ldb_module_send_entry(ac->req, msg);
+               ret = ldb_module_send_entry(ac->req, msg, NULL);
                if (ret != LDB_SUCCESS) {
                        ac->callback_failed = true;
                        return ret;
index 6ab06c4e486813b20b8ea9f95d29f9217c98fa81..35149c4b77f3e4612d8884ac64bc37aa00330d62 100644 (file)
@@ -418,7 +418,7 @@ static int search_func(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, voi
                return -1;
        }
 
-       ret = ldb_module_send_entry(ac->req, msg);
+       ret = ldb_module_send_entry(ac->req, msg, NULL);
        if (ret != LDB_SUCCESS) {
                ac->callback_failed = true;
                /* the callback failed, abort the operation */
index 835715e7dc5bea366d5647286dc8ec4f834ffcb9..c650970af4570a6ac957fdab2b5789567e198bcd 100644 (file)
@@ -178,7 +178,7 @@ static int asq_reqs_callback(struct ldb_request *req, struct ldb_reply *ares)
        case LDB_REPLY_ENTRY:
                /* pass the message up to the original callback as we
                 * do not have to elaborate on it any further */
-               ret = ldb_module_send_entry(ac->req, ares->message);
+               ret = ldb_module_send_entry(ac->req, ares->message, ares->controls);
                if (ret != LDB_SUCCESS) {
                        return ldb_module_done(ac->req, NULL, NULL, ret);
                }
index abb1d4ca1af66a4ea10db59e9acea69c6d848a8a..345441b5e1d7ca0bfdae43a0785b5ef5d253ea0b 100644 (file)
@@ -206,7 +206,7 @@ static int operational_callback(struct ldb_request *req, struct ldb_reply *ares)
                        return ldb_module_done(ac->req, NULL, NULL,
                                                LDB_ERR_OPERATIONS_ERROR);
                }
-               return ldb_module_send_entry(ac->req, ares->message);
+               return ldb_module_send_entry(ac->req, ares->message, ares->controls);
 
        case LDB_REPLY_REFERRAL:
                /* ignore referrals */
index 1a242f1be0497012f09befa96b7114b5584c7969..dfc565fef8c3556aaa0b9bf1a75654e9c7112647 100644 (file)
@@ -147,7 +147,7 @@ static int paged_results(struct paged_context *ac)
 
        while (ac->store->num_entries > 0 && ac->size > 0) {
                msg = ac->store->first;
-               ret = ldb_module_send_entry(ac->req, msg->r->message);
+               ret = ldb_module_send_entry(ac->req, msg->r->message, msg->r->controls);
                if (ret != LDB_SUCCESS) {
                        return ret;
                }
index 7a728e3bb0e3d090140a2cbaa919630e7ce3f496..56f9b1cac3d6cbffaad59c736dc8fd7de19a0266 100644 (file)
@@ -161,7 +161,7 @@ static int ps_callback(struct ldb_request *req, struct ldb_reply *ares)
 
        switch (ares->type) {
        case LDB_REPLY_ENTRY:
-               ret = ldb_module_send_entry(ac->req, ares->message);
+               ret = ldb_module_send_entry(ac->req, ares->message, ares->controls);
                if (ret != LDB_SUCCESS) {
                        return ldb_module_done(ac->req, NULL, NULL, ret);
                }
index 64d60f370cf7111099bfcf3f95b1dfbc64c86e77..25e56b24c8f57f08acb678db66cc5362bd5ec91f 100644 (file)
@@ -152,7 +152,7 @@ static int server_sort_results(struct sort_context *ac)
                ares->type = LDB_REPLY_ENTRY;
                ares->message = talloc_move(ares, &ac->msgs[i]);
 
-               ret = ldb_module_send_entry(ac->req, ares->message);
+               ret = ldb_module_send_entry(ac->req, ares->message, ares->controls);
                if (ret != LDB_SUCCESS) {
                        return ret;
                }