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 
19 #include "ap_config.h"
20 #include "ap_provider.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 typedef struct {
31         int dummy;  /* just here to stop compiler warnings for now. */
32 } authz_user_config_rec;
33 
create_authz_user_dir_config(apr_pool_t * p,char * d)34 static void *create_authz_user_dir_config(apr_pool_t *p, char *d)
35 {
36     authz_user_config_rec *conf = apr_palloc(p, sizeof(*conf));
37 
38     return conf;
39 }
40 
41 static const command_rec authz_user_cmds[] =
42 {
43     {NULL}
44 };
45 
46 module AP_MODULE_DECLARE_DATA authz_user_module;
47 
user_check_authorization(request_rec * r,const char * require_args,const void * parsed_require_args)48 static authz_status user_check_authorization(request_rec *r,
49                                              const char *require_args,
50                                              const void *parsed_require_args)
51 {
52     const char *err = NULL;
53     const ap_expr_info_t *expr = parsed_require_args;
54     const char *require;
55 
56     const char *t, *w;
57 
58     if (!r->user) {
59         return AUTHZ_DENIED_NO_USER;
60     }
61 
62     require = ap_expr_str_exec(r, expr, &err);
63     if (err) {
64         ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(02594)
65                       "authz_user authorize: require user: Can't "
66                       "evaluate require expression: %s", err);
67         return AUTHZ_DENIED;
68     }
69 
70     t = require;
71     while ((w = ap_getword_conf(r->pool, &t)) && w[0]) {
72         if (!strcmp(r->user, w)) {
73             return AUTHZ_GRANTED;
74         }
75     }
76 
77     ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01663)
78                   "access to %s failed, reason: user '%s' does not meet "
79                   "'require'ments for user to be allowed access",
80                   r->uri, r->user);
81 
82     return AUTHZ_DENIED;
83 }
84 
validuser_check_authorization(request_rec * r,const char * require_line,const void * parsed_require_line)85 static authz_status validuser_check_authorization(request_rec *r,
86                                                   const char *require_line,
87                                                   const void *parsed_require_line)
88 {
89     if (!r->user) {
90         return AUTHZ_DENIED_NO_USER;
91     }
92 
93     return AUTHZ_GRANTED;
94 }
95 
user_parse_config(cmd_parms * cmd,const char * require_line,const void ** parsed_require_line)96 static const char *user_parse_config(cmd_parms *cmd, const char *require_line,
97                                      const void **parsed_require_line)
98 {
99     const char *expr_err = NULL;
100     ap_expr_info_t *expr;
101 
102     expr = ap_expr_parse_cmd(cmd, require_line, AP_EXPR_FLAG_STRING_RESULT,
103             &expr_err, NULL);
104 
105     if (expr_err)
106         return apr_pstrcat(cmd->temp_pool,
107                            "Cannot parse expression in require line: ",
108                            expr_err, NULL);
109 
110     *parsed_require_line = expr;
111 
112     return NULL;
113 }
114 
115 static const authz_provider authz_user_provider =
116 {
117     &user_check_authorization,
118     &user_parse_config,
119 };
120 static const authz_provider authz_validuser_provider =
121 {
122     &validuser_check_authorization,
123     NULL,
124 };
125 
register_hooks(apr_pool_t * p)126 static void register_hooks(apr_pool_t *p)
127 {
128     ap_register_auth_provider(p, AUTHZ_PROVIDER_GROUP, "user",
129                               AUTHZ_PROVIDER_VERSION,
130                               &authz_user_provider, AP_AUTH_INTERNAL_PER_CONF);
131     ap_register_auth_provider(p, AUTHZ_PROVIDER_GROUP, "valid-user",
132                               AUTHZ_PROVIDER_VERSION,
133                               &authz_validuser_provider,
134                               AP_AUTH_INTERNAL_PER_CONF);
135 }
136 
137 AP_DECLARE_MODULE(authz_user) =
138 {
139     STANDARD20_MODULE_STUFF,
140     create_authz_user_dir_config, /* dir config creater */
141     NULL,                         /* dir merger --- default is to override */
142     NULL,                         /* server config */
143     NULL,                         /* merge server config */
144     authz_user_cmds,              /* command apr_table_t */
145     register_hooks                /* register hooks */
146 };
147