1 /*
2 * ModSecurity for Apache 2.x, http://www.modsecurity.org/
3 * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/)
4 *
5 * You may not use this file except in compliance with
6 * the License.  You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * If any of the files related to licensing are missing or if you have any
11 * other questions related to licensing please contact Trustwave Holdings, Inc.
12 * directly using the email address security@modsecurity.org.
13 */
14 
15 
16 #pragma once
17 
18 #include <limits.h>
19 
20 #include "http_core.h"
21 #include "http_request.h"
22 
23 #include "modsecurity.h"
24 #include "apache2.h"
25 #include "http_main.h"
26 #include "http_connection.h"
27 
28 #include "apr_optional.h"
29 #include "mod_log_config.h"
30 
31 #include "msc_logging.h"
32 #include "msc_util.h"
33 
34 #include "ap_mpm.h"
35 #include "scoreboard.h"
36 
37 #include "apr_version.h"
38 
39 #include "apr_lib.h"
40 #include "ap_config.h"
41 #include "http_config.h"
42 
43 
44 #ifdef	__cplusplus
45 extern "C"
46 {
47 #endif
48 
49 server_rec *modsecInit();
50 void modsecTerminate();
51 
52 void modsecStartConfig();
53 directory_config *modsecGetDefaultConfig();
54 const char *modsecProcessConfig(directory_config *config, const char *file, const char *dir);
55 void modsecFinalizeConfig();
56 
57 void modsecInitProcess();
58 
59 conn_rec *modsecNewConnection();
60 void modsecProcessConnection(conn_rec *c);
61 int modsecFinishConnection(conn_rec *c);
62 
63 request_rec *modsecNewRequest(conn_rec *connection, directory_config *config);
64 
65 int modsecProcessRequestBody(request_rec *r);
66 int modsecProcessRequestHeaders(request_rec *r);
67 
modsecProcessRequest(request_rec * r)68 static inline int modsecProcessRequest(request_rec *r)    {
69     int status;
70     status = modsecProcessRequestHeaders(r);
71     if (status != DECLINED) {
72         return status;
73     }
74 
75     return modsecProcessRequestBody(r);
76 }
77 
78 
79 int modsecProcessResponse(request_rec *r);
80 int modsecFinishRequest(request_rec *r);
81 
82 void modsecSetLogHook(void *obj, void (*hook)(void *obj, int level, char *str));
83 
84 #define NOTE_MSR_BRIGADE_REQUEST  "modsecurity-brigade-request"
85 #define NOTE_MSR_BRIGADE_RESPONSE "modsecurity-brigade-response"
86 
87 static inline void
modsecSetBodyBrigade(request_rec * r,apr_bucket_brigade * b)88 modsecSetBodyBrigade(request_rec *r, apr_bucket_brigade *b) {
89     apr_table_setn(r->notes, NOTE_MSR_BRIGADE_REQUEST, (char *)b);
90 };
91 
92 static inline apr_bucket_brigade *
modsecGetBodyBrigade(request_rec * r)93 modsecGetBodyBrigade(request_rec *r) {
94     return (apr_bucket_brigade *)apr_table_get(r->notes, NOTE_MSR_BRIGADE_REQUEST);
95 };
96 
97 static inline void
modsecSetResponseBrigade(request_rec * r,apr_bucket_brigade * b)98 modsecSetResponseBrigade(request_rec *r, apr_bucket_brigade *b) {
99     apr_table_setn(r->notes, NOTE_MSR_BRIGADE_RESPONSE, (char *)b);
100 };
101 
102 static inline apr_bucket_brigade *
modsecGetResponseBrigade(request_rec * r)103 modsecGetResponseBrigade(request_rec *r) {
104     return (apr_bucket_brigade *)apr_table_get(r->notes, NOTE_MSR_BRIGADE_RESPONSE);
105 };
106 
107 void modsecSetReadBody(apr_status_t (*func)(request_rec *r, char *buf, unsigned int length, unsigned int *readcnt, int *is_eos));
108 void modsecSetReadResponse(apr_status_t (*func)(request_rec *r, char *buf, unsigned int length, unsigned int *readcnt, int *is_eos));
109 void modsecSetWriteBody(apr_status_t (*func)(request_rec *r, char *buf, unsigned int length));
110 void modsecSetWriteResponse(apr_status_t (*func)(request_rec *r, char *buf, unsigned int length));
111 void modsecSetDropAction(int (*func)(request_rec *r));
112 
113 int modsecIsResponseBodyAccessEnabled(request_rec *r);
114 int modsecIsRequestBodyAccessEnabled(request_rec *r);
115 
116 int modsecContextState(request_rec *r);
117 
118 void modsecSetConfigForIISRequestBody(request_rec *r);
119 
120 const char *modsecIsServerSignatureAvailale(void);
121 
122 #ifdef VERSION_IIS
123 void modsecStatusEngineCall(void);
124 void modsecReportRemoteLoadedRules(void);
125 #endif
126 
127 #ifdef __cplusplus
128 }
129 #endif
130