aboutsummaryrefslogtreecommitdiffstats
path: root/asn1/ldap
diff options
context:
space:
mode:
authorRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2006-05-03 10:59:15 +0000
committerRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2006-05-03 10:59:15 +0000
commitc18467254d0cd353d79b77d7d1124b7e564ef4e2 (patch)
tree106a54547d3714bf9d90c5a1779d3387de321f63 /asn1/ldap
parentac146caf5cd3a5034ce38012254889a06b9dda87 (diff)
do some template magic to make ethereal dissect CLDAP RPC again.
i dont think it is the optimal way to solve this but it is better than nothing for the time being. svn path=/trunk/; revision=18083
Diffstat (limited to 'asn1/ldap')
-rw-r--r--asn1/ldap/ldap.cnf32
-rw-r--r--asn1/ldap/packet-ldap-template.c79
2 files changed, 84 insertions, 27 deletions
diff --git a/asn1/ldap/ldap.cnf b/asn1/ldap/ldap.cnf
index e85d60758c..81e41ac225 100644
--- a/asn1/ldap/ldap.cnf
+++ b/asn1/ldap/ldap.cnf
@@ -337,33 +337,6 @@ ldap_conv_info_t *ldap_info;
proto_item_append_text(ldm_tree, " %%s", valstr);
}
-
-
-#.FN_PARS AttributeValue VAL_PTR = &parameter_tvb
-
-#.FN_BODY AttributeValue
-
- tvbuff_t *parameter_tvb;
- gchar *string;
- guint32 i, len;
- proto_item *pi;
-
- %(DEFAULT_BODY)s
-
- len = tvb_length_remaining(parameter_tvb, 0);
-
- for(i = 0; i < len; i++)
- if(!g_ascii_isprint(tvb_get_guint8(parameter_tvb, i)))
- break;
-
- if(i == len) {
- string = tvb_get_string(parameter_tvb, 0, tvb_length_remaining(parameter_tvb, 0));
-
- pi = get_ber_last_created_item();
-
- proto_item_set_text(pi, string);
-
- }
#.FN_PARS AuthenticationChoice VAL_PTR = &branch
@@ -395,3 +368,8 @@ ldap_conv_info_t *ldap_info;
%(DEFAULT_BODY)s
ldap_do_protocolop(pinfo);
+
+#.NO_EMIT
+AttributeDescription
+AttributeValue
+
diff --git a/asn1/ldap/packet-ldap-template.c b/asn1/ldap/packet-ldap-template.c
index c721c5748c..d081e510c0 100644
--- a/asn1/ldap/packet-ldap-template.c
+++ b/asn1/ldap/packet-ldap-template.c
@@ -621,8 +621,87 @@ static void dissect_mscldap_response(proto_tree *tree, tvbuff_t *tvb, guint32 rp
}
}
+static int dissect_ldap_AttributeDescription(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_);
+static int dissect_ldap_AttributeValue(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_);
+
+static int mscldap_rpc_call=0;
+
#include "packet-ldap-fn.c"
+static int
+dissect_ldap_AttributeValue(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+ tvbuff_t *parameter_tvb;
+ gchar *string;
+ guint32 i, len;
+ proto_item *pi;
+ ldap_conv_info_t *ldap_info;
+
+ ldap_info=(ldap_conv_info_t *)pinfo->private_data;
+ /* if this is cldap then this might hold the RPC reply
+ */
+ if(ldap_info && ldap_info->is_mscldap && mscldap_rpc_call){
+
+ offset = dissect_ber_octet_string(implicit_tag, pinfo, NULL, tvb, offset, hf_index, &parameter_tvb);
+ dissect_mscldap_response(tree, parameter_tvb, mscldap_rpc_call);
+ mscldap_rpc_call=0;
+
+ return offset;
+ }
+
+ offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+ &parameter_tvb);
+
+
+ len = tvb_length_remaining(parameter_tvb, 0);
+
+ for(i = 0; i < len; i++)
+ if(!g_ascii_isprint(tvb_get_guint8(parameter_tvb, i)))
+ break;
+
+ if(i == len) {
+ string = tvb_get_string(parameter_tvb, 0, tvb_length_remaining(parameter_tvb, 0));
+
+ pi = get_ber_last_created_item();
+
+ proto_item_set_text(pi, string);
+
+ }
+
+ return offset;
+}
+
+static int
+dissect_ldap_AttributeDescription(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+ tvbuff_t *parameter_tvb = NULL;
+ char *ldapstring=NULL;
+ ldap_conv_info_t *ldap_info;
+
+ ldap_info=(ldap_conv_info_t *)pinfo->private_data;
+
+ /* if this is cldap then this holds the name of the RPC function called
+ * and we have to remember it until the value is dissected.
+ */
+ if(ldap_info && ldap_info->is_mscldap){
+ mscldap_rpc_call=0;
+ dissect_ber_octet_string(implicit_tag, pinfo, NULL, tvb, offset, hf_index,
+ &parameter_tvb);
+ if(parameter_tvb){
+ ldapstring = tvb_get_string(parameter_tvb, 0, tvb_length_remaining(parameter_tvb, 0));
+ }
+
+ if(ldapstring){
+ if(!strcmp(ldapstring, "netlogon")){
+ mscldap_rpc_call=MSCLDAP_RPC_NETLOGON;
+ }
+ g_free(ldapstring);
+ }
+ }
+
+ offset = dissect_ldap_LDAPString(implicit_tag, tvb, offset, pinfo, tree, hf_index);
+
+ return offset;
+}
+
static void
dissect_ldap_payload(tvbuff_t *tvb, packet_info *pinfo,
proto_tree *tree, ldap_conv_info_t *ldap_info,