2 * Copyright (c) 2012, 2013, JANET(UK)
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of JANET(UK) nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
25 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
31 * OF THE POSSIBILITY OF SUCH DAMAGE.
40 #include <tr_filter.h>
43 int tr_filter_process_rp_permitted(TR_NAME *rp_realm,
44 TR_FILTER *rpp_filter,
45 TR_CONSTRAINT_SET *in_constraints,
46 TR_CONSTRAINT_SET **out_constraints,
51 *out_action = TR_FILTER_ACTION_REJECT;
52 *out_constraints = NULL;
54 /* If this isn't a valid rp_permitted filter, return no match. */
56 (TR_FILTER_TYPE_RP_PERMITTED != rpp_filter->type)) {
57 return TR_FILTER_NO_MATCH;
60 /* Check if there is a match for this filter. */
61 for (i = 0; i < TR_MAX_FILTER_LINES; i++) {
62 for (j = 0; j < TR_MAX_FILTER_SPECS; j++) {
64 if ((rpp_filter->lines[i]) &&
65 (rpp_filter->lines[i]->specs[j]) &&
66 (tr_fspec_matches(rpp_filter->lines[i]->specs[j], rp_realm))) {
67 *out_action = rpp_filter->lines[i]->action;
68 *out_constraints = in_constraints;
69 if (rpp_filter->lines[i]->realm_cons)
70 tr_constraint_add_to_set(out_constraints,
71 rpp_filter->lines[i]->realm_cons);
72 if (rpp_filter->lines[i]->domain_cons)
73 tr_constraint_add_to_set(out_constraints,
74 rpp_filter->lines[i]->domain_cons);
76 return TR_FILTER_MATCH;
80 /* If there is no match, indicate that. */
81 return TR_FILTER_NO_MATCH;
84 void tr_fspec_free(TR_FSPEC *fspec)
89 static int tr_fspec_destructor(void *obj)
91 TR_FSPEC *fspec = talloc_get_type_abort(obj, TR_FSPEC);
93 if (fspec->field != NULL)
94 tr_free_name(fspec->field);
95 if (fspec->match != NULL)
96 tr_free_name(fspec->match);
100 TR_FSPEC *tr_fspec_new(TALLOC_CTX *mem_ctx)
102 TR_FSPEC *fspec = talloc(mem_ctx, TR_FSPEC);
107 talloc_set_destructor((void *) fspec, tr_fspec_destructor);
112 void tr_fspec_set_match(TR_FSPEC *fspec, TR_NAME *match)
114 if (fspec->match != NULL)
115 tr_free_name(fspec->match);
116 fspec->match = match;
119 /* returns 1 if the spec matches */
120 int tr_fspec_matches(TR_FSPEC *fspec, TR_NAME *name)
122 return ((fspec->match != NULL) &&
123 (0 != tr_prefix_wildcard_match(name->buf, fspec->match->buf)));
126 void tr_fline_free(TR_FLINE *fline)
131 TR_FLINE *tr_fline_new(TALLOC_CTX *mem_ctx)
133 TR_FLINE *fl = talloc(mem_ctx, TR_FLINE);
137 fl->action = TR_FILTER_ACTION_UNKNOWN;
138 fl->realm_cons = NULL;
139 fl->domain_cons = NULL;
140 for (ii = 0; ii < TR_MAX_FILTER_SPECS; ii++)
141 fl->specs[ii] = NULL;
146 TR_FILTER *tr_filter_new(TALLOC_CTX *mem_ctx)
148 TR_FILTER *f = talloc(mem_ctx, TR_FILTER);
152 f->type = TR_FILTER_TYPE_UNKNOWN;
153 for (ii = 0; ii < TR_MAX_FILTER_LINES; ii++)
159 void tr_filter_free(TR_FILTER *filt)
164 void tr_filter_set_type(TR_FILTER *filt, TR_FILTER_TYPE type)
169 TR_FILTER_TYPE tr_filter_get_type(TR_FILTER *filt)