r1856: - move asn1 functions to asn1.c
authorStefan Metzmacher <metze@samba.org>
Tue, 17 Aug 2004 11:22:44 +0000 (11:22 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:58:02 +0000 (12:58 -0500)
- merge some stuff from trunk

metze

source/libcli/ldap/ldap.c
source/libcli/util/asn1.c

index b6272f694e44b585aa12bc58e1c9931cccdd623f..b319299b1e733970f2295dd2576d6f20f219f223 100644 (file)
@@ -971,7 +971,8 @@ BOOL ldap_encode(struct ldap_message *msg, DATA_BLOB *result)
                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,46 +1062,12 @@ static void ldap_decode_response(TALLOC_CTX *mem_ctx,
        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
-               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);
+               asn1_end_tag(data);
        } else {
-               BindResp->SASL.secblob = data_blob(NULL, 0);
+               result->referral = NULL;
        }
        asn1_end_tag(data);
 }
@@ -1300,9 +1267,26 @@ BOOL ldap_decode(ASN1_DATA *data, struct ldap_message *msg)
        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 @@ BOOL ldap_decode(ASN1_DATA *data, struct ldap_message *msg)
        }
 
        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;
        }
 
index e7c38b2803820da842bd4cb471ecf48205d759ed..1f04e1fe46221a891abfd4a170239fc09b16a597 100644 (file)
@@ -166,6 +166,14 @@ BOOL asn1_write_GeneralString(ASN1_DATA *data, const char *s)
        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 @@ BOOL asn1_read_OctetString(ASN1_DATA *data, DATA_BLOB *blob)
        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)
 {