Coverage for mindsdb / api / mysql / mysql_proxy / data_types / mysql_packets / handshake_packet.py: 31%
35 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-21 00:36 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-21 00:36 +0000
1"""
2*******************************************************
3 * Copyright (C) 2017 MindsDB Inc. <copyright@mindsdb.com>
4 *
5 * This file is part of MindsDB Server.
6 *
7 * MindsDB Server can not be copied and/or distributed without the express
8 * permission of MindsDB Inc
9 *******************************************************
10"""
12from mindsdb.api.mysql.mysql_proxy.data_types.mysql_packet import Packet
13from mindsdb.api.mysql.mysql_proxy.libs.constants.mysql import (
14 DEFAULT_AUTH_METHOD,
15 DEFAULT_COALLITION_ID,
16 FILLER_FOR_WIRESHARK_DUMP,
17 SERVER_STATUS_AUTOCOMMIT
18)
19from mindsdb.api.mysql.mysql_proxy.classes.server_capabilities import server_capabilities
20from mindsdb.api.mysql.mysql_proxy.data_types.mysql_datum import Datum
23class HandshakePacket(Packet):
24 '''
25 Implementation based on:
26 https://mariadb.com/kb/en/library/1-connecting-connecting/#initial-handshake-packet
27 '''
29 def setup(self):
30 capabilities = server_capabilities.value
31 self.protocol_version = Datum('int<1>', 10)
32 self.server_version = Datum('string<NUL>', '5.7.1-MindsDB-1.0')
33 self.connection_id = Datum('int<4>', self.proxy.connection_id)
34 self.scramble_1st_part = Datum('string<8>', self.proxy.salt[:8])
35 self.reserved_byte = Datum('string<1>', '')
36 self.server_capabilities_1st_part = Datum('int<2>', capabilities)
37 self.server_default_collation = Datum('int<1>', DEFAULT_COALLITION_ID)
38 self.status_flags = Datum('int<2>', SERVER_STATUS_AUTOCOMMIT)
39 self.server_capabilities_2nd_part = Datum('int<2>', capabilities >> 16)
40 self.wireshark_filler = Datum('int<1>', FILLER_FOR_WIRESHARK_DUMP)
41 # self.wireshark_filler = Datum('int<1>', len(self.proxy.salt))
42 self.reserved_filler1 = Datum('string<6>', '')
43 self.reserved_filler2 = Datum('string<4>', '')
44 self.scramble_2nd_part = Datum('string<NUL>', self.proxy.salt[8:])
45 self.null_close = Datum('string<NUL>', DEFAULT_AUTH_METHOD)
47 @property
48 def body(self):
49 order = [
50 'protocol_version',
51 'server_version',
52 'connection_id',
53 'scramble_1st_part',
54 'reserved_byte',
55 'server_capabilities_1st_part',
56 'server_default_collation',
57 'status_flags',
58 'server_capabilities_2nd_part',
59 'wireshark_filler',
60 'reserved_filler1',
61 'reserved_filler2',
62 'scramble_2nd_part',
63 'null_close'
64 ]
65 string = b''
66 for key in order:
67 string += getattr(self, key).toStringPacket()
69 self.setBody(string)
70 return self._body
72 @staticmethod
73 def test():
74 import pprint
75 pprint.pprint(str(HandshakePacket().get_packet_string()))
78# only run the test if this file is called from debugger
79if __name__ == "__main__": 79 ↛ 80line 79 didn't jump to line 80 because the condition on line 79 was never true
80 HandshakePacket.test()