示例#1
0
    def isAuthOk(self, user, orig_user, password, orig_password):
        try:
            if user != orig_user:
                log.warning(f'Check auth, user={user}: user mismatch')
                return False
            if password != orig_password:
                log.warning(f'check auth, user={user}: password mismatch')
                return False

            self.session.username = user
            self.session.auth = True
            log.info(f'Check auth, user={user}: Ok')
            return True
        except Exception:
            log.error(f'Check auth, user={user}: ERROR')
            log.error(traceback.format_exc())
示例#2
0
    def fetch(self, datahub):
        try:
            self.datahub = datahub
            self._fetchData()
            data = self._processData()
            self.result = self._makeResultVeiw(data)
        except (TableWithoutDatasourceException, UndefinedColumnTableException,
                DuplicateTableNameException, NotImplementedError, SqlError,
                Exception) as e:
            # TODO determine different codes for errors types
            log.error(f'ERROR while fetching data for query: {self.raw}\n'
                      f'{traceback.format_exc()}\n'
                      f'{e}')
            return {
                'success': False,
                'error_code': ERR.ER_SYNTAX_ERROR,
                'msg': str(e)
            }

        return {'success': True, 'result': self.result}
示例#3
0
    def setFromBuff(self, buff):
        val = ''
        start = 0

        if self.var_len == 'lenenc':
            start = 1
            ln_enc = buff[0]
            if int(ln_enc) <= ONE_BYTE_ENC[0]:
                start = 0
                end = 1
            elif int(ln_enc) == TWO_BYTE_ENC[0]:
                end = 3
            elif int(ln_enc) == THREE_BYTE_ENC[0]:
                end = 4
            elif ln_enc:
                end = 9

            num_str = buff[start:end]
            if end > 9:
                log.error('Cant decode integer greater than 8 bytes')
                return buff[end - 1:]

            for j in range(8 - (start - end)):
                num_str += b'\0'

            if self.var_type == 'int':
                self.value = struct.unpack('i', num_str)
                return buff[end:]

            if self.var_type in ['byte', 'string']:
                length = struct.unpack('i', num_str)
                self.value = buff[start:(length + end)]
                return buff[(length + end):]

        if self.var_len == 'EOF':
            length = len(buff)
            self.var_len = str(length)
            self.value = buff
            return ''
        else:
            length = self.var_len

        if self.type == 'string<NUL>':
            for j, x in enumerate(buff):
                if int(x) == 0:
                    length = j + 1
                    break

        length = int(length)
        if self.var_type in ['byte', 'string']:
            end = length
            self.value = buff[:end]
        else:  # if its an integer
            end = length
            num_str = buff[:end]
            if end > 8:
                log.error('cant decode integer greater than 8 bytes')
                return buff[end:]
            for j in range(8 - end):
                num_str += b'\0'
            self.value = struct.unpack('Q', num_str)[0]
        if str(self.var_len) == 'NUL':
            self.value = self.value[:-1]
        return buff[end:]
示例#4
0
    def handle(self):
        """
        Handle new incoming connections
        :return:
        """
        log.info('handle new incoming connection')
        if self.handshake() is False:
            return

        while True:
            log.debug('Got a new packet')
            p = self.packet(CommandPacket)

            try:
                success = p.get()
            except Exception:
                log.warning('Session closed, on packet read error')
                log.debug(traceback.format_exc())
                # self.server.shutdown()
                return

            if success is False:
                log.info('Session closed by client')
                # self.server.shutdown()
                return

            log.info('Command TYPE: {type}'.format(
                type=getConstName(COMMANDS, p.type.value)))

            if p.type.value == COMMANDS.COM_QUERY:
                try:
                    sql = p.sql.value.decode('utf-8')
                    # NOTE dbeaver can insert in start of query comment with connector version, for example
                    # /* mysql-connector-java-8.0.11 (Revision: 6d4eaa273bc181b4cf1c8ad0821a2227f116fedf) */SELECT @@session.auto_increment_increment
                    sql = re.sub(re.compile("/\*.*?\*/", re.DOTALL), "", sql)
                    sql = sql.strip(' ;')
                except Exception:
                    log.error('SQL contains non utf-8 values: {sql}'.format(sql=p.sql.value))
                    self.packet(OkPacket).send()
                    continue
                log.info(f'COM_QUERY: {sql}')
                self.current_transaction = self.session.newTransaction(sql_query=sql)

                try:
                    self.queryAnswer(sql)
                except Exception as e:
                    log.error(
                        f'ERROR while executing query: {sql}\n'
                        f'{traceback.format_exc()}\n'
                        f'{e}'
                    )
                    self.packet(
                        ErrPacket,
                        err_code=ERR.ER_SYNTAX_ERROR,
                        msg=str(e)
                    ).send()

                # if self.current_transaction.output_data_array is None:
                #     self.packet(OkPacket).send()
                # else:
                #     self.packet(ResultsetPacket, metadata=self.current_transaction.output_metadata,
                #                 data_array=self.current_transaction.output_data_array).send()
            elif p.type.value == COMMANDS.COM_QUIT:
                log.info('Session closed, on client disconnect')
                self.session = None
                break
            else:
                log.info('Command has no specific handler, return OK msg')
                log.debug(str(p))
                # p.pprintPacket() TODO: Make a version of print packet
                # that sends it to debug isntead
                self.packet(OkPacket).send()