/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #include "httpd.h" #include "http_core.h" #include "http_config.h" #include "http_log.h" #include "http_protocol.h" #include "ap_config.h" #include "apr_optional.h" #include "modsecurity.h" /** * This function will be invoked by * ModSecurity to transform input. */ static int reverse(apr_pool_t *mptmp, unsigned char *input, long int input_len, char **rval, long int *rval_len) { /* Transformation functions can choose to do their * thing in-place, overwriting the existing content. This * is normally possible only if the transformed content * is of equal length or shorter. * * If you need to expand the content use the temporary * memory pool mptmp to allocate the space. */ /* Reverse the string in place, but only if it's long enough. */ if (input_len > 1) { long int i = 0; long int j = input_len - 1; while(i < j) { char c = input[i]; input[i] = input[j]; input[j] = c; i++; j--; } } /* Tell ModSecurity about the content * we have generated. In this case we * merely point back to the input buffer. */ *rval = (char *)input; *rval_len = input_len; /* Must return 1 if the content was * changed, or 0 otherwise. */ return 1; } static int hook_pre_config(apr_pool_t *mp, apr_pool_t *mp_log, apr_pool_t *mp_temp) { void (*fn)(const char *name, void *fn); /* Look for the registration function * exported by ModSecurity. */ fn = APR_RETRIEVE_OPTIONAL_FN(modsec_register_tfn); if (fn) { /* Use it to register our new * transformation function under the * name "reverse". */ fn("reverse", (void *)reverse); } else { ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, NULL, "mod_tfn_reverse: Unable to find modsec_register_tfn."); } return OK; } static void register_hooks(apr_pool_t *p) { ap_hook_pre_config(hook_pre_config, NULL, NULL, APR_HOOK_LAST); } /* Dispatch list for API hooks */ module AP_MODULE_DECLARE_DATA tfn_reverse_module = { STANDARD20_MODULE_STUFF, NULL, /* create per-dir config structures */ NULL, /* merge per-dir config structures */ NULL, /* create per-server config structures */ NULL, /* merge per-server config structures */ NULL, /* table of config file commands */ register_hooks /* register hooks */ };