1 /* Licensed to the Apache Software Foundation (ASF) under one or more
2 * contributor license agreements. See the NOTICE file distributed with
3 * this work for additional information regarding copyright ownership.
4 * The ASF licenses this file to You under the Apache License, Version 2.0
5 * (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 * _ __ ___ ___ __| | ___ ___| | mod_ssl
19 * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL
20 * | | | | | | (_) | (_| | \__ \__ \ |
21 * |_| |_| |_|\___/ \__,_|___|___/___/_|
24 * Expression Evaluation
31 /* _________________________________________________________________
33 ** Expression Evaluation
34 ** _________________________________________________________________
37 static BOOL ssl_expr_eval_comp(request_rec *, ssl_expr *);
38 static char *ssl_expr_eval_word(request_rec *, ssl_expr *);
39 static char *ssl_expr_eval_func_file(request_rec *, char *);
40 static int ssl_expr_eval_strcmplex(char *, char *);
42 BOOL ssl_expr_eval(request_rec *r, ssl_expr *node)
44 switch (node->node_op) {
52 ssl_expr *e = (ssl_expr *)node->node_arg1;
53 return (!ssl_expr_eval(r, e));
56 ssl_expr *e1 = (ssl_expr *)node->node_arg1;
57 ssl_expr *e2 = (ssl_expr *)node->node_arg2;
58 return (ssl_expr_eval(r, e1) || ssl_expr_eval(r, e2));
61 ssl_expr *e1 = (ssl_expr *)node->node_arg1;
62 ssl_expr *e2 = (ssl_expr *)node->node_arg2;
63 return (ssl_expr_eval(r, e1) && ssl_expr_eval(r, e2));
66 ssl_expr *e = (ssl_expr *)node->node_arg1;
67 return ssl_expr_eval_comp(r, e);
70 ssl_expr_error = "Internal evaluation error: Unknown expression node";
76 static BOOL ssl_expr_eval_comp(request_rec *r, ssl_expr *node)
78 switch (node->node_op) {
80 ssl_expr *e1 = (ssl_expr *)node->node_arg1;
81 ssl_expr *e2 = (ssl_expr *)node->node_arg2;
82 return (strcmp(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) == 0);
85 ssl_expr *e1 = (ssl_expr *)node->node_arg1;
86 ssl_expr *e2 = (ssl_expr *)node->node_arg2;
87 return (strcmp(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) != 0);
90 ssl_expr *e1 = (ssl_expr *)node->node_arg1;
91 ssl_expr *e2 = (ssl_expr *)node->node_arg2;
92 return (ssl_expr_eval_strcmplex(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) < 0);
95 ssl_expr *e1 = (ssl_expr *)node->node_arg1;
96 ssl_expr *e2 = (ssl_expr *)node->node_arg2;
97 return (ssl_expr_eval_strcmplex(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) <= 0);
100 ssl_expr *e1 = (ssl_expr *)node->node_arg1;
101 ssl_expr *e2 = (ssl_expr *)node->node_arg2;
102 return (ssl_expr_eval_strcmplex(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) > 0);
105 ssl_expr *e1 = (ssl_expr *)node->node_arg1;
106 ssl_expr *e2 = (ssl_expr *)node->node_arg2;
107 return (ssl_expr_eval_strcmplex(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) >= 0);
110 ssl_expr *e1 = (ssl_expr *)node->node_arg1;
111 ssl_expr *e2 = (ssl_expr *)node->node_arg2;
113 char *w1 = ssl_expr_eval_word(r, e1);
116 e3 = (ssl_expr *)e2->node_arg1;
117 e2 = (ssl_expr *)e2->node_arg2;
118 if (strcmp(w1, ssl_expr_eval_word(r, e3)) == 0) {
122 } while (e2 != NULL);
131 e1 = (ssl_expr *)node->node_arg1;
132 e2 = (ssl_expr *)node->node_arg2;
133 word = ssl_expr_eval_word(r, e1);
134 regex = (regex_t *)(e2->node_arg1);
135 return (ap_regexec(regex, word, 0, NULL, 0) == 0);
143 e1 = (ssl_expr *)node->node_arg1;
144 e2 = (ssl_expr *)node->node_arg2;
145 word = ssl_expr_eval_word(r, e1);
146 regex = (regex_t *)(e2->node_arg1);
147 return !(ap_regexec(regex, word, 0, NULL, 0) == 0);
150 ssl_expr_error = "Internal evaluation error: Unknown expression node";
156 static char *ssl_expr_eval_word(request_rec *r, ssl_expr *node)
158 switch (node->node_op) {
160 char *string = (char *)node->node_arg1;
164 char *string = (char *)node->node_arg1;
168 char *var = (char *)node->node_arg1;
169 char *val = ssl_var_lookup(r->pool, r->server, r->connection, r, var);
170 return (val == NULL ? "" : val);
173 char *name = (char *)node->node_arg1;
174 ssl_expr *args = (ssl_expr *)node->node_arg2;
175 if (strEQ(name, "file"))
176 return ssl_expr_eval_func_file(r, (char *)(args->node_arg1));
178 ssl_expr_error = "Internal evaluation error: Unknown function name";
183 ssl_expr_error = "Internal evaluation error: Unknown expression node";
189 static char *ssl_expr_eval_func_file(request_rec *r, char *filename)
197 if (apr_file_open(&fp, filename, APR_READ|APR_BUFFERED,
198 APR_OS_DEFAULT, r->pool) != APR_SUCCESS) {
199 ssl_expr_error = "Cannot open file";
202 apr_file_info_get(&finfo, APR_FINFO_SIZE, fp);
203 if ((finfo.size + 1) != ((apr_size_t)finfo.size + 1)) {
204 ssl_expr_error = "Huge file cannot be read";
208 len = (apr_size_t)finfo.size;
210 buf = (char *)apr_palloc(r->pool, sizeof(char) * 1);
214 if ((buf = (char *)apr_palloc(r->pool, sizeof(char)*(len+1))) == NULL) {
215 ssl_expr_error = "Cannot allocate memory";
220 apr_file_seek(fp, APR_SET, &offset);
221 if (apr_file_read(fp, buf, &len) != APR_SUCCESS) {
222 ssl_expr_error = "Cannot read from file";
232 /* a variant of strcmp(3) which works correctly also for number strings */
233 static int ssl_expr_eval_strcmplex(char *cpNum1, char *cpNum2)
247 for (i = 0; i < n1; i++) {
248 if (cpNum1[i] > cpNum2[i])
250 if (cpNum1[i] < cpNum2[i])