1 /*
2  * include/types/pattern.h
3  * This file provides structures and types for ACLs.
4  *
5  * Copyright (C) 2000-2012 Willy Tarreau - w@1wt.eu
6  *
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_PATTERN_H
23 #define _TYPES_PATTERN_H
24 
25 #include <common/compat.h>
26 #include <common/config.h>
27 #include <common/mini-clist.h>
28 #include <common/regex.h>
29 
30 #include <types/sample.h>
31 
32 #include <ebmbtree.h>
33 
34 /* Pattern matching function result.
35  *
36  * We're using a 3-state matching system to match samples against patterns in
37  * ACLs :
38  *   - PASS : at least one pattern already matches
39  *   - MISS : some data is missing to decide if some rules may finally match.
40  *   - FAIL : no mattern may ever match
41  *
42  * We assign values 0, 1 and 3 to FAIL, MISS and PASS respectively, so that we
43  * can make use of standard arithmetics for the truth tables below :
44  *
45  *      x  | !x          x&y | F(0) | M(1) | P(3)     x|y | F(0) | M(1) | P(3)
46  *   ------+-----       -----+------+------+-----    -----+------+------+-----
47  *    F(0) | P(3)        F(0)| F(0) | F(0) | F(0)     F(0)| F(0) | M(1) | P(3)
48  *    M(1) | M(1)        M(1)| F(0) | M(1) | M(1)     M(1)| M(1) | M(1) | P(3)
49  *    P(3) | F(0)        P(3)| F(0) | M(1) | P(3)     P(3)| P(3) | P(3) | P(3)
50  *
51  *  neg(x) = (3 >> x)       and(x,y) = (x & y)           or(x,y) = (x | y)
52  *
53  * For efficiency, the ACL return flags are directly mapped from the pattern
54  * match flags. A pattern can't return "MISS" since it's always presented an
55  * existing sample. So that leaves us with only two possible values :
56  *      MATCH   = 0
57  *      NOMATCH = 3
58  */
59 enum pat_match_res {
60 	PAT_NOMATCH = 0,         /* sample didn't match any pattern */
61 	PAT_MATCH = 3,           /* sample matched at least one pattern */
62 };
63 
64 /* possible flags for patterns matching or parsing */
65 enum {
66 	PAT_MF_IGNORE_CASE = 1 << 0,       /* ignore case */
67 	PAT_MF_NO_DNS      = 1 << 1,       /* dont perform any DNS requests */
68 };
69 
70 /* possible flags for patterns storage */
71 enum {
72 	PAT_SF_TREE        = 1 << 0,       /* some patterns are arranged in a tree */
73 };
74 
75 /* ACL match methods */
76 enum {
77 	PAT_MATCH_FOUND, /* just ensure that fetch found the sample */
78 	PAT_MATCH_BOOL,  /* match fetch's integer value as boolean */
79 	PAT_MATCH_INT,   /* unsigned integer (int) */
80 	PAT_MATCH_IP,    /* IPv4/IPv6 address (IP) */
81 	PAT_MATCH_BIN,   /* hex string (bin) */
82 	PAT_MATCH_LEN,   /* string length (str -> int) */
83 	PAT_MATCH_STR,   /* exact string match (str) */
84 	PAT_MATCH_BEG,   /* beginning of string (str) */
85 	PAT_MATCH_SUB,   /* substring (str) */
86 	PAT_MATCH_DIR,   /* directory-like sub-string (str) */
87 	PAT_MATCH_DOM,   /* domain-like sub-string (str) */
88 	PAT_MATCH_END,   /* end of string (str) */
89 	PAT_MATCH_REG,   /* regex (str -> reg) */
90 	PAT_MATCH_REGM,  /* regex (str -> reg) with match zones */
91 	/* keep this one last */
92 	PAT_MATCH_NUM
93 };
94 
95 #define PAT_REF_MAP 0x1 /* Set if the reference is used by at least one map. */
96 #define PAT_REF_ACL 0x2 /* Set if the reference is used by at least one acl. */
97 #define PAT_REF_SMP 0x4 /* Flag used if the reference contains a sample. */
98 
99 /* This struct contain a list of reference strings for dunamically
100  * updatable patterns.
101  */
102 struct pat_ref {
103 	struct list list; /* Used to chain refs. */
104 	unsigned int flags; /* flags PAT_REF_*. */
105 	char *reference; /* The reference name. */
106 	int unique_id; /* Each pattern reference have unique id. */
107 	char *display; /* String displayed to identify the pattern origin. */
108 	struct list head; /* The head of the list of struct pat_ref_elt. */
109 	struct list pat; /* The head of the list of struct pattern_expr. */
110 	__decl_hathreads(HA_SPINLOCK_T lock); /* Lock used to protect pat ref elements */
111 };
112 
113 /* This is a part of struct pat_ref. Each entry contain one
114  * pattern and one associated value as original string.
115  */
116 struct pat_ref_elt {
117 	struct list list; /* Used to chain elements. */
118 	struct list back_refs; /* list of users tracking this pat ref */
119 	char *pattern;
120 	char *sample;
121 	int line;
122 };
123 
124 /* How to store a time range and the valid days in 29 bits */
125 struct pat_time {
126 	int dow:7;              /* 1 bit per day of week: 0-6 */
127 	int h1:5, m1:6;         /* 0..24:0..60. Use 0:0 for all day. */
128 	int h2:5, m2:6;         /* 0..24:0..60. Use 24:0 for all day. */
129 };
130 
131 /* This contain each tree indexed entry. This struct permit to associate
132  * "sample" with a tree entry. It is used with maps.
133  */
134 struct pattern_tree {
135 	struct sample_data *data;
136 	struct pat_ref_elt *ref;
137 	struct ebmb_node node;
138 };
139 
140 /* This describes one ACL pattern, which might be a single value or a tree of
141  * values. All patterns for a single ACL expression are linked together. Some
142  * of them might have a type (eg: IP). Right now, the types are shared with
143  * the samples, though it is possible that in the future this will change to
144  * accommodate for other types (eg: meth, regex). Unsigned and constant types
145  * are preferred when there is a doubt.
146  */
147 struct pattern {
148 	int type;                               /* type of the ACL pattern (SMP_T_*) */
149 	union {
150 		int i;                          /* integer value */
151 		struct {
152 			signed long long min, max;
153 			int min_set :1;
154 			int max_set :1;
155 		} range; /* integer range */
156 		struct {
157 			struct in_addr addr;
158 			struct in_addr mask;
159 		} ipv4;                         /* IPv4 address */
160 		struct {
161 			struct in6_addr addr;
162 			unsigned char mask;     /* number of bits */
163 		} ipv6;                         /* IPv6 address/mask */
164 		struct pat_time time;           /* valid hours and days */
165 		struct eb_root *tree;           /* tree storing all values if any */
166 	} val;                                  /* direct value */
167 	union {
168 		void *ptr;              /* any data */
169 		char *str;              /* any string  */
170 		struct my_regex *reg;   /* a compiled regex */
171 	} ptr;                          /* indirect values, allocated */
172 	int len;                        /* data length when required  */
173 	int sflags;                     /* flags relative to the storage method. */
174 	struct sample_data *data;       /* used to store a pointer to sample value associated
175 	                                   with the match. It is used with maps */
176 	struct pat_ref_elt *ref;
177 };
178 
179 /* This struct is just used for chaining patterns */
180 struct pattern_list {
181 	struct list list;
182 	struct pattern pat;
183 };
184 
185 /* Description of a pattern expression.
186  * It contains pointers to the parse and match functions, and a list or tree of
187  * patterns to test against. The structure is organized so that the hot parts
188  * are grouped together in order to optimize caching.
189  */
190 struct pattern_expr {
191 	struct list list; /* Used for chaining pattern_expr in pat_ref. */
192 	unsigned long long revision; /* updated for each update */
193 	struct pat_ref *ref; /* The pattern reference if exists. */
194 	struct pattern_head *pat_head; /* Point to the pattern_head that contain manipulation functions.
195 	                                * Note that this link point on compatible head but not on the real
196 	                                * head. You can use only the function, and you must not use the
197 	                                * "head". Dont write "(struct pattern_expr *)any->pat_head->expr".
198 	                                */
199 	struct list patterns;         /* list of acl_patterns */
200 	struct eb_root pattern_tree;  /* may be used for lookup in large datasets */
201 	struct eb_root pattern_tree_2;  /* may be used for different types */
202 	int mflags;                     /* flags relative to the parsing or matching method. */
203 	__decl_hathreads(HA_RWLOCK_T lock);               /* lock used to protect patterns */
204 };
205 
206 /* This is a list of expression. A struct pattern_expr can be used by
207  * more than one "struct pattern_head". this intermediate struct
208  * permit more than one list.
209  */
210 struct pattern_expr_list {
211 	struct list list; /* Used for chaining pattern_expr in pattern_head. */
212 	int do_free;
213 	struct pattern_expr *expr; /* The used expr. */
214 };
215 
216 /* This struct contain a list of pattern expr */
217 struct pattern_head {
218 	int (*parse)(const char *text, struct pattern *pattern, int flags, char **err);
219 	int (*parse_smp)(const char *text, struct sample_data *data);
220 	int (*index)(struct pattern_expr *, struct pattern *, char **);
221 	void (*delete)(struct pattern_expr *, struct pat_ref_elt *);
222 	void (*prune)(struct pattern_expr *);
223 	struct pattern *(*match)(struct sample *, struct pattern_expr *, int);
224 	int expect_type; /* type of the expected sample (SMP_T_*) */
225 
226 	struct list head; /* This is a list of struct pattern_expr_list. */
227 };
228 
229 /* This is the root of the list of all pattern_ref avalaibles. */
230 extern struct list pattern_reference;
231 
232 #endif /* _TYPES_PATTERN_H */
233