From 7bb3cc6535e314baa41ddca936dfc436fb857809 Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Wed, 20 Mar 2019 10:56:11 +0200 Subject: [PATCH] MXS-2396 Make preparations for adding additional checks --- .../filter/masking/maskingfiltersession.cc | 77 ++++++++++++------- .../filter/masking/maskingfiltersession.hh | 4 +- 2 files changed, 54 insertions(+), 27 deletions(-) diff --git a/server/modules/filter/masking/maskingfiltersession.cc b/server/modules/filter/masking/maskingfiltersession.cc index dc1dbc711..649149549 100644 --- a/server/modules/filter/masking/maskingfiltersession.cc +++ b/server/modules/filter/masking/maskingfiltersession.cc @@ -67,8 +67,25 @@ MaskingFilterSession* MaskingFilterSession::create(MXS_SESSION* pSession, const return new MaskingFilterSession(pSession, pFilter); } -void MaskingFilterSession::check_query(GWBUF* pPacket) +bool MaskingFilterSession::check_query(GWBUF* pPacket) { + bool rv = true; + + if (m_filter.config().prevent_function_usage()) + { + if (reject_if_function_used(pPacket)) + { + rv = false; + } + } + + return rv; +} + +bool MaskingFilterSession::check_textual_query(GWBUF* pPacket) +{ + bool rv = false; + if (qc_parse(pPacket, QC_COLLECT_FIELDS | QC_COLLECT_FUNCTIONS) == QC_QUERY_PARSED) { if (qc_query_is_type(qc_get_type_mask(pPacket), QUERY_TYPE_PREPARE_NAMED_STMT)) @@ -77,7 +94,7 @@ void MaskingFilterSession::check_query(GWBUF* pPacket) if (pP) { - check_query(pP); + rv = check_textual_query(pP); } else { @@ -88,27 +105,36 @@ void MaskingFilterSession::check_query(GWBUF* pPacket) "A statement prepared from a variable is rejected (masking filter)."; set_response(create_error_response(zMessage)); - m_state = EXPECTING_NOTHING; } } else { - if (reject_if_function_used(pPacket)) - { - m_state = EXPECTING_NOTHING; - } - else - { - m_state = EXPECTING_RESPONSE; - } + rv = check_query(pPacket); } } else { set_response(create_parse_error_response()); - m_state = EXPECTING_NOTHING; } - } + + return rv; +} + +bool MaskingFilterSession::check_binary_query(GWBUF* pPacket) +{ + bool rv = false; + + if (qc_parse(pPacket, QC_COLLECT_FIELDS | QC_COLLECT_FUNCTIONS) == QC_QUERY_PARSED) + { + rv = check_query(pPacket); + } + else + { + set_response(create_parse_error_response()); + } + + return rv; +} int MaskingFilterSession::routeQuery(GWBUF* pPacket) { @@ -120,9 +146,16 @@ int MaskingFilterSession::routeQuery(GWBUF* pPacket) case MXS_COM_QUERY: m_res.reset(request.command(), m_filter.rules()); - if (m_filter.config().prevent_function_usage()) + if (m_filter.config().is_parsing_needed()) { - check_query(pPacket); + if (check_textual_query(pPacket)) + { + m_state = EXPECTING_RESPONSE; + } + else + { + m_state = EXPECTING_NOTHING; + } } else { @@ -131,22 +164,14 @@ int MaskingFilterSession::routeQuery(GWBUF* pPacket) break; case MXS_COM_STMT_PREPARE: - if (m_filter.config().prevent_function_usage()) + if (m_filter.config().is_parsing_needed()) { - if (qc_parse(pPacket, QC_COLLECT_FIELDS | QC_COLLECT_FUNCTIONS) == QC_QUERY_PARSED) + if (check_binary_query(pPacket)) { - if (reject_if_function_used(pPacket)) - { - m_state = EXPECTING_NOTHING; - } - else - { - m_state = IGNORING_RESPONSE; - } + m_state = IGNORING_RESPONSE; } else { - set_response(create_parse_error_response()); m_state = EXPECTING_NOTHING; } } diff --git a/server/modules/filter/masking/maskingfiltersession.hh b/server/modules/filter/masking/maskingfiltersession.hh index bbd621a35..36782a6da 100644 --- a/server/modules/filter/masking/maskingfiltersession.hh +++ b/server/modules/filter/masking/maskingfiltersession.hh @@ -53,7 +53,9 @@ private: SUPPRESSING_RESPONSE }; - void check_query(GWBUF* pPacket); + bool check_query(GWBUF* pPacket); + bool check_textual_query(GWBUF* pPacket); + bool check_binary_query(GWBUF* pPacket); void handle_response(GWBUF* pPacket); void handle_field(GWBUF* pPacket);