diff options
-rw-r--r-- | asn1/ldap/Lightweight-Directory-Access-Protocol-V3.asn | 51 | ||||
-rw-r--r-- | asn1/ldap/ldap.cnf | 47 | ||||
-rw-r--r-- | asn1/ldap/packet-ldap-template.c | 17 | ||||
-rw-r--r-- | epan/dissectors/packet-ber.c | 3 | ||||
-rw-r--r-- | epan/dissectors/packet-ber.h | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-ldap.c | 400 | ||||
-rw-r--r-- | epan/libwireshark.def | 1 |
7 files changed, 448 insertions, 73 deletions
diff --git a/asn1/ldap/Lightweight-Directory-Access-Protocol-V3.asn b/asn1/ldap/Lightweight-Directory-Access-Protocol-V3.asn index 5afe6ff4f2..b993335258 100644 --- a/asn1/ldap/Lightweight-Directory-Access-Protocol-V3.asn +++ b/asn1/ldap/Lightweight-Directory-Access-Protocol-V3.asn @@ -113,7 +113,7 @@ LDAPResult ::= SEQUENCE { Referral ::= SEQUENCE OF LDAPURL -LDAPURL ::= LDAPString -- limited to characters permitted in URLs +LDAPURL ::= OCTET STRING -- LDAPString - - limited to characters permitted in URLs Controls ::= SEQUENCE OF Control @@ -366,6 +366,55 @@ ExtendedResponse ::= [APPLICATION 24] SEQUENCE { ResponseName ::= LDAPOID +-- RFC 2696 - Simple Paged Results Manipulation + +SearchControlValue ::= SEQUENCE { + size INTEGER --(0..maxInt)--, + -- requested page size from client + -- result set size estimate from server + cookie OCTET STRING +} + +-- RFC 2891 - Server Side Sorting of Search Results + +SortKeyList ::= SEQUENCE OF SEQUENCE { + attributeType AttributeDescription, + orderingRule [0] MatchingRuleId OPTIONAL, + reverseOrder [1] BOOLEAN DEFAULT FALSE } + +SortResult ::= SEQUENCE { + sortResult ENUMERATED { + success (0), -- results are sorted + operationsError (1), -- server internal failure + timeLimitExceeded (3), -- timelimit reached before + -- sorting was completed + strongAuthRequired (8), -- refused to return sorted + -- results via insecure + -- protocol + adminLimitExceeded (11), -- too many matching entries + -- for the server to sort + noSuchAttribute (16), -- unrecognized attribute + -- type in sort key + inappropriateMatching (18), -- unrecognized or + -- inappropriate matching + -- rule in sort key + insufficientAccessRights (50), -- refused to return sorted + -- results to this client + busy (51), -- too busy to process + unwillingToPerform (53), -- unable to sort + other (80) + }, + attributeType [0] AttributeDescription OPTIONAL } + + +-- Draft RFC - but used in some implementations + +ReplControlValue ::= SEQUENCE { + parentsFirst INTEGER, + maxReturnLength INTEGER, + cookie OCTET STRING +} + END -- Generated by Asnp, the ASN.1 pretty-printer of France Telecom R&D diff --git a/asn1/ldap/ldap.cnf b/asn1/ldap/ldap.cnf index 33805a0aed..749658af98 100644 --- a/asn1/ldap/ldap.cnf +++ b/asn1/ldap/ldap.cnf @@ -28,6 +28,15 @@ LDAPOID TYPE = FT_STRING DISPLAY = BASE_NONE STRINGS = NULL Mechanism TYPE = FT_STRING DISPLAY = BASE_NONE STRINGS = NULL AssertionValue TYPE = FT_STRING DISPLAY = BASE_NONE STRINGS = NULL +#.REGISTER +SearchControlValue B "1.2.840.113556.1.4.319" "pagedResultsControl" +SortKeyList B "1.2.840.113556.1.4.473" "sortKeyList" +SortResult B "1.2.840.113556.1.4.474" "sortResult" +ReplControlValue B "1.2.840.113556.1.4.841" "replControlValue" + +#.FN_FTR LDAPURL + PROTO_ITEM_SET_URL(get_ber_last_created_item()); + #.FN_PARS LDAPOID VAL_PTR = ¶meter_tvb #.FN_HDR LDAPOID @@ -35,13 +44,19 @@ AssertionValue TYPE = FT_STRING DISPLAY = BASE_NONE STRINGS = NULL const gchar *name; proto_item *item = NULL; - #.FN_FTR LDAPOID + + object_identifier_id = NULL; + if (!parameter_tvb) return offset; - item = get_ber_last_created_item(); - name = get_oid_str_name(tvb_get_string(parameter_tvb, 0, tvb_length_remaining(parameter_tvb,0))); + + object_identifier_id = tvb_get_string(parameter_tvb, 0, tvb_length_remaining(parameter_tvb,0)); + name = get_oid_str_name(object_identifier_id); + if(name){ + item = get_ber_last_created_item(); + proto_item_append_text(item, " (%s)", name); proto_item_append_text(tree, " %s", name); } @@ -253,12 +268,19 @@ ldap_conv_info_t *ldap_info; ldapstring = "<ROOT>"; if(hf_index == hf_ldap_baseObject) { - /* this is search - but it on the scanline */ + /* this is search - put it on the scanline */ if(check_col(pinfo->cinfo, COL_INFO)) col_append_fstr(pinfo->cinfo, COL_INFO, "\"%%s\" ", ldapstring); if(ldm_tree) proto_item_append_text(ldm_tree, " \"%%s\"", ldapstring); + + + if(!parameter_tvb) { + + proto_item_append_text(ber_last_created_item, " (%%s)", ldapstring); + } + } else if ((hf_index == hf_ldap_errorMessage) && result) { /* only show message if not success */ if(check_col(pinfo->cinfo, COL_INFO)) col_append_fstr(pinfo->cinfo, COL_INFO, "(%%s) ", ldapstring); @@ -617,6 +639,23 @@ ldap_conv_info_t *ldap_info; } return offset; +#.FN_BODY Control/controlValue + gint8 class; + gboolean pc, ind; + gint32 tag; + guint32 len; + + if((object_identifier_id != NULL) && oid_has_dissector(object_identifier_id)) { + /* remove the OCTET STRING encoding */ + offset=dissect_ber_identifier(pinfo, NULL, tvb, offset, &class, &pc, &tag); + offset=dissect_ber_length(pinfo, NULL, tvb, offset, &len, &ind); + + call_ber_oid_callback(object_identifier_id, tvb, offset, pinfo, tree); + + offset += len; + } else { + %(DEFAULT_BODY)s + } #.NO_EMIT AttributeType diff --git a/asn1/ldap/packet-ldap-template.c b/asn1/ldap/packet-ldap-template.c index 8089774937..aab1769931 100644 --- a/asn1/ldap/packet-ldap-template.c +++ b/asn1/ldap/packet-ldap-template.c @@ -157,11 +157,11 @@ static gint ett_mscldap_netlogon_flags = -1; #include "packet-ldap-ett.c" static dissector_table_t ldap_name_dissector_table=NULL; +static const char *object_identifier_id = NULL; /* LDAP OID */ /* desegmentation of LDAP */ static gboolean ldap_desegment = TRUE; static guint ldap_tcp_port = 389; -static guint ldap_max_pdu_size = 65535; static gboolean do_protocolop = FALSE; static gchar *attr_type = NULL; @@ -1332,8 +1332,7 @@ dissect_ldap_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) */ sasl_len=tvb_get_ntohl(tvb, 0); - if( (sasl_len>ldap_max_pdu_size) - || (sasl_len<2) ){ + if( sasl_len<2 ){ goto this_was_not_sasl; } @@ -1367,7 +1366,7 @@ this_was_not_sasl: offset=get_ber_length(NULL, tvb, 1, &ldap_len, &ind); /* dont check ind since indefinite length is never used for ldap (famous last words)*/ - if(ldap_len<2 || ldap_len>ldap_max_pdu_size){ + if(ldap_len<2){ goto this_was_not_normal_ldap; } @@ -1623,17 +1622,13 @@ void proto_register_ldap(void) { prefs_register_bool_preference(ldap_module, "desegment_ldap_messages", "Reassemble LDAP messages spanning multiple TCP segments", "Whether the LDAP dissector should reassemble messages spanning multiple TCP segments." - " To use this option, you must also enable \"Allow subdissectors to reassemble TCP streams\" in the TCP protocol settings, and disable \"Verify length\" in the BER protocol settings", + "To use this option, you must also enable \"Allow subdissectors to reassemble TCP streams\" in the TCP protocol settings.", &ldap_desegment); prefs_register_uint_preference(ldap_module, "tcp.port", "LDAP TCP Port", "Set the port for LDAP operations", 10, &ldap_tcp_port); - prefs_register_uint_preference(ldap_module, "max_pdu", "LDAP Maximum PDU Size", - "The maximum LDAP PDU size. PDUs larger than this will be considered invalid.", - 10, &ldap_max_pdu_size); - proto_cldap = proto_register_protocol( "Connectionless Lightweight Directory Access Protocol", "CLDAP", "cldap"); @@ -1699,6 +1694,10 @@ proto_reg_handoff_ldap(void) register_ldap_name_dissector("supportedCapabilities", dissect_ldap_oid, proto_ldap); register_ldap_name_dissector("objectSid", dissect_ldap_sid, proto_ldap); register_ldap_name_dissector("nTSecurityDescriptor", dissect_ldap_nt_sec_desc, proto_ldap); + +#include "packet-ldap-dis-tab.c" + + } diff --git a/epan/dissectors/packet-ber.c b/epan/dissectors/packet-ber.c index 174960097f..c503451849 100644 --- a/epan/dissectors/packet-ber.c +++ b/epan/dissectors/packet-ber.c @@ -2458,5 +2458,8 @@ proto_reg_handoff_ber(void) ber_handle = create_dissector_handle(dissect_ber, proto_ber); dissector_add("wtap_encap", WTAP_ENCAP_BER, ber_handle); +} +gboolean oid_has_dissector(const char *oid) { + return(dissector_get_string_handle(ber_oid_dissector_table, oid) != NULL); } diff --git a/epan/dissectors/packet-ber.h b/epan/dissectors/packet-ber.h index 8eb67043af..d7d9b264cb 100644 --- a/epan/dissectors/packet-ber.h +++ b/epan/dissectors/packet-ber.h @@ -176,5 +176,7 @@ void register_ber_oid_dissector_handle(const char *oid, dissector_handle_t disse void register_ber_oid_dissector(const char *oid, dissector_t dissector, int proto, const char *name); void dissect_ber_oid_NULL_callback(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); +gboolean oid_has_dissector(const char *oid); + #endif /* __PACKET_BER_H__ */ diff --git a/epan/dissectors/packet-ldap.c b/epan/dissectors/packet-ldap.c index 2cacb83a5e..f45aed98e5 100644 --- a/epan/dissectors/packet-ldap.c +++ b/epan/dissectors/packet-ldap.c @@ -157,6 +157,10 @@ static int hf_ldap_AccessMask_ADS_CONTROL_ACCESS = -1; /*--- Included file: packet-ldap-hf.c ---*/ #line 1 "packet-ldap-hf.c" static int hf_ldap_LDAPMessage_PDU = -1; /* LDAPMessage */ +static int hf_ldap_SearchControlValue_PDU = -1; /* SearchControlValue */ +static int hf_ldap_SortKeyList_PDU = -1; /* SortKeyList */ +static int hf_ldap_SortResult_PDU = -1; /* SortResult */ +static int hf_ldap_ReplControlValue_PDU = -1; /* ReplControlValue */ static int hf_ldap_messageID = -1; /* MessageID */ static int hf_ldap_protocolOp = -1; /* ProtocolOp */ static int hf_ldap_controls = -1; /* Controls */ @@ -194,7 +198,7 @@ static int hf_ldap_Referral_item = -1; /* LDAPURL */ static int hf_ldap_Controls_item = -1; /* Control */ static int hf_ldap_controlType = -1; /* ControlType */ static int hf_ldap_criticality = -1; /* BOOLEAN */ -static int hf_ldap_controlValue = -1; /* OCTET_STRING */ +static int hf_ldap_controlValue = -1; /* T_controlValue */ static int hf_ldap_version = -1; /* INTEGER_1_127 */ static int hf_ldap_name = -1; /* LDAPDN */ static int hf_ldap_authentication = -1; /* AuthenticationChoice */ @@ -256,6 +260,15 @@ static int hf_ldap_requestValue = -1; /* OCTET_STRING */ static int hf_ldap_extendedResponse_resultCode = -1; /* ExtendedResponse_resultCode */ static int hf_ldap_responseName = -1; /* ResponseName */ static int hf_ldap_response = -1; /* OCTET_STRING */ +static int hf_ldap_size = -1; /* INTEGER */ +static int hf_ldap_cookie = -1; /* OCTET_STRING */ +static int hf_ldap_SortKeyList_item = -1; /* SortKeyList_item */ +static int hf_ldap_attributeType = -1; /* AttributeDescription */ +static int hf_ldap_orderingRule = -1; /* MatchingRuleId */ +static int hf_ldap_reverseOrder = -1; /* BOOLEAN */ +static int hf_ldap_sortResult = -1; /* T_sortResult */ +static int hf_ldap_parentsFirst = -1; /* INTEGER */ +static int hf_ldap_maxReturnLength = -1; /* INTEGER */ /*--- End of included file: packet-ldap-hf.c ---*/ #line 149 "packet-ldap-template.c" @@ -307,16 +320,21 @@ static gint ett_ldap_ModifyDNRequest = -1; static gint ett_ldap_CompareRequest = -1; static gint ett_ldap_ExtendedRequest = -1; static gint ett_ldap_ExtendedResponse = -1; +static gint ett_ldap_SearchControlValue = -1; +static gint ett_ldap_SortKeyList = -1; +static gint ett_ldap_SortKeyList_item = -1; +static gint ett_ldap_SortResult = -1; +static gint ett_ldap_ReplControlValue = -1; /*--- End of included file: packet-ldap-ett.c ---*/ #line 158 "packet-ldap-template.c" static dissector_table_t ldap_name_dissector_table=NULL; +static const char *object_identifier_id = NULL; /* LDAP OID */ /* desegmentation of LDAP */ static gboolean ldap_desegment = TRUE; static guint ldap_tcp_port = 389; -static guint ldap_max_pdu_size = 65535; static gboolean do_protocolop = FALSE; static gchar *attr_type = NULL; @@ -712,7 +730,7 @@ static int dissect_ldap_Filter(gboolean implicit_tag, tvbuff_t *tvb, int offset, static int dissect_ldap_MessageID(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 53 "ldap.cnf" +#line 68 "ldap.cnf" offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index, &MessageID); @@ -745,7 +763,7 @@ static int dissect_version(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, static int dissect_ldap_LDAPString(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 240 "ldap.cnf" +#line 255 "ldap.cnf" tvbuff_t *parameter_tvb = NULL; char *ldapstring; gchar *sc = NULL; /* semi-colon pointer */ @@ -764,12 +782,19 @@ dissect_ldap_LDAPString(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, pa ldapstring = "<ROOT>"; if(hf_index == hf_ldap_baseObject) { - /* this is search - but it on the scanline */ + /* this is search - put it on the scanline */ if(check_col(pinfo->cinfo, COL_INFO)) col_append_fstr(pinfo->cinfo, COL_INFO, "\"%s\" ", ldapstring); if(ldm_tree) proto_item_append_text(ldm_tree, " \"%s\"", ldapstring); + + + if(!parameter_tvb) { + + proto_item_append_text(ber_last_created_item, " (%s)", ldapstring); + } + } else if ((hf_index == hf_ldap_errorMessage) && result) { /* only show message if not success */ if(check_col(pinfo->cinfo, COL_INFO)) col_append_fstr(pinfo->cinfo, COL_INFO, "(%s) ", ldapstring); @@ -869,7 +894,7 @@ static int dissect_newSuperior_impl(packet_info *pinfo, proto_tree *tree, tvbuff static int dissect_ldap_Simple(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 103 "ldap.cnf" +#line 118 "ldap.cnf" ldap_conv_info_t *ldap_info; offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index, @@ -893,7 +918,7 @@ static int dissect_simple_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *t static int dissect_ldap_Mechanism(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 114 "ldap.cnf" +#line 129 "ldap.cnf" ldap_conv_info_t *ldap_info; tvbuff_t *parameter_tvb; @@ -945,7 +970,7 @@ static int dissect_mechanism(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb static int dissect_ldap_Credentials(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 153 "ldap.cnf" +#line 168 "ldap.cnf" tvbuff_t *parameter_tvb; ldap_conv_info_t *ldap_info; @@ -1002,7 +1027,7 @@ static int dissect_sasl_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb static int dissect_ldap_T_ntlmsspNegotiate(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 601 "ldap.cnf" +#line 623 "ldap.cnf" call_dissector(ntlmssp_handle, tvb, pinfo, tree); offset+=tvb_length_remaining(tvb, offset); @@ -1018,7 +1043,7 @@ static int dissect_ntlmsspNegotiate_impl(packet_info *pinfo, proto_tree *tree, t static int dissect_ldap_T_ntlmsspAuth(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 605 "ldap.cnf" +#line 627 "ldap.cnf" call_dissector(ntlmssp_handle, tvb, pinfo, tree); offset+=tvb_length_remaining(tvb, offset); @@ -1049,7 +1074,7 @@ static const ber_choice_t AuthenticationChoice_choice[] = { static int dissect_ldap_AuthenticationChoice(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 415 "ldap.cnf" +#line 437 "ldap.cnf" gint branch = -1; gint auth = -1; const gchar *valstr; @@ -1147,7 +1172,7 @@ static const value_string ldap_BindResponse_resultCode_vals[] = { static int dissect_ldap_BindResponse_resultCode(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 357 "ldap.cnf" +#line 379 "ldap.cnf" const gchar *valstr; @@ -1182,7 +1207,7 @@ static int dissect_bindResponse_resultCode(packet_info *pinfo, proto_tree *tree, static int dissect_ldap_T_matchedDN(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 609 "ldap.cnf" +#line 631 "ldap.cnf" tvbuff_t *new_tvb=NULL; offset = dissect_ber_octet_string(FALSE, pinfo, tree, tvb, offset, hf_ldap_matchedDN, &new_tvb); @@ -1196,7 +1221,6 @@ dissect_ldap_T_matchedDN(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, p - return offset; } static int dissect_matchedDN1(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { @@ -1219,7 +1243,12 @@ static int dissect_errorMessage(packet_info *pinfo, proto_tree *tree, tvbuff_t * static int dissect_ldap_LDAPURL(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { - offset = dissect_ldap_LDAPString(implicit_tag, tvb, offset, pinfo, tree, hf_index); + offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index, + NULL); + +#line 38 "ldap.cnf" + PROTO_ITEM_SET_URL(get_ber_last_created_item()); + return offset; } @@ -1250,7 +1279,7 @@ static int dissect_referral_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t static int dissect_ldap_ServerSaslCreds(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 179 "ldap.cnf" +#line 194 "ldap.cnf" tvbuff_t *parameter_tvb; ldap_conv_info_t *ldap_info; @@ -1344,7 +1373,7 @@ static int dissect_bindResponse(packet_info *pinfo, proto_tree *tree, tvbuff_t * static int dissect_ldap_UnbindRequest(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 436 "ldap.cnf" +#line 458 "ldap.cnf" implicit_tag = TRUE; /* correct problem with asn2wrs */ @@ -1376,7 +1405,7 @@ static const value_string ldap_T_scope_vals[] = { static int dissect_ldap_T_scope(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 316 "ldap.cnf" +#line 338 "ldap.cnf" gint scope; const gchar *valstr; @@ -1444,7 +1473,7 @@ static int dissect_timeLimit(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb static int dissect_ldap_BOOLEAN(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 529 "ldap.cnf" +#line 551 "ldap.cnf" gboolean val; offset = dissect_ber_boolean_value(implicit_tag, pinfo, tree, tvb, offset, hf_index, &val); @@ -1469,6 +1498,9 @@ static int dissect_dnAttributes_impl(packet_info *pinfo, proto_tree *tree, tvbuf static int dissect_deleteoldrdn(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { return dissect_ldap_BOOLEAN(FALSE, tvb, offset, pinfo, tree, hf_ldap_deleteoldrdn); } +static int dissect_reverseOrder_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { + return dissect_ldap_BOOLEAN(TRUE, tvb, offset, pinfo, tree, hf_ldap_reverseOrder); +} @@ -1476,7 +1508,7 @@ static int dissect_ldap_T_and_item(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { offset = dissect_ldap_Filter(implicit_tag, tvb, offset, pinfo, tree, hf_index); -#line 470 "ldap.cnf" +#line 492 "ldap.cnf" if(and_filter_string){ and_filter_string=ep_strdup_printf("(&%s%s)",and_filter_string,Filter_string); } else { @@ -1497,7 +1529,7 @@ static const ber_sequence_t T_and_set_of[1] = { static int dissect_ldap_T_and(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 477 "ldap.cnf" +#line 499 "ldap.cnf" const ber_sequence_t and_set_of[1] = { { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_and_item }, }; proto_tree *tr=NULL; @@ -1530,7 +1562,7 @@ static int dissect_ldap_T_or_item(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { offset = dissect_ldap_Filter(implicit_tag, tvb, offset, pinfo, tree, hf_index); -#line 496 "ldap.cnf" +#line 518 "ldap.cnf" if(or_filter_string){ or_filter_string=ep_strdup_printf("(|%s%s)",or_filter_string,Filter_string); } else { @@ -1552,7 +1584,7 @@ static const ber_sequence_t T_or_set_of[1] = { static int dissect_ldap_T_or(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 504 "ldap.cnf" +#line 526 "ldap.cnf" const ber_sequence_t or_set_of[1] = { { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_or_item }, }; proto_tree *tr=NULL; @@ -1585,7 +1617,7 @@ static int dissect_ldap_T_not(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { offset = dissect_ldap_Filter(implicit_tag, tvb, offset, pinfo, tree, hf_index); -#line 526 "ldap.cnf" +#line 548 "ldap.cnf" Filter_string=ep_strdup_printf("(!%s)",Filter_string); @@ -1615,6 +1647,12 @@ static int dissect_type(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int static int dissect_type_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { return dissect_ldap_AttributeDescription(TRUE, tvb, offset, pinfo, tree, hf_ldap_type); } +static int dissect_attributeType(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { + return dissect_ldap_AttributeDescription(FALSE, tvb, offset, pinfo, tree, hf_ldap_attributeType); +} +static int dissect_attributeType_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { + return dissect_ldap_AttributeDescription(TRUE, tvb, offset, pinfo, tree, hf_ldap_attributeType); +} static int dissect_assertionValue(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { return dissect_ldap_AssertionValue(FALSE, tvb, offset, pinfo, tree, hf_ldap_assertionValue); @@ -1647,7 +1685,7 @@ static int dissect_ldap_T_equalityMatch(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { offset = dissect_ldap_AttributeValueAssertion(implicit_tag, tvb, offset, pinfo, tree, hf_index); -#line 455 "ldap.cnf" +#line 477 "ldap.cnf" Filter_string=ep_strdup_printf("(%s=%s)",attributedesc_string,ldapvalue_string); @@ -1679,7 +1717,7 @@ dissect_ldap_T_substringFilter_substrings_item(gboolean implicit_tag _U_, tvbuff T_substringFilter_substrings_item_choice, hf_index, ett_ldap_T_substringFilter_substrings_item, NULL); -#line 552 "ldap.cnf" +#line 574 "ldap.cnf" if (substring_item_final) { substring_value=ep_strdup_printf("%s%s", (substring_value?substring_value:"*"), @@ -1725,7 +1763,7 @@ static const ber_sequence_t SubstringFilter_sequence[] = { static int dissect_ldap_SubstringFilter(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 566 "ldap.cnf" +#line 588 "ldap.cnf" proto_tree *tr=NULL; proto_item *it=NULL; char *old_substring_value=substring_value; @@ -1760,7 +1798,7 @@ static int dissect_ldap_T_greaterOrEqual(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { offset = dissect_ldap_AttributeValueAssertion(implicit_tag, tvb, offset, pinfo, tree, hf_index); -#line 459 "ldap.cnf" +#line 481 "ldap.cnf" Filter_string=ep_strdup_printf("(%s>=%s)",attributedesc_string,ldapvalue_string); @@ -1777,7 +1815,7 @@ static int dissect_ldap_T_lessOrEqual(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { offset = dissect_ldap_AttributeValueAssertion(implicit_tag, tvb, offset, pinfo, tree, hf_index); -#line 463 "ldap.cnf" +#line 485 "ldap.cnf" Filter_string=ep_strdup_printf("(%s<=%s)",attributedesc_string,ldapvalue_string); @@ -1794,7 +1832,7 @@ static int dissect_ldap_T_present(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { offset = dissect_ldap_AttributeDescription(implicit_tag, tvb, offset, pinfo, tree, hf_index); -#line 523 "ldap.cnf" +#line 545 "ldap.cnf" Filter_string=ep_strdup_printf("(%s=*)",Filter_string); @@ -1810,7 +1848,7 @@ static int dissect_ldap_T_approxMatch(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { offset = dissect_ldap_AttributeValueAssertion(implicit_tag, tvb, offset, pinfo, tree, hf_index); -#line 467 "ldap.cnf" +#line 489 "ldap.cnf" Filter_string=ep_strdup_printf("(%s~=%s)",attributedesc_string,ldapvalue_string); @@ -1831,6 +1869,9 @@ dissect_ldap_MatchingRuleId(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset static int dissect_matchingRule_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { return dissect_ldap_MatchingRuleId(TRUE, tvb, offset, pinfo, tree, hf_ldap_matchingRule); } +static int dissect_orderingRule_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { + return dissect_ldap_MatchingRuleId(TRUE, tvb, offset, pinfo, tree, hf_ldap_orderingRule); +} static const ber_sequence_t MatchingRuleAssertion_sequence[] = { @@ -1853,7 +1894,7 @@ dissect_ldap_MatchingRuleAssertion(gboolean implicit_tag _U_, tvbuff_t *tvb, int static int dissect_ldap_T_extensibleMatch(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 538 "ldap.cnf" +#line 560 "ldap.cnf" attr_type=NULL; matching_rule_string=NULL; ldapvalue_string=NULL; @@ -1862,7 +1903,7 @@ dissect_ldap_T_extensibleMatch(gboolean implicit_tag _U_, tvbuff_t *tvb, int off offset = dissect_ldap_MatchingRuleAssertion(implicit_tag, tvb, offset, pinfo, tree, hf_index); -#line 544 "ldap.cnf" +#line 566 "ldap.cnf" Filter_string=ep_strdup_printf("(%s:%s%s%s=%s)", (attr_type?attr_type:""), (matching_rule_dnattr?"dn:":""), @@ -1908,7 +1949,7 @@ static const ber_choice_t Filter_choice[] = { static int dissect_ldap_Filter(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 587 "ldap.cnf" +#line 609 "ldap.cnf" proto_tree *tr=NULL; proto_item *it=NULL; @@ -1931,13 +1972,13 @@ dissect_ldap_Filter(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet static int dissect_ldap_T_filter(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 448 "ldap.cnf" +#line 470 "ldap.cnf" Filter_string=NULL; offset = dissect_ldap_Filter(implicit_tag, tvb, offset, pinfo, tree, hf_index); -#line 451 "ldap.cnf" +#line 473 "ldap.cnf" Filter_string=NULL; and_filter_string=NULL; @@ -1992,7 +2033,7 @@ static int dissect_searchRequest(packet_info *pinfo, proto_tree *tree, tvbuff_t 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_) { -#line 378 "ldap.cnf" +#line 400 "ldap.cnf" tvbuff_t *next_tvb; gchar *string; @@ -2152,7 +2193,7 @@ static const value_string ldap_T_resultCode_vals[] = { static int dissect_ldap_T_resultCode(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 335 "ldap.cnf" +#line 357 "ldap.cnf" const gchar *valstr; @@ -2507,23 +2548,29 @@ static int dissect_abandonRequest(packet_info *pinfo, proto_tree *tree, tvbuff_t static int dissect_ldap_LDAPOID(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 33 "ldap.cnf" +#line 42 "ldap.cnf" tvbuff_t *parameter_tvb; const gchar *name; proto_item *item = NULL; - offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index, ¶meter_tvb); -#line 40 "ldap.cnf" +#line 48 "ldap.cnf" + + object_identifier_id = NULL; + if (!parameter_tvb) return offset; - item = get_ber_last_created_item(); - name = get_oid_str_name(tvb_get_string(parameter_tvb, 0, tvb_length_remaining(parameter_tvb,0))); + + object_identifier_id = tvb_get_string(parameter_tvb, 0, tvb_length_remaining(parameter_tvb,0)); + name = get_oid_str_name(object_identifier_id); + if(name){ + item = get_ber_last_created_item(); + proto_item_append_text(item, " (%s)", name); proto_item_append_text(tree, " %s", name); } @@ -2545,15 +2592,15 @@ dissect_ldap_OCTET_STRING(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, return offset; } -static int dissect_controlValue(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { - return dissect_ldap_OCTET_STRING(FALSE, tvb, offset, pinfo, tree, hf_ldap_controlValue); -} static int dissect_requestValue_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { return dissect_ldap_OCTET_STRING(TRUE, tvb, offset, pinfo, tree, hf_ldap_requestValue); } static int dissect_response_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { return dissect_ldap_OCTET_STRING(TRUE, tvb, offset, pinfo, tree, hf_ldap_response); } +static int dissect_cookie(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { + return dissect_ldap_OCTET_STRING(FALSE, tvb, offset, pinfo, tree, hf_ldap_cookie); +} static const ber_sequence_t ExtendedRequest_sequence[] = { @@ -2714,7 +2761,7 @@ static const ber_choice_t ProtocolOp_choice[] = { static int dissect_ldap_ProtocolOp(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { -#line 61 "ldap.cnf" +#line 76 "ldap.cnf" ldap_call_response_t *lcrp; ldap_conv_info_t *ldap_info = (ldap_conv_info_t *)pinfo->private_data; @@ -2725,7 +2772,7 @@ dissect_ldap_ProtocolOp(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, pa ProtocolOp_choice, hf_index, ett_ldap_ProtocolOp, &ProtocolOp); -#line 67 "ldap.cnf" +#line 82 "ldap.cnf" lcrp=ldap_match_call_response(tvb, pinfo, tree, MessageID, ProtocolOp); if(lcrp){ @@ -2781,6 +2828,38 @@ static int dissect_controlType(packet_info *pinfo, proto_tree *tree, tvbuff_t *t } + +static int +dissect_ldap_T_controlValue(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { +#line 643 "ldap.cnf" + gint8 class; + gboolean pc, ind; + gint32 tag; + guint32 len; + + if((object_identifier_id != NULL) && oid_has_dissector(object_identifier_id)) { + /* remove the OCTET STRING encoding */ + offset=dissect_ber_identifier(pinfo, NULL, tvb, offset, &class, &pc, &tag); + offset=dissect_ber_length(pinfo, NULL, tvb, offset, &len, &ind); + + call_ber_oid_callback(object_identifier_id, tvb, offset, pinfo, tree); + + offset += len; + } else { + offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index, + NULL); + + } + + + + return offset; +} +static int dissect_controlValue(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { + return dissect_ldap_T_controlValue(FALSE, tvb, offset, pinfo, tree, hf_ldap_controlValue); +} + + static const ber_sequence_t Control_sequence[] = { { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_controlType }, { BER_CLASS_UNI, BER_UNI_TAG_BOOLEAN, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_criticality }, @@ -2833,11 +2912,148 @@ dissect_ldap_LDAPMessage(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, p + + +static int +dissect_ldap_INTEGER(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { + offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index, + NULL); + + return offset; +} +static int dissect_size(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { + return dissect_ldap_INTEGER(FALSE, tvb, offset, pinfo, tree, hf_ldap_size); +} +static int dissect_parentsFirst(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { + return dissect_ldap_INTEGER(FALSE, tvb, offset, pinfo, tree, hf_ldap_parentsFirst); +} +static int dissect_maxReturnLength(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { + return dissect_ldap_INTEGER(FALSE, tvb, offset, pinfo, tree, hf_ldap_maxReturnLength); +} + + +static const ber_sequence_t SearchControlValue_sequence[] = { + { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_size }, + { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_cookie }, + { 0, 0, 0, NULL } +}; + +static int +dissect_ldap_SearchControlValue(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { + offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset, + SearchControlValue_sequence, hf_index, ett_ldap_SearchControlValue); + + return offset; +} + + +static const ber_sequence_t SortKeyList_item_sequence[] = { + { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_attributeType }, + { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_orderingRule_impl }, + { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_reverseOrder_impl }, + { 0, 0, 0, NULL } +}; + +static int +dissect_ldap_SortKeyList_item(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { + offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset, + SortKeyList_item_sequence, hf_index, ett_ldap_SortKeyList_item); + + return offset; +} +static int dissect_SortKeyList_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { + return dissect_ldap_SortKeyList_item(FALSE, tvb, offset, pinfo, tree, hf_ldap_SortKeyList_item); +} + + +static const ber_sequence_t SortKeyList_sequence_of[1] = { + { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_SortKeyList_item }, +}; + +static int +dissect_ldap_SortKeyList(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { + offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset, + SortKeyList_sequence_of, hf_index, ett_ldap_SortKeyList); + + return offset; +} + + +static const value_string ldap_T_sortResult_vals[] = { + { 0, "success" }, + { 1, "operationsError" }, + { 3, "timeLimitExceeded" }, + { 8, "strongAuthRequired" }, + { 11, "adminLimitExceeded" }, + { 16, "noSuchAttribute" }, + { 18, "inappropriateMatching" }, + { 50, "insufficientAccessRights" }, + { 51, "busy" }, + { 53, "unwillingToPerform" }, + { 80, "other" }, + { 0, NULL } +}; + + +static int +dissect_ldap_T_sortResult(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { + offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index, + NULL); + + return offset; +} +static int dissect_sortResult(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { + return dissect_ldap_T_sortResult(FALSE, tvb, offset, pinfo, tree, hf_ldap_sortResult); +} + + +static const ber_sequence_t SortResult_sequence[] = { + { BER_CLASS_UNI, BER_UNI_TAG_ENUMERATED, BER_FLAGS_NOOWNTAG, dissect_sortResult }, + { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_attributeType_impl }, + { 0, 0, 0, NULL } +}; + +static int +dissect_ldap_SortResult(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { + offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset, + SortResult_sequence, hf_index, ett_ldap_SortResult); + + return offset; +} + + +static const ber_sequence_t ReplControlValue_sequence[] = { + { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_parentsFirst }, + { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_maxReturnLength }, + { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_cookie }, + { 0, 0, 0, NULL } +}; + +static int +dissect_ldap_ReplControlValue(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) { + offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset, + ReplControlValue_sequence, hf_index, ett_ldap_ReplControlValue); + + return offset; +} + /*--- PDUs ---*/ static void dissect_LDAPMessage_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { dissect_ldap_LDAPMessage(FALSE, tvb, 0, pinfo, tree, hf_ldap_LDAPMessage_PDU); } +static void dissect_SearchControlValue_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { + dissect_ldap_SearchControlValue(FALSE, tvb, 0, pinfo, tree, hf_ldap_SearchControlValue_PDU); +} +static void dissect_SortKeyList_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { + dissect_ldap_SortKeyList(FALSE, tvb, 0, pinfo, tree, hf_ldap_SortKeyList_PDU); +} +static void dissect_SortResult_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { + dissect_ldap_SortResult(FALSE, tvb, 0, pinfo, tree, hf_ldap_SortResult_PDU); +} +static void dissect_ReplControlValue_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { + dissect_ldap_ReplControlValue(FALSE, tvb, 0, pinfo, tree, hf_ldap_ReplControlValue_PDU); +} /*--- End of included file: packet-ldap-fn.c ---*/ @@ -3635,8 +3851,7 @@ dissect_ldap_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) */ sasl_len=tvb_get_ntohl(tvb, 0); - if( (sasl_len>ldap_max_pdu_size) - || (sasl_len<2) ){ + if( sasl_len<2 ){ goto this_was_not_sasl; } @@ -3670,7 +3885,7 @@ this_was_not_sasl: offset=get_ber_length(NULL, tvb, 1, &ldap_len, &ind); /* dont check ind since indefinite length is never used for ldap (famous last words)*/ - if(ldap_len<2 || ldap_len>ldap_max_pdu_size){ + if(ldap_len<2){ goto this_was_not_normal_ldap; } @@ -3904,6 +4119,22 @@ void proto_register_ldap(void) { { "LDAPMessage", "ldap.LDAPMessage", FT_NONE, BASE_NONE, NULL, 0, "ldap.LDAPMessage", HFILL }}, + { &hf_ldap_SearchControlValue_PDU, + { "SearchControlValue", "ldap.SearchControlValue", + FT_NONE, BASE_NONE, NULL, 0, + "ldap.SearchControlValue", HFILL }}, + { &hf_ldap_SortKeyList_PDU, + { "SortKeyList", "ldap.SortKeyList", + FT_UINT32, BASE_DEC, NULL, 0, + "ldap.SortKeyList", HFILL }}, + { &hf_ldap_SortResult_PDU, + { "SortResult", "ldap.SortResult", + FT_NONE, BASE_NONE, NULL, 0, + "ldap.SortResult", HFILL }}, + { &hf_ldap_ReplControlValue_PDU, + { "ReplControlValue", "ldap.ReplControlValue", + FT_NONE, BASE_NONE, NULL, 0, + "ldap.ReplControlValue", HFILL }}, { &hf_ldap_messageID, { "messageID", "ldap.messageID", FT_UINT32, BASE_DEC, NULL, 0, @@ -4055,7 +4286,7 @@ void proto_register_ldap(void) { { &hf_ldap_controlValue, { "controlValue", "ldap.controlValue", FT_BYTES, BASE_HEX, NULL, 0, - "ldap.OCTET_STRING", HFILL }}, + "ldap.T_controlValue", HFILL }}, { &hf_ldap_version, { "version", "ldap.version", FT_UINT32, BASE_DEC, NULL, 0, @@ -4300,9 +4531,45 @@ void proto_register_ldap(void) { { "response", "ldap.response", FT_BYTES, BASE_HEX, NULL, 0, "ldap.OCTET_STRING", HFILL }}, + { &hf_ldap_size, + { "size", "ldap.size", + FT_INT32, BASE_DEC, NULL, 0, + "ldap.INTEGER", HFILL }}, + { &hf_ldap_cookie, + { "cookie", "ldap.cookie", + FT_BYTES, BASE_HEX, NULL, 0, + "ldap.OCTET_STRING", HFILL }}, + { &hf_ldap_SortKeyList_item, + { "Item", "ldap.SortKeyList_item", + FT_NONE, BASE_NONE, NULL, 0, + "ldap.SortKeyList_item", HFILL }}, + { &hf_ldap_attributeType, + { "attributeType", "ldap.attributeType", + FT_STRING, BASE_NONE, NULL, 0, + "ldap.AttributeDescription", HFILL }}, + { &hf_ldap_orderingRule, + { "orderingRule", "ldap.orderingRule", + FT_STRING, BASE_NONE, NULL, 0, + "ldap.MatchingRuleId", HFILL }}, + { &hf_ldap_reverseOrder, + { "reverseOrder", "ldap.reverseOrder", + FT_BOOLEAN, 8, NULL, 0, + "ldap.BOOLEAN", HFILL }}, + { &hf_ldap_sortResult, + { "sortResult", "ldap.sortResult", + FT_UINT32, BASE_DEC, VALS(ldap_T_sortResult_vals), 0, + "ldap.T_sortResult", HFILL }}, + { &hf_ldap_parentsFirst, + { "parentsFirst", "ldap.parentsFirst", + FT_INT32, BASE_DEC, NULL, 0, + "ldap.INTEGER", HFILL }}, + { &hf_ldap_maxReturnLength, + { "maxReturnLength", "ldap.maxReturnLength", + FT_INT32, BASE_DEC, NULL, 0, + "ldap.INTEGER", HFILL }}, /*--- End of included file: packet-ldap-hfarr.c ---*/ -#line 1598 "packet-ldap-template.c" +#line 1597 "packet-ldap-template.c" }; /* List of subtrees */ @@ -4353,9 +4620,14 @@ void proto_register_ldap(void) { &ett_ldap_CompareRequest, &ett_ldap_ExtendedRequest, &ett_ldap_ExtendedResponse, + &ett_ldap_SearchControlValue, + &ett_ldap_SortKeyList, + &ett_ldap_SortKeyList_item, + &ett_ldap_SortResult, + &ett_ldap_ReplControlValue, /*--- End of included file: packet-ldap-ettarr.c ---*/ -#line 1609 "packet-ldap-template.c" +#line 1608 "packet-ldap-template.c" }; module_t *ldap_module; @@ -4373,17 +4645,13 @@ void proto_register_ldap(void) { prefs_register_bool_preference(ldap_module, "desegment_ldap_messages", "Reassemble LDAP messages spanning multiple TCP segments", "Whether the LDAP dissector should reassemble messages spanning multiple TCP segments." - " To use this option, you must also enable \"Allow subdissectors to reassemble TCP streams\" in the TCP protocol settings, and disable \"Verify length\" in the BER protocol settings", + "To use this option, you must also enable \"Allow subdissectors to reassemble TCP streams\" in the TCP protocol settings.", &ldap_desegment); prefs_register_uint_preference(ldap_module, "tcp.port", "LDAP TCP Port", "Set the port for LDAP operations", 10, &ldap_tcp_port); - prefs_register_uint_preference(ldap_module, "max_pdu", "LDAP Maximum PDU Size", - "The maximum LDAP PDU size. PDUs larger than this will be considered invalid.", - 10, &ldap_max_pdu_size); - proto_cldap = proto_register_protocol( "Connectionless Lightweight Directory Access Protocol", "CLDAP", "cldap"); @@ -4449,6 +4717,20 @@ proto_reg_handoff_ldap(void) register_ldap_name_dissector("supportedCapabilities", dissect_ldap_oid, proto_ldap); register_ldap_name_dissector("objectSid", dissect_ldap_sid, proto_ldap); register_ldap_name_dissector("nTSecurityDescriptor", dissect_ldap_nt_sec_desc, proto_ldap); + + +/*--- Included file: packet-ldap-dis-tab.c ---*/ +#line 1 "packet-ldap-dis-tab.c" + register_ber_oid_dissector("1.2.840.113556.1.4.319", dissect_SearchControlValue_PDU, proto_ldap, "pagedResultsControl"); + register_ber_oid_dissector("1.2.840.113556.1.4.473", dissect_SortKeyList_PDU, proto_ldap, "sortKeyList"); + register_ber_oid_dissector("1.2.840.113556.1.4.474", dissect_SortResult_PDU, proto_ldap, "sortResult"); + register_ber_oid_dissector("1.2.840.113556.1.4.841", dissect_ReplControlValue_PDU, proto_ldap, "replControlValue"); + + +/*--- End of included file: packet-ldap-dis-tab.c ---*/ +#line 1699 "packet-ldap-template.c" + + } diff --git a/epan/libwireshark.def b/epan/libwireshark.def index 6bf46d8f13..4ad2fa58da 100644 --- a/epan/libwireshark.def +++ b/epan/libwireshark.def @@ -453,6 +453,7 @@ nt_cmd_vals DATA num_tap_filters DATA num_tree_types DATA offset_from_real_beginning +oid_has_dissector other_decode_bitfield_value plugin_list DATA postseq_cleanup_all_protocols |