Blame standalone/main.cpp

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
//#undef inline
Packit Service 384592
#define	inline inline
Packit Service 384592

Packit Service 384592
#include <stdio.h>
Packit Service 384592
#include <conio.h>
Packit Service 384592
#include "api.h"
Packit Service 384592

Packit Service 384592

Packit Service 384592
char *config_file = NULL;
Packit Service 384592
char *url_file = NULL;
Packit Service 384592
char *event_files[1024];
Packit Service 384592
int event_file_cnt;
Packit Service 384592
char *event_file = NULL;
Packit Service 384592
int event_file_len = 0;
Packit Service 384592
char **event_file_lines;
Packit Service 384592
int event_line_cnt = 0;
Packit Service 384592
int event_file_blocks[256];
Packit Service 384592

Packit Service 384592
#define	EVENT_FILE_MAX_SIZE		(16*1024*1024)
Packit Service 384592

Packit Service 384592
#define	MAX_URLS	4096
Packit Service 384592

Packit Service 384592
char urls[MAX_URLS][4096];
Packit Service 384592
int url_cnt = 0;
Packit Service 384592

Packit Service 384592
void readeventfile(char *name)
Packit Service 384592
{
Packit Service 384592
	if(event_file == NULL)
Packit Service 384592
	{
Packit Service 384592
		event_file = (char *)malloc(EVENT_FILE_MAX_SIZE);
Packit Service 384592
		event_file_lines = (char **)malloc(EVENT_FILE_MAX_SIZE);
Packit Service 384592
	}
Packit Service 384592

Packit Service 384592
	event_file_len = 0;
Packit Service 384592
	event_line_cnt = 0;
Packit Service 384592
	memset(event_file_blocks, -1, sizeof(int) * 256);
Packit Service 384592

Packit Service 384592
	FILE *fr = fopen(name, "rb");
Packit Service 384592

Packit Service 384592
	if(fr == NULL)
Packit Service 384592
		return;
Packit Service 384592

Packit Service 384592
	event_file_len = fread(event_file, 1, EVENT_FILE_MAX_SIZE - 1, fr);
Packit Service 384592

Packit Service 384592
	fclose(fr);
Packit Service 384592

Packit Service 384592
	event_file[event_file_len] = 0;
Packit Service 384592
}
Packit Service 384592

Packit Service 384592
void parseeventfile()
Packit Service 384592
{
Packit Service 384592
	if(event_file_len == 0 || event_file == NULL)
Packit Service 384592
		return;
Packit Service 384592

Packit Service 384592
	char *t = event_file;
Packit Service 384592
	char *e = event_file + event_file_len;
Packit Service 384592
	int nocrlf = 1;
Packit Service 384592

Packit Service 384592
	while(t < e)
Packit Service 384592
	{
Packit Service 384592
		event_file_lines[event_line_cnt++] = t;
Packit Service 384592

Packit Service 384592
		while(t < e && *t != 10 && *t != 13)
Packit Service 384592
			t++;
Packit Service 384592

Packit Service 384592
		char ct = *t;
Packit Service 384592
		*t = 0;
Packit Service 384592
		int i = event_line_cnt - 1;
Packit Service 384592

Packit Service 384592
		int l = strlen(event_file_lines[i]);
Packit Service 384592

Packit Service 384592
		if(l == 14 && event_file_lines[i][0] == '-' && event_file_lines[i][1] == '-' && event_file_lines[i][l-2] == '-' && event_file_lines[i][l-1] == '-')
Packit Service 384592
		{
Packit Service 384592
			char blk =  event_file_lines[i][l-3];
Packit Service 384592

Packit Service 384592
			event_file_blocks[blk] = i;
Packit Service 384592

Packit Service 384592
			if(blk == 'C' || blk == 'G')
Packit Service 384592
			{
Packit Service 384592
				nocrlf = 0;
Packit Service 384592
			}
Packit Service 384592
			else
Packit Service 384592
			{
Packit Service 384592
				nocrlf = 1;
Packit Service 384592
			}
Packit Service 384592
		}
Packit Service 384592
		*t = ct;
Packit Service 384592

Packit Service 384592
		if(nocrlf)
Packit Service 384592
			while(t < e && (*t == 10 || *t == 13))
Packit Service 384592
				*t++ = 0;
Packit Service 384592
		else
Packit Service 384592
			while(t < e && (*t == 10 || *t == 13))
Packit Service 384592
				t++;
Packit Service 384592
	}
Packit Service 384592
}
Packit Service 384592

