summaryrefslogtreecommitdiff
path: root/source4/libcli/ldap
diff options
context:
space:
mode:
authorSimo Sorce <idra@samba.org>2006-01-14 01:06:16 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:51:07 -0500
commit5db0c6b3042292e0f343ced3d45f2f7a8f97de12 (patch)
tree1fe20dd2ef31c9189f0ddc7fc620eee08f06e112 /source4/libcli/ldap
parent8e42a0c63c772731c4b756d8cd7db6a842a5f969 (diff)
downloadsamba-5db0c6b3042292e0f343ced3d45f2f7a8f97de12.tar.gz
samba-5db0c6b3042292e0f343ced3d45f2f7a8f97de12.tar.bz2
samba-5db0c6b3042292e0f343ced3d45f2f7a8f97de12.zip
r12925: implement client side of ASQ control
(This used to be commit dd386bdc6ca6fe0b25705d5a375d29e6940b437f)
Diffstat (limited to 'source4/libcli/ldap')
-rw-r--r--source4/libcli/ldap/ldap_controls.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/source4/libcli/ldap/ldap_controls.c b/source4/libcli/ldap/ldap_controls.c
index 55e7a94aa7..2a48d401c9 100644
--- a/source4/libcli/ldap/ldap_controls.c
+++ b/source4/libcli/ldap/ldap_controls.c
@@ -225,6 +225,67 @@ static BOOL decode_paged_results_request(void *mem_ctx, DATA_BLOB in, void **out
return True;
}
+/* seem that this controls has 2 forms one in case it is used with
+ * a Search Request and another when used ina Search Response
+ */
+static BOOL decode_asq_control(void *mem_ctx, DATA_BLOB in, void **out)
+{
+ DATA_BLOB source_attribute;
+ struct asn1_data data;
+ struct ldb_asq_control *lac;
+
+ if (!asn1_load(&data, in)) {
+ return False;
+ }
+
+ lac = talloc(mem_ctx, struct ldb_asq_control);
+ if (!lac) {
+ return False;
+ }
+
+ if (!asn1_start_tag(&data, ASN1_SEQUENCE(0))) {
+ return False;
+ }
+
+ if (asn1_peek_tag(&data, ASN1_OCTET_STRING)) {
+
+ if (!asn1_read_OctetString(&data, &source_attribute)) {
+ return False;
+ }
+ lac->src_attr_len = source_attribute.length;
+ if (lac->src_attr_len) {
+ lac->source_attribute = talloc_memdup(lac, source_attribute.data, source_attribute.length);
+
+ if (!(lac->source_attribute)) {
+ return False;
+ }
+ } else {
+ lac->source_attribute = NULL;
+ }
+
+ lac->request = 1;
+
+ } else if (asn1_peek_tag(&data, ASN1_ENUMERATED)) {
+
+ if (!asn1_read_enumerated(&data, &(lac->result))) {
+ return False;
+ }
+
+ lac->request = 0;
+
+ } else {
+ return False;
+ }
+
+ if (!asn1_end_tag(&data)) {
+ return False;
+ }
+
+ *out = lac;
+
+ return True;
+}
+
static BOOL encode_server_sort_response(void *mem_ctx, void *in, DATA_BLOB *out)
{
struct ldb_sort_resp_control *lsrc = talloc_get_type(in, struct ldb_sort_resp_control);
@@ -366,11 +427,49 @@ static BOOL encode_paged_results_request(void *mem_ctx, void *in, DATA_BLOB *out
return True;
}
+/* seem that this controls has 2 forms one in case it is used with
+ * a Search Request and another when used ina Search Response
+ */
+static BOOL encode_asq_control(void *mem_ctx, void *in, DATA_BLOB *out)
+{
+ struct ldb_asq_control *lac = talloc_get_type(in, struct ldb_asq_control);
+ struct asn1_data data;
+
+ ZERO_STRUCT(data);
+
+ if (!asn1_push_tag(&data, ASN1_SEQUENCE(0))) {
+ return False;
+ }
+
+ if (lac->request) {
+
+ if (!asn1_write_OctetString(&data, lac->source_attribute, lac->src_attr_len)) {
+ return False;
+ }
+ } else {
+ if (!asn1_write_enumerated(&data, lac->result)) {
+ return False;
+ }
+ }
+
+ if (!asn1_pop_tag(&data)) {
+ return False;
+ }
+
+ *out = data_blob_talloc(mem_ctx, data.data, data.length);
+ if (out->data == NULL) {
+ return False;
+ }
+
+ return True;
+}
+
struct control_handler ldap_known_controls[] = {
{ "1.2.840.113556.1.4.319", decode_paged_results_request, encode_paged_results_request },
{ "1.2.840.113556.1.4.529", decode_extended_dn_request, encode_extended_dn_request },
{ "1.2.840.113556.1.4.473", decode_server_sort_request, encode_server_sort_request },
{ "1.2.840.113556.1.4.474", decode_server_sort_response, encode_server_sort_response },
+ { "1.2.840.113556.1.4.1504", decode_asq_control, encode_asq_control },
{ NULL, NULL, NULL }
};