]> granicus.if.org Git - apache/blob - modules/aaa/mod_authz_default.c
Avoid calling access control hooks for internal requests with
[apache] / modules / aaa / mod_authz_default.c
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
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 #include "apr_strings.h"
18 #include "apr_md5.h"            /* for apr_password_validate */
19
20 #include "ap_config.h"
21 #include "httpd.h"
22 #include "http_config.h"
23 #include "http_core.h"
24 #include "http_log.h"
25 #include "http_protocol.h"
26 #include "http_request.h"
27
28 #include "mod_auth.h"
29
30
31 typedef struct {
32     int authoritative;
33 } authz_default_config_rec;
34
35 static void *create_authz_default_dir_config(apr_pool_t *p, char *d)
36 {
37     authz_default_config_rec *conf = apr_palloc(p, sizeof(*conf));
38
39     conf->authoritative = 1; /* keep the fortress secure by default */
40     return conf;
41 }
42
43 static const command_rec authz_default_cmds[] =
44 {
45     AP_INIT_FLAG("AuthzDefaultAuthoritative", ap_set_flag_slot,
46                  (void *)APR_OFFSETOF(authz_default_config_rec, authoritative),
47                  OR_AUTHCFG,
48                  "Set to 'Off' to allow access control to be passed along to "
49                  "lower modules. (default is On.)"),
50     {NULL}
51 };
52
53 module AP_MODULE_DECLARE_DATA authz_default_module;
54
55 static int check_user_access(request_rec *r)
56 {
57     authz_default_config_rec *conf = ap_get_module_config(r->per_dir_config,
58                                                  &authz_default_module);
59     const char *note = apr_table_get(r->notes, AUTHZ_ACCESS_PASSED_NOTE);
60
61     /* If we got here and access checker passed, assume access is OK */
62     if (note && (note[0] == 'Y') && (ap_satisfies(r) == SATISFY_ANY)) {
63         return OK;
64     }
65
66     /* If we got here and there isn't any authz required, assume access is OK */
67     if (!ap_some_auth_required(r)) {
68         return OK;
69     }
70
71     if (!(conf->authoritative)) {
72         return DECLINED;
73     }
74
75     /* if we aren't authoritative, any require directive could be
76      * considered valid even if noone groked it.  However, if we are
77      * authoritative, we can warn the user they did something wrong.
78      *
79      * That something could be a missing "AuthAuthoritative off", but
80      * more likely is a typo in the require directive.
81      */
82     ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
83                           "access to %s failed, reason: require directives "
84                           "present and no Authoritative handler.", r->uri);
85
86     ap_note_auth_failure(r);
87     return HTTP_UNAUTHORIZED;
88 }
89
90 static void register_hooks(apr_pool_t *p)
91 {
92     ap_hook_check_authz(check_user_access, NULL, NULL, APR_HOOK_LAST,
93                         AP_AUTH_INTERNAL_PER_CONF);
94 }
95
96 module AP_MODULE_DECLARE_DATA authz_default_module =
97 {
98     STANDARD20_MODULE_STUFF,
99     create_authz_default_dir_config, /* dir config creater */
100     NULL,                            /* dir merger --- default is to override */
101     NULL,                            /* server config */
102     NULL,                            /* merge server config */
103     authz_default_cmds,              /* command apr_table_t */
104     register_hooks                   /* register hooks */
105 };