blob: 73c48cc3b1966291c6d89c5b507ee769838505aa [file] [log] [blame]
Thierry FOURNIERed66c292013-11-28 11:05:19 +01001/*
2 * include/proto/pattern.h
3 * This file provides structures and types for pattern matching.
4 *
5 * Copyright (C) 2000-2013 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 _PROTO_PATTERN_H
23#define _PROTO_PATTERN_H
24
Willy Tarreau6f8fe312013-11-28 22:24:25 +010025#include <string.h>
26
Willy Tarreau4c7e4b72020-05-27 12:58:42 +020027#include <haproxy/api.h>
Willy Tarreau0cba6072013-11-28 22:21:02 +010028#include <types/pattern.h>
29
Willy Tarreaub4a163a2014-04-02 20:55:23 +020030/* pattern management function arrays */
31extern char *pat_match_names[PAT_MATCH_NUM];
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +020032extern int (*pat_parse_fcts[PAT_MATCH_NUM])(const char *, struct pattern *, int, char **);
Willy Tarreaub4a163a2014-04-02 20:55:23 +020033extern int (*pat_index_fcts[PAT_MATCH_NUM])(struct pattern_expr *, struct pattern *, char **);
34extern void (*pat_delete_fcts[PAT_MATCH_NUM])(struct pattern_expr *, struct pat_ref_elt *);
35extern void (*pat_prune_fcts[PAT_MATCH_NUM])(struct pattern_expr *);
36extern struct pattern *(*pat_match_fcts[PAT_MATCH_NUM])(struct sample *, struct pattern_expr *, int);
37extern int pat_match_types[PAT_MATCH_NUM];
38
Carl Henrik Lundef91ac192020-02-27 16:45:50 +010039int pattern_finalize_config(void);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010040
Willy Tarreau6f8fe312013-11-28 22:24:25 +010041/* return the PAT_MATCH_* index for match name "name", or < 0 if not found */
42static inline int pat_find_match_name(const char *name)
43{
44 int i;
45
46 for (i = 0; i < PAT_MATCH_NUM; i++)
47 if (strcmp(name, pat_match_names[i]) == 0)
48 return i;
49 return -1;
50}
51
Thierry FOURNIERed66c292013-11-28 11:05:19 +010052/* This function executes a pattern match on a sample. It applies pattern <expr>
Ilya Shipitsin77e3b4a2020-03-10 12:06:11 +050053 * to sample <smp>. The function returns NULL if the sample don't match. It returns
Thierry FOURNIER1794fdf2014-01-17 15:25:13 +010054 * non-null if the sample match. If <fill> is true and the sample match, the
55 * function returns the matched pattern. In many cases, this pattern can be a
56 * static buffer.
Thierry FOURNIERed66c292013-11-28 11:05:19 +010057 */
Thierry FOURNIER1e00d382014-02-11 11:31:40 +010058struct pattern *pattern_exec_match(struct pattern_head *head, struct sample *smp, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010059
60/*
61 *
Thierry FOURNIERb9b08462013-12-13 15:12:32 +010062 * The following function gets "pattern", duplicate it and index it in "expr"
63 *
64 */
65int pat_idx_list_val(struct pattern_expr *expr, struct pattern *pat, char **err);
66int pat_idx_list_ptr(struct pattern_expr *expr, struct pattern *pat, char **err);
67int pat_idx_list_str(struct pattern_expr *expr, struct pattern *pat, char **err);
68int pat_idx_list_reg(struct pattern_expr *expr, struct pattern *pat, char **err);
Thierry Fournier8feaa662016-02-10 22:55:20 +010069int pat_idx_list_regm(struct pattern_expr *expr, struct pattern *pat, char **err);
Thierry FOURNIERb9b08462013-12-13 15:12:32 +010070int pat_idx_tree_ip(struct pattern_expr *expr, struct pattern *pat, char **err);
71int pat_idx_tree_str(struct pattern_expr *expr, struct pattern *pat, char **err);
Willy Tarreaub1dd9bf2014-05-10 08:53:48 +020072int pat_idx_tree_pfx(struct pattern_expr *expr, struct pattern *pat, char **err);
Thierry FOURNIERb9b08462013-12-13 15:12:32 +010073
74/*
75 *
Thierry FOURNIERb1136502014-01-15 11:38:49 +010076 * The following functions search pattern <pattern> into the pattern
77 * expression <expr>. If the pattern is found, delete it. This function
78 * never fails.
79 *
80 */
Thierry FOURNIER7acca4b2014-01-28 16:43:36 +010081void pat_del_list_val(struct pattern_expr *expr, struct pat_ref_elt *ref);
82void pat_del_tree_ip(struct pattern_expr *expr, struct pat_ref_elt *ref);
83void pat_del_list_ptr(struct pattern_expr *expr, struct pat_ref_elt *ref);
84void pat_del_tree_str(struct pattern_expr *expr, struct pat_ref_elt *ref);
85void pat_del_list_reg(struct pattern_expr *expr, struct pat_ref_elt *ref);
Thierry FOURNIERb1136502014-01-15 11:38:49 +010086
87/*
88 *
Thierry FOURNIER6f7203d2014-01-14 16:24:51 +010089 * The following functions clean all entries of a pattern expression and
90 * reset the tree and list root.
91 *
92 */
93void pat_prune_val(struct pattern_expr *expr);
94void pat_prune_ptr(struct pattern_expr *expr);
95void pat_prune_reg(struct pattern_expr *expr);
96
97/*
98 *
Thierry FOURNIERed66c292013-11-28 11:05:19 +010099 * The following functions are general purpose pattern matching functions.
100 *
101 */
102
103
104/* ignore the current line */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200105int pat_parse_nothing(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100106
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100107/* Parse an integer. It is put both in min and max. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200108int pat_parse_int(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100109
110/* Parse an version. It is put both in min and max. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200111int pat_parse_dotted_ver(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100112
113/* Parse a range of integers delimited by either ':' or '-'. If only one
114 * integer is read, it is set as both min and max.
115 */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200116int pat_parse_range(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100117
118/* Parse a string. It is allocated and duplicated. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200119int pat_parse_str(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100120
121/* Parse a hexa binary definition. It is allocated and duplicated. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200122int pat_parse_bin(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100123
124/* Parse a regex. It is allocated. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200125int pat_parse_reg(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100126
127/* Parse an IP address and an optional mask in the form addr[/mask].
128 * The addr may either be an IPv4 address or a hostname. The mask
129 * may either be a dotted mask or a number of bits. Returns 1 if OK,
130 * otherwise 0.
131 */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200132int pat_parse_ip(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100133
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100134/* NB: For two strings to be identical, it is required that their lengths match */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100135struct pattern *pat_match_str(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100136
137/* NB: For two binary buffers to be identical, it is required that their lengths match */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100138struct pattern *pat_match_bin(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100139
140/* Checks that the length of the pattern in <test> is included between min and max */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100141struct pattern *pat_match_len(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100142
143/* Checks that the integer in <test> is included between min and max */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100144struct pattern *pat_match_int(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100145
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100146/* always return false */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100147struct pattern *pat_match_nothing(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100148
149/* Checks that the pattern matches the end of the tested string. */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100150struct pattern *pat_match_end(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100151
152/* Checks that the pattern matches the beginning of the tested string. */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100153struct pattern *pat_match_beg(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100154
155/* Checks that the pattern is included inside the tested string. */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100156struct pattern *pat_match_sub(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100157
158/* Checks that the pattern is included inside the tested string, but enclosed
159 * between slashes or at the beginning or end of the string. Slashes at the
160 * beginning or end of the pattern are ignored.
161 */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100162struct pattern *pat_match_dir(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100163
164/* Checks that the pattern is included inside the tested string, but enclosed
165 * between dots or at the beginning or end of the string. Dots at the beginning
166 * or end of the pattern are ignored.
167 */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100168struct pattern *pat_match_dom(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100169
170/* Check that the IPv4 address in <test> matches the IP/mask in pattern */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100171struct pattern *pat_match_ip(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100172
173/* Executes a regex. It temporarily changes the data to add a trailing zero,
174 * and restores the previous character when leaving.
175 */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100176struct pattern *pat_match_reg(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry Fournier8feaa662016-02-10 22:55:20 +0100177struct pattern *pat_match_regm(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100178
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100179/*
180 * pattern_ref manipulation.
181 */
182struct pat_ref *pat_ref_lookup(const char *reference);
Thierry FOURNIERaf5a29d2014-03-11 14:29:22 +0100183struct pat_ref *pat_ref_lookupid(int unique_id);
Thierry FOURNIER0d6ba512014-02-11 03:31:34 +0100184struct pat_ref *pat_ref_new(const char *reference, const char *display, unsigned int flags);
185struct pat_ref *pat_ref_newid(int unique_id, const char *display, unsigned int flags);
Baptiste Assmann953f74d2014-04-25 16:57:03 +0200186struct pat_ref_elt *pat_ref_find_elt(struct pat_ref *ref, const char *key);
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100187int pat_ref_append(struct pat_ref *ref, char *pattern, char *sample, int line);
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200188int pat_ref_add(struct pat_ref *ref, const char *pattern, const char *sample, char **err);
Thierry FOURNIER364cfdf2014-01-29 19:08:49 +0100189int pat_ref_set(struct pat_ref *ref, const char *pattern, const char *sample, char **err);
190int pat_ref_set_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt, const char *value, char **err);
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100191int pat_ref_delete(struct pat_ref *ref, const char *key);
Thierry FOURNIER7acca4b2014-01-28 16:43:36 +0100192int pat_ref_delete_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt);
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100193void pat_ref_prune(struct pat_ref *ref);
194int pat_ref_load(struct pat_ref *ref, struct pattern_expr *expr, int patflags, int soe, char **err);
Thierry FOURNIER46006bd2014-03-21 21:45:15 +0100195void pat_ref_reload(struct pat_ref *ref, struct pat_ref *replace);
196
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100197
198/*
199 * pattern_head manipulation.
200 */
201void pattern_init_head(struct pattern_head *head);
202void pattern_prune(struct pattern_head *head);
Thierry FOURNIER94580c92014-02-11 14:36:45 +0100203int pattern_read_from_file(struct pattern_head *head, unsigned int refflags, const char *filename, int patflags, int load_smp, char **err, const char *file, int line);
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100204
205/*
206 * pattern_expr manipulation.
207 */
Thierry FOURNIERa65b3432013-11-28 18:22:00 +0100208void pattern_init_expr(struct pattern_expr *expr);
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100209struct pattern_expr *pattern_lookup_expr(struct pattern_head *head, struct pat_ref *ref);
Thierry FOURNIER315ec422014-11-24 11:14:42 +0100210struct pattern_expr *pattern_new_expr(struct pattern_head *head, struct pat_ref *ref,
Emeric Brun7d27f3c2017-07-03 17:54:23 +0200211 int patflags, char **err, int *reuse);
Thierry FOURNIER12ba0c22015-08-14 00:02:11 +0200212struct sample_data **pattern_find_smp(struct pattern_expr *expr, struct pat_ref_elt *elt);
Thierry FOURNIER7acca4b2014-01-28 16:43:36 +0100213int pattern_delete(struct pattern_expr *expr, struct pat_ref_elt *ref);
Thierry FOURNIER01cdcd42013-12-10 15:08:01 +0100214
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100215
216#endif