Imported Upstream version 2.5.11
[libapache-mod-security.git] / apache2 / api / mod_var_remote_addr_port.c
1
2 #include "httpd.h"
3 #include "http_core.h"
4 #include "http_config.h"
5 #include "http_log.h"
6 #include "http_protocol.h"
7 #include "ap_config.h"
8 #include "apr_optional.h"
9
10 #include "re.h"
11
12 /* -- Generic generators/validators from re_variables.c -- */
13
14 /**
15  * Generates a variable from a string and a length.
16  */
17 static int var_simple_generate_ex(msre_var *var, apr_table_t *vartab, apr_pool_t *mptmp,
18     const char *value, int value_len)
19 {
20     msre_var *rvar = NULL;
21
22     if (value == NULL) return 0;
23
24     rvar = apr_pmemdup(mptmp, var, sizeof(msre_var));
25     rvar->value = value;
26     rvar->value_len = value_len;
27     apr_table_addn(vartab, rvar->name, (void *)rvar);
28
29     return 1;
30 }
31
32 /**
33  * Generates a variable from a NULL-terminated string.
34  */
35 static int var_simple_generate(msre_var *var, apr_table_t *vartab, apr_pool_t *mptmp,
36     const char *value)
37 {
38     if (value == NULL) return 0;
39     return var_simple_generate_ex(var, vartab, mptmp, value, strlen(value));
40 }
41
42
43 /* -- Module specific code -- */
44
45 /**
46  * Create a silly variable with value = a.b.c.d:port
47  */
48 static int var_remote_addr_port_generate(modsec_rec *msr, msre_var *var, msre_rule *rule,
49     apr_table_t *vartab, apr_pool_t *mptmp)
50 {
51     const char *value = apr_psprintf(mptmp, "%s:%d", msr->remote_addr, msr->remote_port);
52
53     return var_simple_generate(var, vartab, mptmp, value);
54 }
55
56 static int hook_pre_config(apr_pool_t *mp, apr_pool_t *mp_log, apr_pool_t *mp_temp) {
57     void (*register_fn)(const char *name, unsigned int type,
58                         unsigned int argc_min, unsigned int argc_max,
59                         void *fn_validate, void *fn_generate,
60                         unsigned int is_cacheable, unsigned int availability);
61
62     /* Look for the registration function
63      * exported by ModSecurity.
64      */
65     register_fn = APR_RETRIEVE_OPTIONAL_FN(modsec_register_variable);
66     if (register_fn) {
67         /* Use it to register our new
68          * variable under the
69          * name "REMOTE_ADDR_PORT".
70          */
71         register_fn(
72             "REMOTE_ADDR_PORT",
73             VAR_SIMPLE,
74             0, 0,
75             NULL,
76             var_remote_addr_port_generate,
77             VAR_DONT_CACHE,
78             PHASE_REQUEST_HEADERS
79         );
80     }
81
82     return OK;
83 }
84
85 static void register_hooks(apr_pool_t *p) {
86     ap_hook_pre_config(hook_pre_config, NULL, NULL, APR_HOOK_LAST);
87 }
88
89 /* Dispatch list for API hooks */
90 module AP_MODULE_DECLARE_DATA var_remote_addr_port_module = {
91     STANDARD20_MODULE_STUFF, 
92     NULL,                  /* create per-dir    config structures */
93     NULL,                  /* merge  per-dir    config structures */
94     NULL,                  /* create per-server config structures */
95     NULL,                  /* merge  per-server config structures */
96     NULL,                  /* table of config file commands       */
97     register_hooks         /* register hooks                      */
98 };
99