31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
# File 'lib/mysql_replicator/connections/handshake.rb', line 31
def self.parse_handshake_response_packet(packet)
payload = packet[:payload]
offset = 0
protocol_version = MysqlReplicator::StringUtil.read_uint8(payload[offset])
offset += 1
server_version_end = payload.index("\0", offset) || 0
server_version = MysqlReplicator::StringUtil.read_str(payload[offset...server_version_end])
offset = server_version_end + 1
connection_id = MysqlReplicator::StringUtil.read_uint32(payload[offset..(offset + 3)])
offset += 4
auth_plugin_data_part1 = MysqlReplicator::StringUtil.read_str(payload[offset..(offset + 7)])
offset += 8
offset += 1
capability_flags_lower = MysqlReplicator::StringUtil.read_uint16(payload[offset..(offset + 1)])
offset += 2
if offset < payload.length
charset = MysqlReplicator::StringUtil.read_uint8(payload[offset])
offset += 1
status_flags = MysqlReplicator::StringUtil.read_uint16(payload[offset..(offset + 1)])
offset += 2
capability_flags_upper = MysqlReplicator::StringUtil.read_uint16(payload[offset..(offset + 1)])
offset += 2
capability_flags = capability_flags_lower | (capability_flags_upper << 16)
auth_plugin_data_len = MysqlReplicator::StringUtil.read_uint8(payload[offset])
offset += 1
offset += 10
remaining_auth_data_len = [auth_plugin_data_len - 8, 13].max
auth_plugin_data_part2 = MysqlReplicator::StringUtil.read_str(payload[offset..(offset + remaining_auth_data_len - 1)])
offset += remaining_auth_data_len
plugin_name_end = payload.index("\0", offset)
auth_plugin_name = MysqlReplicator::StringUtil.read_str(payload[offset...plugin_name_end])
auth_plugin_data = auth_plugin_data_part1 + MysqlReplicator::StringUtil.read_str(auth_plugin_data_part2[0..11])
if auth_plugin_data.length > 20
auth_plugin_data = auth_plugin_data[0..19] || ''
elsif auth_plugin_data.length < 20
auth_plugin_data += "\x00" * (20 - auth_plugin_data.length)
end
else
auth_plugin_name = 'mysql_native_password'
auth_plugin_data = auth_plugin_data_part1
end
{
protocol_version: protocol_version,
server_version: server_version,
connection_id: connection_id,
capability_flags: capability_flags,
charset: charset,
status_flags: status_flags,
auth_plugin_name: auth_plugin_name,
auth_plugin_data: auth_plugin_data
}
end
|