]> granicus.if.org Git - apache/blob - modules/aaa/mod_authn_default.c
46c78cd79aad4f83e5a09e5c8b924f67e801ef8e
[apache] / modules / aaa / mod_authn_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 #define APR_WANT_STRFUNC
19 #include "apr_want.h"
20
21 #include "ap_config.h"
22 #include "httpd.h"
23 #include "http_config.h"
24 #include "http_core.h"
25 #include "http_log.h"
26 #include "http_protocol.h"
27 #include "http_request.h"
28
29 typedef struct {
30     int authoritative;
31 } authn_default_config_rec;
32
33 static void *create_authn_default_dir_config(apr_pool_t *p, char *d)
34 {
35     authn_default_config_rec *conf = apr_palloc(p, sizeof(*conf));
36
37     conf->authoritative = 1; /* keep the fortress secure by default */
38     return conf;
39 }
40
41 static const command_rec authn_default_cmds[] =
42 {
43     AP_INIT_FLAG("AuthDefaultAuthoritative", ap_set_flag_slot,
44                  (void *)APR_OFFSETOF(authn_default_config_rec,
45                                       authoritative),
46                  OR_AUTHCFG,
47                  "Set to 'Off' to allow access control to be passed along to "
48                  "lower modules if the UserID is not known to this module. "
49                          "(default is On)."),
50     {NULL}
51 };
52
53 module AP_MODULE_DECLARE_DATA authn_default_module;
54
55 static int authenticate_no_user(request_rec *r)
56 {
57     authn_default_config_rec *conf = ap_get_module_config(r->per_dir_config,
58                                                       &authn_default_module);
59
60     const char *type;
61
62     /* if there isn't an auth_type, then assume that no authentication
63         is require so return OK */
64     if (!(type = ap_auth_type(r))) {
65         return OK;
66     }
67
68     /* fill in the r->user field */
69     if (!strcasecmp(type, "Basic")) {
70         const char *sent_pw;
71         int res;
72
73         if ((res = ap_get_basic_auth_pw(r, &sent_pw)) != OK) {
74             return res;
75         }
76     }
77
78     if (conf->authoritative == 0) {
79         return DECLINED;
80     }
81
82     ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
83                   "access to %s failed, reason: verification of user id '%s' "
84                   "not configured",
85                   r->uri, r->user ? r->user : "<null>");
86
87     ap_note_auth_failure(r);
88     return HTTP_UNAUTHORIZED;
89 }
90
91 static void register_hooks(apr_pool_t *p)
92 {
93     ap_hook_check_user_id(authenticate_no_user,NULL,NULL,APR_HOOK_LAST);
94 }
95
96 module AP_MODULE_DECLARE_DATA authn_default_module =
97 {
98     STANDARD20_MODULE_STUFF,
99     create_authn_default_dir_config,/* dir config creater */
100     NULL,                           /* dir merger --- default is to override */
101     NULL,                           /* server config */
102     NULL,                           /* merge server config */
103     authn_default_cmds,             /* command apr_table_t */
104     register_hooks                  /* register hooks */
105 };