This extracts a plugin name from the server and exposes this as connection.get_plugin_name(). The client side here adds capabilities PLUGIN_AUTH and PLUGIN_AUTH_LENENC_CLIENT_DATA. Because of this the HandshakeResponse response has been altered to use the server_capabilities a bit mroe strictly. The immediate upshot is that plugins like unix_socket are immediately supported where they previously would of returned and error as without PLUGIN_AUTH being advertised on the client side, the server only accepts mysql_native_password and mysql_old_password. To support other plugins some more work is needed to implement these.
35 lines
957 B
Python
35 lines
957 B
Python
import struct
|
|
|
|
def byte2int(b):
|
|
if isinstance(b, int):
|
|
return b
|
|
else:
|
|
return struct.unpack("!B", b)[0]
|
|
|
|
def int2byte(i):
|
|
return struct.pack("!B", i)
|
|
|
|
def join_bytes(bs):
|
|
if len(bs) == 0:
|
|
return ""
|
|
else:
|
|
rv = bs[0]
|
|
for b in bs[1:]:
|
|
rv += b
|
|
return rv
|
|
|
|
# https://dev.mysql.com/doc/internals/en/integer.html#packet-Protocol::LengthEncodedInteger
|
|
def lenenc_int(i):
|
|
if (i < 0):
|
|
raise ValueError("Encoding %d is less than 0 - no representation in LengthEncodedInteger" % i)
|
|
elif (i < 0xfb):
|
|
return int2byte(i)
|
|
elif (i < (1 << 16)):
|
|
return b'\xfc' + struct.pack('<H', i)
|
|
elif (i < (1 << 24)):
|
|
return b'\xfd' + struct.pack('<I', i)[:3]
|
|
elif (i < (1 << 64)):
|
|
return b'\xfe' + struct.pack('<Q', i)
|
|
else:
|
|
raise ValueError("Encoding %x is larger than %x - no representation in LengthEncodedInteger" % (i, (1 << 64)))
|