andykimpe / rpms / 389-ds-base

Forked from rpms/389-ds-base 5 months ago
Clone
dc8c34
From 92fbcbe2c3f4476cc4b6373bb52ef4663ea7e4c4 Mon Sep 17 00:00:00 2001
dc8c34
From: Ludwig Krispenz <lkrispen@redhat.com>
dc8c34
Date: Fri, 27 Jun 2014 15:20:25 +0200
dc8c34
Subject: [PATCH 231/234] Ticket 47821 - deref plugin cannot handle complex
dc8c34
 acis
dc8c34
dc8c34
Bug Description:  the deref plugin does not return attributes if
dc8c34
			the access depends on rules requireing
dc8c34
			the entry
dc8c34
dc8c34
Fix Description:   do the access check after the entry is retrieved
dc8c34
dc8c34
https://fedorahosted.org/389/ticket/47821
dc8c34
dc8c34
Reviewed by: mark, thanks
dc8c34
dc8c34
Conflicts:
dc8c34
	ldap/servers/plugins/deref/deref.c
dc8c34
(cherry picked from commit ed487614f094a902afa7299e2c98f4cd8d02fe96)
dc8c34
---
dc8c34
 ldap/servers/plugins/deref/deref.c | 115 +++++++++++++++++++------------------
dc8c34
 1 file changed, 59 insertions(+), 56 deletions(-)
