Blame apache2/re_tfns.c

Packit Service 384592
/*
Packit Service 384592
* ModSecurity for Apache 2.x, http://www.modsecurity.org/
Packit Service 384592
* Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/)
Packit Service 384592
*
Packit Service 384592
* You may not use this file except in compliance with
Packit Service 384592
* the License.  You may obtain a copy of the License at
Packit Service 384592
*
Packit Service 384592
*     http://www.apache.org/licenses/LICENSE-2.0
Packit Service 384592
*
Packit Service 384592
* If any of the files related to licensing are missing or if you have any
Packit Service 384592
* other questions related to licensing please contact Trustwave Holdings, Inc.
Packit Service 384592
* directly using the email address security@modsecurity.org.
Packit Service 384592
*/
Packit Service 384592
Packit Service 384592
#include <ctype.h>
Packit Service 384592
Packit Service 384592
#include "apr_md5.h"
Packit Service 384592
#include "apr_sha1.h"
Packit Service 384592
#include "apr_base64.h"
Packit Service 384592
Packit Service 384592
#include "msc_unicode.h"
Packit Service 384592
#include "re.h"
Packit Service 384592
#include "msc_util.h"
Packit Service 384592
Packit Service 384592
/* cmdline */
Packit Service 384592
Packit Service 384592
/**
Packit Service 384592
* \brief cmdline transformation function
Packit Service 384592
*
Packit Service 384592
* \param mptmp Pointer to resource pool
Packit Service 384592
* \param input Pointer to input data
Packit Service 384592
* \param input_len Input data length
Packit Service 384592
* \param rval Pointer to decoded buffer
Packit Service 384592
* \param rval_len Decoded buffer length
Packit Service 384592
*
Packit Service 384592
* \retval 0 On failure
Packit Service 384592
* \retval 1 On Success
Packit Service 384592
*/
Packit Service 384592
static int msre_fn_cmdline_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
        long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    int space = 0;
Packit Service 384592
    unsigned char *s = input;
Packit Service 384592
Packit Service 384592
    if (rval == NULL) return -1;
Packit Service 384592
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
    /* Check characters */
