]> granicus.if.org Git - apache/blob - modules/aaa/mod_authz_default.c
Fix handling of authz configurations, make default authz logic replicate
[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
60     /* If we got here and there isn't any authz required, assume access is OK */
61     if (!ap_some_auth_required(r)) {
62         return OK;
63     }
64
65     if (!(conf->authoritative)) {
66         return DECLINED;
67     }
68
69     /* if we aren't authoritative, any require directive could be
70      * considered valid even if noone groked it.  However, if we are
71      * authoritative, we can warn the user they did something wrong.
72      *
73      * That something could be a missing "AuthAuthoritative off", but
74      * more likely is a typo in the require directive.
75      */
76     ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
77                           "access to %s failed, reason: require directives "
78                           "present and no Authoritative handler.", r->uri);
79
80     ap_note_auth_failure(r);
81     return HTTP_UNAUTHORIZED;
82 }
83
84 static void register_hooks(apr_pool_t *p)
85 {
86     ap_hook_check_authz(check_user_access, NULL, NULL, APR_HOOK_LAST,
87                         AP_AUTH_INTERNAL_PER_CONF);
88 }
89
90 module AP_MODULE_DECLARE_DATA authz_default_module =
91 {
92     STANDARD20_MODULE_STUFF,
93     create_authz_default_dir_config, /* dir config creater */
94     NULL,                            /* dir merger --- default is to override */
95     NULL,                            /* server config */
96     NULL,                            /* merge server config */
97     authz_default_cmds,              /* command apr_table_t */
98     register_hooks                   /* register hooks */
99 };