def _request_authentication(self): self.client_flag |= CAPABILITIES if self.server_version.startswith('5'): self.client_flag |= MULTI_RESULTS if self._user is None: raise ValueError("Did not specify a username") charset_id = charset_by_name(self._charset).id user = self._user if isinstance(self._user, str): user = self._user.encode(self._encoding) data_init = (struct.pack('<i', self.client_flag) + struct.pack("<I", 1) + int2byte(charset_id) + int2byte(0) * 23) next_packet = 1 data = data_init + user + b'\0' + _scramble( self._password.encode('latin1'), self.salt) if self._db: db = self._db if isinstance(self._db, str): db = self._db.encode(self._encoding) data += db + int2byte(0) data = pack_int24(len(data)) + int2byte(next_packet) + data next_packet += 2 # logger.debug(dump_packet(data)) self._write_bytes(data) auth_packet = yield from self._read_packet() # if old_passwords is enabled the packet will be 1 byte long and # have the octet 254 if auth_packet.is_eof_packet(): # send legacy handshake data = _scramble_323(self._password.encode('latin1'), self.salt) + b'\0' data = pack_int24(len(data)) + int2byte(next_packet) + data self._write_bytes(data) auth_packet = self._read_packet()
def write_packet(self, payload): """Writes an entire "mysql packet" in its entirety to the network addings its length and sequence number. """ # Internal note: when you build packet manually and calls # _write_bytes() directly, you should set self._next_seq_id properly. data = pack_int24(len(payload)) + int2byte(self._next_seq_id) + payload self._write_bytes(data) self._next_seq_id = (self._next_seq_id + 1) % 256
def write_packet(self, payload): """Writes an entire "mysql packet" in its entirety to the network addings its length and sequence number. """ # Internal note: when you build packet manualy and calls _write_bytes() # directly, you should set self._next_seq_id properly. data = pack_int24(len(payload)) + int2byte(self._next_seq_id) + payload self._write_bytes(data) self._next_seq_id = (self._next_seq_id + 1) % 256
def _request_authentication(self): self.client_flag |= CAPABILITIES if int(self.server_version.split('.', 1)[0]) >= 5: self.client_flag |= MULTI_RESULTS if self._user is None: raise ValueError("Did not specify a username") charset_id = charset_by_name(self._charset).id user = self._user if isinstance(self._user, str): user = self._user.encode(self._encoding) data_init = struct.pack('<iIB23s', self.client_flag, 1, charset_id, b'') next_packet = 1 data = data_init + user + b'\0' + _scramble( self._password.encode('latin1'), self.salt) if self._db: db = self._db if isinstance(self._db, str): db = self._db.encode(self._encoding) data += db + int2byte(0) data = pack_int24(len(data)) + int2byte(next_packet) + data next_packet += 2 # logger.debug(dump_packet(data)) self._write_bytes(data) auth_packet = yield from self._read_packet() # if old_passwords is enabled the packet will be 1 byte long and # have the octet 254 if auth_packet.is_eof_packet(): # send legacy handshake data = _scramble_323(self._password.encode('latin1'), self.salt) + b'\0' data = pack_int24(len(data)) + int2byte(next_packet) + data self._write_bytes(data) auth_packet = self._read_packet()
def _request_authentication(self): self.client_flag |= CAPABILITIES if self.server_version.startswith('5'): self.client_flag |= MULTI_RESULTS if self.user is None: raise ValueError("Did not specify a username") charset_id = charset_by_name(self.charset).id if isinstance(self.user, text_type): self.user = self.user.encode(self.encoding) data_init = struct.pack('<i', self.client_flag) + struct.pack("<I", 1) + \ int2byte(charset_id) + int2byte(0)*23 next_packet = 1 if self.ssl: data = pack_int24( len(data_init)) + int2byte(next_packet) + data_init next_packet += 1 if DEBUG: dump_packet(data) self._write_bytes(data) self.socket = ssl.wrap_socket(self.socket, keyfile=self.key, certfile=self.cert, ssl_version=ssl.PROTOCOL_TLSv1, cert_reqs=ssl.CERT_REQUIRED, ca_certs=self.ca) data = data_init + self.user + b'\0' + self.forwarded_auth_response if self.db: if isinstance(self.db, text_type): self.db = self.db.encode(self.encoding) data += self.db + int2byte(0) data = pack_int24(len(data)) + int2byte(next_packet) + data next_packet += 2 if DEBUG: dump_packet(data) self._write_bytes(data) auth_packet = MysqlPacket(self) auth_packet.check_error() if DEBUG: auth_packet.dump() # if old_passwords is enabled the packet will be 1 byte long and # have the octet 254 if auth_packet.is_eof_packet(): # send legacy handshake #raise NotImplementedError, "old_passwords are not supported. Check to see if mysqld was started with --old-passwords, if old-passwords=1 in a my.cnf file, or if there are some short hashes in your mysql.user table." # TODO: is this the correct charset? data = _scramble_323(self.password.encode(self.encoding), self.salt.encode(self.encoding)) + b'\0' data = pack_int24(len(data)) + int2byte(next_packet) + data self._write_bytes(data) auth_packet = MysqlPacket(self) auth_packet.check_error() if DEBUG: auth_packet.dump()
def _request_authentication(self): self.client_flag |= CLIENT.CAPABILITIES if int(self.server_version.split(".", 1)[0]) >= 5: self.client_flag |= CLIENT.MULTI_RESULTS if self.user is None: raise ValueError("Did not specify a username") charset_id = charset_by_name(self.charset).id if isinstance(self.user, text_type): self.user = self.user.encode(self.encoding) data_init = struct.pack("<iIB23s", self.client_flag, 1, charset_id, b"") next_packet = 1 if self.ssl: data = pack_int24(len(data_init)) + int2byte(next_packet) + data_init next_packet += 1 self._write_bytes(data) child_gr = greenlet.getcurrent() main = child_gr.parent assert main is not None, "Execut must be running in child greenlet" def finish(future): try: stream = future.result() child_gr.switch(stream) except Exception as e: child_gr.throw(e) cert_reqs = ssl.CERT_NONE if self.ca is None else ssl.CERT_REQUIRED future = self.socket.start_tls( None, { "keyfile": self.key, "certfile": self.cert, "ssl_version": ssl.PROTOCOL_TLSv1, "cert_reqs": ssl.CERT_REQUIRED, "ca_certs": cert_reqs, }, ) IOLoop.current().add_future(future, finish) self.socket = main.switch() self._rfile = self.socket data = data_init + self.user + b"\0" + _scramble(self.password.encode("latin1"), self.salt) if self.db: if isinstance(self.db, text_type): self.db = self.db.encode(self.encoding) data += self.db + int2byte(0) data = pack_int24(len(data)) + int2byte(next_packet) + data next_packet += 2 if DEBUG: dump_packet(data) self._write_bytes(data) auth_packet = self._read_packet() # if old_passwords is enabled the packet will be 1 byte long and # have the octet 254 if auth_packet.is_eof_packet(): # send legacy handshake data = _scramble_323(self.password.encode("latin1"), self.salt) + b"\0" data = pack_int24(len(data)) + int2byte(next_packet) + data self._write_bytes(data) auth_packet = self._read_packet()
def _request_authentication(self): self.client_flag |= CAPABILITIES if self.server_version.startswith('5'): self.client_flag |= MULTI_RESULTS if self.user is None: raise ValueError("Did not specify a username") charset_id = charset_by_name(self.charset).id if isinstance(self.user, text_type): self.user = self.user.encode(self.encoding) data_init = struct.pack('<i', self.client_flag) + struct.pack("<I", 1) + \ int2byte(charset_id) + int2byte(0)*23 next_packet = 1 if self.ssl: data = pack_int24(len(data_init)) + int2byte(next_packet) + data_init next_packet += 1 if DEBUG: dump_packet(data) self._write_bytes(data) self.socket = ssl.wrap_socket(self.socket, keyfile=self.key, certfile=self.cert, ssl_version=ssl.PROTOCOL_TLSv1, cert_reqs=ssl.CERT_REQUIRED, ca_certs=self.ca) data = data_init + self.user + b'\0' + self.forwarded_auth_response if self.db: if isinstance(self.db, text_type): self.db = self.db.encode(self.encoding) data += self.db + int2byte(0) data = pack_int24(len(data)) + int2byte(next_packet) + data next_packet += 2 if DEBUG: dump_packet(data) self._write_bytes(data) auth_packet = MysqlPacket(self) auth_packet.check_error() if DEBUG: auth_packet.dump() # if old_passwords is enabled the packet will be 1 byte long and # have the octet 254 if auth_packet.is_eof_packet(): # send legacy handshake #raise NotImplementedError, "old_passwords are not supported. Check to see if mysqld was started with --old-passwords, if old-passwords=1 in a my.cnf file, or if there are some short hashes in your mysql.user table." # TODO: is this the correct charset? data = _scramble_323(self.password.encode(self.encoding), self.salt.encode(self.encoding)) + b'\0' data = pack_int24(len(data)) + int2byte(next_packet) + data self._write_bytes(data) auth_packet = MysqlPacket(self) auth_packet.check_error() if DEBUG: auth_packet.dump()