Packit Service 384592
    for ( ; *input; input++ ) {
Packit Service 384592
        switch(*input) {
Packit Service 384592
            /* remove some characters */
Packit Service 384592
            case '"':
Packit Service 384592
            case '\'':
Packit Service 384592
            case '\\':
Packit Service 384592
            case '^':
Packit Service 384592
                continue;
Packit Service 384592
                /* replace some characters to space (only one) */
Packit Service 384592
            case ' ':
Packit Service 384592
            case ',':
Packit Service 384592
            case ';':
Packit Service 384592
            case '\t':
Packit Service 384592
            case '\r':
Packit Service 384592
            case '\n':
Packit Service 384592
                if (!space) {
Packit Service 384592
                    *s++ = ' ';
Packit Service 384592
                    space++;
Packit Service 384592
                }
Packit Service 384592
                break;
Packit Service 384592
            case '/':
Packit Service 384592
            case '(':
Packit Service 384592
                /* remove space before / or ( */
Packit Service 384592
                if (space) s--;
Packit Service 384592
                space = 0;
Packit Service 384592
                *s++ = *input;
Packit Service 384592
                break;
Packit Service 384592
                /* copy normal characters */
Packit Service 384592
            default :
Packit Service 384592
                *s++ = tolower(*input);
Packit Service 384592
                space = 0;
Packit Service 384592
        }
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    *s = 0;
Packit Service 384592
    *rval_len = strlen(*rval);
Packit Service 384592
    return 1;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* lowercase */
Packit Service 384592
Packit Service 384592
static int msre_fn_lowercase_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    long int i;
Packit Service 384592
    int changed = 0;
Packit Service 384592
Packit Service 384592
    if (rval == NULL) return -1;
Packit Service 384592
    *rval = NULL;
Packit Service 384592
Packit Service 384592
    i = 0;
Packit Service 384592
    while(i < input_len) {
Packit Service 384592
        int x = input[i];
Packit Service 384592
        input[i] = tolower(x);
Packit Service 384592
        if (x != input[i]) changed = 1;
Packit Service 384592
        i++;
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
    *rval_len = input_len;
Packit Service 384592
Packit Service 384592
    return changed;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* trimLeft */
Packit Service 384592
Packit Service 384592
static int msre_fn_trimLeft_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    long int i;
Packit Service 384592
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
    for (i = 0; i < input_len; i++) {
Packit Service 384592
        if (isspace(**rval) == 0) {
Packit Service 384592
            break;
Packit Service 384592
        }
Packit Service 384592
        (*rval)++;
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    *rval_len = input_len - i;
Packit Service 384592
Packit Service 384592
    return (*rval_len == input_len ? 0 : 1);
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* trimRight */
Packit Service 384592
Packit Service 384592
static int msre_fn_trimRight_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    long int i;
Packit Service 384592
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
    for (i = input_len - 1; i >= 0; i--) {
Packit Service 384592
        if (isspace((*rval)[i]) == 0) {
Packit Service 384592
            break;
Packit Service 384592
        }
Packit Service 384592
        (*rval)[i] = '\0';
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    *rval_len = i + 1;
Packit Service 384592
Packit Service 384592
    return (*rval_len == input_len ? 0 : 1);
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* trim */
Packit Service 384592
Packit Service 384592
static int msre_fn_trim_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    int rc = 0;
Packit Service 384592
Packit Service 384592
    rc = msre_fn_trimLeft_execute(mptmp, input, input_len, rval, rval_len);
Packit Service 384592
    if (rc == 1) {
Packit Service 384592
        rc = msre_fn_trimRight_execute(mptmp, (unsigned char *)*rval, *rval_len, rval, rval_len);
Packit Service 384592
    }
Packit Service 384592
    else {
Packit Service 384592
        rc = msre_fn_trimRight_execute(mptmp, input, input_len, rval, rval_len);
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    return (*rval_len == input_len ? 0 : 1);
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* removeNulls */
Packit Service 384592
Packit Service 384592
static int msre_fn_removeNulls_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    long int i, j;
Packit Service 384592
    int changed = 0;
Packit Service 384592
Packit Service 384592
    i = j = 0;
Packit Service 384592
    while(i < input_len) {
Packit Service 384592
        if (input[i] == '\0') {
Packit Service 384592
            changed = 1;
Packit Service 384592
        } else {
Packit Service 384592
            input[j] = input[i];
Packit Service 384592
            j++;
Packit Service 384592
        }
Packit Service 384592
        i++;
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
    *rval_len = j;
Packit Service 384592
Packit Service 384592
    return changed;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* replaceNulls */
Packit Service 384592
Packit Service 384592
static int msre_fn_replaceNulls_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    long int i;
Packit Service 384592
    int changed = 0;
Packit Service 384592
Packit Service 384592
    if (rval == NULL) return -1;
Packit Service 384592
    *rval = NULL;
Packit Service 384592
Packit Service 384592
    i = 0;
Packit Service 384592
    while(i < input_len) {
Packit Service 384592
        if (input[i] == '\0') {
Packit Service 384592
            changed = 1;
Packit Service 384592
            input[i] = ' ';
Packit Service 384592
        }
Packit Service 384592
        i++;
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
    *rval_len = input_len;
Packit Service 384592
Packit Service 384592
    return changed;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* compressWhitespace */
Packit Service 384592
Packit Service 384592
static int msre_fn_compressWhitespace_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    long int i, j, count;
Packit Service 384592
    int changed = 0;
Packit Service 384592
    int inwhitespace = 0;
Packit Service 384592
Packit Service 384592
    i = j = count = 0;
Packit Service 384592
    while(i < input_len) {
Packit Service 384592
        if (isspace(input[i])||(input[i] == NBSP)) {
Packit Service 384592
            if (inwhitespace) changed = 1;
Packit Service 384592
            inwhitespace = 1;
Packit Service 384592
            count++;
Packit Service 384592
        } else {
Packit Service 384592
            inwhitespace = 0;
Packit Service 384592
            if (count) {
Packit Service 384592
                input[j] = ' ';
Packit Service 384592
                count = 0;
Packit Service 384592
                j++;
Packit Service 384592
            }
Packit Service 384592
            input[j] = input[i];
Packit Service 384592
            j++;
Packit Service 384592
        }
Packit Service 384592
        i++;
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    if (count) {
Packit Service 384592
        input[j] = ' ';
Packit Service 384592
        j++;
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
    *rval_len = j;
Packit Service 384592
Packit Service 384592
    return changed;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* cssDecode */
Packit Service 384592
Packit Service 384592
static int msre_fn_cssDecode_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    long int length;
Packit Service 384592
Packit Service 384592
    length = css_decode_inplace(input, input_len);
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
    *rval_len = length;
Packit Service 384592
Packit Service 384592
    return (*rval_len == input_len ? 0 : 1);
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* removeWhitespace */
Packit Service 384592
Packit Service 384592
static int msre_fn_removeWhitespace_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    long int i, j;
Packit Service 384592
    int changed = 0;
Packit Service 384592
Packit Service 384592
    i = j = 0;
Packit Service 384592
    while(i < input_len) {
Packit Service 384592
        if (isspace(input[i])||(input[i] == NBSP)) {
Packit Service 384592
            /* do nothing */
Packit Service 384592
            changed = 1;
Packit Service 384592
        } else {
Packit Service 384592
            input[j] = input[i];
Packit Service 384592
            j++;
Packit Service 384592
        }
Packit Service 384592
        i++;
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
    *rval_len = j;
Packit Service 384592
Packit Service 384592
    return changed;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* removeCommentsChar */
Packit Service 384592
Packit Service 384592
static int msre_fn_removeCommentsChar_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
        long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    long int i, j;
Packit Service 384592
    int changed = 0;
Packit Service 384592
Packit Service 384592
    i = j = 0;
Packit Service 384592
    while(i < input_len) {
Packit Service 384592
        if ((input[i] == '/')&&(i + 1 < input_len)&&(input[i + 1] == '*')) {
Packit Service 384592
            changed = 1;
Packit Service 384592
            i += 2;
Packit Service 384592
        } else if ((input[i] == '*')&&(i + 1 < input_len)&&(input[i + 1] == '/')) {
Packit Service 384592
            changed = 1;
Packit Service 384592
            i += 2;
Packit Service 384592
        } else if ((input[i] == '<')&&(i + 1 < input_len)&&(input[i + 1] == '!')&&
Packit Service 384592
                    (i + 2 < input_len)&&(input[i+2] == '-')&&(i + 3 < input_len)&&
Packit Service 384592
                    (input[i + 3] == '-')) {
Packit Service 384592
            changed = 1;
Packit Service 384592
            i += 4;
Packit Service 384592
        } else if ((input[i] == '-')&&(i + 1 < input_len)&&(input[i + 1] == '-')&&
Packit Service 384592
                    (i + 2 < input_len)&&(input[i+2] == '>'))   {
Packit Service 384592
            changed = 1;
Packit Service 384592
            i += 3;
Packit Service 384592
        } else if ((input[i] == '-')&&(i + 1 < input_len)&&(input[i + 1] == '-')) {
Packit Service 384592
            changed = 1;
Packit Service 384592
            i += 2;
Packit Service 384592
        } else if (input[i] == '#') {
Packit Service 384592
            changed = 1;
Packit Service 384592
            i++;
Packit Service 384592
        } else {
Packit Service 384592
            input[j] = input[i];
Packit Service 384592
            i++;
Packit Service 384592
            j++;
Packit Service 384592
        }
Packit Service 384592
    }
Packit Service 384592
    input[j] = '\0';
Packit Service 384592
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
    *rval_len = j;
Packit Service 384592
Packit Service 384592
    return changed;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* removeComments */
Packit Service 384592
Packit Service 384592
static int msre_fn_removeComments_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
        long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    long int i, j, incomment;
Packit Service 384592
    int changed = 0;
Packit Service 384592
Packit Service 384592
    i = j = incomment = 0;
Packit Service 384592
    while(i < input_len) {
Packit Service 384592
        if (incomment == 0) {
Packit Service 384592
            if ((input[i] == '/')&&(i + 1 < input_len)&&(input[i + 1] == '*')) {
Packit Service 384592
                changed = 1;
Packit Service 384592
                incomment = 1;
Packit Service 384592
                i += 2;
Packit Service 384592
            } else if ((input[i] == '<')&&(i + 1 < input_len)&&(input[i + 1] == '!')&&
Packit Service 384592
                    (i + 2 < input_len)&&(input[i+2] == '-')&&(i + 3 < input_len)&&
Packit Service 384592
                    (input[i + 3] == '-') && (incomment == 0)) {
Packit Service 384592
                incomment = 1;
Packit Service 384592
                changed = 1;
Packit Service 384592
                i += 4;
Packit Service 384592
            } else if ((input[i] == '-')&&(i + 1 < input_len)&&(input[i + 1] == '-')
Packit Service 384592
                        && (incomment == 0)) {
Packit Service 384592
                changed = 1;
Packit Service 384592
                input[i] = ' ';
Packit Service 384592
                break;
Packit Service 384592
            } else if (input[i] == '#' && (incomment == 0)) {
Packit Service 384592
                changed = 1;
Packit Service 384592
                input[i] = ' ';
Packit Service 384592
               break;
Packit Service 384592
            } else {
Packit Service 384592
                input[j] = input[i];
Packit Service 384592
                i++;
Packit Service 384592
                j++;
Packit Service 384592
            }
Packit Service 384592
        } else {
Packit Service 384592
            if ((input[i] == '*')&&(i + 1 < input_len)&&(input[i + 1] == '/')) {
Packit Service 384592
                incomment = 0;
Packit Service 384592
                i += 2;
Packit Service 384592
                input[j] = input[i];
Packit Service 384592
                i++;
Packit Service 384592
                j++;
Packit Service 384592
            } else if ((input[i] == '-')&&(i + 1 < input_len)&&(input[i + 1] == '-')&&
Packit Service 384592
                    (i + 2 < input_len)&&(input[i+2] == '>'))   {
Packit Service 384592
                incomment = 0;
Packit Service 384592
                i += 3;
Packit Service 384592
                input[j] = input[i];
Packit Service 384592
                i++;
Packit Service 384592
                j++;
Packit Service 384592
            } else {
Packit Service 384592
                i++;
Packit Service 384592
            }
Packit Service 384592
        }
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    if (incomment) {
Packit Service 384592
        input[j++] = ' ';
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
    *rval_len = j;
Packit Service 384592
Packit Service 384592
    return changed;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* replaceComments */
Packit Service 384592
Packit Service 384592
static int msre_fn_replaceComments_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    long int i, j, incomment;
Packit Service 384592
    int changed = 0;
Packit Service 384592
Packit Service 384592
    i = j = incomment = 0;
Packit Service 384592
    while(i < input_len) {
Packit Service 384592
        if (incomment == 0) {
Packit Service 384592
            if ((input[i] == '/')&&(i + 1 < input_len)&&(input[i + 1] == '*')) {
Packit Service 384592
                changed = 1;
Packit Service 384592
                incomment = 1;
Packit Service 384592
                i += 2;
Packit Service 384592
            } else {
Packit Service 384592
                input[j] = input[i];
Packit Service 384592
                i++;
Packit Service 384592
                j++;
Packit Service 384592
            }
Packit Service 384592
        } else {
Packit Service 384592
            if ((input[i] == '*')&&(i + 1 < input_len)&&(input[i + 1] == '/')) {
Packit Service 384592
                incomment = 0;
Packit Service 384592
                i += 2;
Packit Service 384592
                input[j] = ' ';
Packit Service 384592
                j++;
Packit Service 384592
            } else {
Packit Service 384592
                i++;
Packit Service 384592
            }
Packit Service 384592
        }
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    if (incomment) {
Packit Service 384592
        input[j++] = ' ';
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
    *rval_len = j;
Packit Service 384592
Packit Service 384592
    return changed;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* jsDecode */
Packit Service 384592
Packit Service 384592
static int msre_fn_jsDecode_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    long int length;
Packit Service 384592
Packit Service 384592
    length = js_decode_nonstrict_inplace(input, input_len);
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
    *rval_len = length;
Packit Service 384592
Packit Service 384592
    return (*rval_len == input_len ? 0 : 1);
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* urlDecode */
Packit Service 384592
Packit Service 384592
static int msre_fn_urlDecode_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    long int length;
Packit Service 384592
    int invalid_count;
Packit Service 384592
    int changed;
Packit Service 384592
Packit Service 384592
    length = urldecode_nonstrict_inplace_ex(input, input_len, &invalid_count, &changed);
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
    *rval_len = length;
Packit Service 384592
Packit Service 384592
    return changed;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* urlDecodeUni */
Packit Service 384592
Packit Service 384592
static int msre_fn_urlDecodeUni_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    long int length;
Packit Service 384592
    int changed;
Packit Service 384592
Packit Service 384592
    length = urldecode_uni_nonstrict_inplace_ex(input, input_len, &changed);
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
    *rval_len = length;
Packit Service 384592
Packit Service 384592
    return changed;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
static int msre_fn_utf8Unicode_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    int changed = 0;
Packit Service 384592
Packit Service 384592
    *rval = (char *)utf8_unicode_inplace_ex(mptmp, input, input_len, &changed);
Packit Service 384592
    *rval_len = strlen(*rval);
Packit Service 384592
Packit Service 384592
    return changed;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
Packit Service 384592
/* urlEncode */
Packit Service 384592
Packit Service 384592
static int msre_fn_urlEncode_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    int changed;
Packit Service 384592
Packit Service 384592
    *rval = url_encode(mptmp, (char *)input, input_len, &changed);
Packit Service 384592
    *rval_len = strlen(*rval);
Packit Service 384592
Packit Service 384592
    return changed;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* base64Encode */
Packit Service 384592
Packit Service 384592
static int msre_fn_base64Encode_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    *rval_len = apr_base64_encode_len(input_len); /* returns len with NULL byte included */
Packit Service 384592
    *rval = apr_palloc(mptmp, *rval_len);
Packit Service 384592
    apr_base64_encode(*rval, (const char *)input, input_len);
Packit Service 384592
    (*rval_len)--;
Packit Service 384592
Packit Service 384592
    return *rval_len ? 1 : 0;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* base64Decode */
Packit Service 384592
Packit Service 384592
static int msre_fn_base64Decode_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    *rval_len = apr_base64_decode_len((const char *)input); /* returns len with NULL byte included */
Packit Service 384592
    *rval = apr_palloc(mptmp, *rval_len);
Packit Service 384592
    *rval_len = apr_base64_decode(*rval, (const char *)input);
Packit Service 384592
Packit Service 384592
    return *rval_len ? 1 : 0;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* length */
Packit Service 384592
Packit Service 384592
static int msre_fn_length_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    *rval = apr_psprintf(mptmp, "%ld", input_len);
Packit Service 384592
    *rval_len = strlen(*rval);
Packit Service 384592
Packit Service 384592
    return 1;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* md5 */
Packit Service 384592
Packit Service 384592
static int msre_fn_md5_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    unsigned char digest[APR_MD5_DIGESTSIZE];
Packit Service 384592
Packit Service 384592
    apr_md5(digest, input, input_len);
Packit Service 384592
Packit Service 384592
    *rval_len = APR_MD5_DIGESTSIZE;
Packit Service 384592
    *rval = apr_pstrmemdup(mptmp, (const char *)digest, APR_MD5_DIGESTSIZE);
Packit Service 384592
Packit Service 384592
    return 1;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* sha1 */
Packit Service 384592
Packit Service 384592
static int msre_fn_sha1_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    unsigned char digest[APR_SHA1_DIGESTSIZE];
Packit Service 384592
    apr_sha1_ctx_t context;
Packit Service 384592
Packit Service 384592
    apr_sha1_init(&context);
Packit Service 384592
    apr_sha1_update(&context, (const char *)input, input_len);
Packit Service 384592
    apr_sha1_final(digest, &context);
Packit Service 384592
Packit Service 384592
    *rval_len = APR_SHA1_DIGESTSIZE;
Packit Service 384592
    *rval = apr_pstrmemdup(mptmp, (const char *)digest, APR_SHA1_DIGESTSIZE);
Packit Service 384592
Packit Service 384592
    return 1;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/**
Packit Service 384592
* \brief SqlHexDecode transformation function. Transform xNN data.
Packit Service 384592
*
Packit Service 384592
* \param mptmp Pointer to resource pool
Packit Service 384592
* \param input Pointer to input data
Packit Service 384592
* \param input_len Input data length
Packit Service 384592
* \param rval Pointer to decoded buffer
Packit Service 384592
* \param rval_len Decoded buffer length
Packit Service 384592
*
Packit Service 384592
* \retval 0 On failure
Packit Service 384592
* \retval 1 On Success
Packit Service 384592
*/
Packit Service 384592
static int msre_fn_sqlHexDecode_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    *rval_len = sql_hex2bytes_inplace(input, input_len);
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
Packit Service 384592
    return 1;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* hexDecode */
Packit Service 384592
Packit Service 384592
static int msre_fn_hexDecode_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    *rval_len = hex2bytes_inplace(input, input_len);
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
Packit Service 384592
    return 1;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* hexEncode */
Packit Service 384592
Packit Service 384592
static int msre_fn_hexEncode_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    *rval = bytes2hex(mptmp, input, input_len);
Packit Service 384592
    *rval_len = strlen(*rval);
Packit Service 384592
Packit Service 384592
    return 1;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* htmlEntityDecode */
Packit Service 384592
Packit Service 384592
static int msre_fn_htmlEntityDecode_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    *rval_len = html_entities_decode_inplace(mptmp, input, input_len);
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
Packit Service 384592
    return (*rval_len == input_len ? 0 : 1);
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* escapeSeqDecode */
Packit Service 384592
Packit Service 384592
static int msre_fn_escapeSeqDecode_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    *rval_len = ansi_c_sequences_decode_inplace(input, input_len);
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
Packit Service 384592
    return (*rval_len == input_len ? 0 : 1);
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* normalizePath */
Packit Service 384592
Packit Service 384592
static int msre_fn_normalizePath_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    int changed;
Packit Service 384592
Packit Service 384592
    *rval_len = normalize_path_inplace(input, input_len, 0, &changed);
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
Packit Service 384592
    return changed;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* normalizePathWin */
Packit Service 384592
Packit Service 384592
static int msre_fn_normalizePathWin_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    int changed;
Packit Service 384592
Packit Service 384592
    *rval_len = normalize_path_inplace(input, input_len, 1, &changed);
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
Packit Service 384592
    return changed;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* parityEven7bit */
Packit Service 384592
Packit Service 384592
static int msre_fn_parityEven7bit_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    long int i;
Packit Service 384592
    int changed = 0;
Packit Service 384592
Packit Service 384592
    if (rval == NULL) return -1;
Packit Service 384592
    *rval = NULL;
Packit Service 384592
Packit Service 384592
    i = 0;
Packit Service 384592
    while(i < input_len) {
Packit Service 384592
        unsigned int x = input[i];
Packit Service 384592
Packit Service 384592
        input[i] ^= input[i] >> 4;
Packit Service 384592
        input[i] &= 0xf;
Packit Service 384592
Packit Service 384592
        if ((0x6996 >> input[i]) & 1) {
Packit Service 384592
            input[i] = x | 0x80;
Packit Service 384592
        }
Packit Service 384592
        else {
Packit Service 384592
            input[i] = x & 0x7f;
Packit Service 384592
        }
Packit Service 384592
Packit Service 384592
        if (x != input[i]) changed = 1;
Packit Service 384592
        i++;
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
    *rval_len = input_len;
Packit Service 384592
Packit Service 384592
    return changed;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* parityZero7bit */
Packit Service 384592
Packit Service 384592
static int msre_fn_parityZero7bit_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    long int i;
Packit Service 384592
    int changed = 0;
Packit Service 384592
Packit Service 384592
    if (rval == NULL) return -1;
Packit Service 384592
    *rval = NULL;
Packit Service 384592
Packit Service 384592
    i = 0;
Packit Service 384592
    while(i < input_len) {
Packit Service 384592
        unsigned char c = input[i];
Packit Service 384592
        input[i] &= 0x7f;
Packit Service 384592
        if (c != input[i]) changed = 1;
Packit Service 384592
        i++;
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
    *rval_len = input_len;
Packit Service 384592
Packit Service 384592
    return changed;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* parityOdd7bit */
Packit Service 384592
Packit Service 384592
static int msre_fn_parityOdd7bit_execute(apr_pool_t *mptmp, unsigned char *input,
Packit Service 384592
    long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    long int i;
Packit Service 384592
    int changed = 0;
Packit Service 384592
Packit Service 384592
    if (rval == NULL) return -1;
Packit Service 384592
    *rval = NULL;
Packit Service 384592
Packit Service 384592
    i = 0;
Packit Service 384592
    while(i < input_len) {
Packit Service 384592
        unsigned int x = input[i];
Packit Service 384592
Packit Service 384592
        input[i] ^= input[i] >> 4;
Packit Service 384592
        input[i] &= 0xf;
Packit Service 384592
Packit Service 384592
        if ((0x6996 >> input[i]) & 1) {
Packit Service 384592
            input[i] = x & 0x7f;
Packit Service 384592
        }
Packit Service 384592
        else {
Packit Service 384592
            input[i] = x | 0x80;
Packit Service 384592
        }
Packit Service 384592
Packit Service 384592
        if (x != input[i]) changed = 1;
Packit Service 384592
        i++;
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    *rval = (char *)input;
Packit Service 384592
    *rval_len = input_len;
Packit Service 384592
Packit Service 384592
    return changed;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/**
Packit Service 384592
* \brief Base64 transformation function based on RFC2045
Packit Service 384592
*
Packit Service 384592
* \param mptmp Pointer to resource pool
Packit Service 384592
* \param input Pointer to input data
Packit Service 384592
* \param input_len Input data length
Packit Service 384592
* \param rval Pointer to decoded buffer
Packit Service 384592
* \param rval_len Decoded buffer length
Packit Service 384592
*
Packit Service 384592
* \retval 0 On failure
Packit Service 384592
* \retval 1 On Success
Packit Service 384592
*/
Packit Service 384592
static int msre_fn_base64DecodeExt_execute(apr_pool_t *mptmp, unsigned char *input, long int input_len, char **rval, long int *rval_len)
Packit Service 384592
{
Packit Service 384592
    *rval_len = input_len;
Packit Service 384592
    *rval = apr_palloc(mptmp, *rval_len);
Packit Service 384592
    *rval_len = decode_base64_ext(*rval, (const unsigned char *)input, input_len);
Packit Service 384592
Packit Service 384592
    return *rval_len ? 1 : 0;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
Packit Service 384592
/* ------------------------------------------------------------------------------ */
Packit Service 384592
Packit Service 384592
/**
Packit Service 384592
 * Registers one transformation function with the engine.
Packit Service 384592
 */
Packit Service 384592
void msre_engine_tfn_register(msre_engine *engine, const char *name,
Packit Service 384592
    fn_tfn_execute_t execute)
Packit Service 384592
{
Packit Service 384592
    msre_tfn_metadata *metadata = (msre_tfn_metadata *)apr_pcalloc(engine->mp,
Packit Service 384592
        sizeof(msre_tfn_metadata));
Packit Service 384592
    if (metadata == NULL) return;
Packit Service 384592
Packit Service 384592
    metadata->name = name;
Packit Service 384592
    metadata->execute = execute;
Packit Service 384592
Packit Service 384592
    apr_table_setn(engine->tfns, name, (void *)metadata);
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/**
Packit Service 384592
 * Returns transformation function metadata given a name.
Packit Service 384592
 */
Packit Service 384592
msre_tfn_metadata *msre_engine_tfn_resolve(msre_engine *engine, const char *name) {
Packit Service 384592
    return (msre_tfn_metadata *)apr_table_get(engine->tfns, name);
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/**
Packit Service 384592
 * Register the default transformation functions.
Packit Service 384592
 */
Packit Service 384592
void msre_engine_register_default_tfns(msre_engine *engine) {
Packit Service 384592
Packit Service 384592
    /* none */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "none",
Packit Service 384592
        NULL
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* base64Decode */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "base64Decode",
Packit Service 384592
        msre_fn_base64Decode_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* base64Encode */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "base64Encode",
Packit Service 384592
        msre_fn_base64Encode_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* compressWhitespace */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "compressWhitespace",
Packit Service 384592
        msre_fn_compressWhitespace_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* cssDecode */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "cssDecode",
Packit Service 384592
        msre_fn_cssDecode_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* escapeSeqDecode */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "escapeSeqDecode",
Packit Service 384592
        msre_fn_escapeSeqDecode_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* sqlHexDecode */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "sqlHexDecode",
Packit Service 384592
        msre_fn_sqlHexDecode_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* hexDecode */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "hexDecode",
Packit Service 384592
        msre_fn_hexDecode_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* hexEncode */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "hexEncode",
Packit Service 384592
        msre_fn_hexEncode_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* htmlEntityDecode */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "htmlEntityDecode",
Packit Service 384592
        msre_fn_htmlEntityDecode_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* jsDecode */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "jsDecode",
Packit Service 384592
        msre_fn_jsDecode_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* length */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "length",
Packit Service 384592
        msre_fn_length_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* lowercase */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "lowercase",
Packit Service 384592
        msre_fn_lowercase_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* md5 */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "md5",
Packit Service 384592
        msre_fn_md5_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* normalisePath */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "normalisePath",
Packit Service 384592
        msre_fn_normalizePath_execute
Packit Service 384592
    );
Packit Service 384592
    
Packit Service 384592
    /* normalizePath */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "normalizePath",
Packit Service 384592
        msre_fn_normalizePath_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* normalisePathWin */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "normalisePathWin",
Packit Service 384592
        msre_fn_normalizePathWin_execute
Packit Service 384592
    );
Packit Service 384592
    
Packit Service 384592
    /* normalizePathWin */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "normalizePathWin",
Packit Service 384592
        msre_fn_normalizePathWin_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* parityEven7bit */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "parityEven7bit",
Packit Service 384592
        msre_fn_parityEven7bit_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* parityZero7bit */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "parityZero7bit",
Packit Service 384592
        msre_fn_parityZero7bit_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* parityOdd7bit */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "parityOdd7bit",
Packit Service 384592
        msre_fn_parityOdd7bit_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* removeWhitespace */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "removeWhitespace",
Packit Service 384592
        msre_fn_removeWhitespace_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* removeNulls */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "removeNulls",
Packit Service 384592
        msre_fn_removeNulls_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* replaceNulls */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "replaceNulls",
Packit Service 384592
        msre_fn_replaceNulls_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* removeComments */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "removeComments",
Packit Service 384592
        msre_fn_removeComments_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* removeCommentsChar */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "removeCommentsChar",
Packit Service 384592
        msre_fn_removeCommentsChar_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* replaceComments */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "replaceComments",
Packit Service 384592
        msre_fn_replaceComments_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* sha1 */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "sha1",
Packit Service 384592
        msre_fn_sha1_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* trim */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "trim",
Packit Service 384592
        msre_fn_trim_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* trimLeft */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "trimLeft",
Packit Service 384592
        msre_fn_trimLeft_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "cmdline",
Packit Service 384592
        msre_fn_cmdline_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* trimRight */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "trimRight",
Packit Service 384592
        msre_fn_trimRight_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* urlDecode */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "urlDecode",
Packit Service 384592
        msre_fn_urlDecode_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* urlDecodeUni */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "urlDecodeUni",
Packit Service 384592
        msre_fn_urlDecodeUni_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* Utf8Unicode */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "Utf8toUnicode",
Packit Service 384592
        msre_fn_utf8Unicode_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* urlEncode */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "urlEncode",
Packit Service 384592
        msre_fn_urlEncode_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
    /* base64DecodeExt */
Packit Service 384592
    msre_engine_tfn_register(engine,
Packit Service 384592
        "base64DecodeExt",
Packit Service 384592
        msre_fn_base64DecodeExt_execute
Packit Service 384592
    );
Packit Service 384592
Packit Service 384592
}