use crate::mqtt::mqtt_property::*;
use crate::mqtt::parser::*;
use std::fmt;
use suricata_derive::EnumStringU8;
#[derive(Debug)]
pub struct MQTTMessage {
pub header: FixedHeader,
pub op: MQTTOperation,
}
#[derive(Debug)]
pub enum MQTTOperation {
UNASSIGNED,
CONNECT(MQTTConnectData),
CONNACK(MQTTConnackData),
PUBLISH(MQTTPublishData),
PUBACK(MQTTMessageIdOnly),
PUBREC(MQTTMessageIdOnly),
PUBREL(MQTTMessageIdOnly),
PUBCOMP(MQTTMessageIdOnly),
SUBSCRIBE(MQTTSubscribeData),
SUBACK(MQTTSubackData),
UNSUBSCRIBE(MQTTUnsubscribeData),
UNSUBACK(MQTTUnsubackData),
AUTH(MQTTAuthData),
PINGREQ,
PINGRESP,
DISCONNECT(MQTTDisconnectData),
TRUNCATED(MQTTTruncatedData),
}
#[repr(u8)]
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, FromPrimitive, Debug, EnumStringU8)]
pub enum MQTTTypeCode {
UNASSIGNED = 0,
CONNECT = 1,
CONNACK = 2,
PUBLISH = 3,
PUBACK = 4,
PUBREC = 5,
PUBREL = 6,
PUBCOMP = 7,
SUBSCRIBE = 8,
SUBACK = 9,
UNSUBSCRIBE = 10,
UNSUBACK = 11,
PINGREQ = 12,
PINGRESP = 13,
DISCONNECT = 14,
AUTH = 15,
}
impl MQTTTypeCode {
pub fn to_lower_str(&self) -> String {
self.to_string().to_lowercase()
}
}
impl fmt::Display for MQTTTypeCode {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
}
#[derive(Debug)]
pub struct MQTTConnectData {
pub protocol_string: String,
pub protocol_version: u8,
pub rawflags: u8,
pub username_flag: bool,
pub password_flag: bool,
pub will_retain: bool,
pub will_qos: u8,
pub will_flag: bool,
pub clean_session: bool,
pub keepalive: u16,
pub client_id: String,
pub will_topic: Option<String>,
pub will_message: Option<Vec<u8>>,
pub username: Option<String>,
pub password: Option<Vec<u8>>,
pub properties: Option<Vec<MQTTProperty>>, pub will_properties: Option<Vec<MQTTProperty>>, }
#[derive(Debug)]
pub struct MQTTConnackData {
pub return_code: u8,
pub session_present: bool, pub properties: Option<Vec<MQTTProperty>>, }
#[derive(Debug)]
pub struct MQTTPublishData {
pub topic: String,
pub message_id: Option<u16>,
pub message: Vec<u8>,
pub properties: Option<Vec<MQTTProperty>>, }
#[derive(Debug)]
pub struct MQTTMessageIdOnly {
pub message_id: u16,
pub reason_code: Option<u8>, pub properties: Option<Vec<MQTTProperty>>, }
#[derive(Debug)]
pub struct MQTTSubscribeTopicData {
pub topic_name: String,
pub qos: u8,
}
#[derive(Debug)]
pub struct MQTTSubscribeData {
pub message_id: u16,
pub topics: Vec<MQTTSubscribeTopicData>,
pub properties: Option<Vec<MQTTProperty>>, }
#[derive(Debug)]
pub struct MQTTSubackData {
pub message_id: u16,
pub qoss: Vec<u8>,
pub properties: Option<Vec<MQTTProperty>>, }
#[derive(Debug)]
pub struct MQTTUnsubscribeData {
pub message_id: u16,
pub topics: Vec<String>,
pub properties: Option<Vec<MQTTProperty>>, }
#[derive(Debug)]
pub struct MQTTUnsubackData {
pub message_id: u16,
pub properties: Option<Vec<MQTTProperty>>, pub reason_codes: Option<Vec<u8>>, }
#[derive(Debug)]
pub struct MQTTAuthData {
pub reason_code: u8, pub properties: Option<Vec<MQTTProperty>>, }
#[derive(Debug)]
pub struct MQTTDisconnectData {
pub reason_code: Option<u8>, pub properties: Option<Vec<MQTTProperty>>, }
#[derive(Debug)]
pub struct MQTTTruncatedData {
pub original_message_type: MQTTTypeCode,
pub skipped_length: usize,
}