dc8c34
dc8c34
diff --git a/ldap/servers/plugins/deref/deref.c b/ldap/servers/plugins/deref/deref.c
dc8c34
index 6e4d4ec..c6630df 100644
dc8c34
--- a/ldap/servers/plugins/deref/deref.c
dc8c34
+++ b/ldap/servers/plugins/deref/deref.c
dc8c34
@@ -597,14 +597,10 @@ deref_do_deref_attr(Slapi_PBlock *pb, BerElement *ctrlber, const char *derefdn,
dc8c34
     Slapi_Entry **entries = NULL;
dc8c34
     int rc;
dc8c34
 
dc8c34
-    if (deref_check_access(pb, NULL, derefdn, attrs, &retattrs,
dc8c34
-                           (SLAPI_ACL_SEARCH|SLAPI_ACL_READ))) {
dc8c34
-        slapi_log_error(SLAPI_LOG_PLUGIN, DEREF_PLUGIN_SUBSYSTEM,
dc8c34
-                        "The client does not have permission to read the requested "
dc8c34
-                        "attributes in entry %s\n", derefdn);
dc8c34
-        return;
dc8c34
-    }
dc8c34
-
dc8c34
+/*  If the access check on the attributes is done without retrieveing the entry
dc8c34
+ *  it cannot handle acis which need teh entry, eg to apply a targetfilter rule
dc8c34
+ *  So the determination of attrs which can be dereferenced is delayed
dc8c34
+ */
dc8c34
     derefpb = slapi_pblock_new();
dc8c34
     slapi_search_internal_set_pb(derefpb, derefdn, LDAP_SCOPE_BASE,
dc8c34
                                  "(objectclass=*)", retattrs, 0,
dc8c34
@@ -623,61 +619,68 @@ deref_do_deref_attr(Slapi_PBlock *pb, BerElement *ctrlber, const char *derefdn,
dc8c34
             } else {
dc8c34
                 int ii;
dc8c34
                 int needattrvals = 1; /* need attrvals sequence? */
dc8c34
-                for (ii = 0; retattrs[ii]; ++ii) {
dc8c34
-                    Slapi_Value *sv;
dc8c34
-                    int idx = 0;
dc8c34
-                    Slapi_ValueSet* results = NULL;
dc8c34
-                    int type_name_disposition = 0;
dc8c34
-                    char* actual_type_name = NULL;
dc8c34
-                    int flags = 0;
dc8c34
-                    int buffer_flags = 0;
dc8c34
-                    int needpartialattr = 1; /* need PartialAttribute sequence? */
dc8c34
-                    int needvalsset = 1;
dc8c34
-
dc8c34
-                    if (is_type_forbidden(retattrs[ii])) {
dc8c34
-                        slapi_log_error(SLAPI_LOG_PLUGIN, DEREF_PLUGIN_SUBSYSTEM,
dc8c34
-                            "skip forbidden attribute [%s]\n", derefdn);
dc8c34
-                        continue;
dc8c34
-                    }
dc8c34
+                if (deref_check_access(pb, entries[0], derefdn, attrs, &retattrs,
dc8c34
+                          (SLAPI_ACL_SEARCH|SLAPI_ACL_READ))) {
dc8c34
+                    slapi_log_error(SLAPI_LOG_PLUGIN, DEREF_PLUGIN_SUBSYSTEM,
dc8c34
+                             "The client does not have permission to read the requested "
dc8c34
+                             "attributes in entry %s\n", derefdn);
dc8c34
+           } else {
dc8c34
+                    for (ii = 0; retattrs[ii]; ++ii) {
dc8c34
+                        Slapi_Value *sv;
dc8c34
+                        int idx = 0;
dc8c34
+                        Slapi_ValueSet* results = NULL;
dc8c34
+                        int type_name_disposition = 0;
dc8c34
+                        char* actual_type_name = NULL;
dc8c34
+                        int flags = 0;
dc8c34
+                        int buffer_flags = 0;
dc8c34
+                        int needpartialattr = 1; /* need PartialAttribute sequence? */
dc8c34
+                        int needvalsset = 1;
dc8c34
+
dc8c34
+                        if (is_type_forbidden(retattrs[ii])) {
dc8c34
+                            slapi_log_error(SLAPI_LOG_PLUGIN, DEREF_PLUGIN_SUBSYSTEM,
dc8c34
+                                "skip forbidden attribute [%s]\n", derefdn);
dc8c34
+                            continue;
dc8c34
+                        }
dc8c34
 
dc8c34
-                    deref_get_values(entries[0], retattrs[ii], &results, &type_name_disposition,
dc8c34
-                                     &actual_type_name, flags, &buffer_flags);
dc8c34
+                        deref_get_values(entries[0], retattrs[ii], &results, &type_name_disposition,
dc8c34
+                                         &actual_type_name, flags, &buffer_flags);
dc8c34
 
dc8c34
-                    if (results) {
dc8c34
-                        idx = slapi_valueset_first_value(results, &sv;;
dc8c34
-                    }
dc8c34
-                    for (; results && sv; idx = slapi_valueset_next_value(results, idx, &sv)) {
dc8c34
-                        const struct berval *bv = slapi_value_get_berval(sv);
dc8c34
-                        if (needattrvals) {
dc8c34
-                            /* we have at least one attribute with values in
dc8c34
-                               DerefRes.attrVals */
dc8c34
-                            /* attrVals is OPTIONAL - only added if there are
dc8c34
-                               any values to send */
dc8c34
-                            ber_printf(ctrlber, "t{", (LBER_CLASS_CONTEXT|LBER_CONSTRUCTED));
dc8c34
-                            needattrvals = 0;
dc8c34
+                        if (results) {
dc8c34
+                            idx = slapi_valueset_first_value(results, &sv;;
dc8c34
                         }
dc8c34
-                        if (needpartialattr) {
dc8c34
-                            /* This attribute in attrVals has values */
dc8c34
-                            ber_printf(ctrlber, "{s", retattrs[ii]);
dc8c34
-                            needpartialattr = 0;
dc8c34
+                        for (; results && sv; idx = slapi_valueset_next_value(results, idx, &sv)) {
dc8c34
+                            const struct berval *bv = slapi_value_get_berval(sv);
dc8c34
+                            if (needattrvals) {
dc8c34
+                                /* we have at least one attribute with values in
dc8c34
+                                   DerefRes.attrVals */
dc8c34
+                                /* attrVals is OPTIONAL - only added if there are
dc8c34
+                                   any values to send */
dc8c34
+                                ber_printf(ctrlber, "t{", (LBER_CLASS_CONTEXT|LBER_CONSTRUCTED));
dc8c34
+                                needattrvals = 0;
dc8c34
+                            }
dc8c34
+                            if (needpartialattr) {
dc8c34
+                                /* This attribute in attrVals has values */
dc8c34
+                                ber_printf(ctrlber, "{s", retattrs[ii]);
dc8c34
+                                needpartialattr = 0;
dc8c34
+                            }
dc8c34
+                            if (needvalsset) {
dc8c34
+                                /* begin the vals SET of values for this attribute */
dc8c34
+                                ber_printf(ctrlber, "[");
dc8c34
+                                needvalsset = 0;
dc8c34
+                            }
dc8c34
+                            ber_printf(ctrlber, "O", bv);
dc8c34
+                        } /* for each value in retattrs[ii] */
dc8c34
+                        deref_values_free(&results, &actual_type_name, buffer_flags);
dc8c34
+                        if (needvalsset == 0) {
dc8c34
+                            ber_printf(ctrlber, "]");
dc8c34
                         }
dc8c34
-                        if (needvalsset) {
dc8c34
-                            /* begin the vals SET of values for this attribute */
dc8c34
-                            ber_printf(ctrlber, "[");
dc8c34
-                            needvalsset = 0;
dc8c34
+                        if (needpartialattr == 0) {
dc8c34
+                            ber_printf(ctrlber, "}");
dc8c34
                         }
dc8c34
-                        ber_printf(ctrlber, "O", bv);
dc8c34
-                    } /* for each value in retattrs[ii] */
dc8c34
-                    deref_values_free(&results, &actual_type_name, buffer_flags);
dc8c34
-                    if (needvalsset == 0) {
dc8c34
-                        ber_printf(ctrlber, "]");
dc8c34
-                    }
dc8c34
-                    if (needpartialattr == 0) {
dc8c34
+                    } /* for each attr in retattrs */
dc8c34
+                    if (needattrvals == 0) {
dc8c34
                         ber_printf(ctrlber, "}");
dc8c34
                     }
dc8c34
-                } /* for each attr in retattrs */
dc8c34
-                if (needattrvals == 0) {
dc8c34
-                    ber_printf(ctrlber, "}");
dc8c34
                 }
dc8c34
             }
dc8c34
         } else { /* nothing */
dc8c34
-- 
dc8c34
1.8.1.4
dc8c34