172 lines
3.9 KiB
C
172 lines
3.9 KiB
C
#if CONFIG_FOR_HTTPD_TEST
|
|
|
|
Alias /authany @DocumentRoot@
|
|
<Location /authany>
|
|
require user any-user
|
|
AuthType Basic
|
|
AuthName authany
|
|
<IfDefine !APACHE1>
|
|
<IfVersion >= 2.3>
|
|
AuthBasicProvider any
|
|
</IfVersion>
|
|
</IfDefine>
|
|
</Location>
|
|
|
|
#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);
|