From 3fc5918c7a10f3e57327a1d858e9f31faba8a703 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Ciejka?= Date: Mon, 13 Sep 2021 17:51:24 +0000 Subject: [PATCH] Transaction pull style API to retrieve variable value --- headers/modsecurity/transaction.h | 3 ++ src/transaction.cc | 60 +++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/headers/modsecurity/transaction.h b/headers/modsecurity/transaction.h index 6d9949dbbd..a076113847 100644 --- a/headers/modsecurity/transaction.h +++ b/headers/modsecurity/transaction.h @@ -711,6 +711,9 @@ int msc_process_logging(Transaction *transaction); /** @ingroup ModSecurity_C_API */ int msc_update_status_code(Transaction *transaction, int status); +/** @ingroup ModSecurity_C_API */ +const char *msc_get_transaction_variable(Transaction *transaction, const char *var_name); + #ifdef __cplusplus } } // namespace modsecurity diff --git a/src/transaction.cc b/src/transaction.cc index bae7c4ca7d..0285ab0872 100644 --- a/src/transaction.cc +++ b/src/transaction.cc @@ -2316,6 +2316,66 @@ extern "C" int msc_update_status_code(Transaction *transaction, int status) { return transaction->updateStatusCode(status); } +/** + * @name msc_get_transaction_variable + * @brief Retrieve variable value by name. + * + * This function returns tx_collection variable value by name. + * + * @param transaction ModSecurity transaction. + * @param var_name variable name + * @return variable value. + * + */ +extern "C" const char *msc_get_transaction_variable(Transaction *transaction, const char *var_name){ + std::vector l; + modsecurity::collection::Collection *c = NULL; + std::string cn; + const char *p = NULL; + + if (var_name == NULL ){ + return NULL; + } + + p = strchr(var_name,':'); + + if ( p == NULL ){ + return NULL; + } + + cn = std::string(var_name,p-var_name); + transform(cn.begin(),cn.end(),cn.begin(),::tolower); + + if ( cn.compare("global") == 0){ + c = transaction->m_collections.m_global_collection; + }else if ( cn.compare("ip") == 0){ + c = transaction->m_collections.m_ip_collection; + }else if ( cn.compare("session") == 0){ + c = transaction->m_collections.m_session_collection; + }else if ( cn.compare("user") == 0){ + c = transaction->m_collections.m_user_collection; + }else if ( cn.compare("resource") == 0){ + c = transaction->m_collections.m_resource_collection; + }else if( cn.compare("tx") == 0){ + c = transaction->m_collections.m_tx_collection; + } + + if(c == NULL){ + return NULL; + } + + ++p; + cn = std::string(p); + transform(cn.begin(),cn.end(),cn.begin(),::tolower); + + c->resolveSingleMatch(cn.c_str(),&l); + + if ( l.size() < 1){ + return NULL; + } + + return l[0]->getValue().c_str(); +} } // namespace modsecurity