Packit Service 384592
void parseargs(int argc, char *argv[])
Packit Service 384592
{
Packit Service 384592
	int i = 1;
Packit Service 384592

Packit Service 384592
	event_file_cnt = 0;
Packit Service 384592

Packit Service 384592
	while(i < argc)
Packit Service 384592
	{
Packit Service 384592
		if(argv[i][0] == '-')
Packit Service 384592
		{
Packit Service 384592
			if(argv[i][1] == 'c' && i < argc - 1)
Packit Service 384592
			{
Packit Service 384592
				config_file = argv[i + 1];
Packit Service 384592
				i += 2;
Packit Service 384592
				continue;
Packit Service 384592
			}
Packit Service 384592
			if(argv[i][1] == 'u' && i < argc - 1)
Packit Service 384592
			{
Packit Service 384592
				url_file = argv[i + 1];
Packit Service 384592
				i += 2;
Packit Service 384592
				continue;
Packit Service 384592
			}
Packit Service 384592
			i++;
Packit Service 384592
			continue;
Packit Service 384592
		}
Packit Service 384592
		if(event_file_cnt == 1024)
Packit Service 384592
		{
Packit Service 384592
			fprintf(stderr, "Too many input files! (limit 1024)\n");
Packit Service 384592
			break;
Packit Service 384592
		}
Packit Service 384592

Packit Service 384592
		event_files[event_file_cnt++] = argv[i++];
Packit Service 384592
	}
Packit Service 384592
}
Packit Service 384592

Packit Service 384592
void log(void *obj, int level, char *str)
Packit Service 384592
{
Packit Service 384592
	printf("%s\n", str);
Packit Service 384592
}
Packit Service 384592

Packit Service 384592
unsigned int bodypos = 0;
Packit Service 384592

Packit Service 384592
apr_status_t readbody(request_rec *r, char *buf, unsigned int length, unsigned int *readcnt, int *is_eos)
Packit Service 384592
{
Packit Service 384592
	int j = event_file_blocks['C'];
Packit Service 384592

Packit Service 384592
	if(j < 0)
Packit Service 384592
	{
Packit Service 384592
		*is_eos = 1;
Packit Service 384592
		return APR_SUCCESS;
Packit Service 384592
	}
Packit Service 384592

Packit Service 384592
	j++;
Packit Service 384592

Packit Service 384592
	if(event_file_lines[j][0] == 0)
Packit Service 384592
	{
Packit Service 384592
		*is_eos = 1;
Packit Service 384592
		return APR_SUCCESS;
Packit Service 384592
	}
Packit Service 384592

Packit Service 384592
	unsigned int l = strlen(event_file_lines[j]);
Packit Service 384592
	unsigned int size = length;
Packit Service 384592

Packit Service 384592
	if(bodypos + size > l)
Packit Service 384592
		size = l - bodypos;
Packit Service 384592

Packit Service 384592
	memcpy(buf, &event_file_lines[j][bodypos], size);
Packit Service 384592

Packit Service 384592
	bodypos += size;
Packit Service 384592
	*readcnt = size;
Packit Service 384592

Packit Service 384592
	if(bodypos == l)
Packit Service 384592
	{
Packit Service 384592
		*is_eos = 1;
Packit Service 384592
	}
Packit Service 384592

Packit Service 384592
	return APR_SUCCESS;
Packit Service 384592
}
Packit Service 384592

