def _request_authentication(self): if self.user is None: raise ValueError("Did not specify a username") next_packet = 1 charset_id = charset_by_name(self.charset).id user = self.user.encode(self.charset) data_init = (struct.pack('<i', self.client_flag) + struct.pack("<I", 1) + int2byte(charset_id) + int2byte(0) * 23) if self.ssl and self.server_capabilities & CLIENT.SSL: data = pack_int24( len(data_init)) + int2byte(next_packet) + data_init self.socket.sendall(data) next_packet += 1 self.socket = ssl.wrap_socket(self.socket, keyfile=self.key, certfile=self.cert, ca_certs=self.ca) data = data_init + user + int2byte(0) authresp = self._scramble() if self.server_capabilities & CLIENT.SECURE_CONNECTION: data += int2byte(len(authresp)) + authresp else: data += authresp + int2byte(0) if self.db and self.server_capabilities & CLIENT.CONNECT_WITH_DB: data += self.db.encode(self.charset) + int2byte(0) if self.server_capabilities & CLIENT.PLUGIN_AUTH: data += self.auth_plugin_name.encode(self.charset) + int2byte(0) data = pack_int24(len(data)) + int2byte(next_packet) + data next_packet += 2 self.socket.sendall(data) auth_packet = self.read_packet() if auth_packet.is_eof_packet(): # AuthSwitchRequest # https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchRequest self.auth_plugin_name, self.salt = auth_packet.read_auth_switch_request( ) data = self._scramble() data = pack_int24(len(data)) + int2byte(next_packet) + data next_packet += 2 self.socket.sendall(data) auth_packet = self.read_packet() if self.auth_plugin_name == 'caching_sha2_password': self._caching_sha2_authentication2(auth_packet, next_packet)
def _send_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.encode(self.charset) 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.socket.sendall(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 + user + int2byte(0) + _scramble( self.password.encode(self.charset), self.salt) if self.db: self.db = self.db.encode(self.charset) data += self.db + int2byte(0) data = pack_int24(len(data)) + int2byte(next_packet) + data next_packet += 2 if DEBUG: dump_packet(data) self.socket.sendall(data) auth_packet = MysqlPacket(self) if DEBUG: dump_packet(auth_packet.get_all_data()) # 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." )
def _request_authentication(self): if self.user is None: raise ValueError("Did not specify a username") next_packet = 1 charset_id = charset_by_name(self.charset).id user = self.user.encode(self.encoding) data_init = ( struct.pack('<i', self.client_flag) + struct.pack("<I", 1) + int2byte(charset_id) + int2byte(0)*23 ) if self.ssl and self.server_capabilities & CLIENT.SSL: data = pack_int24(len(data_init)) + int2byte(next_packet) + data_init self.socket.sendall(data) next_packet += 1 self.socket = ssl.wrap_socket(self.socket, keyfile=self.key, certfile=self.cert, ca_certs=self.ca) data = data_init + user + int2byte(0) authresp = self._scramble() if self.server_capabilities & CLIENT.SECURE_CONNECTION: data += int2byte(len(authresp)) + authresp else: data += authresp + int2byte(0) if self.db and self.server_capabilities & CLIENT.CONNECT_WITH_DB: data += self.db.encode(self.encoding) + int2byte(0) if self.server_capabilities & CLIENT.PLUGIN_AUTH: data += self.auth_plugin_name.encode(self.encoding) + int2byte(0) data = pack_int24(len(data)) + int2byte(next_packet) + data next_packet += 2 self.socket.sendall(data) auth_packet = self.read_packet() if auth_packet.is_eof_packet(): # AuthSwitchRequest # https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchRequest self.auth_plugin_name, self.salt = auth_packet.read_auth_switch_request() data = self._scramble() data = pack_int24(len(data)) + int2byte(next_packet) + data next_packet += 2 self.socket.sendall(data) auth_packet = self.read_packet() if self.auth_plugin_name == 'caching_sha2_password': self._caching_sha2_authentication2(auth_packet, next_packet)
def _send_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.encode(self.charset) 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.socket.sendall(data) self.socket = ssl.wrap_self.socketet(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 + user+int2byte(0) + _scramble(self.password.encode(self.charset), self.salt) if self.db: self.db = self.db.encode(self.charset) data += self.db + int2byte(0) data = pack_int24(len(data)) + int2byte(next_packet) + data next_packet += 2 if DEBUG: dump_packet(data) self.socket.sendall(data) auth_packet = MysqlPacket(self) if DEBUG: dump_packet(auth_packet.get_all_data()) # 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.")