ldap: implement abandon request

Ticket: #7477
pull/12396/head
Philippe Antoine 2 years ago committed by Alice Akaki
parent 770a75911f
commit edfe0ccbe1

@ -193,11 +193,7 @@ impl LdapState {
if self.request_gap { if self.request_gap {
match ldap_parse_msg(input) { match ldap_parse_msg(input) {
Ok((_, msg)) => { Ok((_, _msg)) => {
let ldap_msg = LdapMessage::from(msg);
if ldap_msg.is_unknown() {
return AppLayerResult::err();
}
AppLayerResult::ok(); AppLayerResult::ok();
} }
Err(_e) => { Err(_e) => {
@ -264,11 +260,7 @@ impl LdapState {
if self.response_gap { if self.response_gap {
match ldap_parse_msg(input) { match ldap_parse_msg(input) {
Ok((_, msg)) => { Ok((_, _msg)) => {
let ldap_msg = LdapMessage::from(msg);
if ldap_msg.is_unknown() {
return AppLayerResult::err();
}
AppLayerResult::ok(); AppLayerResult::ok();
} }
Err(_e) => { Err(_e) => {
@ -518,9 +510,6 @@ fn probe(input: &[u8], direction: Direction, rdir: *mut u8) -> AppProto {
match ldap_parse_msg(input) { match ldap_parse_msg(input) {
Ok((_, msg)) => { Ok((_, msg)) => {
let ldap_msg = LdapMessage::from(msg); let ldap_msg = LdapMessage::from(msg);
if ldap_msg.is_unknown() {
return ALPROTO_FAILED;
}
if direction == Direction::ToServer && !ldap_msg.is_request() { if direction == Direction::ToServer && !ldap_msg.is_request() {
unsafe { unsafe {
*rdir = Direction::ToClient.into(); *rdir = Direction::ToClient.into();

@ -256,6 +256,11 @@ pub struct CompareRequest {
pub ava: AttributeValueAssertion, pub ava: AttributeValueAssertion,
} }
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct AbandonRequest {
pub message_id: u32,
}
#[derive(Clone, Debug, Eq, PartialEq)] #[derive(Clone, Debug, Eq, PartialEq)]
pub struct ExtendedRequest { pub struct ExtendedRequest {
pub request_name: LdapOID, pub request_name: LdapOID,
@ -297,7 +302,7 @@ pub enum ProtocolOp {
ExtendedRequest(ExtendedRequest), ExtendedRequest(ExtendedRequest),
ExtendedResponse(ExtendedResponse), ExtendedResponse(ExtendedResponse),
IntermediateResponse(IntermediateResponse), IntermediateResponse(IntermediateResponse),
Unknown, AbandonRequest(AbandonRequest),
} }
impl Display for ProtocolOp { impl Display for ProtocolOp {
@ -320,10 +325,10 @@ impl Display for ProtocolOp {
ProtocolOp::ModDnResponse(_) => write!(f, "mod_dn_response"), ProtocolOp::ModDnResponse(_) => write!(f, "mod_dn_response"),
ProtocolOp::CompareRequest(_) => write!(f, "compare_request"), ProtocolOp::CompareRequest(_) => write!(f, "compare_request"),
ProtocolOp::CompareResponse(_) => write!(f, "compare_response"), ProtocolOp::CompareResponse(_) => write!(f, "compare_response"),
ProtocolOp::AbandonRequest(_) => write!(f, "abandon_request"),
ProtocolOp::ExtendedRequest(_) => write!(f, "extended_request"), ProtocolOp::ExtendedRequest(_) => write!(f, "extended_request"),
ProtocolOp::ExtendedResponse(_) => write!(f, "extended_response"), ProtocolOp::ExtendedResponse(_) => write!(f, "extended_response"),
ProtocolOp::IntermediateResponse(_) => write!(f, "intermediate_response"), ProtocolOp::IntermediateResponse(_) => write!(f, "intermediate_response"),
ProtocolOp::Unknown => write!(f, "unknown"),
} }
} }
} }
@ -376,7 +381,7 @@ impl From<ldap_parser::ldap::LdapMessage<'_>> for LdapMessage {
ldap_parser::ldap::ProtocolOp::IntermediateResponse(msg) => { ldap_parser::ldap::ProtocolOp::IntermediateResponse(msg) => {
Self::from_intermediate_response(msg) Self::from_intermediate_response(msg)
} }
ldap_parser::ldap::ProtocolOp::AbandonRequest(_) => ProtocolOp::Unknown, ldap_parser::ldap::ProtocolOp::AbandonRequest(msg) => Self::from_abandon_request(msg),
}; };
let controls = ldap_msg.controls.map(|ctls| { let controls = ldap_msg.controls.map(|ctls| {
ctls.iter() ctls.iter()
@ -397,13 +402,6 @@ impl From<ldap_parser::ldap::LdapMessage<'_>> for LdapMessage {
} }
impl LdapMessage { impl LdapMessage {
pub fn is_unknown(&self) -> bool {
match self.protocol_op {
ProtocolOp::Unknown => return true,
_ => return false,
}
}
pub fn is_request(&self) -> bool { pub fn is_request(&self) -> bool {
match self.protocol_op { match self.protocol_op {
ProtocolOp::BindRequest(_) ProtocolOp::BindRequest(_)
@ -414,7 +412,7 @@ impl LdapMessage {
| ProtocolOp::DelRequest(_) | ProtocolOp::DelRequest(_)
| ProtocolOp::ModDnRequest(_) | ProtocolOp::ModDnRequest(_)
| ProtocolOp::CompareRequest(_) | ProtocolOp::CompareRequest(_)
| ProtocolOp::Unknown // AbandonRequest | ProtocolOp::AbandonRequest(_)
| ProtocolOp::ExtendedRequest(_) => { | ProtocolOp::ExtendedRequest(_) => {
return true; return true;
} }
@ -589,6 +587,10 @@ impl LdapMessage {
}) })
} }
fn from_abandon_request(msg: ldap_parser::ldap::MessageID) -> ProtocolOp {
ProtocolOp::AbandonRequest(AbandonRequest {message_id: msg.0})
}
fn from_extended_request(msg: ldap_parser::ldap::ExtendedRequest) -> ProtocolOp { fn from_extended_request(msg: ldap_parser::ldap::ExtendedRequest) -> ProtocolOp {
ProtocolOp::ExtendedRequest(ExtendedRequest { ProtocolOp::ExtendedRequest(ExtendedRequest {
request_name: LdapOID(msg.request_name.0.to_string()), request_name: LdapOID(msg.request_name.0.to_string()),

Loading…
Cancel
Save