Packit Service 384592
unsigned int responsepos = 0;
Packit Service 384592

Packit Service 384592
apr_status_t readresponse(request_rec *r, char *buf, unsigned int length, unsigned int *readcnt, int *is_eos)
Packit Service 384592
{
Packit Service 384592
	int j = event_file_blocks['G'];
Packit Service 384592

Packit Service 384592
	if(j < 0)
Packit Service 384592
	{
Packit Service 384592
		*is_eos = 1;
Packit Service 384592
		return APR_SUCCESS;
Packit Service 384592
	}
Packit Service 384592

Packit Service 384592
	j++;
Packit Service 384592

Packit Service 384592
	if(event_file_lines[j][0] == 0)
Packit Service 384592
	{
Packit Service 384592
		*is_eos = 1;
Packit Service 384592
		return APR_SUCCESS;
Packit Service 384592
	}
Packit Service 384592

Packit Service 384592
	unsigned int l = strlen(event_file_lines[j]);
Packit Service 384592
	unsigned int size = length;
Packit Service 384592

Packit Service 384592
	if(responsepos + size > l)
Packit Service 384592
		size = l - responsepos;
Packit Service 384592

Packit Service 384592
	memcpy(buf, &event_file_lines[j][responsepos], size);
Packit Service 384592

Packit Service 384592
	responsepos += size;
Packit Service 384592
	*readcnt = size;
Packit Service 384592

Packit Service 384592
	if(responsepos == l)
Packit Service 384592
		*is_eos = 1;
Packit Service 384592

Packit Service 384592
	return APR_SUCCESS;
Packit Service 384592
}
Packit Service 384592

