blob: ddd59cec0e794d232a0897ab0e7413acf7314eb4 [file] [log] [blame]
Willy Tarreaua84d3742007-05-07 00:36:48 +02001/*
2 include/types/acl.h
3 This file provides structures and types for ACLs.
4
Willy Tarreau11382812008-07-09 16:18:21 +02005 Copyright (C) 2000-2008 Willy Tarreau - w@1wt.eu
Willy Tarreaua84d3742007-05-07 00:36:48 +02006
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation, version 2.1
10 exclusively.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General Public
18 License along with this library; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20*/
21
22#ifndef _TYPES_ACL_H
23#define _TYPES_ACL_H
24
25#include <common/compat.h>
26#include <common/config.h>
27#include <common/mini-clist.h>
28
29#include <types/proxy.h>
30#include <types/session.h>
31
32
Willy Tarreau11382812008-07-09 16:18:21 +020033/* Pattern matching function result.
34 *
35 * We're using a 3-state matching system :
36 * - PASS : at least one pattern already matches
37 * - MISS : some data is missing to decide if some rules may finally match.
38 * - FAIL : no mattern may ever match
39 *
40 * We assign values 0, 1 and 3 to FAIL, MISS and PASS respectively, so that we
41 * can make use of standard arithmetics for the truth tables below :
42 *
43 * x | !x x&y | F(0) | M(1) | P(3) x|y | F(0) | M(1) | P(3)
44 * ------+----- -----+------+------+----- -----+------+------+-----
45 * F(0) | P(3) F(0)| F(0) | F(0) | F(0) F(0)| F(0) | M(1) | P(3)
46 * M(1) | M(1) M(1)| F(0) | M(1) | M(1) M(1)| M(1) | M(1) | P(3)
47 * P(3) | F(0) P(3)| F(0) | M(1) | P(3) P(3)| P(3) | P(3) | P(3)
48 *
49 * neg(x) = (3 >> x) and(x,y) = (x & y) or(x,y) = (x | y)
50 *
51 */
52
Willy Tarreaua84d3742007-05-07 00:36:48 +020053enum {
54 ACL_PAT_FAIL = 0, /* test failed */
Willy Tarreau11382812008-07-09 16:18:21 +020055 ACL_PAT_MISS = 1, /* test may pass with more info */
56 ACL_PAT_PASS = 3, /* test passed */
Willy Tarreaua84d3742007-05-07 00:36:48 +020057};
58
59/* Condition polarity. It makes it easier for any option to choose between
60 * IF/UNLESS if it can store that information within the condition itself.
Willy Tarreau11382812008-07-09 16:18:21 +020061 * Those should be interpreted as "IF/UNLESS result == PASS".
Willy Tarreaua84d3742007-05-07 00:36:48 +020062 */
63enum {
64 ACL_COND_NONE, /* no polarity set yet */
65 ACL_COND_IF, /* positive condition (after 'if') */
66 ACL_COND_UNLESS, /* negative condition (after 'unless') */
67};
68
69/* possible flags for intermediate test values. The flags are maintained
70 * across consecutive fetches for a same entry (eg: parse all req lines).
71 */
72enum {
73 ACL_TEST_F_READ_ONLY = 1 << 0, /* test data are read-only */
74 ACL_TEST_F_MUST_FREE = 1 << 1, /* test data must be freed after end of evaluation */
75 ACL_TEST_F_VOL_TEST = 1 << 2, /* result must not survive longer than the test (eg: time) */
76 ACL_TEST_F_VOL_HDR = 1 << 3, /* result sensitive to changes in headers */
77 ACL_TEST_F_VOL_1ST = 1 << 4, /* result sensitive to changes in first line (eg: URI) */
78 ACL_TEST_F_VOL_TXN = 1 << 5, /* result sensitive to new transaction (eg: persist) */
79 ACL_TEST_F_VOL_SESS = 1 << 6, /* result sensitive to new session (eg: IP) */
80 ACL_TEST_F_VOLATILE = (1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6),
Willy Tarreaub6866442008-07-14 23:54:42 +020081 ACL_TEST_F_FETCH_MORE = 1 << 7, /* if test does not match, retry with next entry (for multi-match) */
82 ACL_TEST_F_MAY_CHANGE = 1 << 8, /* if test does not match, retry later (eg: request size) */
Willy Tarreaua79534f2008-07-20 10:13:37 +020083 ACL_TEST_F_RES_SET = 1 << 9, /* for fetch() function to assign the result without calling match() */
84 ACL_TEST_F_RES_PASS = 1 << 10,/* with SET_RESULT, sets result to PASS (defaults to FAIL) */
85 ACL_TEST_F_SET_RES_PASS = (ACL_TEST_F_RES_SET|ACL_TEST_F_RES_PASS), /* sets result to PASS */
86 ACL_TEST_F_SET_RES_FAIL = (ACL_TEST_F_RES_SET), /* sets result to FAIL */
Willy Tarreaua84d3742007-05-07 00:36:48 +020087};
88
Willy Tarreaub6866442008-07-14 23:54:42 +020089/* ACLs can be evaluated on requests and on responses, and on partial or complete data */
Willy Tarreaud41f8d82007-06-10 10:06:18 +020090enum {
91 ACL_DIR_REQ = 0, /* ACL evaluated on request */
Willy Tarreaub6866442008-07-14 23:54:42 +020092 ACL_DIR_RTR = (1 << 0), /* ACL evaluated on response */
93 ACL_DIR_MASK = (ACL_DIR_REQ | ACL_DIR_RTR),
94 ACL_PARTIAL = (1 << 1), /* partial data, return MISS if data are missing */
Willy Tarreaud41f8d82007-06-10 10:06:18 +020095};
96
Willy Tarreauc8d7c962007-06-17 08:20:33 +020097/* possible flags for expressions or patterns */
98enum {
99 ACL_PAT_F_IGNORE_CASE = 1 << 0, /* ignore case */
100 ACL_PAT_F_FROM_FILE = 1 << 1, /* pattern comes from a file */
101};
102
Willy Tarreaua84d3742007-05-07 00:36:48 +0200103/* How to store a time range and the valid days in 29 bits */
104struct acl_time {
105 int dow:7; /* 1 bit per day of week: 0-6 */
106 int h1:5, m1:6; /* 0..24:0..60. Use 0:0 for all day. */
107 int h2:5, m2:6; /* 0..24:0..60. Use 24:0 for all day. */
108};
109
110/* The acl will be linked to from the proxy where it is declared */
111struct acl_pattern {
112 struct list list; /* chaining */
113 union {
114 int i; /* integer value */
Willy Tarreauae8b7962007-06-09 23:10:04 +0200115 struct {
116 signed long long min, max;
117 int min_set :1;
118 int max_set :1;
119 } range; /* integer range */
Willy Tarreaua67fad92007-05-08 19:50:09 +0200120 struct {
121 struct in_addr addr;
122 struct in_addr mask;
123 } ipv4; /* IPv4 address */
Willy Tarreaua84d3742007-05-07 00:36:48 +0200124 struct acl_time time; /* valid hours and days */
125 } val; /* direct value */
126 union {
127 void *ptr; /* any data */
128 char *str; /* any string */
129 regex_t *reg; /* a compiled regex */
130 } ptr; /* indirect values, allocated */
Krzysztof Piotr Oledzki8001d612008-05-31 13:53:23 +0200131 void(*freeptrbuf)(void *ptr); /* a destructor able to free objects from the ptr */
Willy Tarreaua84d3742007-05-07 00:36:48 +0200132 int len; /* data length when required */
Willy Tarreauc8d7c962007-06-17 08:20:33 +0200133 int flags; /* expr or pattern flags. */
Willy Tarreaua84d3742007-05-07 00:36:48 +0200134};
135
136/* The structure exchanged between an acl_fetch_* function responsible for
137 * retrieving a value, and an acl_match_* function responsible for testing it.
138 */
139struct acl_test {
Willy Tarreau33a7e692007-06-10 19:45:56 +0200140 int i; /* integer value */
141 char *ptr; /* pointer to beginning of value */
142 int len; /* length of value at ptr, otherwise ignored */
143 int flags; /* ACL_TEST_F_* set to 0 on first call */
144 union { /* fetch_* functions context for any purpose */
145 void *p; /* any pointer */
146 int i; /* any integer */
147 long long ll; /* any long long or smaller */
148 double d; /* any float or double */
149 void *a[8]; /* any array of up to 8 pointers */
Willy Tarreaua84d3742007-05-07 00:36:48 +0200150 } ctx;
151};
152
153
154/*
155 * ACL keyword: Associates keywords with parsers, methods to retrieve the value and testers.
156 */
157
158/* some dummy declarations to silent the compiler */
159struct proxy;
160struct session;
161
Willy Tarreauae8b7962007-06-09 23:10:04 +0200162/*
163 * NOTE:
164 * The 'parse' function is called to parse words in the configuration. It must
165 * return the number of valid words read. 0 = error. The 'opaque' argument may
166 * be used by functions which need to maintain a context between consecutive
167 * values. It is initialized to zero before the first call, and passed along
168 * successive calls.
169 */
170
Willy Tarreau97be1452007-06-10 11:47:14 +0200171struct acl_expr;
Willy Tarreaua84d3742007-05-07 00:36:48 +0200172struct acl_keyword {
173 const char *kw;
Willy Tarreauae8b7962007-06-09 23:10:04 +0200174 int (*parse)(const char **text, struct acl_pattern *pattern, int *opaque);
Willy Tarreau97be1452007-06-10 11:47:14 +0200175 int (*fetch)(struct proxy *px, struct session *l4, void *l7, int dir,
176 struct acl_expr *expr, struct acl_test *test);
Willy Tarreaua84d3742007-05-07 00:36:48 +0200177 int (*match)(struct acl_test *test, struct acl_pattern *pattern);
178 int use_cnt;
179};
180
181/*
182 * A keyword list. It is a NULL-terminated array of keywords. It embeds a
183 * struct list in order to be linked to other lists, allowing it to easily
184 * be declared where it is needed, and linked without duplicating data nor
185 * allocating memory.
186 */
187struct acl_kw_list {
188 struct list list;
189 struct acl_keyword kw[VAR_ARRAY];
190};
191
192/*
193 * Description of an ACL expression.
194 * It contains a subject and a set of patterns to test against it.
195 * - the function get() is called to retrieve the subject from the
196 * current session or transaction and build a test.
197 * - the function test() is called to evaluate the test based on the
198 * available patterns and return ACL_PAT_*
199 * Both of those functions are available through the keyword.
200 */
201struct acl_expr {
202 struct list list; /* chaining */
203 struct acl_keyword *kw; /* back-reference to the keyword */
204 union { /* optional argument of the subject (eg: header or cookie name) */
205 char *str;
206 } arg;
Willy Tarreaubb768912007-06-10 11:17:01 +0200207 int arg_len; /* optional argument length */
Willy Tarreaua84d3742007-05-07 00:36:48 +0200208 struct list patterns; /* list of acl_patterns */
209};
210
211struct acl {
212 struct list list; /* chaining */
213 char *name; /* acl name */
214 struct list expr; /* list of acl_exprs */
215 int cache_idx; /* ACL index in cache */
216};
217
218/* the condition will be linked to from an action in a proxy */
219struct acl_term {
220 struct list list; /* chaining */
221 struct acl *acl; /* acl pointed to by this term */
222 int neg; /* 1 if the ACL result must be negated */
223};
224
225struct acl_term_suite {
226 struct list list; /* chaining of term suites */
227 struct list terms; /* list of acl_terms */
228};
229
230struct acl_cond {
231 struct list list; /* Some specific tests may use multiple conditions */
232 struct list suites; /* list of acl_term_suites */
233 int pol; /* polarity: ACL_COND_IF / ACL_COND_UNLESS */
234};
235
236
237#endif /* _TYPES_ACL_H */
238
239/*
240 * Local variables:
241 * c-indent-level: 8
242 * c-basic-offset: 8
243 * End:
244 */