Fix include paths to new location of libutil.
[bbaumbach/samba-autobuild/.git] / source4 / libcli / ldap / ldap.c
index 11689fbd7999901151571c022319e6b1d15bf939..87c89daf9f47301a2665f2011bf24122c0028ce6 100644 (file)
@@ -23,8 +23,9 @@
 */
 
 #include "includes.h"
-#include "libcli/util/asn_1.h"
+#include "../lib/util/asn1.h"
 #include "libcli/ldap/ldap.h"
+#include "libcli/ldap/ldap_proto.h"
 
 
 static bool ldap_push_filter(struct asn1_data *data, struct ldb_parse_tree *tree)
@@ -77,7 +78,7 @@ static bool ldap_push_filter(struct asn1_data *data, struct ldb_parse_tree *tree
                i = 0;
                if ( ! tree->u.substring.start_with_wildcard) {
                        asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(0));
-                       asn1_write_LDAPString(data, (char *)tree->u.substring.chunks[i]->data);
+                       asn1_write_DATA_BLOB_LDAPString(data, tree->u.substring.chunks[i]);
                        asn1_pop_tag(data);
                        i++;
                }
@@ -91,7 +92,7 @@ static bool ldap_push_filter(struct asn1_data *data, struct ldb_parse_tree *tree
                                ctx = 1;
                        }
                        asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(ctx));
-                       asn1_write_LDAPString(data, (char *)tree->u.substring.chunks[i]->data);
+                       asn1_write_DATA_BLOB_LDAPString(data, tree->u.substring.chunks[i]);
                        asn1_pop_tag(data);
                        i++;
                }
@@ -157,7 +158,7 @@ static bool ldap_push_filter(struct asn1_data *data, struct ldb_parse_tree *tree
                        asn1_pop_tag(data);
                }
                asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(3));
-               asn1_write_LDAPString(data, (char *)tree->u.extended.value.data);
+               asn1_write_DATA_BLOB_LDAPString(data, &tree->u.extended.value);
                asn1_pop_tag(data);
                asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(4));
                asn1_write_uint8(data, tree->u.extended.dnAttributes);
@@ -187,7 +188,7 @@ static void ldap_encode_response(struct asn1_data *data, struct ldap_Result *res
        }
 }
 
-bool ldap_encode(struct ldap_message *msg, DATA_BLOB *result, TALLOC_CTX *mem_ctx)
+_PUBLIC_ bool ldap_encode(struct ldap_message *msg, DATA_BLOB *result, TALLOC_CTX *mem_ctx)
 {
        struct asn1_data *data = asn1_init(mem_ctx);
        int i, j;
@@ -927,7 +928,7 @@ static void ldap_decode_attribs(TALLOC_CTX *mem_ctx, struct asn1_data *data,
 
 /* This routine returns LDAP status codes */
 
-NTSTATUS ldap_decode(struct asn1_data *data, struct ldap_message *msg)
+_PUBLIC_ NTSTATUS ldap_decode(struct asn1_data *data, struct ldap_message *msg)
 {
        uint8_t tag;
 
@@ -1325,10 +1326,12 @@ NTSTATUS ldap_decode(struct asn1_data *data, struct ldap_message *msg)
        }
 
        msg->controls = NULL;
+       msg->controls_decoded = NULL;
 
        if (asn1_peek_tag(data, ASN1_CONTEXT(0))) {
                int i = 0;
                struct ldb_control **ctrl = NULL;
+               bool *decoded = NULL;
 
                asn1_start_tag(data, ASN1_CONTEXT(0));
 
@@ -1341,6 +1344,11 @@ NTSTATUS ldap_decode(struct asn1_data *data, struct ldap_message *msg)
                                return NT_STATUS_LDAP(LDAP_OPERATIONS_ERROR);
                        }
 
+                       decoded = talloc_realloc(msg, decoded, bool, i+1);
+                       if (!decoded) {
+                               return NT_STATUS_LDAP(LDAP_OPERATIONS_ERROR);
+                       }
+
                        ctrl[i] = talloc(ctrl, struct ldb_control);
                        if (!ctrl[i]) {
                                return NT_STATUS_LDAP(LDAP_OPERATIONS_ERROR);
@@ -1352,12 +1360,15 @@ NTSTATUS ldap_decode(struct asn1_data *data, struct ldap_message *msg)
                        
                        if (!ldap_decode_control_value(ctrl, value, ctrl[i])) {
                                if (ctrl[i]->critical) {
-                                       return NT_STATUS_LDAP(LDAP_UNAVAILABLE_CRITICAL_EXTENSION);
+                                       ctrl[i]->data = NULL;
+                                       decoded[i] = false;
+                                       i++;
                                } else {
                                        talloc_free(ctrl[i]);
                                        ctrl[i] = NULL;
                                }
                        } else {
+                               decoded[i] = true;
                                i++;
                        }
                }
@@ -1367,6 +1378,7 @@ NTSTATUS ldap_decode(struct asn1_data *data, struct ldap_message *msg)
                }
 
                msg->controls = ctrl;
+               msg->controls_decoded = decoded;
 
                asn1_end_tag(data);
        }