svn commit: samba r1856 - in branches/SAMBA_4_0/source/libcli: ldap util

metze at samba.org metze at samba.org
Tue Aug 17 11:22:45 GMT 2004


Author: metze
Date: 2004-08-17 11:22:44 +0000 (Tue, 17 Aug 2004)
New Revision: 1856

WebSVN: http://websvn.samba.org/websvn/changeset.php?rep=samba&path=/branches/SAMBA_4_0/source/libcli&rev=1856&nolog=1

Log:
- move asn1 functions to asn1.c
- merge some stuff from trunk

metze

Modified:
   branches/SAMBA_4_0/source/libcli/ldap/ldap.c
   branches/SAMBA_4_0/source/libcli/util/asn1.c


Changeset:
Modified: branches/SAMBA_4_0/source/libcli/ldap/ldap.c
===================================================================
--- branches/SAMBA_4_0/source/libcli/ldap/ldap.c	2004-08-17 11:04:12 UTC (rev 1855)
+++ branches/SAMBA_4_0/source/libcli/ldap/ldap.c	2004-08-17 11:22:44 UTC (rev 1856)
@@ -971,7 +971,8 @@
 		break;
 	}
 	case LDAP_TAG_ModifyDNResponse: {
-/*		struct ldap_Result *r = &msg->r.ModifyDNResponse; */
+		struct ldap_Result *r = &msg->r.ModifyDNResponse;
+		ldap_encode_response(msg->type, r, &data);
 		break;
 	}
 	case LDAP_TAG_CompareRequest: {
@@ -1061,50 +1062,16 @@
 	asn1_read_enumerated(data, &result->resultcode);
 	asn1_read_OctetString_talloc(mem_ctx, data, &result->dn);
 	asn1_read_OctetString_talloc(mem_ctx, data, &result->errormessage);
-	if (asn1_peek_tag(data, ASN1_OCTET_STRING))
+	if (asn1_peek_tag(data, ASN1_CONTEXT(3))) {
+		asn1_start_tag(data, ASN1_CONTEXT(3));
 		asn1_read_OctetString_talloc(mem_ctx, data, &result->referral);
-	else
+		asn1_end_tag(data);
+	} else {
 		result->referral = NULL;
-	asn1_end_tag(data);
-}
-
-/* read a octet string blob */
-static BOOL asn1_read_ContextSimple(ASN1_DATA *data, uint8_t num, DATA_BLOB *blob)
-{
-	int len;
-	ZERO_STRUCTP(blob);
-	if (!asn1_start_tag(data, ASN1_CONTEXT_SIMPLE(num))) return False;
-	len = asn1_tag_remaining(data);
-	if (len < 0) {
-		data->has_error = True;
-		return False;
 	}
-	*blob = data_blob(NULL, len);
-	asn1_read(data, blob->data, len);
 	asn1_end_tag(data);
-	return !data->has_error;
 }
 
-static void ldap_decode_BindResponse(TALLOC_CTX *mem_ctx,
-				 ASN1_DATA *data,
-				 enum ldap_request_tag tag,
-				 struct ldap_BindResponse *BindResp)
-{
-	asn1_start_tag(data, ASN1_APPLICATION(tag));
-	asn1_read_enumerated(data, &BindResp->response.resultcode);
-	asn1_read_OctetString_talloc(mem_ctx, data, &BindResp->response.dn);
-	asn1_read_OctetString_talloc(mem_ctx, data, &BindResp->response.errormessage);
-	if (asn1_peek_tag(data, ASN1_CONTEXT_SIMPLE(7))) {
-		DATA_BLOB tmp_blob = data_blob(NULL, 0);
-		asn1_read_ContextSimple(data, 7, &tmp_blob);
-		BindResp->SASL.secblob = data_blob_talloc(mem_ctx, tmp_blob.data, tmp_blob.length);
-		data_blob_free(&tmp_blob);
-	} else {
-		BindResp->SASL.secblob = data_blob(NULL, 0);
-	}
-	asn1_end_tag(data);
-}
-
 static BOOL add_attrib_to_array_talloc(TALLOC_CTX *mem_ctx,
 				       const struct ldap_attribute *attrib,
 				       struct ldap_attribute **attribs,
@@ -1300,9 +1267,26 @@
 	case ASN1_APPLICATION(LDAP_TAG_BindResponse): {
 		struct ldap_BindResponse *r = &msg->r.BindResponse;
 		msg->type = LDAP_TAG_BindResponse;
-		ldap_decode_BindResponse(msg->mem_ctx,
-				     data, LDAP_TAG_BindResponse,
-				     r);
+		asn1_start_tag(data, ASN1_APPLICATION(LDAP_TAG_BindResponse));
+		asn1_read_enumerated(data, &r->response.resultcode);
+		asn1_read_OctetString_talloc(msg->mem_ctx, data, &r->response.dn);
+		asn1_read_OctetString_talloc(msg->mem_ctx, data, &r->response.errormessage);
+		if (asn1_peek_tag(data, ASN1_CONTEXT(3))) {
+			asn1_start_tag(data, ASN1_CONTEXT(3));
+			asn1_read_OctetString_talloc(msg->mem_ctx, data, &r->response.referral);
+			asn1_end_tag(data);
+		} else {
+			r->response.referral = NULL;
+		}
+		if (asn1_peek_tag(data, ASN1_CONTEXT_SIMPLE(7))) {
+			DATA_BLOB tmp_blob = data_blob(NULL, 0);
+			asn1_read_ContextSimple(data, 7, &tmp_blob);
+			r->SASL.secblob = data_blob_talloc(msg->mem_ctx, tmp_blob.data, tmp_blob.length);
+			data_blob_free(&tmp_blob);
+		} else {
+			r->SASL.secblob = data_blob(NULL, 0);
+		}
+		asn1_end_tag(data);
 		break;
 	}
 
@@ -1460,8 +1444,28 @@
 	}
 
 	case ASN1_APPLICATION(LDAP_TAG_ModifyDNRequest): {
-/*		struct ldap_ModifyDNRequest *r = &msg->r.ModifyDNRequest; */
+		struct ldap_ModifyDNRequest *r = &msg->r.ModifyDNRequest;
 		msg->type = LDAP_TAG_ModifyDNRequest;
+		asn1_start_tag(data,
+			       ASN1_APPLICATION(LDAP_TAG_ModifyDNRequest));
+		asn1_read_OctetString_talloc(msg->mem_ctx, data, &r->dn);
+		asn1_read_OctetString_talloc(msg->mem_ctx, data, &r->newrdn);
+		asn1_read_BOOLEAN2(data, &r->deleteolddn);
+		r->newsuperior = NULL;
+		if (asn1_tag_remaining(data) > 0) {
+			int len;
+			char *newsup;
+			asn1_start_tag(data, ASN1_CONTEXT_SIMPLE(0));
+			len = asn1_tag_remaining(data);
+			newsup = talloc(msg->mem_ctx, len+1);
+			if (newsup == NULL)
+				break;
+			asn1_read(data, newsup, len);
+			newsup[len] = '\0';
+			r->newsuperior = newsup;
+			asn1_end_tag(data);
+		}
+		asn1_end_tag(data);
 		break;
 	}
 

Modified: branches/SAMBA_4_0/source/libcli/util/asn1.c
===================================================================
--- branches/SAMBA_4_0/source/libcli/util/asn1.c	2004-08-17 11:04:12 UTC (rev 1855)
+++ branches/SAMBA_4_0/source/libcli/util/asn1.c	2004-08-17 11:22:44 UTC (rev 1856)
@@ -166,6 +166,14 @@
 	return !data->has_error;
 }
 
+BOOL asn1_write_ContextSimple(ASN1_DATA *data, uint8_t num, DATA_BLOB *blob)
+{
+	asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(num));
+	asn1_write(data, blob->data, blob->length);
+	asn1_pop_tag(data);
+	return !data->has_error;
+}
+
 /* write a BOOLEAN */
 BOOL asn1_write_BOOLEAN(ASN1_DATA *data, BOOL v)
 {
@@ -518,6 +526,22 @@
 	return !data->has_error;
 }
 
+BOOL asn1_read_ContextSimple(ASN1_DATA *data, uint8_t num, DATA_BLOB *blob)
+{
+	int len;
+	ZERO_STRUCTP(blob);
+	if (!asn1_start_tag(data, ASN1_CONTEXT_SIMPLE(num))) return False;
+	len = asn1_tag_remaining(data);
+	if (len < 0) {
+		data->has_error = True;
+		return False;
+	}
+	*blob = data_blob(NULL, len);
+	asn1_read(data, blob->data, len);
+	asn1_end_tag(data);
+	return !data->has_error;
+}
+
 /* read an interger */
 BOOL asn1_read_Integer(ASN1_DATA *data, int *i)
 {



More information about the samba-cvs mailing list