Beispiel #1
0
    def handle(self):

        # 认证
        challenge1 = '12345678'
        challenge2 = '123456789012'
        challenge = self.create_challenge(challenge1, challenge2)
        self.send_packet(challenge.toPacket())

        packet = self.read_packet()
        response = Response()
        response = response.loadFromPacket(packet)

        username = response.username
        self.logger.info("login user:"******"proxy_password"]
        self.user_id = username

        # 验证密码
        native_password = scramble_native_password(password,
                                                   challenge1 + challenge2)

        if self.server.settings[
                "proxy_user"] != username or response.authResponse.encode(
                    "iso-8859-1") != native_password:
            err = ERR(9001, '28000', '[%s] Access denied.' % username)
            buff = err.toPacket()
            self.send_packet(buff)
            self.finish()
            return

        buff = file2packet("auth_result.cap")
        self.send_packet(buff)

        # 初始化后端服务器
        self.init_upstream()

        # 查询
        while True:

            packet = self.read_packet()
            if len(packet) < 4:
                continue
            packet_type = getType(packet)

            if packet_type == Flags.COM_QUIT:
                self.upstream.close()
                self.finish()

            elif packet_type == Flags.COM_QUERY:
                self.handle_query(packet)
            else:
                self.dispatch_packet(packet)
    def handle(self):

        # 认证
        challenge1 = '12345678'
        challenge2 = '123456789012'
        challenge = self.create_challenge(challenge1, challenge2)
        self.send_packet(challenge.toPacket())

        packet = self.read_packet()
        response = Response()
        response = response.loadFromPacket(packet)

        username = response.username
        self.logger.info("login user:"******"password"]
        self.user_id = username

        # 验证密码
        native_password = scramble_native_password(password,
                                                   challenge1 + challenge2)

        if self.server.settings[
                "user"] != username or response.authResponse.encode(
                    "iso-8859-1") != native_password:
            err = ERR(9001, '28000', '[%s] Access denied.' % username)
            buff = err.toPacket()
            self.send_packet(buff)
            self.finish()
            return

        buff = file2packet("auth_result.cap")
        self.send_packet(buff)
        # self.send_packet(bytes.fromhex("07 00 00 02 00 00 00 02 00 00 00"))

        # 查询
        while True:

            packet = self.read_packet()
            if len(packet) < 4:
                continue
            packet_type = getType(packet)

            # dump_my_packet(packet)
            # print('packet_type', packet_type, com_type_name(packet_type))

            if packet_type == Flags.COM_QUIT:
                self.finish()
            elif packet_type == Flags.COM_REGISTER_SLAVE:
                logger.info("Received COM_REGISTER_SLAVE")
                self.send_packet(OK().toPacket())

            elif packet_type == Flags.COM_BINLOG_DUMP_GTID:
                logger.info("Received COM_BINLOG_DUMP_GTID")
                dump(packet)
                # https://dev.mysql.com/doc/internals/en/com-binlog-dump-gtid.html
                filename_len = struct.unpack("<I", packet[11:15])[0]
                payload = packet[27 + filename_len:]
                gtid_set = GtidSet.decode(BytesIO(payload))

                self.dump_binlog_gtid(gtid_set)

            elif packet_type == Flags.COM_QUERY:
                self.handle_query(packet)
Beispiel #3
0
 def test_err(self):
     err2 = ERR(1045, '28000',
                'Access denied for user %s.' % ("alvinzane", ))
     err2.sequenceId = 2
     buff2 = err2.toPacket()
     dump_my_packet(buff2)
Beispiel #4
0
from py_mysql_binlogserver.packet.dump_gtid import DumpGtid
from py_mysql_binlogserver.packet.dump_pos import DumpPos
from py_mysql_binlogserver.packet.semiack import SemiAck
from py_mysql_binlogserver.packet.slave import Slave
from py_mysql_binlogserver.protocol.err import ERR
from py_mysql_binlogserver.protocol.packet import file2packet, dump_my_packet

err2 = ERR(1045, '28000', 'Access denied for user %s.' % ("alvinzane",))
err2.sequenceId = 2
buff2 = err2.toPacket()
dump_my_packet(buff2)
print(buff2)

slave = Slave("127.0.0.1", 'repl', 'repl1234', 3306, 3306100, 3306201)
slave.sequenceId = 2
# dump_my_packet(slave)
buf = slave.getPayload()

print(buf)
dump_my_packet(buf)

dump = DumpGtid(3306201, "f0ea18e0-3cff-11e9-9488-0800275ae9e7:1-10")
slave.sequenceId = 0
# dump_my_packet(slave)
buf = dump.getPayload()

print(buf)
dump_my_packet(buf)


dump = DumpPos(3306201, "mysql-bin.000007", 4)