From 5f7a9397c37c5f541df4766f9dd5a7ebdd79707d Mon Sep 17 00:00:00 2001 From: Giuseppe Longo Date: Tue, 6 Aug 2024 19:22:45 +0200 Subject: [PATCH] rust/ldap: code refactoring --- rust/src/ldap/ldap.rs | 112 ++++++++++++++++++------------------------ 1 file changed, 47 insertions(+), 65 deletions(-) diff --git a/rust/src/ldap/ldap.rs b/rust/src/ldap/ldap.rs index 03ee15e65422..415019ddbdc3 100644 --- a/rust/src/ldap/ldap.rs +++ b/rust/src/ldap/ldap.rs @@ -216,20 +216,13 @@ impl LdapState { let mut tx = self.new_tx(); let tx_id = tx.id(); let request = LdapMessage::from(msg); - tx.complete = match request.protocol_op { - ProtocolOp::UnbindRequest => true, - _ => false, - }; + tx.complete = tx_is_complete(&request.protocol_op, Direction::ToServer); tx.request = Some(request); self.transactions.push_back(tx); let consumed = start.len() - rem.len(); start = rem; - if let Some(frame) = &self.request_frame { - frame.set_len(flow, consumed as i64); - frame.set_tx(flow, tx_id); - self.request_frame = None; - } + self.set_frame_ts(flow, tx_id, consumed as i64); } Err(nom::Err::Incomplete(_)) => { let consumed = input.len() - start.len(); @@ -284,25 +277,11 @@ impl LdapState { Ok((rem, msg)) => { let response = LdapMessage::from(msg); if let Some(tx) = self.find_request(response.message_id) { - tx.complete = match response.protocol_op { - ProtocolOp::SearchResultDone(_) - | ProtocolOp::BindResponse(_) - | ProtocolOp::ModifyResponse(_) - | ProtocolOp::AddResponse(_) - | ProtocolOp::DelResponse(_) - | ProtocolOp::ModDnResponse(_) - | ProtocolOp::CompareResponse(_) - | ProtocolOp::ExtendedResponse(_) => true, - _ => false, - }; + tx.complete = tx_is_complete(&response.protocol_op, Direction::ToClient); let tx_id = tx.id(); tx.responses.push_back(response); let consumed = start.len() - rem.len(); - if let Some(frame) = &self.response_frame { - frame.set_len(flow, consumed as i64); - frame.set_tx(flow, tx_id); - self.response_frame = None; - } + self.set_frame_tc(flow, tx_id, consumed as i64); } else if let ProtocolOp::ExtendedResponse(_) = response.protocol_op { // this is an unsolicited notification, which means // there is no request @@ -312,11 +291,7 @@ impl LdapState { tx.responses.push_back(response); self.transactions.push_back(tx); let consumed = start.len() - rem.len(); - if let Some(frame) = &self.response_frame { - frame.set_len(flow, consumed as i64); - frame.set_tx(flow, tx_id); - self.response_frame = None; - } + self.set_frame_tc(flow, tx_id, consumed as i64); } else { let mut tx = self.new_tx(); tx.complete = true; @@ -325,11 +300,7 @@ impl LdapState { self.transactions.push_back(tx); self.set_event(LdapEvent::RequestNotFound); let consumed = start.len() - rem.len(); - if let Some(frame) = &self.response_frame { - frame.set_len(flow, consumed as i64); - frame.set_tx(flow, tx_id); - self.response_frame = None; - } + self.set_frame_tc(flow, tx_id, consumed as i64); }; start = rem; } @@ -366,10 +337,7 @@ impl LdapState { Ok((_, msg)) => { let mut tx = self.new_tx(); let request = LdapMessage::from(msg); - tx.complete = match request.protocol_op { - ProtocolOp::UnbindRequest => true, - _ => false, - }; + tx.complete = tx_is_complete(&request.protocol_op, Direction::ToServer); tx.request = Some(request); self.transactions.push_back(tx); } @@ -411,25 +379,11 @@ impl LdapState { Ok((rem, msg)) => { let response = LdapMessage::from(msg); if let Some(tx) = self.find_request(response.message_id) { - tx.complete = match response.protocol_op { - ProtocolOp::SearchResultDone(_) - | ProtocolOp::BindResponse(_) - | ProtocolOp::ModifyResponse(_) - | ProtocolOp::AddResponse(_) - | ProtocolOp::DelResponse(_) - | ProtocolOp::ModDnResponse(_) - | ProtocolOp::CompareResponse(_) - | ProtocolOp::ExtendedResponse(_) => true, - _ => false, - }; + tx.complete = tx_is_complete(&response.protocol_op, Direction::ToClient); let tx_id = tx.id(); tx.responses.push_back(response); let consumed = start.len() - rem.len(); - if let Some(frame) = &self.response_frame { - frame.set_len(flow, consumed as i64); - frame.set_tx(flow, tx_id); - self.response_frame = None; - } + self.set_frame_tc(flow, tx_id, consumed as i64); } else if let ProtocolOp::ExtendedResponse(_) = response.protocol_op { // this is an unsolicited notification, which means // there is no request @@ -439,11 +393,7 @@ impl LdapState { tx.responses.push_back(response); self.transactions.push_back(tx); let consumed = start.len() - rem.len(); - if let Some(frame) = &self.response_frame { - frame.set_len(flow, consumed as i64); - frame.set_tx(flow, tx_id); - self.response_frame = None; - } + self.set_frame_tc(flow, tx_id, consumed as i64); } else { let mut tx = self.new_tx(); tx.complete = true; @@ -452,11 +402,7 @@ impl LdapState { self.transactions.push_back(tx); self.set_event(LdapEvent::RequestNotFound); let consumed = start.len() - rem.len(); - if let Some(frame) = &self.response_frame { - frame.set_len(flow, consumed as i64); - frame.set_tx(flow, tx_id); - self.response_frame = None; - } + self.set_frame_tc(flow, tx_id, consumed as i64); }; start = rem; } @@ -481,6 +427,42 @@ impl LdapState { fn on_response_gap(&mut self, _size: u32) { self.response_gap = true; } + + fn set_frame_ts(&mut self, flow: *const Flow, tx_id: u64, consumed: i64) { + if let Some(frame) = &self.request_frame { + frame.set_len(flow, consumed as i64); + frame.set_tx(flow, tx_id); + self.request_frame = None; + } + } + + fn set_frame_tc(&mut self, flow: *const Flow, tx_id: u64, consumed: i64) { + if let Some(frame) = &self.response_frame { + frame.set_len(flow, consumed as i64); + frame.set_tx(flow, tx_id); + self.response_frame = None; + } + } +} + +fn tx_is_complete(op: &ProtocolOp, dir: Direction) -> bool { + match dir { + Direction::ToServer => match op { + ProtocolOp::UnbindRequest => true, + _ => false, + }, + Direction::ToClient => match op { + ProtocolOp::SearchResultDone(_) + | ProtocolOp::BindResponse(_) + | ProtocolOp::ModifyResponse(_) + | ProtocolOp::AddResponse(_) + | ProtocolOp::DelResponse(_) + | ProtocolOp::ModDnResponse(_) + | ProtocolOp::CompareResponse(_) + | ProtocolOp::ExtendedResponse(_) => true, + _ => false, + }, + } } fn probe(input: &[u8], direction: Direction, rdir: *mut u8) -> AppProto {