#if CONFIG_FOR_HTTPD_TEST Alias /authany @DocumentRoot@ require user any-user AuthType Basic AuthName authany = 2.3> AuthBasicProvider any #endif #include "ap_mmn.h" /* do not accept empty "" strings */ #define strtrue(s) (s && *s) #if AP_MODULE_MAGIC_AT_LEAST(20060110, 0) #include "ap_provider.h" #include "mod_auth.h" static authn_status authn_check_password(request_rec *r, const char *user, const char *password) { return strtrue(r->user) && strcmp(r->user, "guest") == 0 ? AUTH_GRANTED : AUTH_DENIED; } static const authn_provider authn_any_provider = { &authn_check_password }; static authz_status any_check_authorization(request_rec *r, const char *requirement, const void *dummy) { #if AP_MODULE_MAGIC_AT_LEAST(20100714,0) if (!r->user) return AUTHZ_DENIED_NO_USER; #endif return strtrue(r->user) && strcmp(requirement, "any-user") == 0 ? AUTHZ_GRANTED : AUTHZ_DENIED; } static const authz_provider authz_any_provider = { &any_check_authorization }; static void extra_hooks(apr_pool_t *p) { ap_register_provider(p, AUTHN_PROVIDER_GROUP, "any", "0", &authn_any_provider); ap_register_provider(p, AUTHZ_PROVIDER_GROUP, "user", "0", &authz_any_provider); } #define APACHE_HTTPD_TEST_EXTRA_HOOKS extra_hooks #include "apache_httpd_test.h" #else /* < 2.3 */ #ifdef APACHE2 #include "apr_pools.h" static void extra_hooks(apr_pool_t *); #define APACHE_HTTPD_TEST_EXTRA_HOOKS extra_hooks #else #define APACHE_HTTPD_TEST_HOOK_ORDER APR_HOOK_FIRST #define APACHE_HTTPD_TEST_CHECK_USER_ID authany_handler #define APACHE_HTTPD_TEST_AUTH_CHECKER require_any_user #endif #include "apache_httpd_test.h" static int require_any_user(request_rec *r) { const apr_array_header_t *requires = ap_requires(r); require_line *rq; int x; if (!requires) { return DECLINED; } rq = (require_line *) requires->elts; for (x = 0; x < requires->nelts; x++) { const char *line, *requirement; line = rq[x].requirement; requirement = ap_getword(r->pool, &line, ' '); if ((strcmp(requirement, "user") == 0) && (strcmp(line, "any-user") == 0)) { return OK; } } return DECLINED; } static int authany_handler(request_rec *r) { const char *sent_pw; int rc = ap_get_basic_auth_pw(r, &sent_pw); char *user; if (rc != OK) { return rc; } if (require_any_user(r) != OK) { return DECLINED; } #ifdef APACHE1 user = r->connection->user; #endif #ifdef APACHE2 user = r->user; #endif if (!(strtrue(user) && strtrue(sent_pw))) { ap_note_basic_auth_failure(r); #ifdef APACHE1 ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r, "Both a username and password must be provided"); #endif #ifdef APACHE2 ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r, "Both a username and password must be provided"); #endif return HTTP_UNAUTHORIZED; } return OK; } #ifdef APACHE2 static void extra_hooks(apr_pool_t *p) { /* mod_authany and mod_ssl both specify APR_HOOK_FIRST as the * ordering of their check-user-id hooks. * mod_ssl's must run before mod_authany because it may need to * generate the Basic auth information based on the certificate. */ static const char * const modssl_runs_before[] = {"mod_ssl.c", NULL}; ap_hook_check_user_id(authany_handler, modssl_runs_before, NULL, APR_HOOK_FIRST); ap_hook_auth_checker(require_any_user, NULL, NULL, APR_HOOK_FIRST); } #endif #endif APACHE_HTTPD_TEST_MODULE(authany);