PcapPlusPlus  Next
MySqlLayer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Layer.h"
4 #include "PointerVector.h"
5 #include <memory>
6 #include <ostream>
7 #include <unordered_map>
8 
10 
13 namespace pcpp
14 {
15 
18  enum class MySqlMessageOrigin
19  {
21  Client,
23  Server
24  };
25 
29  {
30  public:
32  enum Value : uint8_t
33  {
102 
115 
117  Unknown
118  };
119 
120  constexpr MySqlMessageType() : m_Value(Unknown)
121  {}
122 
123  // cppcheck-suppress noExplicitConstructor
126  constexpr MySqlMessageType(Value value) : m_Value(value)
127  {}
128 
131  std::string toString() const;
132 
137  friend std::ostream& operator<<(std::ostream& os, const MySqlMessageType& messageType)
138  {
139  os << messageType.toString();
140  return os;
141  }
142 
145  explicit operator std::string() const
146  {
147  return toString();
148  }
149 
153 
154  // Allow switch and comparisons
155  constexpr operator Value() const
156  {
157  return m_Value;
158  }
159 
160  // Prevent usage: if(MySqlMessageType)
161  explicit operator bool() const = delete;
162 
163  private:
164  Value m_Value;
165  };
166 
170  {
171  public:
172  virtual ~MySqlMessage() = default;
173 
179  static std::unique_ptr<MySqlMessage> parseMySqlMessage(const uint8_t* data, size_t dataLen,
180  MySqlMessageOrigin origin);
181 
184  {
185  return m_MessageType;
186  }
187 
190  {
191  return m_MessageOrigin;
192  }
193 
196  virtual uint32_t getMessageLength() const;
197 
200  uint8_t getPacketNumber() const;
201 
204  size_t getTotalMessageLength() const
205  {
206  return m_DataLen;
207  }
208 
211  virtual std::vector<uint8_t> getRawPayload() const;
212 
213  protected:
214  MySqlMessage(const uint8_t* data, size_t dataLen, const MySqlMessageType& messageType,
215  MySqlMessageOrigin origin)
216  : m_Data(data), m_DataLen(dataLen), m_MessageType(messageType), m_MessageOrigin(origin)
217  {}
218 
219  static constexpr int basicMessageLength = 4;
220  static constexpr int commandLength = 1;
221  static constexpr int packetNumberIndex = 3;
222  static constexpr int commandIndex = packetNumberIndex + 1;
223 
224  const uint8_t* m_Data;
225  size_t m_DataLen;
226  MySqlMessageType m_MessageType;
227  MySqlMessageOrigin m_MessageOrigin;
228  };
229 
234  {
235  friend class MySqlMessage;
236 
237  public:
238  uint32_t getMessageLength() const override;
239  std::vector<uint8_t> getRawPayload() const override;
240 
241  protected:
242  MySqlCommandMessage(const uint8_t* data, size_t dataLen, const MySqlMessageType& messageType,
243  MySqlMessageOrigin origin)
244  : MySqlMessage(data, dataLen, messageType, origin)
245  {}
246  };
247 
251  {
252  friend class MySqlMessage;
253 
254  public:
256  std::string getQuery() const;
257 
258  protected:
259  MySqlQueryMessage(const uint8_t* data, size_t dataLen)
260  : MySqlCommandMessage(data, dataLen, MySqlMessageType::Client_Query, MySqlMessageOrigin::Client)
261  {}
262 
263  private:
264  static constexpr int statementIndex = commandIndex + 3;
265  };
266 
270  {
271  friend class MySqlMessage;
272 
273  public:
275  uint16_t getErrorCode() const;
276 
278  std::string getSqlState() const;
279 
281  std::string getErrorMessage() const;
282 
283  protected:
284  MySqlErrorMessage(const uint8_t* data, size_t dataLen)
285  : MySqlCommandMessage(data, dataLen, MySqlMessageType::Server_Error, MySqlMessageOrigin::Server)
286  {}
287 
288  private:
289  static constexpr int errorCodeIndex = commandIndex + 1;
290  static constexpr int sqlStateIndex = errorCodeIndex + sizeof(uint16_t) + 1;
291  static constexpr int sqlStateSize = 5;
292  static constexpr int errorMessageIndex = sqlStateIndex + sqlStateSize;
293  };
294 
297  class MySqlLayer : public Layer
298  {
299  public:
301  ~MySqlLayer() override = default;
302 
306  static bool isMySqlPort(uint16_t port)
307  {
308  return port == 3306;
309  }
310 
317  static MySqlLayer* parseMySqlClientMessage(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet);
318 
325  static MySqlLayer* parseMySqlServerMessage(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet);
326 
329  {
330  return m_MessageOrigin;
331  }
332 
335 
339  const MySqlMessage* getMySqlMessage(const MySqlMessageType& messageType) const;
340 
344  template <class TMessage, std::enable_if_t<std::is_base_of<MySqlMessage, TMessage>::value, bool> = nullptr>
345  const TMessage* getMySqlMessage() const
346  {
347  const auto& messages = getMySqlMessages();
348  for (const auto& msg : messages)
349  {
350  auto result = dynamic_cast<const TMessage*>(msg);
351  if (result != nullptr)
352  {
353  return result;
354  }
355  }
356  return nullptr;
357  }
358 
359  // Overridden methods
360 
362  size_t getHeaderLen() const override
363  {
364  return m_DataLen;
365  }
366 
368  void parseNextLayer() override
369  {}
370 
372  void computeCalculateFields() override
373  {}
374 
377  {
379  }
380 
382  std::string toString() const override;
383 
384  private:
385  MySqlMessageOrigin m_MessageOrigin;
386  mutable PointerVector<MySqlMessage> m_Messages;
387  mutable bool m_MessagesInitialized = false;
388 
389  MySqlLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet, MySqlMessageOrigin origin)
390  : Layer(data, dataLen, prevLayer, packet, MySQL), m_MessageOrigin(origin)
391  {}
392  };
393 
394 } // namespace pcpp
Definition: Layer.h:116
Definition: MySqlLayer.h:234
std::vector< uint8_t > getRawPayload() const override
Returns the raw payload bytes of the message.
uint32_t getMessageLength() const override
Returns the length of the message payload.
Definition: MySqlLayer.h:270
std::string getSqlState() const
uint16_t getErrorCode() const
std::string getErrorMessage() const
Definition: MySqlLayer.h:298
void parseNextLayer() override
Does nothing for this layer, MySQL is always last.
Definition: MySqlLayer.h:368
std::string toString() const override
const PointerVector< MySqlMessage > & getMySqlMessages() const
const TMessage * getMySqlMessage() const
Get a MySQL message by its type (template version)
Definition: MySqlLayer.h:345
MySqlMessageOrigin getMySqlOrigin() const
Definition: MySqlLayer.h:328
OsiModelLayer getOsiModelLayer() const override
Definition: MySqlLayer.h:376
static MySqlLayer * parseMySqlClientMessage(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Parse a MySQL client message.
size_t getHeaderLen() const override
Definition: MySqlLayer.h:362
~MySqlLayer() override=default
Destructor for this layer.
void computeCalculateFields() override
Does nothing for this layer.
Definition: MySqlLayer.h:372
const MySqlMessage * getMySqlMessage(const MySqlMessageType &messageType) const
Get a MySQL message by its type.
static MySqlLayer * parseMySqlServerMessage(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Parse a MySQL server message.
static bool isMySqlPort(uint16_t port)
Check whether the port is considered as MySQL.
Definition: MySqlLayer.h:306
Definition: MySqlLayer.h:170
static std::unique_ptr< MySqlMessage > parseMySqlMessage(const uint8_t *data, size_t dataLen, MySqlMessageOrigin origin)
Parse a MySQL message from raw data.
virtual uint32_t getMessageLength() const
Returns the length of the message payload.
MySqlMessageOrigin getMessageOrigin() const
Definition: MySqlLayer.h:189
size_t getTotalMessageLength() const
Returns the total length of the message including the length field.
Definition: MySqlLayer.h:204
MySqlMessageType getMessageType() const
Definition: MySqlLayer.h:183
uint8_t getPacketNumber() const
Returns the packet number.
virtual std::vector< uint8_t > getRawPayload() const
Returns the raw payload bytes of the message.
Definition: MySqlLayer.h:29
constexpr MySqlMessageType(Value value)
Constructs a MySqlMessageType object from a Value enum.
Definition: MySqlLayer.h:126
MySqlMessageOrigin getOrigin() const
Returns the origin of the message (client or server)
friend std::ostream & operator<<(std::ostream &os, const MySqlMessageType &messageType)
Stream operator for MySqlMessageType.
Definition: MySqlLayer.h:137
Value
Define enum types for MySQL message types.
Definition: MySqlLayer.h:33
@ Client_FieldList
COM_FIELD_LIST command - get field information for a table.
Definition: MySqlLayer.h:45
@ Client_Query
COM_QUERY command - execute SQL query.
Definition: MySqlLayer.h:43
@ Client_Statistics
COM_STATISTICS command - get server status information.
Definition: MySqlLayer.h:55
@ Client_TableDump
COM_TABLE_DUMP command - dump table data (slave replication)
Definition: MySqlLayer.h:75
@ Client_ProcessInfo
COM_PROCESS_INFO command - get list of active threads.
Definition: MySqlLayer.h:57
@ Client_Time
COM_TIME command.
Definition: MySqlLayer.h:67
@ Client_ProcessKill
COM_PROCESS_KILL command - kill a server thread.
Definition: MySqlLayer.h:61
@ Server_Data
Server message that contains data (could be column definition, row data, result set header,...
Definition: MySqlLayer.h:114
@ Client_InitDb
COM_INIT_DB command - change default database.
Definition: MySqlLayer.h:41
@ Client_Refresh
COM_REFRESH command - flush tables, caches, or logs.
Definition: MySqlLayer.h:51
@ Client_Debug
COM_DEBUG command - send debug info to server.
Definition: MySqlLayer.h:63
@ Client_Clone
COM_CLONE command.
Definition: MySqlLayer.h:101
@ Client_BinlogDumpGtid
COM_BINLOG_DUMP_GTID command - start GTID-based binary log dump.
Definition: MySqlLayer.h:97
@ Server_EOF
EOF message.
Definition: MySqlLayer.h:110
@ Client_SetOption
COM_SET_OPTION command - set option (e.g., multi-statements)
Definition: MySqlLayer.h:91
@ Client_StmtFetch
COM_STMT_FETCH command - fetch rows from prepared statement.
Definition: MySqlLayer.h:85
@ Server_Handshake
Initial handshake.
Definition: MySqlLayer.h:104
@ Server_Ok
OK packet - successful response from server.
Definition: MySqlLayer.h:106
@ Client_Shutdown
COM_SHUTDOWN command - shutdown the server.
Definition: MySqlLayer.h:53
@ Client_RegisterSlave
COM_REGISTER_SLAVE command - register slave with master.
Definition: MySqlLayer.h:79
@ Server_AuthSwitchRequest
AuthSwitchRequest packet - server requests authentication method switch.
Definition: MySqlLayer.h:108
@ Client_ChangeUser
COM_CHANGE_USER command - change user and database.
Definition: MySqlLayer.h:71
@ Client_StmtClose
COM_STMT_CLOSE command - close prepared statement.
Definition: MySqlLayer.h:87
@ Client_StmtReset
COM_STMT_RESET command - reset prepared statement data.
Definition: MySqlLayer.h:89
@ Client_DropDb
COM_DROP_DB command.
Definition: MySqlLayer.h:49
@ Client_ResetConnection
COM_RESET_CONNECTION command - reset connection without re-authentication.
Definition: MySqlLayer.h:99
@ Client_Ping
COM_PING command - check server availability.
Definition: MySqlLayer.h:65
@ Client_HandshakeResponse
Handshake response.
Definition: MySqlLayer.h:35
@ Client_Daemon
COM_DAEMON command.
Definition: MySqlLayer.h:95
@ Client_StmtPrepare
COM_STMT_PREPARE command - prepare statement.
Definition: MySqlLayer.h:81
@ Unknown
Unknown message.
Definition: MySqlLayer.h:117
@ Client_ConnectOut
COM_CONNECT_OUT command - slave connecting to master (internal use)
Definition: MySqlLayer.h:77
@ Client_BinlogDump
COM_BINLOG_DUMP command - start binary log dump (slave replication)
Definition: MySqlLayer.h:73
@ Server_Error
Error packet - error response from server.
Definition: MySqlLayer.h:112
@ Client_StmtExecute
COM_STMT_EXECUTE command - execute prepared statement.
Definition: MySqlLayer.h:83
@ Client_Connect
COM_CONNECT command - connect to server (internal use)
Definition: MySqlLayer.h:59
@ Client_Sleep
COM_SLEEP command.
Definition: MySqlLayer.h:37
@ Client_CreateDb
COM_CREATE_DB command.
Definition: MySqlLayer.h:47
@ Client_Quit
COM_QUIT command - close connection.
Definition: MySqlLayer.h:39
@ Client_StmtSendLongData
COM_STMT_SEND_LONG_DATA command - send long data for prepared statement.
Definition: MySqlLayer.h:93
@ Client_DelayedInsert
COM_DELAYED_INSERT command.
Definition: MySqlLayer.h:69
std::string toString() const
Returns a string representation of the message type.
Definition: MySqlLayer.h:251
std::string getQuery() const
Definition: Packet.h:48
Definition: PointerVector.h:50
const ProtocolType MySQL
MySQL protocol.
Definition: ProtocolType.h:258
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
MySqlMessageOrigin
Definition: MySqlLayer.h:19
@ Client
Message is from the MySQL client.
@ Server
Message is from the MySQL server.
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:267
@ OsiModelApplicationLayer
Application layer (layer 7)
Definition: ProtocolType.h:281