summaryrefslogtreecommitdiff
path: root/source4/libcli
diff options
context:
space:
mode:
Diffstat (limited to 'source4/libcli')
-rw-r--r--source4/libcli/ldap/ldap.c90
-rw-r--r--source4/libcli/util/asn1.c24
2 files changed, 71 insertions, 43 deletions
diff --git a/source4/libcli/ldap/ldap.c b/source4/libcli/ldap/ldap.c
index b6272f694e..b319299b1e 100644
--- a/source4/libcli/ldap/ldap.c
+++ b/source4/libcli/ldap/ldap.c
@@ -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;
}
diff --git a/source4/libcli/util/asn1.c b/source4/libcli/util/asn1.c
index e7c38b2803..1f04e1fe46 100644
--- a/source4/libcli/util/asn1.c
+++ b/source4/libcli/util/asn1.c
@@ -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)
{