Packit Service 384592
void main(int argc, char *argv[])
Packit Service 384592
{
Packit Service 384592
	directory_config *config;
Packit Service 384592
	conn_rec *c;
Packit Service 384592
	request_rec *r;
Packit Service 384592

Packit Service 384592
	parseargs(argc, argv);
Packit Service 384592

Packit Service 384592
	if(config_file == NULL || argc < 3)
Packit Service 384592
	{
Packit Service 384592
		printf("Usage:\n");
Packit Service 384592
		printf("standalone.exe -c <config_file> [-u <text_file_with_urls>] <event_file1> [<event_file2> <event_file3> ...]\n");
Packit Service 384592
		return;
Packit Service 384592
	}
Packit Service 384592

Packit Service 384592
	modsecSetLogHook(NULL, log);
Packit Service 384592

Packit Service 384592
	modsecSetReadBody(readbody);
Packit Service 384592
	modsecSetReadResponse(readresponse);
Packit Service 384592

Packit Service 384592
	modsecInit();
Packit Service 384592

Packit Service 384592
	modsecStartConfig();
Packit Service 384592

Packit Service 384592
	config = modsecGetDefaultConfig();
Packit Service 384592

Packit Service 384592
	const char * err = modsecProcessConfig(config, config_file, "c:\\inetpub\\wwwroot");
Packit Service 384592

Packit Service 384592
	if(err != NULL)
Packit Service 384592
	{
Packit Service 384592
		printf("%s\n", err);
Packit Service 384592
	}
Packit Service 384592

Packit Service 384592
	modsecFinalizeConfig();
Packit Service 384592

Packit Service 384592
	modsecInitProcess();
Packit Service 384592

Packit Service 384592
	if(url_file != NULL)
Packit Service 384592
	{
Packit Service 384592
		FILE *fr = fopen(url_file, "rb");
Packit Service 384592
		int i = 0;
Packit Service 384592

Packit Service 384592
		while(fgets(urls[i],4096,fr) != NULL)
Packit Service 384592
		{
Packit Service 384592
			urls[i][4095] = 0;
Packit Service 384592

Packit Service 384592
			int l = strlen(urls[i]) - 1;
Packit Service 384592

Packit Service 384592
			if(l < 8)
Packit Service 384592
				continue;
Packit Service 384592

Packit Service 384592
			while(urls[i][l] == 10 || urls[i][l] == 13)
Packit Service 384592
				l--;
Packit Service 384592

Packit Service 384592
			urls[i++][l + 1] = 0;
Packit Service 384592
		}
Packit Service 384592

Packit Service 384592
		url_cnt = i;
Packit Service 384592
		fclose(fr);
Packit Service 384592
	}
Packit Service 384592

Packit Service 384592
	for(int i = 0; i < event_file_cnt; i++)
Packit Service 384592
	{
Packit Service 384592
		if(url_cnt == 0)
Packit Service 384592
		{
Packit Service 384592
			urls[0][0] = 0;
Packit Service 384592
			url_cnt = 1;
Packit Service 384592
		}
Packit Service 384592

Packit Service 384592
		for(int ui = 0; ui < url_cnt; ui++)
Packit Service 384592
		{
Packit Service 384592
			readeventfile(event_files[i]);
Packit Service 384592
			parseeventfile();
Packit Service 384592

Packit Service 384592
			bodypos = 0;
Packit Service 384592
			responsepos = 0;
Packit Service 384592

Packit Service 384592
			c = modsecNewConnection();
Packit Service 384592

Packit Service 384592
			modsecProcessConnection(c);
Packit Service 384592

Packit Service 384592
			r = modsecNewRequest(c, config);
Packit Service 384592

Packit Service 384592
			int j = event_file_blocks['B'];
Packit Service 384592

Packit Service 384592
			if(j < 0)
Packit Service 384592
				continue;
Packit Service 384592

Packit Service 384592
			j++;
Packit Service 384592

Packit Service 384592
			if(event_file_lines[j][0] == 0)
Packit Service 384592
				continue;
Packit Service 384592

Packit Service 384592
			char *method = event_file_lines[j];
Packit Service 384592
			char *url = strchr(method, 32);
Packit Service 384592
			char *proto = strchr(url + 1, 32);
Packit Service 384592

Packit Service 384592
			if(url == NULL || proto == NULL)
Packit Service 384592
				continue;
Packit Service 384592

Packit Service 384592
			*url++=0;
Packit Service 384592
			*proto++=0;
Packit Service 384592

Packit Service 384592
			if(urls[ui][0] != 0)
Packit Service 384592
			{
Packit Service 384592
				url = urls[ui];
Packit Service 384592
			}
Packit Service 384592

Packit Service 384592
#define	SETMETHOD(m) if(strcmp(method,#m) == 0){ r->method = method; r->method_number = M_##m; }
Packit Service 384592

Packit Service 384592
			r->method = "INVALID";
Packit Service 384592
			r->method_number = M_INVALID;
Packit Service 384592

Packit Service 384592
			SETMETHOD(OPTIONS)
Packit Service 384592
			SETMETHOD(GET)
Packit Service 384592
			SETMETHOD(POST)
Packit Service 384592
			SETMETHOD(PUT)
Packit Service 384592
			SETMETHOD(DELETE)
Packit Service 384592
			SETMETHOD(TRACE)
Packit Service 384592
			SETMETHOD(CONNECT)
Packit Service 384592
			SETMETHOD(MOVE)
Packit Service 384592
			SETMETHOD(COPY)
Packit Service 384592
			SETMETHOD(PROPFIND)
Packit Service 384592
			SETMETHOD(PROPPATCH)
Packit Service 384592
			SETMETHOD(MKCOL)
Packit Service 384592
			SETMETHOD(LOCK)
Packit Service 384592
			SETMETHOD(UNLOCK)
Packit Service 384592

Packit Service 384592
			r->protocol = proto;
Packit Service 384592

Packit Service 384592
			while(event_file_lines[++j][0] != 0)
Packit Service 384592
			{
Packit Service 384592
				char *value = strchr(event_file_lines[j], ':');
Packit Service 384592

Packit Service 384592
				if(value == NULL)
Packit Service 384592
					break;
Packit Service 384592

Packit Service 384592
				*value++ = 0;
Packit Service 384592

Packit Service 384592
				while(*value <=32 && *value != 0)
Packit Service 384592
					value++;
Packit Service 384592

Packit Service 384592
				apr_table_setn(r->headers_in, event_file_lines[j], value);
Packit Service 384592
			}
Packit Service 384592

Packit Service 384592
			r->content_encoding = apr_table_get(r->headers_in, "Content-Encoding");
Packit Service 384592
			r->content_type = apr_table_get(r->headers_in, "Content-Type");
Packit Service 384592
			r->hostname = apr_table_get(r->headers_in, "Host");
Packit Service 384592
			r->path_info = url;
Packit Service 384592
		
Packit Service 384592
			char *query = strchr(url, '?');
Packit Service 384592
			char *rawurl = url;
Packit Service 384592

Packit Service 384592
			if(query != NULL)
Packit Service 384592
			{
Packit Service 384592
				rawurl = (char *)apr_palloc(r->pool, strlen(url) + 1);
Packit Service 384592
				strcpy(rawurl, url);
Packit Service 384592
				*query++ = 0;
Packit Service 384592
				r->args = query;
Packit Service 384592
			}
Packit Service 384592

Packit Service 384592
			const char *lng = apr_table_get(r->headers_in, "Content-Languages");
Packit Service 384592

Packit Service 384592
			if(lng != NULL)
Packit Service 384592
			{
Packit Service 384592
				r->content_languages = apr_array_make(r->pool, 1, sizeof(const char *));
Packit Service 384592

Packit Service 384592
				*(const char **)apr_array_push(r->content_languages) = lng;
Packit Service 384592
			}
Packit Service 384592

Packit Service 384592
			r->request_time = apr_time_now();
Packit Service 384592

Packit Service 384592
			r->parsed_uri.scheme = "http";
Packit Service 384592
			r->parsed_uri.path = r->path_info;
Packit Service 384592
			r->parsed_uri.hostname = (char *)r->hostname;
Packit Service 384592
			r->parsed_uri.is_initialized = 1;
Packit Service 384592
			r->parsed_uri.port = 80;
Packit Service 384592
			r->parsed_uri.port_str = "80";
Packit Service 384592
			r->parsed_uri.query = r->args;
Packit Service 384592
			r->parsed_uri.dns_looked_up = 0;
Packit Service 384592
			r->parsed_uri.dns_resolved = 0;
Packit Service 384592
			r->parsed_uri.password = NULL;
Packit Service 384592
			r->parsed_uri.user = NULL;
Packit Service 384592
			r->parsed_uri.fragment = NULL;
Packit Service 384592

Packit Service 384592
			r->unparsed_uri = rawurl;
Packit Service 384592
			r->uri = r->unparsed_uri;
Packit Service 384592

Packit Service 384592
			r->the_request = (char *)apr_palloc(r->pool, strlen(r->method) + 1 + strlen(r->uri) + 1 + strlen(r->protocol) + 1);
Packit Service 384592

Packit Service 384592
			strcpy(r->the_request, r->method);
Packit Service 384592
			strcat(r->the_request, " ");
Packit Service 384592
			strcat(r->the_request, r->uri);
Packit Service 384592
			strcat(r->the_request, " ");
Packit Service 384592
			strcat(r->the_request, r->protocol);
Packit Service 384592

Packit Service 384592
			apr_table_setn(r->subprocess_env, "UNIQUE_ID", "1");
Packit Service 384592

Packit Service 384592
			modsecProcessRequest(r);
Packit Service 384592
			modsecProcessResponse(r);
Packit Service 384592
			modsecFinishRequest(r);
Packit Service 384592
		}
Packit Service 384592
	}
Packit Service 384592

Packit Service 384592
	modsecTerminate();
Packit Service 384592
	getch();
Packit Service 384592
}