From 20efd38d4cfbb55b4c2ddf3bd0bde63b4bd858cb Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@unknown> Date: Thu, 3 Oct 2002 05:35:21 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create tag 'APACHE_2_0_43'. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/tags/2.0.43@97072 13f79535-47bb-0310-9956-ffa450edef68 --- Apache.dsw | 261 +------------ CHANGES | 6 - Makefile.win | 60 +-- NWGNUmakefile | 4 +- acinclude.m4 | 2 - apachenw.mcp.zip | Bin 198962 -> 146507 bytes build/mkconfNW.awk | 13 +- build/nw_export.inc | 2 - configure.in | 2 - docs/conf/httpd-std.conf.in | 3 - docs/conf/httpd-win.conf | 3 - docs/manual/mod/mod_auth_basic.html.en | 62 --- docs/manual/mod/mod_auth_basic.html.ja.jis | 65 ---- docs/manual/mod/mod_auth_basic.xml | 82 ---- docs/manual/mod/mod_auth_basic.xml.ja | 86 ----- docs/manual/mod/mod_authn_dbm.html.en | 82 ---- docs/manual/mod/mod_authn_dbm.xml | 104 ----- docs/manual/mod/mod_authn_file.html.en | 71 ---- docs/manual/mod/mod_authn_file.html.ja.jis | 79 ---- docs/manual/mod/mod_authn_file.xml | 87 ----- docs/manual/mod/mod_authn_file.xml.ja | 94 ----- docs/manual/mod/mod_authz_dbm.html.en | 126 ------- docs/manual/mod/mod_authz_dbm.xml | 151 -------- docs/manual/mod/mod_authz_groupfile.html.en | 81 ---- docs/manual/mod/mod_authz_groupfile.xml | 103 ----- include/ap_provider.h | 88 ----- include/ap_release.h | 2 +- libhttpd.dsp | 4 - modules/aaa/{NWGNUauthnano => NWGNUauthanon} | 10 +- modules/aaa/NWGNUauthbasc | 250 ------------ modules/aaa/{NWGNUauthndbm => NWGNUauthdbm} | 10 +- modules/aaa/NWGNUauthndef | 250 ------------ modules/aaa/NWGNUauthnfil | 250 ------------ modules/aaa/NWGNUauthzdbm | 250 ------------ modules/aaa/NWGNUauthzdef | 250 ------------ modules/aaa/NWGNUauthzgrp | 250 ------------ modules/aaa/NWGNUauthzusr | 250 ------------ modules/aaa/{NWGNUauthdigt => NWGNUdigest} | 6 +- modules/aaa/NWGNUmakefile | 13 +- modules/aaa/config.m4 | 42 +-- .../aaa/{mod_authz_host.c => mod_access.c} | 171 ++++----- .../aaa/{mod_authn_dbm.dsp => mod_access.dsp} | 56 +-- modules/aaa/mod_access.exp | 1 + modules/aaa/mod_auth.c | 356 ++++++++++++++++++ .../aaa/{mod_authn_file.dsp => mod_auth.dsp} | 56 +-- modules/aaa/mod_auth.exp | 1 + modules/aaa/mod_auth.h | 111 ------ .../aaa/{mod_authn_anon.c => mod_auth_anon.c} | 132 ++++--- .../{mod_authz_dbm.dsp => mod_auth_anon.dsp} | 56 +-- modules/aaa/mod_auth_anon.exp | 1 + modules/aaa/mod_auth_basic.c | 340 ----------------- modules/aaa/mod_auth_basic.dsp | 128 ------- .../aaa/{mod_authz_dbm.c => mod_auth_dbm.c} | 263 +++++++------ .../{mod_authz_host.dsp => mod_auth_dbm.dsp} | 56 +-- modules/aaa/mod_auth_dbm.exp | 1 + modules/aaa/mod_auth_digest.c | 274 +++++++++----- modules/aaa/mod_authn_anon.dsp | 128 ------- modules/aaa/mod_authn_dbm.c | 206 ---------- modules/aaa/mod_authn_default.c | 148 -------- modules/aaa/mod_authn_default.dsp | 128 ------- modules/aaa/mod_authn_file.c | 234 ------------ modules/aaa/mod_authz_default.c | 171 --------- modules/aaa/mod_authz_default.dsp | 128 ------- modules/aaa/mod_authz_groupfile.c | 277 -------------- modules/aaa/mod_authz_groupfile.dsp | 128 ------- modules/aaa/mod_authz_user.c | 198 ---------- modules/aaa/mod_authz_user.dsp | 128 ------- modules/arch/netware/mod_auth_anon.def | 1 + modules/arch/netware/mod_auth_basic.def | 1 - modules/arch/netware/mod_auth_dbm.def | 1 + modules/arch/netware/mod_authn_anon.def | 1 - modules/arch/netware/mod_authn_dbm.def | 2 - modules/arch/netware/mod_authn_default.def | 1 - modules/arch/netware/mod_authn_file.def | 3 - modules/arch/netware/mod_authz_dbm.def | 1 - modules/arch/netware/mod_authz_default.def | 1 - modules/arch/netware/mod_authz_groupfile.def | 2 - modules/arch/netware/mod_authz_user.def | 1 - modules/dav/main/providers.c | 26 +- modules/loggers/config.m4 | 2 - modules/loggers/mod_logio.c | 226 ----------- os/netware/modules.c | 9 +- os/win32/BaseAddr.ref | 14 +- server/Makefile.in | 7 +- server/provider.c | 117 ------ support/dbmmanage | 350 ----------------- support/log_server_status | 114 ------ support/logresolve.pl | 261 ------------- support/phf_abuse_log.cgi | 22 -- support/split-logfile | 98 ----- 90 files changed, 1054 insertions(+), 7638 deletions(-) delete mode 100644 docs/manual/mod/mod_auth_basic.html.en delete mode 100644 docs/manual/mod/mod_auth_basic.html.ja.jis delete mode 100644 docs/manual/mod/mod_auth_basic.xml delete mode 100644 docs/manual/mod/mod_auth_basic.xml.ja delete mode 100644 docs/manual/mod/mod_authn_dbm.html.en delete mode 100644 docs/manual/mod/mod_authn_dbm.xml delete mode 100644 docs/manual/mod/mod_authn_file.html.en delete mode 100644 docs/manual/mod/mod_authn_file.html.ja.jis delete mode 100644 docs/manual/mod/mod_authn_file.xml delete mode 100644 docs/manual/mod/mod_authn_file.xml.ja delete mode 100644 docs/manual/mod/mod_authz_dbm.html.en delete mode 100644 docs/manual/mod/mod_authz_dbm.xml delete mode 100644 docs/manual/mod/mod_authz_groupfile.html.en delete mode 100644 docs/manual/mod/mod_authz_groupfile.xml delete mode 100644 include/ap_provider.h rename modules/aaa/{NWGNUauthnano => NWGNUauthanon} (96%) delete mode 100644 modules/aaa/NWGNUauthbasc rename modules/aaa/{NWGNUauthndbm => NWGNUauthdbm} (97%) delete mode 100644 modules/aaa/NWGNUauthndef delete mode 100644 modules/aaa/NWGNUauthnfil delete mode 100644 modules/aaa/NWGNUauthzdbm delete mode 100644 modules/aaa/NWGNUauthzdef delete mode 100644 modules/aaa/NWGNUauthzgrp delete mode 100644 modules/aaa/NWGNUauthzusr rename modules/aaa/{NWGNUauthdigt => NWGNUdigest} (97%) rename modules/aaa/{mod_authz_host.c => mod_access.c} (70%) rename modules/aaa/{mod_authn_dbm.dsp => mod_access.dsp} (58%) create mode 100644 modules/aaa/mod_access.exp create mode 100644 modules/aaa/mod_auth.c rename modules/aaa/{mod_authn_file.dsp => mod_auth.dsp} (58%) create mode 100644 modules/aaa/mod_auth.exp delete mode 100644 modules/aaa/mod_auth.h rename modules/aaa/{mod_authn_anon.c => mod_auth_anon.c} (68%) rename modules/aaa/{mod_authz_dbm.dsp => mod_auth_anon.dsp} (60%) create mode 100644 modules/aaa/mod_auth_anon.exp delete mode 100644 modules/aaa/mod_auth_basic.c delete mode 100644 modules/aaa/mod_auth_basic.dsp rename modules/aaa/{mod_authz_dbm.c => mod_auth_dbm.c} (54%) rename modules/aaa/{mod_authz_host.dsp => mod_auth_dbm.dsp} (59%) create mode 100644 modules/aaa/mod_auth_dbm.exp delete mode 100644 modules/aaa/mod_authn_anon.dsp delete mode 100644 modules/aaa/mod_authn_dbm.c delete mode 100644 modules/aaa/mod_authn_default.c delete mode 100644 modules/aaa/mod_authn_default.dsp delete mode 100644 modules/aaa/mod_authn_file.c delete mode 100644 modules/aaa/mod_authz_default.c delete mode 100644 modules/aaa/mod_authz_default.dsp delete mode 100644 modules/aaa/mod_authz_groupfile.c delete mode 100644 modules/aaa/mod_authz_groupfile.dsp delete mode 100644 modules/aaa/mod_authz_user.c delete mode 100644 modules/aaa/mod_authz_user.dsp create mode 100644 modules/arch/netware/mod_auth_anon.def delete mode 100644 modules/arch/netware/mod_auth_basic.def create mode 100644 modules/arch/netware/mod_auth_dbm.def delete mode 100644 modules/arch/netware/mod_authn_anon.def delete mode 100644 modules/arch/netware/mod_authn_dbm.def delete mode 100644 modules/arch/netware/mod_authn_default.def delete mode 100644 modules/arch/netware/mod_authn_file.def delete mode 100644 modules/arch/netware/mod_authz_dbm.def delete mode 100644 modules/arch/netware/mod_authz_default.def delete mode 100644 modules/arch/netware/mod_authz_groupfile.def delete mode 100644 modules/arch/netware/mod_authz_user.def delete mode 100644 modules/loggers/mod_logio.c delete mode 100644 server/provider.c delete mode 100644 support/dbmmanage delete mode 100644 support/log_server_status delete mode 100644 support/logresolve.pl delete mode 100644 support/phf_abuse_log.cgi delete mode 100644 support/split-logfile diff --git a/Apache.dsw b/Apache.dsw index 593239be4ae..16c9cd021fd 100644 --- a/Apache.dsw +++ b/Apache.dsw @@ -57,6 +57,9 @@ Package=<4> Project_Dep_Name ApacheMonitor End Project Dependency Begin Project Dependency + Project_Dep_Name mod_access + End Project Dependency + Begin Project Dependency Project_Dep_Name mod_actions End Project Dependency Begin Project Dependency @@ -66,34 +69,16 @@ Package=<4> Project_Dep_Name mod_asis End Project Dependency Begin Project Dependency - Project_Dep_Name mod_auth_digest - End Project Dependency - Begin Project Dependency - Project_Dep_Name mod_authn_anon - End Project Dependency - Begin Project Dependency - Project_Dep_Name mod_authn_dbm - End Project Dependency - Begin Project Dependency - Project_Dep_Name mod_authn_default - End Project Dependency - Begin Project Dependency - Project_Dep_Name mod_authn_file - End Project Dependency - Begin Project Dependency - Project_Dep_Name mod_authz_dbm - End Project Dependency - Begin Project Dependency - Project_Dep_Name mod_authz_default + Project_Dep_Name mod_auth End Project Dependency Begin Project Dependency - Project_Dep_Name mod_authz_groupfile + Project_Dep_Name mod_auth_anon End Project Dependency Begin Project Dependency - Project_Dep_Name mod_authz_host + Project_Dep_Name mod_auth_dbm End Project Dependency Begin Project Dependency - Project_Dep_Name mod_authz_user + Project_Dep_Name mod_auth_digest End Project Dependency Begin Project Dependency Project_Dep_Name mod_autoindex @@ -105,9 +90,6 @@ Package=<4> Project_Dep_Name mod_cgi End Project Dependency Begin Project Dependency - Project_Dep_Name mod_charset_lite - End Project Dependency - Begin Project Dependency Project_Dep_Name mod_dav_fs End Project Dependency Begin Project Dependency @@ -279,18 +261,6 @@ Package=<4> ############################################################################### -Project: "apriconv"=".\srclib\apr-iconv\apriconv.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - Project: "aprutil"=".\srclib\apr-util\aprutil.dsp" - Package Owner=<4> Package=<5> @@ -299,9 +269,6 @@ Package=<5> Package=<4> {{{ - Begin Project Dependency - Project_Dep_Name apriconv - End Project Dependency Begin Project Dependency Project_Dep_Name gen_uri_delims End Project Dependency @@ -417,21 +384,6 @@ Package=<4> ############################################################################### -Project: "libapriconv"=".\srclib\apr-iconv\libapriconv.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libapr - End Project Dependency -}}} - -############################################################################### - Project: "libaprutil"=".\srclib\apr-util\libaprutil.dsp" - Package Owner=<4> Package=<5> @@ -444,9 +396,6 @@ Package=<4> Project_Dep_Name libapr End Project Dependency Begin Project Dependency - Project_Dep_Name libapriconv - End Project Dependency - Begin Project Dependency Project_Dep_Name gen_uri_delims End Project Dependency Begin Project Dependency @@ -468,9 +417,6 @@ Package=<4> Project_Dep_Name libapr End Project Dependency Begin Project Dependency - Project_Dep_Name libapriconv - End Project Dependency - Begin Project Dependency Project_Dep_Name libaprutil End Project Dependency Begin Project Dependency @@ -501,7 +447,7 @@ Package=<4> ############################################################################### -Project: "mod_actions"=".\modules\mappers\mod_actions.dsp" - Package Owner=<4> +Project: "mod_access"=".\modules\aaa\mod_access.dsp" - Package Owner=<4> Package=<5> {{{ @@ -522,142 +468,7 @@ Package=<4> ############################################################################### -Project: "mod_alias"=".\modules\mappers\mod_alias.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libapr - End Project Dependency - Begin Project Dependency - Project_Dep_Name libaprutil - End Project Dependency - Begin Project Dependency - Project_Dep_Name libhttpd - End Project Dependency -}}} - -############################################################################### - -Project: "mod_asis"=".\modules\generators\mod_asis.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libapr - End Project Dependency - Begin Project Dependency - Project_Dep_Name libaprutil - End Project Dependency - Begin Project Dependency - Project_Dep_Name libhttpd - End Project Dependency -}}} - -############################################################################### - -Project: "mod_auth_basic"=".\modules\aaa\mod_auth_basic.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libapr - End Project Dependency - Begin Project Dependency - Project_Dep_Name libaprutil - End Project Dependency - Begin Project Dependency - Project_Dep_Name libhttpd - End Project Dependency -}}} - -############################################################################### - -Project: "mod_auth_digest"=".\modules\aaa\mod_auth_digest.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libapr - End Project Dependency - Begin Project Dependency - Project_Dep_Name libaprutil - End Project Dependency - Begin Project Dependency - Project_Dep_Name libhttpd - End Project Dependency - Begin Project Dependency - Project_Dep_Name mod_auth_basic - End Project Dependency -}}} - -############################################################################### - -Project: "mod_authn_anon"=".\modules\aaa\mod_authn_anon.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libapr - End Project Dependency - Begin Project Dependency - Project_Dep_Name libaprutil - End Project Dependency - Begin Project Dependency - Project_Dep_Name libhttpd - End Project Dependency - Begin Project Dependency - Project_Dep_Name mod_auth_basic - End Project Dependency -}}} - -############################################################################### - -Project: "mod_authn_dbm"=".\modules\aaa\mod_authn_dbm.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libapr - End Project Dependency - Begin Project Dependency - Project_Dep_Name libaprutil - End Project Dependency - Begin Project Dependency - Project_Dep_Name libhttpd - End Project Dependency - Begin Project Dependency - Project_Dep_Name mod_auth_basic - End Project Dependency -}}} - -############################################################################### - -Project: "mod_authn_default"=".\modules\aaa\mod_authn_default.dsp" - Package Owner=<4> +Project: "mod_actions"=".\modules\mappers\mod_actions.dsp" - Package Owner=<4> Package=<5> {{{ @@ -674,14 +485,11 @@ Package=<4> Begin Project Dependency Project_Dep_Name libhttpd End Project Dependency - Begin Project Dependency - Project_Dep_Name mod_auth_basic - End Project Dependency }}} ############################################################################### -Project: "mod_authn_file"=".\modules\aaa\mod_authn_file.dsp" - Package Owner=<4> +Project: "mod_alias"=".\modules\mappers\mod_alias.dsp" - Package Owner=<4> Package=<5> {{{ @@ -698,14 +506,11 @@ Package=<4> Begin Project Dependency Project_Dep_Name libhttpd End Project Dependency - Begin Project Dependency - Project_Dep_Name mod_auth_basic - End Project Dependency }}} ############################################################################### -Project: "mod_authz_dbm"=".\modules\aaa\mod_authz_dbm.dsp" - Package Owner=<4> +Project: "mod_asis"=".\modules\generators\mod_asis.dsp" - Package Owner=<4> Package=<5> {{{ @@ -722,14 +527,11 @@ Package=<4> Begin Project Dependency Project_Dep_Name libhttpd End Project Dependency - Begin Project Dependency - Project_Dep_Name mod_auth_basic - End Project Dependency }}} ############################################################################### -Project: "mod_authz_default"=".\modules\aaa\mod_authz_default.dsp" - Package Owner=<4> +Project: "mod_auth"=".\modules\aaa\mod_auth.dsp" - Package Owner=<4> Package=<5> {{{ @@ -746,14 +548,11 @@ Package=<4> Begin Project Dependency Project_Dep_Name libhttpd End Project Dependency - Begin Project Dependency - Project_Dep_Name mod_auth_basic - End Project Dependency }}} ############################################################################### -Project: "mod_authz_groupfile"=".\modules\aaa\mod_authz_groupfile.dsp" - Package Owner=<4> +Project: "mod_auth_anon"=".\modules\aaa\mod_auth_anon.dsp" - Package Owner=<4> Package=<5> {{{ @@ -770,14 +569,11 @@ Package=<4> Begin Project Dependency Project_Dep_Name libhttpd End Project Dependency - Begin Project Dependency - Project_Dep_Name mod_auth_basic - End Project Dependency }}} ############################################################################### -Project: "mod_authz_host"=".\modules\aaa\mod_authz_host.dsp" - Package Owner=<4> +Project: "mod_auth_dbm"=".\modules\aaa\mod_auth_dbm.dsp" - Package Owner=<4> Package=<5> {{{ @@ -794,14 +590,11 @@ Package=<4> Begin Project Dependency Project_Dep_Name libhttpd End Project Dependency - Begin Project Dependency - Project_Dep_Name mod_auth_basic - End Project Dependency }}} ############################################################################### -Project: "mod_authz_user"=".\modules\aaa\mod_authz_user.dsp" - Package Owner=<4> +Project: "mod_auth_digest"=".\modules\aaa\mod_auth_digest.dsp" - Package Owner=<4> Package=<5> {{{ @@ -818,9 +611,6 @@ Package=<4> Begin Project Dependency Project_Dep_Name libhttpd End Project Dependency - Begin Project Dependency - Project_Dep_Name mod_auth_basic - End Project Dependency }}} ############################################################################### @@ -909,27 +699,6 @@ Package=<4> ############################################################################### -Project: "mod_charset_lite"=".\modules\experimental\mod_charset_lite.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name libapr - End Project Dependency - Begin Project Dependency - Project_Dep_Name libaprutil - End Project Dependency - Begin Project Dependency - Project_Dep_Name libhttpd - End Project Dependency -}}} - -############################################################################### - Project: "mod_dav"=".\modules\dav\main\mod_dav.dsp" - Package Owner=<4> Package=<5> diff --git a/CHANGES b/CHANGES index 5577012a1cc..ebaf48c267c 100644 --- a/CHANGES +++ b/CHANGES @@ -52,15 +52,9 @@ Changes with Apache 2.0.43 properly for virtual hosts that override server-wide mod_cache setttings. [Matthieu Estrade ] - *) Add ap_register_provider/ap_lookup_provider API. - [John K. Sterling , Justin Erenkrantz] - *) Add -p option to apxs to allow programs to be compiled with apxs. [Justin Erenkrantz] - *) Rewrite of aaa modules to an authn/authz model. - [Dirk-Willem van Gulik, Justin Erenkrantz] - Changes with Apache 2.0.42 *) mod_dav: Check for versioning hooks before using them. diff --git a/Makefile.win b/Makefile.win index 00633710b40..b98dc8f2589 100644 --- a/Makefile.win +++ b/Makefile.win @@ -31,12 +31,13 @@ default: _apacher CTARGET=/build !ENDIF -!IF !EXIST("srclib\apr") || !EXIST("srclib\apr-util") || !EXIST("srclib\apr-iconv") +!IF !EXIST("srclib\apr") || !EXIST("srclib\apr-util") +## || !EXIST("srclib\apr-iconv") !MESSAGE Please check out or download and unpack the Apache Portability Runtime -!MESSAGE sources (apr, apr-iconv and apr-util) into your $(INSTDIR)\srclib dir. +!MESSAGE sources (apr and apr-util) into your $(INSTDIR)\srclib dir. !MESSAGE Apache cannot build without these libraries! !MESSAGE -!ERROR Need $(INSTDIR)\srclib\ apr, apr-iconv and apr-util +!ERROR Need $(INSTDIR)\srclib\ apr and apr-util !ENDIF # Note; _tryssl: is only used by the msvc developer studio environment to 'fix up' @@ -174,10 +175,6 @@ _build: $(MAKE) $(MAKEOPT) -f apr.mak CFG="apr - Win32 $(LONG)" RECURSE=0 $(CTARGET) $(MAKE) $(MAKEOPT) -f libapr.mak CFG="libapr - Win32 $(LONG)" RECURSE=0 $(CTARGET) cd ..\.. - cd srclib\apr-iconv - $(MAKE) $(MAKEOPT) -f apriconv.mak CFG="apriconv - Win32 $(LONG)" RECURSE=0 $(CTARGET) - $(MAKE) $(MAKEOPT) -f libapriconv.mak CFG="libapriconv - Win32 $(LONG)" RECURSE=0 $(CTARGET) - cd ..\.. cd srclib\apr-util\uri $(MAKE) $(MAKEOPT) -f gen_uri_delims.mak CFG="gen_uri_delims - Win32 $(LONG)" RECURSE=0 $(CTARGET) cd ..\..\.. @@ -198,17 +195,11 @@ _build: $(MAKE) $(MAKEOPT) -f libhttpd.mak CFG="libhttpd - Win32 $(LONG)" RECURSE=0 $(CTARGET) $(MAKE) $(MAKEOPT) -f Apache.mak CFG="Apache - Win32 $(LONG)" RECURSE=0 $(CTARGET) cd modules\aaa - $(MAKE) $(MAKEOPT) -f mod_auth_basic.mak CFG="mod_auth_basic - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_access.mak CFG="mod_access - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_auth.mak CFG="mod_auth - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_auth_anon.mak CFG="mod_auth_anon - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_auth_dbm.mak CFG="mod_auth_dbm - Win32 $(LONG)" RECURSE=0 $(CTARGET) $(MAKE) $(MAKEOPT) -f mod_auth_digest.mak CFG="mod_auth_digest - Win32 $(LONG)" RECURSE=0 $(CTARGET) - $(MAKE) $(MAKEOPT) -f mod_authn_anon.mak CFG="mod_authn_anon - Win32 $(LONG)" RECURSE=0 $(CTARGET) - $(MAKE) $(MAKEOPT) -f mod_authn_dbm.mak CFG="mod_authn_dbm - Win32 $(LONG)" RECURSE=0 $(CTARGET) - $(MAKE) $(MAKEOPT) -f mod_authn_default.mak CFG="mod_authn_default - Win32 $(LONG)" RECURSE=0 $(CTARGET) - $(MAKE) $(MAKEOPT) -f mod_authn_file.mak CFG="mod_authn_file - Win32 $(LONG)" RECURSE=0 $(CTARGET) - $(MAKE) $(MAKEOPT) -f mod_authz_dbm.mak CFG="mod_authz_dbm - Win32 $(LONG)" RECURSE=0 $(CTARGET) - $(MAKE) $(MAKEOPT) -f mod_authz_default.mak CFG="mod_authz_default - Win32 $(LONG)" RECURSE=0 $(CTARGET) - $(MAKE) $(MAKEOPT) -f mod_authz_groupfile.mak CFG="mod_authz_groupfile - Win32 $(LONG)" RECURSE=0 $(CTARGET) - $(MAKE) $(MAKEOPT) -f mod_authz_host.mak CFG="mod_authz_host - Win32 $(LONG)" RECURSE=0 $(CTARGET) - $(MAKE) $(MAKEOPT) -f mod_authz_user.mak CFG="mod_authz_user - Win32 $(LONG)" RECURSE=0 $(CTARGET) cd ..\.. cd modules\arch\win32 $(MAKE) $(MAKEOPT) -f mod_isapi.mak CFG="mod_isapi - Win32 $(LONG)" RECURSE=0 $(CTARGET) @@ -224,7 +215,6 @@ _build: cd ..\..\.. cd modules\experimental $(MAKE) $(MAKEOPT) -f mod_cache.mak CFG="mod_cache - Win32 $(LONG)" RECURSE=0 $(CTARGET) - $(MAKE) $(MAKEOPT) -f mod_charset_lite.mak CFG="mod_charset_lite - Win32 $(LONG)" RECURSE=0 $(CTARGET) $(MAKE) $(MAKEOPT) -f mod_mem_cache.mak CFG="mod_mem_cache - Win32 $(LONG)" RECURSE=0 $(CTARGET) $(MAKE) $(MAKEOPT) -f mod_disk_cache.mak CFG="mod_disk_cache - Win32 $(LONG)" RECURSE=0 $(CTARGET) $(MAKE) $(MAKEOPT) -f mod_ext_filter.mak CFG="mod_ext_filter - Win32 $(LONG)" RECURSE=0 $(CTARGET) @@ -363,25 +353,17 @@ _install: copy $(LONG)\Apache.exe "$(INSTDIR)\bin" <.y copy $(LONG)\libhttpd.dll "$(INSTDIR)\bin" <.y copy srclib\apr\$(LONG)\libapr.dll "$(INSTDIR)\bin" <.y - copy srclib\apr-iconv\$(LONG)\libapriconv.dll "$(INSTDIR)\bin" <.y copy srclib\apr-util\$(LONG)\libaprutil.dll "$(INSTDIR)\bin" <.y - copy modules\aaa\$(LONG)\mod_auth_basic.so "$(INSTDIR)\modules" <.y + copy modules\aaa\$(LONG)\mod_access.so "$(INSTDIR)\modules" <.y + copy modules\aaa\$(LONG)\mod_auth.so "$(INSTDIR)\modules" <.y + copy modules\aaa\$(LONG)\mod_auth_anon.so "$(INSTDIR)\modules" <.y + copy modules\aaa\$(LONG)\mod_auth_dbm.so "$(INSTDIR)\modules" <.y copy modules\aaa\$(LONG)\mod_auth_digest.so "$(INSTDIR)\modules" <.y - copy modules\aaa\$(LONG)\mod_authn_anon.so "$(INSTDIR)\modules" <.y - copy modules\aaa\$(LONG)\mod_authn_dbm.so "$(INSTDIR)\modules" <.y - copy modules\aaa\$(LONG)\mod_authn_default.so "$(INSTDIR)\modules" <.y - copy modules\aaa\$(LONG)\mod_authn_file.so "$(INSTDIR)\modules" <.y - copy modules\aaa\$(LONG)\mod_authz_dbm.so "$(INSTDIR)\modules" <.y - copy modules\aaa\$(LONG)\mod_authz_default.so "$(INSTDIR)\modules" <.y - copy modules\aaa\$(LONG)\mod_authz_groupfile.so "$(INSTDIR)\modules" <.y - copy modules\aaa\$(LONG)\mod_authz_host.so "$(INSTDIR)\modules" <.y - copy modules\aaa\$(LONG)\mod_authz_user.so "$(INSTDIR)\modules" <.y copy modules\arch\win32\$(LONG)\mod_isapi.so "$(INSTDIR)\modules" <.y copy modules\cache\$(LONG)\mod_file_cache.so "$(INSTDIR)\modules" <.y copy modules\dav\fs\$(LONG)\mod_dav_fs.so "$(INSTDIR)\modules" <.y copy modules\dav\main\$(LONG)\mod_dav.so "$(INSTDIR)\modules" <.y copy modules\experimental\$(LONG)\mod_cache.so "$(INSTDIR)\modules" <.y - copy modules\experimental\$(LONG)\mod_charset_lite.so "$(INSTDIR)\modules" <.y copy modules\experimental\$(LONG)\mod_mem_cache.so "$(INSTDIR)\modules" <.y copy modules\experimental\$(LONG)\mod_disk_cache.so "$(INSTDIR)\modules" <.y copy modules\experimental\$(LONG)\mod_ext_filter.so "$(INSTDIR)\modules" <.y @@ -418,25 +400,17 @@ _install: copy $(LONG)\Apache.pdb "$(INSTDIR)\bin" <.y copy $(LONG)\libhttpd.pdb "$(INSTDIR)\bin" <.y copy srclib\apr\$(LONG)\libapr.pdb "$(INSTDIR)\bin" <.y - copy srclib\apr-iconv\$(LONG)\libapriconv.pdb "$(INSTDIR)\bin" <.y copy srclib\apr-util\$(LONG)\libaprutil.pdb "$(INSTDIR)\bin" <.y - copy modules\aaa\$(LONG)\mod_auth_basic.pdb "$(INSTDIR)\modules" <.y + copy modules\aaa\$(LONG)\mod_access.pdb "$(INSTDIR)\modules" <.y + copy modules\aaa\$(LONG)\mod_auth.pdb "$(INSTDIR)\modules" <.y + copy modules\aaa\$(LONG)\mod_auth_anon.pdb "$(INSTDIR)\modules" <.y + copy modules\aaa\$(LONG)\mod_auth_dbm.pdb "$(INSTDIR)\modules" <.y copy modules\aaa\$(LONG)\mod_auth_digest.pdb "$(INSTDIR)\modules" <.y - copy modules\aaa\$(LONG)\mod_authn_anon.pdb "$(INSTDIR)\modules" <.y - copy modules\aaa\$(LONG)\mod_authn_dbm.pdb "$(INSTDIR)\modules" <.y - copy modules\aaa\$(LONG)\mod_authn_default.pdb "$(INSTDIR)\modules" <.y - copy modules\aaa\$(LONG)\mod_authn_file.pdb "$(INSTDIR)\modules" <.y - copy modules\aaa\$(LONG)\mod_authz_dbm.pdb "$(INSTDIR)\modules" <.y - copy modules\aaa\$(LONG)\mod_authz_default.pdb "$(INSTDIR)\modules" <.y - copy modules\aaa\$(LONG)\mod_authz_groupfile.pdb "$(INSTDIR)\modules" <.y - copy modules\aaa\$(LONG)\mod_authz_host.pdb "$(INSTDIR)\modules" <.y - copy modules\aaa\$(LONG)\mod_authz_user.pdb "$(INSTDIR)\modules" <.y copy modules\arch\win32\$(LONG)\mod_isapi.pdb "$(INSTDIR)\modules" <.y copy modules\cache\$(LONG)\mod_file_cache.pdb "$(INSTDIR)\modules" <.y copy modules\dav\fs\$(LONG)\mod_dav_fs.pdb "$(INSTDIR)\modules" <.y copy modules\dav\main\$(LONG)\mod_dav.pdb "$(INSTDIR)\modules" <.y copy modules\experimental\$(LONG)\mod_cache.pdb "$(INSTDIR)\modules" <.y - copy modules\experimental\$(LONG)\mod_charset_lite.pdb "$(INSTDIR)\modules" <.y copy modules\experimental\$(LONG)\mod_mem_cache.pdb "$(INSTDIR)\modules" <.y copy modules\experimental\$(LONG)\mod_disk_cache.pdb "$(INSTDIR)\modules" <.y copy modules\experimental\$(LONG)\mod_ext_filter.pdb "$(INSTDIR)\modules" <.y @@ -629,8 +603,6 @@ BEGIN { copy srclib\apr-util\xml\expat\lib\Lib$(SHORT)\xml.lib "$(INSTDIR)\lib\expat.lib" <.y copy srclib\apr\$(LONG)\libapr.lib "$(INSTDIR)\lib" <.y copy srclib\apr\$(LONG)\libapr.exp "$(INSTDIR)\lib" <.y - copy srclib\apr-iconv\$(LONG)\libapriconv.lib "$(INSTDIR)\lib" <.y - copy srclib\apr-iconv\$(LONG)\libapriconv.exp "$(INSTDIR)\lib" <.y copy srclib\apr-util\$(LONG)\libaprutil.lib "$(INSTDIR)\lib" <.y copy srclib\apr-util\$(LONG)\libaprutil.exp "$(INSTDIR)\lib" <.y copy $(LONG)\libhttpd.exp "$(INSTDIR)\lib" <.y diff --git a/NWGNUmakefile b/NWGNUmakefile index 025bd9e201e..82d2ce44246 100644 --- a/NWGNUmakefile +++ b/NWGNUmakefile @@ -194,10 +194,11 @@ FILES_nlm_objs = \ $(OBJDIR)/listen.o \ $(OBJDIR)/log.o \ $(OBJDIR)/main.o \ - $(OBJDIR)/mod_authz_host.o \ + $(OBJDIR)/mod_access.o \ $(OBJDIR)/mod_actions.o \ $(OBJDIR)/mod_alias.o \ $(OBJDIR)/mod_asis.o \ + $(OBJDIR)/mod_auth.o \ $(OBJDIR)/mod_autoindex.o \ $(OBJDIR)/mod_cgi.o \ $(OBJDIR)/mod_dir.o \ @@ -218,7 +219,6 @@ FILES_nlm_objs = \ $(OBJDIR)/pcre.o \ $(OBJDIR)/pcreposix.o \ $(OBJDIR)/protocol.o \ - $(OBJDIR)/provider.o \ $(OBJDIR)/request.o \ $(OBJDIR)/rfc1413.o \ $(OBJDIR)/scoreboard.o \ diff --git a/acinclude.m4 b/acinclude.m4 index 2342fabff1e..ed3964886fc 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -85,8 +85,6 @@ AC_DEFUN(APACHE_GEN_CONFIG_VARS,[ APACHE_SUBST(MK_IMPLIB) APACHE_SUBST(INSTALL_PROG_FLAGS) APACHE_SUBST(DSO_MODULES) - APACHE_SUBST(APR_BINDIR) - APACHE_SUBST(APU_BINDIR) abs_srcdir="`(cd $srcdir && pwd)`" diff --git a/apachenw.mcp.zip b/apachenw.mcp.zip index efc6e329cb295b4c55c5adaefd56499bb7161773..4d8655852a8a0b07b5d01a509317fa59c19da476 100644 GIT binary patch literal 146507 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 b#vd9LeB&%)^_u_IR%(W;W>#vrR;>6xL)X?v literal 198962 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 %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent -# You need to enable mod_logio.c to use %I and %O -#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio - # # The location and format of the access logfile (Common Logfile Format). # If you do not define any access logfiles within a diff --git a/docs/conf/httpd-win.conf b/docs/conf/httpd-win.conf index 0f54df71e21..09aeab5a68c 100644 --- a/docs/conf/httpd-win.conf +++ b/docs/conf/httpd-win.conf @@ -406,9 +406,6 @@ LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent -# You need to enable mod_logio.c to use %I and %O -#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio - # # The location and format of the access logfile (Common Logfile Format). # If you do not define any access logfiles within a diff --git a/docs/manual/mod/mod_auth_basic.html.en b/docs/manual/mod/mod_auth_basic.html.en deleted file mode 100644 index dd794fa69f3..00000000000 --- a/docs/manual/mod/mod_auth_basic.html.en +++ /dev/null @@ -1,62 +0,0 @@ - - -mod_auth_basic - Apache HTTP Server

<-

Apache Module mod_auth_basic

Description: - Basic authentication
Status: - Base
Module Identifier: - auth_basic_module
Source File: - mod_auth_basic.c
Compatibility: - Available in Apache 2.0.42 and later

Summary

- -

This module allows the use of HTTP Basic Authentication to - restrict access by looking up users in the given providers. - HTTP Digest Authentication is provided by - mod_auth_digest.

- -
top

AuthBasicAuthoritative Directive

Description: - Sets whether authorization and authentication are -passed to lower level modules
Syntax: - AuthBasicAuthoritative on|off
Default: - AuthBasicAuthoritative on
Context: - directory, .htaccess
Override: - AuthConfig
Status: - Base
Module: - mod_auth_basic
-

Setting the AuthBasicAuthoritative directive - explicitly to 'off' allows for both - authentication and authorization to be passed on to lower level - modules (as defined in the Configuration and - modules.c files) if there is no - userID or rule matching the supplied - userID. If there is a userID and/or rule specified; the usual - password and access checks will be applied and a failure will give - an Authorization Required reply.

- -

So if a userID appears in the database of more than one module; - or if a valid Require - directive applies to more than one module; then the first module - will verify the credentials; and no access is passed on; - regardless of the AuthAuthoritative setting.

- -

By default; control is not passed on; and an unknown userID or - rule will result in an Authorization Required reply. Not setting - it thus keeps the system secure; and forces an NCSA compliant - behaviour.

- -
top

AuthBasicProvider Directive

Description: - Sets the authentication provider(s) for this location
Syntax: - AuthBasicProvider provider-name
Context: - directory, location, .htaccess
Override: - AuthConfig
Status: - Base
Module: - mod_auth_basic
-

The AuthBasicProvider directive sets - which provider is used to authenticate the users for this location.

- -

See mod_authn_dbm, mod_authn_file - for providers.

- -
\ No newline at end of file diff --git a/docs/manual/mod/mod_auth_basic.html.ja.jis b/docs/manual/mod/mod_auth_basic.html.ja.jis deleted file mode 100644 index 04348cc5e83..00000000000 --- a/docs/manual/mod/mod_auth_basic.html.ja.jis +++ /dev/null @@ -1,65 +0,0 @@ - - -mod_auth_basic - Apache HTTP $B%5!<%P(B
<-

Apache $B%b%8%e!<%k(B mod_auth_basic

$B@bL@(B: - $B4pK\G'>Z(B
$B%9%F!<%?%9(B: - Base
$B%b%8%e!<%k<1JL;R(B: - auth_basic_module
$B%=!<%9%U%!%$(B$B%k(B: - mod_auth_basic.c
$B8_49@-(B: - Apache 2.0.42 $B0J9_(B

$B35MW(B

- -

$BM?$($i$l$?%W%m%P%$(B$B%@(B ($BLuCm(B: $BG'>Z$G$N>H2q$r9T$&Ld$$9g$o$;@h(B) - $B$G%f!<(B$B%6$r8!:w$7!"(BHTTP $B4pK\G'>Z$G%"%/%;%9@)8B$G$-$k$h$&$K$J$j$^$9!#(B - HTTP $B%@%$%8%'%9%HG'>Z$K$D$$$F$O(B mod_auth_digest - $B$GDs6!$5$l$^$9!#(B

- -

$B%G%#%l%/%F%#%V(B

$B;2(B$B>H(B

top

AuthBasicAuthoritative $B%G%#%l%/%F%#%V(B

$B@bL@(B: - $BG'>Z$H>5G'$r!"$h$jDc$$%l%Y%k$N%b%8%e!<%k$K0\9T$5$;$k$+$r(B -$B@_Dj$7$^$9!#(B
$B9=J8(B: - AuthBasicAuthoritative on|off
$B%G%U%)%k%H(B: - AuthBasicAuthoritative on
$B%3%s%F%-%9%H(B: - $B%G%#%l%/%H%j(B, .htaccess
$B>e=q$-(B: - AuthConfig
$B%9%F!<%?%9(B: - Base
$B%b%8%e!<%k(B: - mod_auth_basic
-

AuthBasicAuthoritative - $B%G%#%l%/%F%#%V$GL@<(E*$K(B 'off'$B$K@_Dj$9$k$H!"(B - $BM?$($i$l$?G'>Z%f!<%6(B ID $B$KBP$7$F(B$B%f!<%6(B ID $B$,$J$$(B - $B$^$?$O(B$B%k!<%k$,$J$$(B$B>l9g$K!"(B - $BG'>Z$H>5G'$NN>J}$N%W%m%;%9$,!"(B - $B$h$jDc$$%l%Y%k$N%b%8%e!<%k(B (Configuration $B$H(B - modules.c $B%U%!%$%k$GDj5A(B) $B$K0\9T$9$k$h$&$K$G$-$^$9!#(B - $B%f!<%6(B ID $B$,$"$k!"$+$D$^$?$O!"%k!<%k$,;XDj$5$l$F$$$k>l9g$O!"(B - $BDL>o$N%Q%9%o!<%I$H%"%/%;%9%A%'%C%/$,E,MQ$5$l$F!"(B - $BG'>Z$K<:GT$9$k$H!V(B Authorization Required $B!W1~Ez$,JV$5$l$^$9!#(B

- -

$B$G$9$+$i!"Fs$D0J>e$N%b%8%e!<%k$N%G!<%?%Y!<%9$GF10l$N(B - $B%f!<%6(B ID $B$,8=$o$l$?$j!"(B - $B$^$?$O!"@5$7$$(B Require - $B%G%#%l%/%F%#%V$,Fs$D0J>e$N%b%8%e!<%k$G8=$o$l$?$j$7$?>l9g$O!"(B - $B0l$DL\$N%b%8%e!<%k$,G'Dj$r9T$C$F!"(BAuthAuthoritative $B@_Dj$K4X$o$i$:!"(B - $B%"%/%;%9$O0\9T$7$^$;$s!#(B

- -

$B%G%U%)%k%H$G$O!"@)8f$O0\9T$7$^$;$s!#$=$7$F!"L$CN$N%f!<%6(B ID $B$d(B - $B%k!<%k$,$"$C$F$b!V(B Authorization Required $B!W1~Ez$,JV$5$l$^$9!#(B - $B$G$9$+$i!"$3$N%G%#%l%/%F%#%V@_Dj$7$J$$$3$H$G%7%9%F%`$N0BA4$r0];}$G$-$F!"$^$?!"(B - NCSA $B=`5r$N5sF0$r6/@)$G$-$^$9!#(B

- -
top

AuthBasicProvider $B%G%#%l%/%F%#%V(B

$B@bL@(B: - $B$3$N(B$B0LCV$KBP$9$kG'>Z%W%m%P%$%@$r@_Dj$7$^$9!#(B
$B9=J8(B: - AuthBasicProvider provider-name
$B%3%s%F%-%9%H(B: - $B%G%#%l%/%H%j(B, $B%m%1!<%7%g%s(B, .htaccess
$B>e=q$-(B: - AuthConfig
$B%9%F!<%?%9(B: - Base
$B%b%8%e!<%k(B: - mod_auth_basic
-

AuthBasicProvider $B%G%#%l%/%F%#%V$G(B$B!"(B - $B$3$N0LCV$KBP$9$k%f!<%6G'>Z$KMQ$$$i$l$kG'>Z%W%m%P%$%@$r@_Dj$7$^$9!#(B

- -

$BG'>Z%W%m%P%$%@$K$D$$$F$O(B - mod_authn_dbm, mod_authn_file - $B$r$4Mw2<$5$$!#(B

- -
\ No newline at end of file diff --git a/docs/manual/mod/mod_auth_basic.xml b/docs/manual/mod/mod_auth_basic.xml deleted file mode 100644 index 03a6735a323..00000000000 --- a/docs/manual/mod/mod_auth_basic.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - -mod_auth_basic -Basic authentication -Base -mod_auth_basic.c -auth_basic_module -Available in Apache 2.0.42 and later - - - -

This module allows the use of HTTP Basic Authentication to - restrict access by looking up users in the given providers. - HTTP Digest Authentication is provided by - mod_auth_digest.

- -
-AuthName -AuthType - - -AuthBasicProvider -Sets the authentication provider(s) for this location -AuthBasicProvider provider-name - - directory - location - .htaccess - -AuthConfig - - -

The AuthBasicProvider directive sets - which provider is used to authenticate the users for this location.

- -

See mod_authn_dbm, mod_authn_file - for providers.

- -
-
- - -AuthBasicAuthoritative -Sets whether authorization and authentication are -passed to lower level modules -AuthBasicAuthoritative on|off -AuthBasicAuthoritative on - - directory - .htaccess - -AuthConfig - - -

Setting the AuthBasicAuthoritative directive - explicitly to 'off' allows for both - authentication and authorization to be passed on to lower level - modules (as defined in the Configuration and - modules.c files) if there is no - userID or rule matching the supplied - userID. If there is a userID and/or rule specified; the usual - password and access checks will be applied and a failure will give - an Authorization Required reply.

- -

So if a userID appears in the database of more than one module; - or if a valid Require - directive applies to more than one module; then the first module - will verify the credentials; and no access is passed on; - regardless of the AuthAuthoritative setting.

- -

By default; control is not passed on; and an unknown userID or - rule will result in an Authorization Required reply. Not setting - it thus keeps the system secure; and forces an NCSA compliant - behaviour.

- -
-
- -
diff --git a/docs/manual/mod/mod_auth_basic.xml.ja b/docs/manual/mod/mod_auth_basic.xml.ja deleted file mode 100644 index 42df7b54999..00000000000 --- a/docs/manual/mod/mod_auth_basic.xml.ja +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - -mod_auth_basic -$B4pK\G'>Z(B -Base -mod_auth_basic.c -auth_basic_module -Apache 2.0.42 $B0J9_(B - - - -

$BM?$($i$l$?%W%m%P%$%@(B ($BLuCm(B: $BG'>Z$G$N>H2q$r9T$&Ld$$9g$o$;@h(B) - $B$G%f!<%6$r8!:w$7!"(BHTTP $B4pK\G'>Z$G%"%/%;%9@)8B$G$-$k$h$&$K$J$j$^$9!#(B - HTTP $B%@%$%8%'%9%HG'>Z$K$D$$$F$O(B mod_auth_digest - $B$GDs6!$5$l$^$9!#(B

- -
-AuthName -AuthType - - -AuthBasicProvider -$B$3$N0LCV$KBP$9$kG'>Z%W%m%P%$%@$r@_Dj$7$^$9!#(B -AuthBasicProvider provider-name - - $B%G%#%l%/%H%j(B - $B%m%1!<%7%g%s(B - .htaccess - -AuthConfig - - -

AuthBasicProvider $B%G%#%l%/%F%#%V$G!"(B - $B$3$N0LCV$KBP$9$k%f!<%6G'>Z$KMQ$$$i$l$kG'>Z%W%m%P%$%@$r@_Dj$7$^$9!#(B

- -

$BG'>Z%W%m%P%$%@$K$D$$$F$O(B - mod_authn_dbm, mod_authn_file - $B$r$4Mw2<$5$$!#(B

- -
-
- - -AuthBasicAuthoritative -$BG'>Z$H>5G'$r!"$h$jDc$$%l%Y%k$N%b%8%e!<%k$K0\9T$5$;$k$+$r(B -$B@_Dj$7$^$9!#(B -AuthBasicAuthoritative on|off -AuthBasicAuthoritative on - - $B%G%#%l%/%H%j(B - .htaccess - -AuthConfig - - -

AuthBasicAuthoritative - $B%G%#%l%/%F%#%V$GL@<(E*$K(B 'off'$B$K@_Dj$9$k$H!"(B - $BM?$($i$l$?G'>Z%f!<%6(B ID $B$KBP$7$F(B$B%f!<%6(B ID $B$,$J$$(B - $B$^$?$O(B$B%k!<%k$,$J$$(B$B>l9g$K!"(B - $BG'>Z$H>5G'$NN>J}$N%W%m%;%9$,!"(B - $B$h$jDc$$%l%Y%k$N%b%8%e!<%k(B (Configuration $B$H(B - modules.c $B%U%!%$%k$GDj5A(B) $B$K0\9T$9$k$h$&$K$G$-$^$9!#(B - $B%f!<%6(B ID $B$,$"$k!"$+$D$^$?$O!"%k!<%k$,;XDj$5$l$F$$$k>l9g$O!"(B - $BDL>o$N%Q%9%o!<%I$H%"%/%;%9%A%'%C%/$,E,MQ$5$l$F!"(B - $BG'>Z$K<:GT$9$k$H!V(B Authorization Required $B!W1~Ez$,JV$5$l$^$9!#(B

- -

$B$G$9$+$i!"Fs$D0J>e$N%b%8%e!<%k$N%G!<%?%Y!<%9$GF10l$N(B - $B%f!<%6(B ID $B$,8=$o$l$?$j!"(B - $B$^$?$O!"@5$7$$(B Require - $B%G%#%l%/%F%#%V$,Fs$D0J>e$N%b%8%e!<%k$G8=$o$l$?$j$7$?>l9g$O!"(B - $B0l$DL\$N%b%8%e!<%k$,G'Dj$r9T$C$F!"(BAuthAuthoritative $B@_Dj$K4X$o$i$:!"(B - $B%"%/%;%9$O0\9T$7$^$;$s!#(B

- -

$B%G%U%)%k%H$G$O!"@)8f$O0\9T$7$^$;$s!#$=$7$F!"L$CN$N%f!<%6(B ID $B$d(B - $B%k!<%k$,$"$C$F$b!V(B Authorization Required $B!W1~Ez$,JV$5$l$^$9!#(B - $B$G$9$+$i!"$3$N%G%#%l%/%F%#%V@_Dj$7$J$$$3$H$G%7%9%F%`$N0BA4$r0];}$G$-$F!"$^$?!"(B - NCSA $B=`5r$N5sF0$r6/@)$G$-$^$9!#(B

- -
-
- -
diff --git a/docs/manual/mod/mod_authn_dbm.html.en b/docs/manual/mod/mod_authn_dbm.html.en deleted file mode 100644 index 0ef60d652ab..00000000000 --- a/docs/manual/mod/mod_authn_dbm.html.en +++ /dev/null @@ -1,82 +0,0 @@ - - -mod_authn_dbm - Apache HTTP Server
<-

Apache Module mod_authn_dbm

Description: - User authentication using DBM files
Status: - Extension
Module Identifier: - authn_dbm_module
Source File: - mod_authn_dbm.c
Compatibility: - Available in Apache 2.0.42 and later

Summary

-

This module provides authentication front-ends such as - mod_auth_digest and mod_auth_basic - to authenticate users by looking up users in plain text password files. - Similar functionality is provided by mod_authn_file.

- -

When using mod_auth_basic or - mod_auth_digest, this module is invoked via the - AuthBasicProvider or - AuthDigestProvider - with the 'dbm' value.

-
top

AuthDBMType Directive

Description: - Sets the type of database file that is used to -store passwords
Syntax: - AuthDBMType default|SDBM|GDBM|NDBM|DB
Default: - AuthDBMType default
Context: - directory, .htaccess
Override: - AuthConfig
Status: - Extension
Module: - mod_authn_dbm
Compatibility: - Available in version 2.0.30 and later.
- -

Sets the type of database file that is used to store the passwords. -The default database type is determined at compile time. The -availability of other types of database files also depends on -compile-time settings.

- -

It is crucial that whatever program you use to create your password -files is configured to use the same type of database.

-
top

AuthDBMUserFile Directive

Description: - Sets the name of a database file containing the list of users and -passwords for authentication
Syntax: - AuthDBMUserFile file-path
Context: - directory, .htaccess
Override: - AuthConfig
Status: - Extension
Module: - mod_authn_dbm
-

The AuthDBMUserFile directive sets the - name of a DBM file containing the list of users and passwords for - user authentication. File-path is the absolute path to - the user file.

- -

The user file is keyed on the username. The value for a user is - the crypt() encrypted password, optionally followed - by a colon and arbitrary data. The colon and the data following it - will be ignored by the server.

- -

Security: make sure that the - AuthDBMUserFile is stored outside the - document tree of the web-server; do not put it in the - directory that it protects. Otherwise, clients will be able to - download the AuthDBMUserFile.

- -

Important compatibility note: The implementation of - "dbmopen" in the apache modules reads the string length of the - hashed values from the DBM data structures, rather than relying - upon the string being NULL-appended. Some applications, such as - the Netscape web server, rely upon the string being - NULL-appended, so if you are having trouble using DBM files - interchangeably between applications this may be a part of the - problem.

- -

A perl script called - dbmmanage is included with - Apache. This program can be used to create and update DBM - format password files for use with this module.

-
\ No newline at end of file diff --git a/docs/manual/mod/mod_authn_dbm.xml b/docs/manual/mod/mod_authn_dbm.xml deleted file mode 100644 index 85307b225a1..00000000000 --- a/docs/manual/mod/mod_authn_dbm.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - - - -mod_authn_dbm -User authentication using DBM files -Extension -mod_authn_dbm.c -authn_dbm_module -Available in Apache 2.0.42 and later - - -

This module provides authentication front-ends such as - mod_auth_digest and mod_auth_basic - to authenticate users by looking up users in plain text password files. - Similar functionality is provided by mod_authn_file.

- -

When using mod_auth_basic or - mod_auth_digest, this module is invoked via the - AuthBasicProvider or - AuthDigestProvider - with the 'dbm' value.

-
- -AuthName -AuthType - - AuthBasicProvider - - - AuthDigestProvider - - - -AuthDBMUserFile -Sets the name of a database file containing the list of users and -passwords for authentication -AuthDBMUserFile file-path - - directory - .htaccess - -AuthConfig - - -

The AuthDBMUserFile directive sets the - name of a DBM file containing the list of users and passwords for - user authentication. File-path is the absolute path to - the user file.

- -

The user file is keyed on the username. The value for a user is - the crypt() encrypted password, optionally followed - by a colon and arbitrary data. The colon and the data following it - will be ignored by the server.

- -

Security: make sure that the - AuthDBMUserFile is stored outside the - document tree of the web-server; do not put it in the - directory that it protects. Otherwise, clients will be able to - download the AuthDBMUserFile.

- -

Important compatibility note: The implementation of - "dbmopen" in the apache modules reads the string length of the - hashed values from the DBM data structures, rather than relying - upon the string being NULL-appended. Some applications, such as - the Netscape web server, rely upon the string being - NULL-appended, so if you are having trouble using DBM files - interchangeably between applications this may be a part of the - problem.

- -

A perl script called - dbmmanage is included with - Apache. This program can be used to create and update DBM - format password files for use with this module.

-
-
- - -AuthDBMType -Sets the type of database file that is used to -store passwords -AuthDBMType default|SDBM|GDBM|NDBM|DB -AuthDBMType default - - directory - .htaccess - -AuthConfig -Available in version 2.0.30 and later. - - - -

Sets the type of database file that is used to store the passwords. -The default database type is determined at compile time. The -availability of other types of database files also depends on -compile-time settings.

- -

It is crucial that whatever program you use to create your password -files is configured to use the same type of database.

-
-
- -
diff --git a/docs/manual/mod/mod_authn_file.html.en b/docs/manual/mod/mod_authn_file.html.en deleted file mode 100644 index 1e49444ba0a..00000000000 --- a/docs/manual/mod/mod_authn_file.html.en +++ /dev/null @@ -1,71 +0,0 @@ - - -mod_authn_file - Apache HTTP Server
<-

Apache Module mod_authn_file

Description: - User authentication using text files
Status: - Base
Module Identifier: - authn_file_module
Source File: - mod_authn_file.c
Compatibility: - Available in Apache 2.0.42 and later

Summary

- -

This module provides authentication front-ends such as - mod_auth_digest and mod_auth_basic - to authenticate users by looking up users in plain text password files. - Similar functionality is provided by mod_authn_dbm.

- -

When using mod_auth_basic or - mod_auth_digest, this module is invoked via the - AuthBasicProvider or - AuthDigestProvider - with the 'file' value.

- -
top

AuthUserFile Directive

Description: - Sets the name of a text file containing the list of users and -passwords for authentication
Syntax: - AuthUserFile file-path
Context: - directory, .htaccess
Override: - AuthConfig
Status: - Base
Module: - mod_authn_file
-

The AuthUserFile directive sets the name - of a textual file containing the list of users and passwords for - user authentication. File-path is the path to the user - file. If it is not absolute (i.e., if it doesn't begin - with a slash), it is treated as relative to the ServerRoot.

- -

Each line of the user file contains a username followed by - a colon, followed by the crypt() encrypted - password. The behavior of multiple occurrences of the same user is - undefined.

- -

The utility htpasswd - which is installed as part of the binary distribution, or which - can be found in src/support, is used to maintain - this password file. See the man page for more - details. In short:

- -

Create a password file 'Filename' with 'username' as the - initial ID. It will prompt for the password:

-

htpasswd -c Filename username

- -

Add or modify 'username2' in the password file 'Filename':

-

htpasswd Filename username2

- -

Note that searching large text files is very - inefficient; AuthDBMUserFile should be used - instead.

- -

Security

-

Make sure that the AuthUserFile is - stored outside the document tree of the web-server; do not - put it in the directory that it protects. Otherwise, clients will - be able to download the AuthUserFile.

-
-
\ No newline at end of file diff --git a/docs/manual/mod/mod_authn_file.html.ja.jis b/docs/manual/mod/mod_authn_file.html.ja.jis deleted file mode 100644 index 116dbe9cff2..00000000000 --- a/docs/manual/mod/mod_authn_file.html.ja.jis +++ /dev/null @@ -1,79 +0,0 @@ - - -mod_authn_file - Apache HTTP $B%5!<%P(B
<-

Apache $B%b%8%e!<%k(B mod_authn_file

$B@bL@(B: - $B%F%-%9%H%U%!%$%k$rMQ$$$?%f!<(B$B%6G'>Z(B
$B%9%F!<%?%9(B: - Base
$B%b%8%e!<%k<1JL;R(B: - authn_file_module
$B%=!<%9%U%!%$(B$B%k(B: - mod_authn_file.c
$B8_49@-(B: - Apache 2.0.42 $B0J9_(B

$B35MW(B

- -

$BK\%b%8%e!<%k$O(B mod_auth_digest $B$d(B - mod_auth_basic $B$H$$$C$?G'>Z%U%m%s%H%(%s%I$KBP$7$F!"(B - $B%W%l%$%s%F%-%9%H$N%Q%9%o!<%I%U%!%$%kFb$+$i%f!<%6$r8!:w$9$k$3$H$G!"(B - $B%f!<%6G'>Z5!G=$rDs6!$7$^$9!#;w$?$h$&$J5!G=$O(B mod_authn_dbm - $B$G$bDs6!$5$l$F$$$^(B$B$9!#(B

- -

mod_auth_basic $B$d(B mod_auth_digest - $B$r;HMQ$9$k:]$K$O!"(B - AuthBasicProvider $B$d(B - AuthDigestPrivider - $B$G!V(B file $B!W$H;XDj$9$k$3$H$G$3$N%b%8%e(B$B!<%k$O5/F0$5$l$^$9!#(B

- -

$B%G%#%l%/%F%#%V(B

$B;2(B$B>H(B

top

AuthUserFile $B%G%#%l%/%F%#%V(B

$B@bL@(B: - $BG'>Z$K;HMQ$9$k%f!<%6$H%Q%9%o!<%I$N0lMw$,3JG<$5$l$F$$$k!"(B -$B%F%-%9%H%U%!%$(B$B%k$NL>A0$r@_Dj$9$k(B
$B9=J8(B: - AuthUserFile file-path
$B%3%s%F%-%9%H(B: - $B%G%#%l%/%H%j(B, .htaccess
$B>e=q$-(B: - AuthConfig
$B%9%F!<%?%9(B: - Base
$B%b%8%e!<%k(B: - mod_authn_file
-

AuthUserFile $B%G%#%l%/%F%#%V$O!"(B - $B%f!<%6G'>Z$N$?$a$N%f!<%6$H%Q%9%o!<%I$N0lMw$r3JG<$7$?(B - $B%F%-%9%H%U%!%$%k$NL>A0$r@_Dj$7$^$9!#(Bfile-path - $B$O%f!<%6%U%!%$%k$X$N%Q%9$G$9!#(B - $B$b$7@dBP%Q%9$G$J$1$l$P(B - ($B$D$^$j(B $B%9%i%C%7%e$G;O$^$i$J$$%Q%9$G$"$l$P(B) - $B!"(BServerRoot - $B$+$i$NAjBP%Q%9$H$7$F07$o$l$^$9!#(B

- -

$B%f!<%6%U%!%$%k$N3F9T$K$O!"%f!<%6L>!"%3%m%s!"(B - crypt() $B$G0E9f2=$7$?%Q%9%o!<%I$r5-=R$7$^$9!#(B - $BF10l%f!<%6$,J#?t2sEPO?$5$l$?;~$N5sF0$ODj5A$5$l$F$$$^$;$s!#(B

- -

$B%P%$%J%jG[I[$N0lIt$H$7$F%$%s%9%H!<%k$5$l$k$+!"(B - $B$"$k$$$O(B src/support $B$K$"$k(B - htpasswd - $B%f!<%F%#%j%F%#$G!"$3$N%Q%9%o!<%I%U%!%$%k$r%a%$%s%F%J%s%9$7$^$9!#(B - $B>\:Y$O(B man $B%Z!<%8$r$4MwD:$/$H$7$F!"4JC1$K$O(B:

- -

$B=i4|(B ID username $B$G!"(BFilename - $B$H$$$&%Q%9%o!<%I%U%!%$%k$r@8@.$7$^$9!#(B - $B -

htpasswd -c Filename username

- -

$B%Q%9%o!<%I%U%!%$%k(B Filename $B$K!"(Busername2 - $B$rDI2C$7$?$j=$@5$7$?$j$7$^$9(B:

-

htpasswd Filename username2

- -

($BLuCm(B: $BHs>o$KB?$/$N%f!<%6$rEPO?$9$k$HBg$-$J%U%!%$%k$K$J$j$^$9$,(B) - $BBg$-$J%F%-%9%H%U%!%$%k$r8!:w$9$k$N$O(B$BHs>o$K8zN($,0-$$(B - $B$H$$$&$3$H$KCm0U$7$F$/$@$5$$!#$=$N$h$&$JI,MW$N$"$k;~$O!"(B - AuthDBMUserFile - $B$rBe$o$j$K;H$C$F$/$@$5$$!#(B

- -

$B%;%-%e%j%F%#(B

-

AuthUserFile - $B$O!"%&%'%V%5!<%P$N%I%-%e%a%s%H%D%j!<$N30B&$KJ]4I$9$k$h$&$K$7$F$/$@$5$$!#(B - $BJ]8n$7$h$&$H$7$F$$$k%G%#%l%/%H%j0J2<$K$O!"(B$BCV$+$J$$$G2<$5$$(B$B!#(B - $B$=$&$7$J$$$H(B AuthUserFile $B$O(B - $B%@%&%s%m!<%I$G$-$F$7$^$$$^$9!#(B

-
-
\ No newline at end of file diff --git a/docs/manual/mod/mod_authn_file.xml b/docs/manual/mod/mod_authn_file.xml deleted file mode 100644 index d3b534ea8c8..00000000000 --- a/docs/manual/mod/mod_authn_file.xml +++ /dev/null @@ -1,87 +0,0 @@ - - - - - -mod_authn_file -User authentication using text files -Base -mod_authn_file.c -authn_file_module -Available in Apache 2.0.42 and later - - - -

This module provides authentication front-ends such as - mod_auth_digest and mod_auth_basic - to authenticate users by looking up users in plain text password files. - Similar functionality is provided by mod_authn_dbm.

- -

When using mod_auth_basic or - mod_auth_digest, this module is invoked via the - AuthBasicProvider or - AuthDigestProvider - with the 'file' value.

- -
-AuthName -AuthType - - AuthBasicProvider - - - AuthDigestProvider - - - -AuthUserFile -Sets the name of a text file containing the list of users and -passwords for authentication -AuthUserFile file-path - - directory - .htaccess - -AuthConfig - - -

The AuthUserFile directive sets the name - of a textual file containing the list of users and passwords for - user authentication. File-path is the path to the user - file. If it is not absolute (i.e., if it doesn't begin - with a slash), it is treated as relative to the ServerRoot.

- -

Each line of the user file contains a username followed by - a colon, followed by the crypt() encrypted - password. The behavior of multiple occurrences of the same user is - undefined.

- -

The utility htpasswd - which is installed as part of the binary distribution, or which - can be found in src/support, is used to maintain - this password file. See the man page for more - details. In short:

- -

Create a password file 'Filename' with 'username' as the - initial ID. It will prompt for the password:

- htpasswd -c Filename username - -

Add or modify 'username2' in the password file 'Filename':

- htpasswd Filename username2 - -

Note that searching large text files is very - inefficient; AuthDBMUserFile should be used - instead.

- - Security -

Make sure that the AuthUserFile is - stored outside the document tree of the web-server; do not - put it in the directory that it protects. Otherwise, clients will - be able to download the AuthUserFile.

-
-
-
- -
diff --git a/docs/manual/mod/mod_authn_file.xml.ja b/docs/manual/mod/mod_authn_file.xml.ja deleted file mode 100644 index 903fbbdd8c3..00000000000 --- a/docs/manual/mod/mod_authn_file.xml.ja +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - -mod_authn_file -$B%F%-%9%H%U%!%$%k$rMQ$$$?%f!<%6G'>Z(B -Base -mod_authn_file.c -authn_file_module -Apache 2.0.42 $B0J9_(B - - - -

$BK\%b%8%e!<%k$O(B mod_auth_digest $B$d(B - mod_auth_basic $B$H$$$C$?G'>Z%U%m%s%H%(%s%I$KBP$7$F!"(B - $B%W%l%$%s%F%-%9%H$N%Q%9%o!<%I%U%!%$%kFb$+$i%f!<%6$r8!:w$9$k$3$H$G!"(B - $B%f!<%6G'>Z5!G=$rDs6!$7$^$9!#;w$?$h$&$J5!G=$O(B mod_authn_dbm - $B$G$bDs6!$5$l$F$$$^$9!#(B

- -

mod_auth_basic $B$d(B mod_auth_digest - $B$r;HMQ$9$k:]$K$O!"(B - AuthBasicProvider $B$d(B - AuthDigestPrivider - $B$G!V(B file $B!W$H;XDj$9$k$3$H$G$3$N%b%8%e!<%k$O5/F0$5$l$^$9!#(B

- -
-AuthName -AuthType - - AuthBasicProvider - - - AuthDigestProvider - - - -AuthUserFile -$BG'>Z$K;HMQ$9$k%f!<%6$H%Q%9%o!<%I$N0lMw$,3JG<$5$l$F$$$k!"(B -$B%F%-%9%H%U%!%$%k$NL>A0$r@_Dj$9$k(B -AuthUserFile file-path - - $B%G%#%l%/%H%j(B - .htaccess - -AuthConfig - - -

AuthUserFile $B%G%#%l%/%F%#%V$O!"(B - $B%f!<%6G'>Z$N$?$a$N%f!<%6$H%Q%9%o!<%I$N0lMw$r3JG<$7$?(B - $B%F%-%9%H%U%!%$%k$NL>A0$r@_Dj$7$^$9!#(Bfile-path - $B$O%f!<%6%U%!%$%k$X$N%Q%9$G$9!#(B - $B$b$7@dBP%Q%9$G$J$1$l$P(B - ($B$D$^$j(B $B%9%i%C%7%e$G;O$^$i$J$$%Q%9$G$"$l$P(B) - $B!"(BServerRoot - $B$+$i$NAjBP%Q%9$H$7$F07$o$l$^$9!#(B

- -

$B%f!<%6%U%!%$%k$N3F9T$K$O!"%f!<%6L>!"%3%m%s!"(B - crypt() $B$G0E9f2=$7$?%Q%9%o!<%I$r5-=R$7$^$9!#(B - $BF10l%f!<%6$,J#?t2sEPO?$5$l$?;~$N5sF0$ODj5A$5$l$F$$$^$;$s!#(B

- -

$B%P%$%J%jG[I[$N0lIt$H$7$F%$%s%9%H!<%k$5$l$k$+!"(B - $B$"$k$$$O(B src/support $B$K$"$k(B - htpasswd - $B%f!<%F%#%j%F%#$G!"$3$N%Q%9%o!<%I%U%!%$%k$r%a%$%s%F%J%s%9$7$^$9!#(B - $B>\:Y$O(B man $B%Z!<%8$r$4MwD:$/$H$7$F!"4JC1$K$O(B:

- -

$B=i4|(B ID username $B$G!"(BFilename - $B$H$$$&%Q%9%o!<%I%U%!%$%k$r@8@.$7$^$9!#(B - $B - htpasswd -c Filename username - -

$B%Q%9%o!<%I%U%!%$%k(B Filename $B$K!"(Busername2 - $B$rDI2C$7$?$j=$@5$7$?$j$7$^$9(B:

- htpasswd Filename username2 - -

($BLuCm(B: $BHs>o$KB?$/$N%f!<%6$rEPO?$9$k$HBg$-$J%U%!%$%k$K$J$j$^$9$,(B) - $BBg$-$J%F%-%9%H%U%!%$%k$r8!:w$9$k$N$O(B$BHs>o$K8zN($,0-$$(B - $B$H$$$&$3$H$KCm0U$7$F$/$@$5$$!#$=$N$h$&$JI,MW$N$"$k;~$O!"(B - AuthDBMUserFile - $B$rBe$o$j$K;H$C$F$/$@$5$$!#(B

- - $B%;%-%e%j%F%#(B -

AuthUserFile - $B$O!"%&%'%V%5!<%P$N%I%-%e%a%s%H%D%j!<$N30B&$KJ]4I$9$k$h$&$K$7$F$/$@$5$$!#(B - $BJ]8n$7$h$&$H$7$F$$$k%G%#%l%/%H%j0J2<$K$O!"(B$BCV$+$J$$$G2<$5$$(B$B!#(B - $B$=$&$7$J$$$H(B AuthUserFile $B$O(B - $B%@%&%s%m!<%I$G$-$F$7$^$$$^$9!#(B

-
-
-
- -
diff --git a/docs/manual/mod/mod_authz_dbm.html.en b/docs/manual/mod/mod_authz_dbm.html.en deleted file mode 100644 index 4e8e4bea28b..00000000000 --- a/docs/manual/mod/mod_authz_dbm.html.en +++ /dev/null @@ -1,126 +0,0 @@ - - -mod_authz_dbm - Apache HTTP Server
<-

Apache Module mod_authz_dbm

Description: - Group authorization using DBM files
Status: - Extension
Module Identifier: - authz_dbm_module
Source File: - mod_authz_dbm.c
Compatibility: - Available in Apache 2.0.42 and later

Summary

-

This module provides authorization capabilities so that - authenticated users can be allowed or denied access to portions - of the web site by group membership. Similar functionality is - provided by mod_authz_groupfile.

-
top

AuthDBMGroupFile Directive

Description: - Sets the name of the database file containing the list -of user groups for authentication
Syntax: - AuthDBMGroupFile file-path
Context: - directory, .htaccess
Override: - AuthConfig
Status: - Extension
Module: - mod_authz_dbm
-

The AuthDBMGroupFile directive sets the - name of a DBM file containing the list of user groups for user - authentication. File-path is the absolute path to the - group file.

- -

The group file is keyed on the username. The value for a - user is a comma-separated list of the groups to which the users - belongs. There must be no whitespace within the value, and it - must never contain any colons.

- -

Security: make sure that the - AuthDBMGroupFile is stored outside the - document tree of the web-server; do not put it in the - directory that it protects. Otherwise, clients will be able to - download the AuthDBMGroupFile unless - otherwise protected.

- -

Combining Group and Password DBM files: In some cases it is - easier to manage a single database which contains both the - password and group details for each user. This simplifies any - support programs that need to be written: they now only have to - deal with writing to and locking a single DBM file. This can be - accomplished by first setting the group and password files to - point to the same DBM:

- -

-AuthDBMGroupFile /www/userbase
-AuthDBMUserFile /www/userbase -

- -

The key for the single DBM is the username. The value consists - of

- -

Unix Crypt-ed Password : List of Groups [ : (ignored) - ]

- -

The password section contains the Unix crypt() - password as before. This is followed by a colon and the comma - separated list of groups. Other data may optionally be left in the - DBM file after another colon; it is ignored by the authentication - module. This is what www.telescope.org uses for its combined - password and group database.

-
top

AuthzDBMAuthoritative Directive

Description: - Sets whether authorization will be passed on to lower level modules
Syntax: - AuthzDBMAuthoritative on|off
Default: - AuthzDBMAuthoritative on
Context: - directory, .htaccess
Override: - AuthConfig
Status: - Extension
Module: - mod_authz_dbm
- -

Setting the AuthzDBMAuthoritative - directive explicitly to 'off' allows for both - authentication and authorization to be passed on to lower level - modules (as defined in the Configuration and - modules.c file if there is no userID - or rule matching the supplied userID. If there is - a userID and/or rule specified; the usual password and access - checks will be applied and a failure will give an Authorization - Required reply.

- -

So if a userID appears in the database of more than one module; - or if a valid Require - directive applies to more than one module; then the first module - will verify the credentials; and no access is passed on; - regardless of the AuthAuthoritative setting.

- -

A common use for this is in conjunction with one of the - auth providers; such as mod_authn_file. Whereas this - DBM module supplies the bulk of the user credential checking; a - few (administrator) related accesses fall through to a lower - level with a well protected .htpasswd file.

- -

By default, control is not passed on and an unknown userID - or rule will result in an Authorization Required reply. Not - setting it thus keeps the system secure and forces an NCSA - compliant behaviour.

- -

Security: Do consider the implications of allowing a user to - allow fall-through in his .htaccess file; and verify that this - is really what you want; Generally it is easier to just secure - a single .htpasswd file, than it is to secure a database which - might have more access interfaces.

-
top

AuthzDBMType Directive

Description: - Sets the type of database file that is used to -store passwords
Syntax: - AuthzDBMType default|SDBM|GDBM|NDBM|DB
Default: - AuthzDBMType default
Context: - directory, .htaccess
Override: - AuthConfig
Status: - Extension
Module: - mod_authz_dbm
Compatibility: - Available in version 2.0.30 and later.
- -

Sets the type of database file that is used to store the passwords. -The default database type is determined at compile time. The -availability of other types of database files also depends on -compile-time settings.

- -

It is crucial that whatever program you use to create your password -files is configured to use the same type of database.

-
\ No newline at end of file diff --git a/docs/manual/mod/mod_authz_dbm.xml b/docs/manual/mod/mod_authz_dbm.xml deleted file mode 100644 index 624f71619d2..00000000000 --- a/docs/manual/mod/mod_authz_dbm.xml +++ /dev/null @@ -1,151 +0,0 @@ - - - - - -mod_authz_dbm -Group authorization using DBM files -Extension -mod_authz_dbm.c -authz_dbm_module -Available in Apache 2.0.42 and later - - -

This module provides authorization capabilities so that - authenticated users can be allowed or denied access to portions - of the web site by group membership. Similar functionality is - provided by mod_authz_groupfile.

-
- -Require -Satisfy - - -AuthDBMGroupFile -Sets the name of the database file containing the list -of user groups for authentication -AuthDBMGroupFile file-path -directory.htaccess - -AuthConfig - - -

The AuthDBMGroupFile directive sets the - name of a DBM file containing the list of user groups for user - authentication. File-path is the absolute path to the - group file.

- -

The group file is keyed on the username. The value for a - user is a comma-separated list of the groups to which the users - belongs. There must be no whitespace within the value, and it - must never contain any colons.

- -

Security: make sure that the - AuthDBMGroupFile is stored outside the - document tree of the web-server; do not put it in the - directory that it protects. Otherwise, clients will be able to - download the AuthDBMGroupFile unless - otherwise protected.

- -

Combining Group and Password DBM files: In some cases it is - easier to manage a single database which contains both the - password and group details for each user. This simplifies any - support programs that need to be written: they now only have to - deal with writing to and locking a single DBM file. This can be - accomplished by first setting the group and password files to - point to the same DBM:

- - -AuthDBMGroupFile /www/userbase
-AuthDBMUserFile /www/userbase -
- -

The key for the single DBM is the username. The value consists - of

- -Unix Crypt-ed Password : List of Groups [ : (ignored) - ] - -

The password section contains the Unix crypt() - password as before. This is followed by a colon and the comma - separated list of groups. Other data may optionally be left in the - DBM file after another colon; it is ignored by the authentication - module. This is what www.telescope.org uses for its combined - password and group database.

-
-
- - -AuthzDBMType -Sets the type of database file that is used to -store passwords -AuthzDBMType default|SDBM|GDBM|NDBM|DB -AuthzDBMType default - - directory - .htaccess - -AuthConfig -Available in version 2.0.30 and later. - - - -

Sets the type of database file that is used to store the passwords. -The default database type is determined at compile time. The -availability of other types of database files also depends on -compile-time settings.

- -

It is crucial that whatever program you use to create your password -files is configured to use the same type of database.

-
-
- - -AuthzDBMAuthoritative -Sets whether authorization will be passed on to lower level modules -AuthzDBMAuthoritative on|off -AuthzDBMAuthoritative on - - directory - .htaccess - -AuthConfig - - - -

Setting the AuthzDBMAuthoritative - directive explicitly to 'off' allows for both - authentication and authorization to be passed on to lower level - modules (as defined in the Configuration and - modules.c file if there is no userID - or rule matching the supplied userID. If there is - a userID and/or rule specified; the usual password and access - checks will be applied and a failure will give an Authorization - Required reply.

- -

So if a userID appears in the database of more than one module; - or if a valid Require - directive applies to more than one module; then the first module - will verify the credentials; and no access is passed on; - regardless of the AuthAuthoritative setting.

- -

A common use for this is in conjunction with one of the - auth providers; such as mod_authn_file. Whereas this - DBM module supplies the bulk of the user credential checking; a - few (administrator) related accesses fall through to a lower - level with a well protected .htpasswd file.

- -

By default, control is not passed on and an unknown userID - or rule will result in an Authorization Required reply. Not - setting it thus keeps the system secure and forces an NCSA - compliant behaviour.

- -

Security: Do consider the implications of allowing a user to - allow fall-through in his .htaccess file; and verify that this - is really what you want; Generally it is easier to just secure - a single .htpasswd file, than it is to secure a database which - might have more access interfaces.

-
-
- -
diff --git a/docs/manual/mod/mod_authz_groupfile.html.en b/docs/manual/mod/mod_authz_groupfile.html.en deleted file mode 100644 index f9cbe56867f..00000000000 --- a/docs/manual/mod/mod_authz_groupfile.html.en +++ /dev/null @@ -1,81 +0,0 @@ - - -mod_authz_groupfile - Apache HTTP Server
<-

Apache Module mod_authz_groupfile

Description: - Group authorization using plaintext files
Status: - Extension
Module Identifier: - authz_groupfile_module
Source File: - mod_authz_groupfile.c
Compatibility: - Available in Apache 2.0.42 and later

Summary

-

This module provides authorization capabilities so that - authenticated users can be allowed or denied access to portions - of the web site by group membership. Similar functionality is - provided by mod_authz_dbm.

-
top

AuthGroupFile Directive

Description: - Sets the name of a text file containing the list -of user groups for authentication
Syntax: - AuthGroupFile file-path
Context: - directory, .htaccess
Override: - AuthConfig
Status: - Extension
Module: - mod_authz_groupfile
-

The AuthGroupFile directive sets the - name of a textual file containing the list of user groups for user - authentication. File-path is the path to the group - file. If it is not absolute (i.e., if it doesn't begin - with a slash), it is treated as relative to the ServerRoot.

- -

Each line of the group file contains a groupname followed by a - colon, followed by the member usernames separated by spaces. - Example:

- -

mygroup: bob joe anne

- -

Note that searching large text files is very - inefficient; AuthDBMGroupFile should be used - instead.

- -

Security

-

Make sure that the AuthGroupFile is - stored outside the document tree of the web-server; do not - put it in the directory that it protects. Otherwise, clients will - be able to download the AuthGroupFile.

-
-
top

AuthzGroupFileAuthoritative Directive

Description: - Sets whether authorization will be passed on to lower level modules
Syntax: - AuthzGroupFileAuthoritative on|off
Default: - AuthzGroupFileAuthoritative on
Context: - directory, .htaccess
Override: - AuthConfig
Status: - Extension
Module: - mod_authz_groupfile
- -

Setting the AuthzGroupFileAuthoritative - directive explicitly to 'off' allows for - authorization to be passed on to lower level modules (as defined in - the Configuration and modules.c file if - there is no userID or rule matching - the supplied userID. If there is a userID and/or rule specified; the - usual password and access checks will be applied and a failure will - give an Authorization Required reply.

- -

So if a valid Require - directive applies to more than one module; then the first module - will verify the credentials; and no access is passed on; - regardless of the AuthzGroupFileAuthoritative - setting.

- -

By default, control is not passed on and an unknown userID - or rule will result in an Authorization Required reply. Not - setting it thus keeps the system secure and forces an NCSA - compliant behaviour.

- -

Security: Do consider the implications of allowing a user to - allow fall-through in his .htaccess file; and verify that this - is really what you want; Generally it is easier to just secure - a single .htpasswd file, than it is to secure a database which - might have more access interfaces.

-
\ No newline at end of file diff --git a/docs/manual/mod/mod_authz_groupfile.xml b/docs/manual/mod/mod_authz_groupfile.xml deleted file mode 100644 index 0753de7257e..00000000000 --- a/docs/manual/mod/mod_authz_groupfile.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - -mod_authz_groupfile -Group authorization using plaintext files -Extension -mod_authz_groupfile.c -authz_groupfile_module -Available in Apache 2.0.42 and later - - -

This module provides authorization capabilities so that - authenticated users can be allowed or denied access to portions - of the web site by group membership. Similar functionality is - provided by mod_authz_dbm.

-
- -Require -Satisfy - - -AuthGroupFile -Sets the name of a text file containing the list -of user groups for authentication -AuthGroupFile file-path - - directory - .htaccess - -AuthConfig - - -

The AuthGroupFile directive sets the - name of a textual file containing the list of user groups for user - authentication. File-path is the path to the group - file. If it is not absolute (i.e., if it doesn't begin - with a slash), it is treated as relative to the ServerRoot.

- -

Each line of the group file contains a groupname followed by a - colon, followed by the member usernames separated by spaces. - Example:

- - mygroup: bob joe anne - -

Note that searching large text files is very - inefficient; AuthDBMGroupFile should be used - instead.

- - Security -

Make sure that the AuthGroupFile is - stored outside the document tree of the web-server; do not - put it in the directory that it protects. Otherwise, clients will - be able to download the AuthGroupFile.

-
-
-
- - -AuthzGroupFileAuthoritative -Sets whether authorization will be passed on to lower level modules -AuthzGroupFileAuthoritative on|off -AuthzGroupFileAuthoritative on - - directory - .htaccess - -AuthConfig - - - -

Setting the AuthzGroupFileAuthoritative - directive explicitly to 'off' allows for - authorization to be passed on to lower level modules (as defined in - the Configuration and modules.c file if - there is no userID or rule matching - the supplied userID. If there is a userID and/or rule specified; the - usual password and access checks will be applied and a failure will - give an Authorization Required reply.

- -

So if a valid Require - directive applies to more than one module; then the first module - will verify the credentials; and no access is passed on; - regardless of the AuthzGroupFileAuthoritative - setting.

- -

By default, control is not passed on and an unknown userID - or rule will result in an Authorization Required reply. Not - setting it thus keeps the system secure and forces an NCSA - compliant behaviour.

- -

Security: Do consider the implications of allowing a user to - allow fall-through in his .htaccess file; and verify that this - is really what you want; Generally it is easier to just secure - a single .htpasswd file, than it is to secure a database which - might have more access interfaces.

-
-
- -
diff --git a/include/ap_provider.h b/include/ap_provider.h deleted file mode 100644 index 22fe2eb96d8..00000000000 --- a/include/ap_provider.h +++ /dev/null @@ -1,88 +0,0 @@ -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * nor may "Apache" appear in their name, without prior written - * permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ - -#ifndef AP_PROVIDER_H -#define AP_PROVIDER_H - -#include "ap_config.h" - -/** - * @package Provider API - */ - -/** - * This function is used to register a provider with the global - * provider pool. - * @param pool The pool to create any storage from - * @param provider_group The group to store the provider in - * @param provider_name The name for this provider - * @param provider Opaque structure for this provider - * @return APR_SUCCESS if all went well - */ -AP_DECLARE(apr_status_t) ap_register_provider(apr_pool_t *pool, - const char *provider_group, - const char *provider_name, - const void *provider); - -/** - * This function is used to retrieve a provider from the global - * provider pool. - * @param provider_group The group to look for this provider in - * @param provider_name The name for the provider - * @return provider pointer to provider if found, NULL otherwise - */ -AP_DECLARE(void *) ap_lookup_provider(const char *provider_group, - const char *provider_name); - -#endif diff --git a/include/ap_release.h b/include/ap_release.h index 90e398f4e34..459fda5e833 100644 --- a/include/ap_release.h +++ b/include/ap_release.h @@ -75,7 +75,7 @@ #define AP_SERVER_BASEPRODUCT "Apache" #define AP_SERVER_MAJORVERSION "2" #define AP_SERVER_MINORVERSION "0" -#define AP_SERVER_PATCHLEVEL "43-dev" +#define AP_SERVER_PATCHLEVEL "43" #define AP_SERVER_MINORREVISION AP_SERVER_MAJORVERSION "." AP_SERVER_MINORVERSION #define AP_SERVER_BASEREVISION AP_SERVER_MINORREVISION "." AP_SERVER_PATCHLEVEL #define AP_SERVER_BASEVERSION AP_SERVER_BASEPRODUCT "/" AP_SERVER_BASEREVISION diff --git a/libhttpd.dsp b/libhttpd.dsp index ae0601a1217..94a37661222 100644 --- a/libhttpd.dsp +++ b/libhttpd.dsp @@ -583,10 +583,6 @@ SOURCE=.\server\mpm\winnt\service.c # End Source File # Begin Source File -SOURCE=.\server\provider.c -# End Source File -# Begin Source File - SOURCE=.\server\scoreboard.c # End Source File # Begin Source File diff --git a/modules/aaa/NWGNUauthnano b/modules/aaa/NWGNUauthanon similarity index 96% rename from modules/aaa/NWGNUauthnano rename to modules/aaa/NWGNUauthanon index 299ded841e4..1847e7d3454 100644 --- a/modules/aaa/NWGNUauthnano +++ b/modules/aaa/NWGNUauthanon @@ -94,13 +94,13 @@ endif # This is used by the link 'name' directive to name the nlm. If left blank # TARGET_nlm (see below) will be used. # -NLM_NAME = authnano +NLM_NAME = authanon # # This is used by the link '-desc ' directive. # If left blank, NLM_NAME will be used. # -NLM_DESCRIPTION = Anonymouse Authentication Module +NLM_DESCRIPTION = Authentication Anonymous Module # # This is used by the '-threadname' directive. If left blank, @@ -151,7 +151,7 @@ XDCDATA = # If there is an NLM target, put it here # TARGET_nlm = \ - $(OBJDIR)/authnano.nlm \ + $(OBJDIR)/authanon.nlm \ $(EOLIST) # @@ -165,7 +165,7 @@ TARGET_lib = \ # Paths must all use the '/' character # FILES_nlm_objs = \ - $(OBJDIR)/mod_authn_anon.o \ + $(OBJDIR)/mod_auth_anon.o \ $(EOLIST) # @@ -213,7 +213,7 @@ FILES_nlm_Ximports = \ # Any symbols exported to here # FILES_nlm_exports = \ - authn_anon_module \ + auth_anon_module \ $(EOLIST) # diff --git a/modules/aaa/NWGNUauthbasc b/modules/aaa/NWGNUauthbasc deleted file mode 100644 index 1e5f9a609a5..00000000000 --- a/modules/aaa/NWGNUauthbasc +++ /dev/null @@ -1,250 +0,0 @@ -# -# Make sure all needed macro's are defined -# - -# -# Get the 'head' of the build environment if necessary. This includes default -# targets and paths to tools -# - -ifndef EnvironmentDefined -include $(AP_WORK)\build\NWGNUhead.inc -endif - -# -# These directories will be at the beginning of the include list, followed by -# INCDIRS -# -XINCDIRS += \ - $(AP_WORK)/include \ - $(NWOS) \ - $(AP_WORK)/modules/arch/netware \ - $(AP_WORK)/srclib/apr/include \ - $(AP_WORK)/srclib/apr-util/include \ - $(AP_WORK)/srclib/apr \ - $(EOLIST) - -# -# These flags will come after CFLAGS -# -XCFLAGS += \ - -prefix pre_nw.h \ - $(EOLIST) - -# -# These defines will come after DEFINES -# -XDEFINES += \ - $(EOLIST) - -# -# These flags will be added to the link.opt file -# -XLFLAGS += \ - $(EOLIST) - -# -# These values will be appended to the correct variables based on the value of -# RELEASE -# -ifeq "$(RELEASE)" "debug" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -ifeq "$(RELEASE)" "noopt" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -ifeq "$(RELEASE)" "release" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -# -# These are used by the link target if an NLM is being generated -# This is used by the link 'name' directive to name the nlm. If left blank -# TARGET_nlm (see below) will be used. -# -NLM_NAME = authbasc - -# -# This is used by the link '-desc ' directive. -# If left blank, NLM_NAME will be used. -# -NLM_DESCRIPTION = Basic Authentication Module - -# -# This is used by the '-threadname' directive. If left blank, -# NLM_NAME Thread will be used. -# -NLM_THREAD_NAME = AuthBasic Module - -# -# If this is specified, it will override VERSION value in -# $(AP_WORK)\build\NWGNUenvironment.inc -# -NLM_VERSION = - -# -# If this is specified, it will override the default of 64K -# -NLM_STACK_SIZE = 8192 - - -# -# If this is specified it will be used by the link '-entry' directive -# -NLM_ENTRY_SYM = _LibCPrelude - -# -# If this is specified it will be used by the link '-exit' directive -# -NLM_EXIT_SYM = _LibCPostlude - -# -# If this is specified it will be used by the link '-check' directive -# -NLM_CHECK_SYM = - -# -# If these are specified it will be used by the link '-flags' directive -# -NLM_FLAGS = AUTOUNLOAD, PSEUDOPREEMPTION - -# -# If this is specified it will be linked in with the XDCData option in the def -# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled -# by setting APACHE_UNIPROC in the environment -# -XDCDATA = - -# -# If there is an NLM target, put it here -# -TARGET_nlm = \ - $(OBJDIR)/authbasc.nlm \ - $(EOLIST) - -# -# If there is an LIB target, put it here -# -TARGET_lib = \ - $(EOLIST) - -# -# These are the OBJ files needed to create the NLM target above. -# Paths must all use the '/' character -# -FILES_nlm_objs = \ - $(OBJDIR)/mod_auth_basic.o \ - $(EOLIST) - -# -# These are the LIB files needed to create the NLM target above. -# These will be added as a library command in the link.opt file. -# -FILES_nlm_libs = \ - libcpre.o \ - $(EOLIST) - -# -# These are the modules that the above NLM target depends on to load. -# These will be added as a module command in the link.opt file. -# -FILES_nlm_modules = \ - aprlib \ - libc \ - $(EOLIST) - -# -# If the nlm has a msg file, put it's path here -# -FILE_nlm_msg = - -# -# If the nlm has a hlp file put it's path here -# -FILE_nlm_hlp = - -# -# If this is specified, it will override $(NWOS)\copyright.txt. -# -FILE_nlm_copyright = - -# -# Any additional imports go here -# -FILES_nlm_Ximports = \ - @$(APR)/aprlib.imp \ - @$(NWOS)/httpd.imp \ - @libc.imp \ - $(EOLIST) - -# -# Any symbols exported to here -# -FILES_nlm_exports = \ - auth_basic_module \ - $(EOLIST) - -# -# These are the OBJ files needed to create the LIB target above. -# Paths must all use the '/' character -# -FILES_lib_objs = \ - $(EOLIST) - -# -# implement targets and dependancies (leave this section alone) -# - -libs :: $(OBJDIR) $(TARGET_lib) - -nlms :: libs $(TARGET_nlm) - -# -# Updated this target to create necessary directories and copy files to the -# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples) -# -install :: nlms FORCE - -# -# Any specialized rules here -# - -# -# Include the 'tail' makefile that has targets that depend on variables defined -# in this makefile -# - -include $(AP_WORK)\build\NWGNUtail.inc - diff --git a/modules/aaa/NWGNUauthndbm b/modules/aaa/NWGNUauthdbm similarity index 97% rename from modules/aaa/NWGNUauthndbm rename to modules/aaa/NWGNUauthdbm index 69eccdc478f..a64e7ec732c 100644 --- a/modules/aaa/NWGNUauthndbm +++ b/modules/aaa/NWGNUauthdbm @@ -93,7 +93,7 @@ endif # This is used by the link 'name' directive to name the nlm. If left blank # TARGET_nlm (see below) will be used. # -NLM_NAME = authndbm +NLM_NAME = authdbm # # This is used by the link '-desc ' directive. @@ -105,7 +105,7 @@ NLM_DESCRIPTION = Database Authentication Module # This is used by the '-threadname' directive. If left blank, # NLM_NAME Thread will be used. # -NLM_THREAD_NAME = AuthnDBM Module +NLM_THREAD_NAME = AuthDBM Module # # If this is specified, it will override VERSION value in @@ -150,7 +150,7 @@ XDCDATA = # If there is an NLM target, put it here # TARGET_nlm = \ - $(OBJDIR)/authndbm.nlm \ + $(OBJDIR)/authdbm.nlm \ $(EOLIST) # @@ -164,7 +164,7 @@ TARGET_lib = \ # Paths must all use the '/' character # FILES_nlm_objs = \ - $(OBJDIR)/mod_authn_dbm.o \ + $(OBJDIR)/mod_auth_dbm.o \ $(EOLIST) # @@ -212,7 +212,7 @@ FILES_nlm_Ximports = \ # Any symbols exported to here # FILES_nlm_exports = \ - authn_dbm_module \ + auth_dbm_module \ $(EOLIST) # diff --git a/modules/aaa/NWGNUauthndef b/modules/aaa/NWGNUauthndef deleted file mode 100644 index 20996e74b60..00000000000 --- a/modules/aaa/NWGNUauthndef +++ /dev/null @@ -1,250 +0,0 @@ -# -# Make sure all needed macro's are defined -# - -# -# Get the 'head' of the build environment if necessary. This includes default -# targets and paths to tools -# - -ifndef EnvironmentDefined -include $(AP_WORK)\build\NWGNUhead.inc -endif - -# -# These directories will be at the beginning of the include list, followed by -# INCDIRS -# -XINCDIRS += \ - $(AP_WORK)/include \ - $(NWOS) \ - $(AP_WORK)/modules/arch/netware \ - $(AP_WORK)/srclib/apr/include \ - $(AP_WORK)/srclib/apr-util/include \ - $(AP_WORK)/srclib/apr \ - $(EOLIST) - -# -# These flags will come after CFLAGS -# -XCFLAGS += \ - -prefix pre_nw.h \ - $(EOLIST) - -# -# These defines will come after DEFINES -# -XDEFINES += \ - $(EOLIST) - -# -# These flags will be added to the link.opt file -# -XLFLAGS += \ - $(EOLIST) - -# -# These values will be appended to the correct variables based on the value of -# RELEASE -# -ifeq "$(RELEASE)" "debug" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -ifeq "$(RELEASE)" "noopt" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -ifeq "$(RELEASE)" "release" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -# -# These are used by the link target if an NLM is being generated -# This is used by the link 'name' directive to name the nlm. If left blank -# TARGET_nlm (see below) will be used. -# -NLM_NAME = authndef - -# -# This is used by the link '-desc ' directive. -# If left blank, NLM_NAME will be used. -# -NLM_DESCRIPTION = Default Authentication Module - -# -# This is used by the '-threadname' directive. If left blank, -# NLM_NAME Thread will be used. -# -NLM_THREAD_NAME = Authndef Module - -# -# If this is specified, it will override VERSION value in -# $(AP_WORK)\build\NWGNUenvironment.inc -# -NLM_VERSION = - -# -# If this is specified, it will override the default of 64K -# -NLM_STACK_SIZE = 8192 - - -# -# If this is specified it will be used by the link '-entry' directive -# -NLM_ENTRY_SYM = _LibCPrelude - -# -# If this is specified it will be used by the link '-exit' directive -# -NLM_EXIT_SYM = _LibCPostlude - -# -# If this is specified it will be used by the link '-check' directive -# -NLM_CHECK_SYM = - -# -# If these are specified it will be used by the link '-flags' directive -# -NLM_FLAGS = AUTOUNLOAD, PSEUDOPREEMPTION - -# -# If this is specified it will be linked in with the XDCData option in the def -# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled -# by setting APACHE_UNIPROC in the environment -# -XDCDATA = - -# -# If there is an NLM target, put it here -# -TARGET_nlm = \ - $(OBJDIR)/authndef.nlm \ - $(EOLIST) - -# -# If there is an LIB target, put it here -# -TARGET_lib = \ - $(EOLIST) - -# -# These are the OBJ files needed to create the NLM target above. -# Paths must all use the '/' character -# -FILES_nlm_objs = \ - $(OBJDIR)/mod_authn_default.o \ - $(EOLIST) - -# -# These are the LIB files needed to create the NLM target above. -# These will be added as a library command in the link.opt file. -# -FILES_nlm_libs = \ - libcpre.o \ - $(EOLIST) - -# -# These are the modules that the above NLM target depends on to load. -# These will be added as a module command in the link.opt file. -# -FILES_nlm_modules = \ - aprlib \ - libc \ - $(EOLIST) - -# -# If the nlm has a msg file, put it's path here -# -FILE_nlm_msg = - -# -# If the nlm has a hlp file put it's path here -# -FILE_nlm_hlp = - -# -# If this is specified, it will override $(NWOS)\copyright.txt. -# -FILE_nlm_copyright = - -# -# Any additional imports go here -# -FILES_nlm_Ximports = \ - @$(APR)/aprlib.imp \ - @$(NWOS)/httpd.imp \ - @libc.imp \ - $(EOLIST) - -# -# Any symbols exported to here -# -FILES_nlm_exports = \ - authn_default_module \ - $(EOLIST) - -# -# These are the OBJ files needed to create the LIB target above. -# Paths must all use the '/' character -# -FILES_lib_objs = \ - $(EOLIST) - -# -# implement targets and dependancies (leave this section alone) -# - -libs :: $(OBJDIR) $(TARGET_lib) - -nlms :: libs $(TARGET_nlm) - -# -# Updated this target to create necessary directories and copy files to the -# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples) -# -install :: nlms FORCE - -# -# Any specialized rules here -# - -# -# Include the 'tail' makefile that has targets that depend on variables defined -# in this makefile -# - -include $(AP_WORK)\build\NWGNUtail.inc - diff --git a/modules/aaa/NWGNUauthnfil b/modules/aaa/NWGNUauthnfil deleted file mode 100644 index 045ed4a3118..00000000000 --- a/modules/aaa/NWGNUauthnfil +++ /dev/null @@ -1,250 +0,0 @@ -# -# Make sure all needed macro's are defined -# - -# -# Get the 'head' of the build environment if necessary. This includes default -# targets and paths to tools -# - -ifndef EnvironmentDefined -include $(AP_WORK)\build\NWGNUhead.inc -endif - -# -# These directories will be at the beginning of the include list, followed by -# INCDIRS -# -XINCDIRS += \ - $(AP_WORK)/include \ - $(NWOS) \ - $(AP_WORK)/modules/arch/netware \ - $(AP_WORK)/srclib/apr/include \ - $(AP_WORK)/srclib/apr-util/include \ - $(AP_WORK)/srclib/apr \ - $(EOLIST) - -# -# These flags will come after CFLAGS -# -XCFLAGS += \ - -prefix pre_nw.h \ - $(EOLIST) - -# -# These defines will come after DEFINES -# -XDEFINES += \ - $(EOLIST) - -# -# These flags will be added to the link.opt file -# -XLFLAGS += \ - $(EOLIST) - -# -# These values will be appended to the correct variables based on the value of -# RELEASE -# -ifeq "$(RELEASE)" "debug" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -ifeq "$(RELEASE)" "noopt" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -ifeq "$(RELEASE)" "release" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -# -# These are used by the link target if an NLM is being generated -# This is used by the link 'name' directive to name the nlm. If left blank -# TARGET_nlm (see below) will be used. -# -NLM_NAME = authnfil - -# -# This is used by the link '-desc ' directive. -# If left blank, NLM_NAME will be used. -# -NLM_DESCRIPTION = File Authentication Module - -# -# This is used by the '-threadname' directive. If left blank, -# NLM_NAME Thread will be used. -# -NLM_THREAD_NAME = AuthnFile Module - -# -# If this is specified, it will override VERSION value in -# $(AP_WORK)\build\NWGNUenvironment.inc -# -NLM_VERSION = - -# -# If this is specified, it will override the default of 64K -# -NLM_STACK_SIZE = 8192 - - -# -# If this is specified it will be used by the link '-entry' directive -# -NLM_ENTRY_SYM = _LibCPrelude - -# -# If this is specified it will be used by the link '-exit' directive -# -NLM_EXIT_SYM = _LibCPostlude - -# -# If this is specified it will be used by the link '-check' directive -# -NLM_CHECK_SYM = - -# -# If these are specified it will be used by the link '-flags' directive -# -NLM_FLAGS = AUTOUNLOAD, PSEUDOPREEMPTION - -# -# If this is specified it will be linked in with the XDCData option in the def -# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled -# by setting APACHE_UNIPROC in the environment -# -XDCDATA = - -# -# If there is an NLM target, put it here -# -TARGET_nlm = \ - $(OBJDIR)/authnfil.nlm \ - $(EOLIST) - -# -# If there is an LIB target, put it here -# -TARGET_lib = \ - $(EOLIST) - -# -# These are the OBJ files needed to create the NLM target above. -# Paths must all use the '/' character -# -FILES_nlm_objs = \ - $(OBJDIR)/mod_authn_file.o \ - $(EOLIST) - -# -# These are the LIB files needed to create the NLM target above. -# These will be added as a library command in the link.opt file. -# -FILES_nlm_libs = \ - libcpre.o \ - $(EOLIST) - -# -# These are the modules that the above NLM target depends on to load. -# These will be added as a module command in the link.opt file. -# -FILES_nlm_modules = \ - aprlib \ - libc \ - $(EOLIST) - -# -# If the nlm has a msg file, put it's path here -# -FILE_nlm_msg = - -# -# If the nlm has a hlp file put it's path here -# -FILE_nlm_hlp = - -# -# If this is specified, it will override $(NWOS)\copyright.txt. -# -FILE_nlm_copyright = - -# -# Any additional imports go here -# -FILES_nlm_Ximports = \ - @$(APR)/aprlib.imp \ - @$(NWOS)/httpd.imp \ - @libc.imp \ - $(EOLIST) - -# -# Any symbols exported to here -# -FILES_nlm_exports = \ - authn_file_module \ - $(EOLIST) - -# -# These are the OBJ files needed to create the LIB target above. -# Paths must all use the '/' character -# -FILES_lib_objs = \ - $(EOLIST) - -# -# implement targets and dependancies (leave this section alone) -# - -libs :: $(OBJDIR) $(TARGET_lib) - -nlms :: libs $(TARGET_nlm) - -# -# Updated this target to create necessary directories and copy files to the -# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples) -# -install :: nlms FORCE - -# -# Any specialized rules here -# - -# -# Include the 'tail' makefile that has targets that depend on variables defined -# in this makefile -# - -include $(AP_WORK)\build\NWGNUtail.inc - diff --git a/modules/aaa/NWGNUauthzdbm b/modules/aaa/NWGNUauthzdbm deleted file mode 100644 index f79e705b906..00000000000 --- a/modules/aaa/NWGNUauthzdbm +++ /dev/null @@ -1,250 +0,0 @@ -# -# Make sure all needed macro's are defined -# - -# -# Get the 'head' of the build environment if necessary. This includes default -# targets and paths to tools -# - -ifndef EnvironmentDefined -include $(AP_WORK)\build\NWGNUhead.inc -endif - -# -# These directories will be at the beginning of the include list, followed by -# INCDIRS -# -XINCDIRS += \ - $(AP_WORK)/include \ - $(NWOS) \ - $(AP_WORK)/modules/arch/netware \ - $(AP_WORK)/srclib/apr/include \ - $(AP_WORK)/srclib/apr-util/include \ - $(AP_WORK)/srclib/apr \ - $(EOLIST) - -# -# These flags will come after CFLAGS -# -XCFLAGS += \ - -prefix pre_nw.h \ - $(EOLIST) - -# -# These defines will come after DEFINES -# -XDEFINES += \ - $(EOLIST) - -# -# These flags will be added to the link.opt file -# -XLFLAGS += \ - $(EOLIST) - -# -# These values will be appended to the correct variables based on the value of -# RELEASE -# -ifeq "$(RELEASE)" "debug" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -ifeq "$(RELEASE)" "noopt" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -ifeq "$(RELEASE)" "release" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -# -# These are used by the link target if an NLM is being generated -# This is used by the link 'name' directive to name the nlm. If left blank -# TARGET_nlm (see below) will be used. -# -NLM_NAME = authzdbm - -# -# This is used by the link '-desc ' directive. -# If left blank, NLM_NAME will be used. -# -NLM_DESCRIPTION = Database Authorization Module - -# -# This is used by the '-threadname' directive. If left blank, -# NLM_NAME Thread will be used. -# -NLM_THREAD_NAME = AuthzDBM Module - -# -# If this is specified, it will override VERSION value in -# $(AP_WORK)\build\NWGNUenvironment.inc -# -NLM_VERSION = - -# -# If this is specified, it will override the default of 64K -# -NLM_STACK_SIZE = 8192 - - -# -# If this is specified it will be used by the link '-entry' directive -# -NLM_ENTRY_SYM = _LibCPrelude - -# -# If this is specified it will be used by the link '-exit' directive -# -NLM_EXIT_SYM = _LibCPostlude - -# -# If this is specified it will be used by the link '-check' directive -# -NLM_CHECK_SYM = - -# -# If these are specified it will be used by the link '-flags' directive -# -NLM_FLAGS = AUTOUNLOAD, PSEUDOPREEMPTION - -# -# If this is specified it will be linked in with the XDCData option in the def -# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled -# by setting APACHE_UNIPROC in the environment -# -XDCDATA = - -# -# If there is an NLM target, put it here -# -TARGET_nlm = \ - $(OBJDIR)/authzdbm.nlm \ - $(EOLIST) - -# -# If there is an LIB target, put it here -# -TARGET_lib = \ - $(EOLIST) - -# -# These are the OBJ files needed to create the NLM target above. -# Paths must all use the '/' character -# -FILES_nlm_objs = \ - $(OBJDIR)/mod_authz_dbm.o \ - $(EOLIST) - -# -# These are the LIB files needed to create the NLM target above. -# These will be added as a library command in the link.opt file. -# -FILES_nlm_libs = \ - libcpre.o \ - $(EOLIST) - -# -# These are the modules that the above NLM target depends on to load. -# These will be added as a module command in the link.opt file. -# -FILES_nlm_modules = \ - aprlib \ - libc \ - $(EOLIST) - -# -# If the nlm has a msg file, put it's path here -# -FILE_nlm_msg = - -# -# If the nlm has a hlp file put it's path here -# -FILE_nlm_hlp = - -# -# If this is specified, it will override $(NWOS)\copyright.txt. -# -FILE_nlm_copyright = - -# -# Any additional imports go here -# -FILES_nlm_Ximports = \ - @$(APR)/aprlib.imp \ - @$(NWOS)/httpd.imp \ - @libc.imp \ - $(EOLIST) - -# -# Any symbols exported to here -# -FILES_nlm_exports = \ - authz_dbm_module \ - $(EOLIST) - -# -# These are the OBJ files needed to create the LIB target above. -# Paths must all use the '/' character -# -FILES_lib_objs = \ - $(EOLIST) - -# -# implement targets and dependancies (leave this section alone) -# - -libs :: $(OBJDIR) $(TARGET_lib) - -nlms :: libs $(TARGET_nlm) - -# -# Updated this target to create necessary directories and copy files to the -# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples) -# -install :: nlms FORCE - -# -# Any specialized rules here -# - -# -# Include the 'tail' makefile that has targets that depend on variables defined -# in this makefile -# - -include $(AP_WORK)\build\NWGNUtail.inc - diff --git a/modules/aaa/NWGNUauthzdef b/modules/aaa/NWGNUauthzdef deleted file mode 100644 index d3b914f8485..00000000000 --- a/modules/aaa/NWGNUauthzdef +++ /dev/null @@ -1,250 +0,0 @@ -# -# Make sure all needed macro's are defined -# - -# -# Get the 'head' of the build environment if necessary. This includes default -# targets and paths to tools -# - -ifndef EnvironmentDefined -include $(AP_WORK)\build\NWGNUhead.inc -endif - -# -# These directories will be at the beginning of the include list, followed by -# INCDIRS -# -XINCDIRS += \ - $(AP_WORK)/include \ - $(NWOS) \ - $(AP_WORK)/modules/arch/netware \ - $(AP_WORK)/srclib/apr/include \ - $(AP_WORK)/srclib/apr-util/include \ - $(AP_WORK)/srclib/apr \ - $(EOLIST) - -# -# These flags will come after CFLAGS -# -XCFLAGS += \ - -prefix pre_nw.h \ - $(EOLIST) - -# -# These defines will come after DEFINES -# -XDEFINES += \ - $(EOLIST) - -# -# These flags will be added to the link.opt file -# -XLFLAGS += \ - $(EOLIST) - -# -# These values will be appended to the correct variables based on the value of -# RELEASE -# -ifeq "$(RELEASE)" "debug" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -ifeq "$(RELEASE)" "noopt" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -ifeq "$(RELEASE)" "release" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -# -# These are used by the link target if an NLM is being generated -# This is used by the link 'name' directive to name the nlm. If left blank -# TARGET_nlm (see below) will be used. -# -NLM_NAME = authzdef - -# -# This is used by the link '-desc ' directive. -# If left blank, NLM_NAME will be used. -# -NLM_DESCRIPTION = Default Authorization Module - -# -# This is used by the '-threadname' directive. If left blank, -# NLM_NAME Thread will be used. -# -NLM_THREAD_NAME = Authzdef Module - -# -# If this is specified, it will override VERSION value in -# $(AP_WORK)\build\NWGNUenvironment.inc -# -NLM_VERSION = - -# -# If this is specified, it will override the default of 64K -# -NLM_STACK_SIZE = 8192 - - -# -# If this is specified it will be used by the link '-entry' directive -# -NLM_ENTRY_SYM = _LibCPrelude - -# -# If this is specified it will be used by the link '-exit' directive -# -NLM_EXIT_SYM = _LibCPostlude - -# -# If this is specified it will be used by the link '-check' directive -# -NLM_CHECK_SYM = - -# -# If these are specified it will be used by the link '-flags' directive -# -NLM_FLAGS = AUTOUNLOAD, PSEUDOPREEMPTION - -# -# If this is specified it will be linked in with the XDCData option in the def -# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled -# by setting APACHE_UNIPROC in the environment -# -XDCDATA = - -# -# If there is an NLM target, put it here -# -TARGET_nlm = \ - $(OBJDIR)/authzdef.nlm \ - $(EOLIST) - -# -# If there is an LIB target, put it here -# -TARGET_lib = \ - $(EOLIST) - -# -# These are the OBJ files needed to create the NLM target above. -# Paths must all use the '/' character -# -FILES_nlm_objs = \ - $(OBJDIR)/mod_authz_default.o \ - $(EOLIST) - -# -# These are the LIB files needed to create the NLM target above. -# These will be added as a library command in the link.opt file. -# -FILES_nlm_libs = \ - libcpre.o \ - $(EOLIST) - -# -# These are the modules that the above NLM target depends on to load. -# These will be added as a module command in the link.opt file. -# -FILES_nlm_modules = \ - aprlib \ - libc \ - $(EOLIST) - -# -# If the nlm has a msg file, put it's path here -# -FILE_nlm_msg = - -# -# If the nlm has a hlp file put it's path here -# -FILE_nlm_hlp = - -# -# If this is specified, it will override $(NWOS)\copyright.txt. -# -FILE_nlm_copyright = - -# -# Any additional imports go here -# -FILES_nlm_Ximports = \ - @$(APR)/aprlib.imp \ - @$(NWOS)/httpd.imp \ - @libc.imp \ - $(EOLIST) - -# -# Any symbols exported to here -# -FILES_nlm_exports = \ - authz_default_module \ - $(EOLIST) - -# -# These are the OBJ files needed to create the LIB target above. -# Paths must all use the '/' character -# -FILES_lib_objs = \ - $(EOLIST) - -# -# implement targets and dependancies (leave this section alone) -# - -libs :: $(OBJDIR) $(TARGET_lib) - -nlms :: libs $(TARGET_nlm) - -# -# Updated this target to create necessary directories and copy files to the -# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples) -# -install :: nlms FORCE - -# -# Any specialized rules here -# - -# -# Include the 'tail' makefile that has targets that depend on variables defined -# in this makefile -# - -include $(AP_WORK)\build\NWGNUtail.inc - diff --git a/modules/aaa/NWGNUauthzgrp b/modules/aaa/NWGNUauthzgrp deleted file mode 100644 index 3b6f97f2810..00000000000 --- a/modules/aaa/NWGNUauthzgrp +++ /dev/null @@ -1,250 +0,0 @@ -# -# Make sure all needed macro's are defined -# - -# -# Get the 'head' of the build environment if necessary. This includes default -# targets and paths to tools -# - -ifndef EnvironmentDefined -include $(AP_WORK)\build\NWGNUhead.inc -endif - -# -# These directories will be at the beginning of the include list, followed by -# INCDIRS -# -XINCDIRS += \ - $(AP_WORK)/include \ - $(NWOS) \ - $(AP_WORK)/modules/arch/netware \ - $(AP_WORK)/srclib/apr/include \ - $(AP_WORK)/srclib/apr-util/include \ - $(AP_WORK)/srclib/apr \ - $(EOLIST) - -# -# These flags will come after CFLAGS -# -XCFLAGS += \ - -prefix pre_nw.h \ - $(EOLIST) - -# -# These defines will come after DEFINES -# -XDEFINES += \ - $(EOLIST) - -# -# These flags will be added to the link.opt file -# -XLFLAGS += \ - $(EOLIST) - -# -# These values will be appended to the correct variables based on the value of -# RELEASE -# -ifeq "$(RELEASE)" "debug" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -ifeq "$(RELEASE)" "noopt" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -ifeq "$(RELEASE)" "release" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -# -# These are used by the link target if an NLM is being generated -# This is used by the link 'name' directive to name the nlm. If left blank -# TARGET_nlm (see below) will be used. -# -NLM_NAME = authzgrp - -# -# This is used by the link '-desc ' directive. -# If left blank, NLM_NAME will be used. -# -NLM_DESCRIPTION = Group File Authorization Module - -# -# This is used by the '-threadname' directive. If left blank, -# NLM_NAME Thread will be used. -# -NLM_THREAD_NAME = AuthzGrp Module - -# -# If this is specified, it will override VERSION value in -# $(AP_WORK)\build\NWGNUenvironment.inc -# -NLM_VERSION = - -# -# If this is specified, it will override the default of 64K -# -NLM_STACK_SIZE = 8192 - - -# -# If this is specified it will be used by the link '-entry' directive -# -NLM_ENTRY_SYM = _LibCPrelude - -# -# If this is specified it will be used by the link '-exit' directive -# -NLM_EXIT_SYM = _LibCPostlude - -# -# If this is specified it will be used by the link '-check' directive -# -NLM_CHECK_SYM = - -# -# If these are specified it will be used by the link '-flags' directive -# -NLM_FLAGS = AUTOUNLOAD, PSEUDOPREEMPTION - -# -# If this is specified it will be linked in with the XDCData option in the def -# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled -# by setting APACHE_UNIPROC in the environment -# -XDCDATA = - -# -# If there is an NLM target, put it here -# -TARGET_nlm = \ - $(OBJDIR)/authzgrp.nlm \ - $(EOLIST) - -# -# If there is an LIB target, put it here -# -TARGET_lib = \ - $(EOLIST) - -# -# These are the OBJ files needed to create the NLM target above. -# Paths must all use the '/' character -# -FILES_nlm_objs = \ - $(OBJDIR)/mod_authz_groupfile.o \ - $(EOLIST) - -# -# These are the LIB files needed to create the NLM target above. -# These will be added as a library command in the link.opt file. -# -FILES_nlm_libs = \ - libcpre.o \ - $(EOLIST) - -# -# These are the modules that the above NLM target depends on to load. -# These will be added as a module command in the link.opt file. -# -FILES_nlm_modules = \ - aprlib \ - libc \ - $(EOLIST) - -# -# If the nlm has a msg file, put it's path here -# -FILE_nlm_msg = - -# -# If the nlm has a hlp file put it's path here -# -FILE_nlm_hlp = - -# -# If this is specified, it will override $(NWOS)\copyright.txt. -# -FILE_nlm_copyright = - -# -# Any additional imports go here -# -FILES_nlm_Ximports = \ - @$(APR)/aprlib.imp \ - @$(NWOS)/httpd.imp \ - @libc.imp \ - $(EOLIST) - -# -# Any symbols exported to here -# -FILES_nlm_exports = \ - authz_groupfile_module \ - $(EOLIST) - -# -# These are the OBJ files needed to create the LIB target above. -# Paths must all use the '/' character -# -FILES_lib_objs = \ - $(EOLIST) - -# -# implement targets and dependancies (leave this section alone) -# - -libs :: $(OBJDIR) $(TARGET_lib) - -nlms :: libs $(TARGET_nlm) - -# -# Updated this target to create necessary directories and copy files to the -# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples) -# -install :: nlms FORCE - -# -# Any specialized rules here -# - -# -# Include the 'tail' makefile that has targets that depend on variables defined -# in this makefile -# - -include $(AP_WORK)\build\NWGNUtail.inc - diff --git a/modules/aaa/NWGNUauthzusr b/modules/aaa/NWGNUauthzusr deleted file mode 100644 index f4f3a062598..00000000000 --- a/modules/aaa/NWGNUauthzusr +++ /dev/null @@ -1,250 +0,0 @@ -# -# Make sure all needed macro's are defined -# - -# -# Get the 'head' of the build environment if necessary. This includes default -# targets and paths to tools -# - -ifndef EnvironmentDefined -include $(AP_WORK)\build\NWGNUhead.inc -endif - -# -# These directories will be at the beginning of the include list, followed by -# INCDIRS -# -XINCDIRS += \ - $(AP_WORK)/include \ - $(NWOS) \ - $(AP_WORK)/modules/arch/netware \ - $(AP_WORK)/srclib/apr/include \ - $(AP_WORK)/srclib/apr-util/include \ - $(AP_WORK)/srclib/apr \ - $(EOLIST) - -# -# These flags will come after CFLAGS -# -XCFLAGS += \ - -prefix pre_nw.h \ - $(EOLIST) - -# -# These defines will come after DEFINES -# -XDEFINES += \ - $(EOLIST) - -# -# These flags will be added to the link.opt file -# -XLFLAGS += \ - $(EOLIST) - -# -# These values will be appended to the correct variables based on the value of -# RELEASE -# -ifeq "$(RELEASE)" "debug" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -ifeq "$(RELEASE)" "noopt" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -ifeq "$(RELEASE)" "release" -XINCDIRS += \ - $(EOLIST) - -XCFLAGS += \ - $(EOLIST) - -XDEFINES += \ - $(EOLIST) - -XLFLAGS += \ - $(EOLIST) -endif - -# -# These are used by the link target if an NLM is being generated -# This is used by the link 'name' directive to name the nlm. If left blank -# TARGET_nlm (see below) will be used. -# -NLM_NAME = authzusr - -# -# This is used by the link '-desc ' directive. -# If left blank, NLM_NAME will be used. -# -NLM_DESCRIPTION = User Authorization Module - -# -# This is used by the '-threadname' directive. If left blank, -# NLM_NAME Thread will be used. -# -NLM_THREAD_NAME = AuthzUser Module - -# -# If this is specified, it will override VERSION value in -# $(AP_WORK)\build\NWGNUenvironment.inc -# -NLM_VERSION = - -# -# If this is specified, it will override the default of 64K -# -NLM_STACK_SIZE = 8192 - - -# -# If this is specified it will be used by the link '-entry' directive -# -NLM_ENTRY_SYM = _LibCPrelude - -# -# If this is specified it will be used by the link '-exit' directive -# -NLM_EXIT_SYM = _LibCPostlude - -# -# If this is specified it will be used by the link '-check' directive -# -NLM_CHECK_SYM = - -# -# If these are specified it will be used by the link '-flags' directive -# -NLM_FLAGS = AUTOUNLOAD, PSEUDOPREEMPTION - -# -# If this is specified it will be linked in with the XDCData option in the def -# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled -# by setting APACHE_UNIPROC in the environment -# -XDCDATA = - -# -# If there is an NLM target, put it here -# -TARGET_nlm = \ - $(OBJDIR)/authzusr.nlm \ - $(EOLIST) - -# -# If there is an LIB target, put it here -# -TARGET_lib = \ - $(EOLIST) - -# -# These are the OBJ files needed to create the NLM target above. -# Paths must all use the '/' character -# -FILES_nlm_objs = \ - $(OBJDIR)/mod_authz_user.o \ - $(EOLIST) - -# -# These are the LIB files needed to create the NLM target above. -# These will be added as a library command in the link.opt file. -# -FILES_nlm_libs = \ - libcpre.o \ - $(EOLIST) - -# -# These are the modules that the above NLM target depends on to load. -# These will be added as a module command in the link.opt file. -# -FILES_nlm_modules = \ - aprlib \ - libc \ - $(EOLIST) - -# -# If the nlm has a msg file, put it's path here -# -FILE_nlm_msg = - -# -# If the nlm has a hlp file put it's path here -# -FILE_nlm_hlp = - -# -# If this is specified, it will override $(NWOS)\copyright.txt. -# -FILE_nlm_copyright = - -# -# Any additional imports go here -# -FILES_nlm_Ximports = \ - @$(APR)/aprlib.imp \ - @$(NWOS)/httpd.imp \ - @libc.imp \ - $(EOLIST) - -# -# Any symbols exported to here -# -FILES_nlm_exports = \ - authz_user_module \ - $(EOLIST) - -# -# These are the OBJ files needed to create the LIB target above. -# Paths must all use the '/' character -# -FILES_lib_objs = \ - $(EOLIST) - -# -# implement targets and dependancies (leave this section alone) -# - -libs :: $(OBJDIR) $(TARGET_lib) - -nlms :: libs $(TARGET_nlm) - -# -# Updated this target to create necessary directories and copy files to the -# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples) -# -install :: nlms FORCE - -# -# Any specialized rules here -# - -# -# Include the 'tail' makefile that has targets that depend on variables defined -# in this makefile -# - -include $(AP_WORK)\build\NWGNUtail.inc - diff --git a/modules/aaa/NWGNUauthdigt b/modules/aaa/NWGNUdigest similarity index 97% rename from modules/aaa/NWGNUauthdigt rename to modules/aaa/NWGNUdigest index e3803f64632..814db9841cd 100644 --- a/modules/aaa/NWGNUauthdigt +++ b/modules/aaa/NWGNUdigest @@ -16,7 +16,6 @@ endif # INCDIRS # XINCDIRS += \ - $(AP_WORK)/include \ $(NWOS) \ $(AP_WORK)/modules/arch/netware \ $(AP_WORK)/srclib/apr/include \ @@ -28,7 +27,6 @@ XINCDIRS += \ # These flags will come after CFLAGS # XCFLAGS += \ - -prefix pre_nw.h \ $(EOLIST) # @@ -94,7 +92,7 @@ endif # This is used by the link 'name' directive to name the nlm. If left blank # TARGET_nlm (see below) will be used. # -NLM_NAME = authdigt +NLM_NAME = digest # # This is used by the link '-desc ' directive. @@ -151,7 +149,7 @@ XDCDATA = # If there is an NLM target, put it here # TARGET_nlm = \ - $(OBJDIR)/authdigt.nlm \ + $(OBJDIR)/digest.nlm \ $(EOLIST) # diff --git a/modules/aaa/NWGNUmakefile b/modules/aaa/NWGNUmakefile index 7a45c0c60d0..fc72c7355e4 100644 --- a/modules/aaa/NWGNUmakefile +++ b/modules/aaa/NWGNUmakefile @@ -152,16 +152,9 @@ XDCDATA = # If there is an NLM target, put it here # TARGET_nlm = \ - $(OBJDIR)/authbasc.nlm \ - $(OBJDIR)/authdigt.nlm \ - $(OBJDIR)/authnano.nlm \ - $(OBJDIR)/authndbm.nlm \ - $(OBJDIR)/authndef.nlm \ - $(OBJDIR)/authnfil.nlm \ - $(OBJDIR)/authzdbm.nlm \ - $(OBJDIR)/authzdef.nlm \ - $(OBJDIR)/authzgrp.nlm \ - $(OBJDIR)/authzusr.nlm \ + $(OBJDIR)/authanon.nlm \ + $(OBJDIR)/authdbm.nlm \ + $(OBJDIR)/digest.nlm \ $(EOLIST) # diff --git a/modules/aaa/config.m4 b/modules/aaa/config.m4 index 8579d33b4dd..525e79d675a 100644 --- a/modules/aaa/config.m4 +++ b/modules/aaa/config.m4 @@ -1,46 +1,22 @@ dnl modules enabled in this directory by default -dnl Authentication (authn), Access, and Authorization (authz) - dnl APACHE_MODULE(name, helptext[, objects[, structname[, default[, config]]]]) APACHE_MODPATH_INIT(aaa) -dnl Authentication modules; modules checking a username and password against a -dnl file, database, or other similar magic. -dnl -APACHE_MODULE(authn_file, file-based authentication control, , , yes) -APACHE_MODULE(authn_dbm, DBM-based authentication control, , , most) -APACHE_MODULE(authn_anon, anonymous user authentication control, , , most) - -dnl - and just in case all of the above punt; a default handler to -dnl keep the bad guys out. -APACHE_MODULE(authn_default, authentication backstopper, , , yes) - -dnl Authorization modules: modules which verify a certain property such as -dnl membership of a group, value of the IP address against a list of pre -dnl configured directives (e.g. require, allow) or against an external file -dnl or database. -dnl -APACHE_MODULE(authz_host, host-based authorization control, , , yes) -APACHE_MODULE(authz_groupfile, 'require group' authorization control, , , yes) -APACHE_MODULE(authz_user, 'require user' authorization control, , , yes) -APACHE_MODULE(authz_dbm, DBM-based authorization control, , , most) - -dnl - and just in case all of the above punt; a default handler to -dnl keep the bad guys out. -APACHE_MODULE(authz_default, authorization control backstopper, , , yes) - -dnl these are the front-end authentication modules +APACHE_MODULE(access, host-based access control, , , yes) +APACHE_MODULE(auth, user-based access control, , , yes) +APACHE_MODULE(auth_anon, anonymous user access, , , most) +APACHE_MODULE(auth_dbm, DBM-based access databases, , , most) -APACHE_MODULE(auth_basic, basic authentication, , , yes) APACHE_MODULE(auth_digest, RFC2617 Digest authentication, , , most, [ ap_old_cppflags=$CPPFLAGS CPPFLAGS="$CPPFLAGS -I$APR_SOURCE_DIR/include -I$abs_builddir/srclib/apr/include" - AC_TRY_COMPILE([#include ], [ -#if !APR_HAS_RANDOM -#error You need APR random support to use mod_auth_digest. -#endif], , enable_auth_digest=no) + AC_TRY_COMPILE([#include ], + [#if !APR_HAS_RANDOM + #error You need APR random support to use auth_digest. + #endif],, + enable_auth_digest=no) CPPFLAGS=$ap_old_cppflags ]) diff --git a/modules/aaa/mod_authz_host.c b/modules/aaa/mod_access.c similarity index 70% rename from modules/aaa/mod_authz_host.c rename to modules/aaa/mod_access.c index 5e15d9cc1f2..af377aa6c2c 100644 --- a/modules/aaa/mod_authz_host.c +++ b/modules/aaa/mod_access.c @@ -65,7 +65,7 @@ #include "apr_strings.h" #include "apr_network_io.h" -#include "apr_md5.h" +#include "apr_lib.h" #define APR_WANT_STRFUNC #define APR_WANT_BYTEFUNC @@ -108,15 +108,15 @@ typedef struct { int order[METHODS]; apr_array_header_t *allows; apr_array_header_t *denys; -} authz_host_dir_conf; +} access_dir_conf; -module AP_MODULE_DECLARE_DATA authz_host_module; +module AP_MODULE_DECLARE_DATA access_module; -static void *create_authz_host_dir_config(apr_pool_t *p, char *dummy) +static void *create_access_dir_config(apr_pool_t *p, char *dummy) { int i; - authz_host_dir_conf *conf = - (authz_host_dir_conf *)apr_pcalloc(p, sizeof(authz_host_dir_conf)); + access_dir_conf *conf = + (access_dir_conf *)apr_pcalloc(p, sizeof(access_dir_conf)); for (i = 0; i < METHODS; ++i) { conf->order[i] = DENY_THEN_ALLOW; @@ -129,21 +129,21 @@ static void *create_authz_host_dir_config(apr_pool_t *p, char *dummy) static const char *order(cmd_parms *cmd, void *dv, const char *arg) { - authz_host_dir_conf *d = (authz_host_dir_conf *) dv; + access_dir_conf *d = (access_dir_conf *) dv; int i, o; if (!strcasecmp(arg, "allow,deny")) - o = ALLOW_THEN_DENY; + o = ALLOW_THEN_DENY; else if (!strcasecmp(arg, "deny,allow")) - o = DENY_THEN_ALLOW; + o = DENY_THEN_ALLOW; else if (!strcasecmp(arg, "mutual-failure")) - o = MUTUAL_FAILURE; + o = MUTUAL_FAILURE; else - return "unknown order"; + return "unknown order"; for (i = 0; i < METHODS; ++i) - if (cmd->limited & (AP_METHOD_BIT << i)) - d->order[i] = o; + if (cmd->limited & (AP_METHOD_BIT << i)) + d->order[i] = o; return NULL; } @@ -151,7 +151,7 @@ static const char *order(cmd_parms *cmd, void *dv, const char *arg) static const char *allow_cmd(cmd_parms *cmd, void *dv, const char *from, const char *where_c) { - authz_host_dir_conf *d = (authz_host_dir_conf *) dv; + access_dir_conf *d = (access_dir_conf *) dv; allowdeny *a; char *where = apr_pstrdup(cmd->pool, where_c); char *s; @@ -159,19 +159,19 @@ static const char *allow_cmd(cmd_parms *cmd, void *dv, const char *from, apr_status_t rv; if (strcasecmp(from, "from")) - return "allow and deny must be followed by 'from'"; + return "allow and deny must be followed by 'from'"; a = (allowdeny *) apr_array_push(cmd->info ? d->allows : d->denys); a->x.from = where; a->limited = cmd->limited; if (!strncasecmp(where, "env=", 4)) { - a->type = T_ENV; - a->x.from += 4; + a->type = T_ENV; + a->x.from += 4; } else if (!strcasecmp(where, "all")) { - a->type = T_ALL; + a->type = T_ALL; } else if ((s = strchr(where, '/'))) { *s++ = '\0'; @@ -194,7 +194,7 @@ static const char *allow_cmd(cmd_parms *cmd, void *dv, const char *from, a->type = T_IP; } else { /* no slash, didn't look like an IP address => must be a host */ - a->type = T_HOST; + a->type = T_HOST; } return NULL; @@ -202,7 +202,7 @@ static const char *allow_cmd(cmd_parms *cmd, void *dv, const char *from, static char its_an_allow; -static const command_rec authz_host_cmds[] = +static const command_rec access_cmds[] = { AP_INIT_TAKE1("order", order, NULL, OR_LIMIT, "'allow,deny', 'deny,allow', or 'mutual-failure'"), @@ -219,25 +219,21 @@ static int in_domain(const char *domain, const char *what) int wl = strlen(what); if ((wl - dl) >= 0) { - if (strcasecmp(domain, &what[wl - dl]) != 0) { - return 0; - } - - /* Make sure we matched an *entire* subdomain --- if the user - * said 'allow from good.com', we don't want people from nogood.com - * to be able to get in. - */ - - if (wl == dl) { - return 1; /* matched whole thing */ - } - else { - return (domain[0] == '.' || what[wl - dl - 1] == '.'); - } - } - else { - return 0; + if (strcasecmp(domain, &what[wl - dl]) != 0) + return 0; + + /* Make sure we matched an *entire* subdomain --- if the user + * said 'allow from good.com', we don't want people from nogood.com + * to be able to get in. + */ + + if (wl == dl) + return 1; /* matched whole thing */ + else + return (domain[0] == '.' || what[wl - dl - 1] == '.'); } + else + return 0; } static int find_allowdeny(request_rec *r, apr_array_header_t *a, int method) @@ -250,52 +246,46 @@ static int find_allowdeny(request_rec *r, apr_array_header_t *a, int method) const char *remotehost = NULL; for (i = 0; i < a->nelts; ++i) { - if (!(mmask & ap[i].limited)) { - continue; - } + if (!(mmask & ap[i].limited)) + continue; - switch (ap[i].type) { - case T_ENV: - if (apr_table_get(r->subprocess_env, ap[i].x.from)) { - return 1; - } - break; + switch (ap[i].type) { + case T_ENV: + if (apr_table_get(r->subprocess_env, ap[i].x.from)) { + return 1; + } + break; - case T_ALL: - return 1; + case T_ALL: + return 1; - case T_IP: + case T_IP: if (apr_ipsubnet_test(ap[i].x.ip, r->connection->remote_addr)) { return 1; } break; - case T_HOST: - if (!gothost) { + case T_HOST: + if (!gothost) { int remotehost_is_ip; - remotehost = ap_get_remote_host(r->connection, - r->per_dir_config, - REMOTE_DOUBLE_REV, - &remotehost_is_ip); - - if ((remotehost == NULL) || remotehost_is_ip) { - gothost = 1; - } - else { - gothost = 2; - } - } + remotehost = ap_get_remote_host(r->connection, r->per_dir_config, + REMOTE_DOUBLE_REV, &remotehost_is_ip); - if ((gothost == 2) && in_domain(ap[i].x.from, remotehost)) { - return 1; - } - break; + if ((remotehost == NULL) || remotehost_is_ip) + gothost = 1; + else + gothost = 2; + } - case T_FAIL: - /* do nothing? */ - break; - } + if ((gothost == 2) && in_domain(ap[i].x.from, remotehost)) + return 1; + break; + + case T_FAIL: + /* do nothing? */ + break; + } } return 0; @@ -305,34 +295,28 @@ static int check_dir_access(request_rec *r) { int method = r->method_number; int ret = OK; - authz_host_dir_conf *a = (authz_host_dir_conf *) - ap_get_module_config(r->per_dir_config, &authz_host_module); + access_dir_conf *a = (access_dir_conf *) + ap_get_module_config(r->per_dir_config, &access_module); if (a->order[method] == ALLOW_THEN_DENY) { ret = HTTP_FORBIDDEN; - if (find_allowdeny(r, a->allows, method)) { + if (find_allowdeny(r, a->allows, method)) ret = OK; - } - if (find_allowdeny(r, a->denys, method)) { + if (find_allowdeny(r, a->denys, method)) ret = HTTP_FORBIDDEN; - } } else if (a->order[method] == DENY_THEN_ALLOW) { - if (find_allowdeny(r, a->denys, method)) { + if (find_allowdeny(r, a->denys, method)) ret = HTTP_FORBIDDEN; - } - if (find_allowdeny(r, a->allows, method)) { + if (find_allowdeny(r, a->allows, method)) ret = OK; - } } else { if (find_allowdeny(r, a->allows, method) - && !find_allowdeny(r, a->denys, method)) { + && !find_allowdeny(r, a->denys, method)) ret = OK; - } - else { + else ret = HTTP_FORBIDDEN; - } } if (ret == HTTP_FORBIDDEN @@ -347,17 +331,16 @@ static int check_dir_access(request_rec *r) static void register_hooks(apr_pool_t *p) { - /* This can be access checker since we don't require r->user to be set. */ ap_hook_access_checker(check_dir_access,NULL,NULL,APR_HOOK_MIDDLE); } -module AP_MODULE_DECLARE_DATA authz_host_module = +module AP_MODULE_DECLARE_DATA access_module = { STANDARD20_MODULE_STUFF, - create_authz_host_dir_config, /* dir config creater */ - NULL, /* dir merger --- default is to override */ - NULL, /* server config */ - NULL, /* merge server config */ - authz_host_cmds, - register_hooks /* register hooks */ + create_access_dir_config, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server config */ + access_cmds, + register_hooks /* register hooks */ }; diff --git a/modules/aaa/mod_authn_dbm.dsp b/modules/aaa/mod_access.dsp similarity index 58% rename from modules/aaa/mod_authn_dbm.dsp rename to modules/aaa/mod_access.dsp index dc6558fe2ad..ee1118b356f 100644 --- a/modules/aaa/mod_authn_dbm.dsp +++ b/modules/aaa/mod_access.dsp @@ -1,24 +1,24 @@ -# Microsoft Developer Studio Project File - Name="mod_authn_dbm" - Package Owner=<4> +# Microsoft Developer Studio Project File - Name="mod_access" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 -CFG=mod_authn_dbm - Win32 Debug +CFG=mod_access - Win32 Release !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE -!MESSAGE NMAKE /f "mod_authn_dbm.mak". +!MESSAGE NMAKE /f "mod_access.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE -!MESSAGE NMAKE /f "mod_authn_dbm.mak" CFG="mod_authn_dbm - Win32 Debug" +!MESSAGE NMAKE /f "mod_access.mak" CFG="mod_access - Win32 Release" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE -!MESSAGE "mod_authn_dbm - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "mod_authn_dbm - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_access - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_access - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project @@ -29,7 +29,7 @@ CPP=cl.exe MTL=midl.exe RSC=rc.exe -!IF "$(CFG)" == "mod_authn_dbm - Win32 Release" +!IF "$(CFG)" == "mod_access - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -43,19 +43,19 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MD /W3 /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_authn_dbm" /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" +# ADD CPP /nologo /MD /W3 /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_access" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_authn_dbm.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authn_dbm -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_authn_dbm.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authn_dbm +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_access.so" /base:@..\..\os\win32\BaseAddr.ref,mod_access +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_access.so" /base:@..\..\os\win32\BaseAddr.ref,mod_access -!ELSEIF "$(CFG)" == "mod_authn_dbm - Win32 Debug" +!ELSEIF "$(CFG)" == "mod_access - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -69,55 +69,55 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_authn_dbm" /FD /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" +# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_access" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_authn_dbm.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authn_dbm -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_authn_dbm.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authn_dbm +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_access.so" /base:@..\..\os\win32\BaseAddr.ref,mod_access +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_access.so" /base:@..\..\os\win32\BaseAddr.ref,mod_access !ENDIF # Begin Target -# Name "mod_authn_dbm - Win32 Release" -# Name "mod_authn_dbm - Win32 Debug" +# Name "mod_access - Win32 Release" +# Name "mod_access - Win32 Debug" # Begin Source File -SOURCE=.\mod_authn_dbm.c +SOURCE=.\mod_access.c # End Source File # Begin Source File -SOURCE=.\mod_authn_dbm.rc +SOURCE=.\mod_access.rc # End Source File # Begin Source File SOURCE=..\..\build\win32\win32ver.awk -!IF "$(CFG)" == "mod_authn_dbm - Win32 Release" +!IF "$(CFG)" == "mod_access - Win32 Release" # PROP Ignore_Default_Tool 1 # Begin Custom Build - Creating Version Resource InputPath=..\..\build\win32\win32ver.awk -".\mod_authn_dbm.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_authn_dbm "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_authn_dbm.rc +".\mod_access.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_access "access_module for Apache" ../../include/ap_release.h > .\mod_access.rc # End Custom Build -!ELSEIF "$(CFG)" == "mod_authn_dbm - Win32 Debug" +!ELSEIF "$(CFG)" == "mod_access - Win32 Debug" # PROP Ignore_Default_Tool 1 # Begin Custom Build - Creating Version Resource InputPath=..\..\build\win32\win32ver.awk -".\mod_authn_dbm.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_authn_dbm "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_authn_dbm.rc +".\mod_access.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_access "access_module for Apache" ../../include/ap_release.h > .\mod_access.rc # End Custom Build diff --git a/modules/aaa/mod_access.exp b/modules/aaa/mod_access.exp new file mode 100644 index 00000000000..f8aff339dad --- /dev/null +++ b/modules/aaa/mod_access.exp @@ -0,0 +1 @@ +access_module diff --git a/modules/aaa/mod_auth.c b/modules/aaa/mod_auth.c new file mode 100644 index 00000000000..ed349bd22bf --- /dev/null +++ b/modules/aaa/mod_auth.c @@ -0,0 +1,356 @@ +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000-2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" must + * not be used to endorse or promote products derived from this + * software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * nor may "Apache" appear in their name, without prior written + * permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + * Portions of this software are based upon public domain software + * originally written at the National Center for Supercomputing Applications, + * University of Illinois, Urbana-Champaign. + */ + +/* + * http_auth: authentication + * + * Rob McCool + * + * Adapted to Apache by rst. + * + * dirkx - Added Authoritative control to allow passing on to lower + * modules if and only if the userid is not known to this + * module. A known user with a faulty or absent password still + * causes an AuthRequired. The default is 'Authoritative', i.e. + * no control is passed along. + */ + +#include "apr_strings.h" +#include "apr_md5.h" /* for apr_password_validate */ + +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_log.h" +#include "http_protocol.h" +#include "http_request.h" + + +typedef struct { + char *auth_pwfile; + char *auth_grpfile; + int auth_authoritative; +} auth_config_rec; + +static void *create_auth_dir_config(apr_pool_t *p, char *d) +{ + auth_config_rec *conf = apr_palloc(p, sizeof(*conf)); + + conf->auth_pwfile = NULL; /* just to illustrate the default really */ + conf->auth_grpfile = NULL; /* unless you have a broken HP cc */ + conf->auth_authoritative = 1; /* keep the fortress secure by default */ + return conf; +} + +static const char *set_auth_slot(cmd_parms *cmd, void *offset, const char *f, + const char *t) +{ + if (t && strcmp(t, "standard")) { + return apr_pstrcat(cmd->pool, "Invalid auth file type: ", t, NULL); + } + + return ap_set_file_slot(cmd, offset, f); +} + +static const command_rec auth_cmds[] = +{ + AP_INIT_TAKE12("AuthUserFile", set_auth_slot, + (void *)APR_OFFSETOF(auth_config_rec, auth_pwfile), + OR_AUTHCFG, "text file containing user IDs and passwords"), + AP_INIT_TAKE12("AuthGroupFile", set_auth_slot, + (void *)APR_OFFSETOF(auth_config_rec, auth_grpfile), + OR_AUTHCFG, + "text file containing group names and member user IDs"), + AP_INIT_FLAG("AuthAuthoritative", ap_set_flag_slot, + (void *)APR_OFFSETOF(auth_config_rec, auth_authoritative), + OR_AUTHCFG, + "Set to 'no' to allow access control to be passed along to " + "lower modules if the UserID is not known to this module"), + {NULL} +}; + +module AP_MODULE_DECLARE_DATA auth_module; + +static char *get_pw(request_rec *r, char *user, char *auth_pwfile) +{ + ap_configfile_t *f; + char l[MAX_STRING_LEN]; + const char *rpw, *w; + apr_status_t status; + + if ((status = ap_pcfg_openfile(&f, r->pool, auth_pwfile)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r, + "Could not open password file: %s", auth_pwfile); + return NULL; + } + while (!(ap_cfg_getline(l, MAX_STRING_LEN, f))) { + if ((l[0] == '#') || (!l[0])) { + continue; + } + rpw = l; + w = ap_getword(r->pool, &rpw, ':'); + + if (!strcmp(user, w)) { + ap_cfg_closefile(f); + return ap_getword(r->pool, &rpw, ':'); + } + } + ap_cfg_closefile(f); + return NULL; +} + +static apr_table_t *groups_for_user(apr_pool_t *p, char *user, char *grpfile) +{ + ap_configfile_t *f; + apr_table_t *grps = apr_table_make(p, 15); + apr_pool_t *sp; + char l[MAX_STRING_LEN]; + const char *group_name, *ll, *w; + apr_status_t status; + + if ((status = ap_pcfg_openfile(&f, p, grpfile)) != APR_SUCCESS) { +/*add? aplog_error(APLOG_MARK, APLOG_ERR, NULL, + "Could not open group file: %s", grpfile);*/ + return NULL; + } + + apr_pool_create(&sp, p); + + while (!(ap_cfg_getline(l, MAX_STRING_LEN, f))) { + if ((l[0] == '#') || (!l[0])) { + continue; + } + ll = l; + apr_pool_clear(sp); + + group_name = ap_getword(sp, &ll, ':'); + + while (ll[0]) { + w = ap_getword_conf(sp, &ll); + if (!strcmp(w, user)) { + apr_table_setn(grps, apr_pstrdup(p, group_name), "in"); + break; + } + } + } + ap_cfg_closefile(f); + apr_pool_destroy(sp); + return grps; +} + +/* These functions return 0 if client is OK, and proper error status + * if not... either HTTP_UNAUTHORIZED, if we made a check, and it failed, or + * HTTP_INTERNAL_SERVER_ERROR, if things are so totally confused that we + * couldn't figure out how to tell if the client is authorized or not. + * + * If they return DECLINED, and all other modules also decline, that's + * treated by the server core as a configuration error, logged and + * reported as such. + */ + +/* Determine user ID, and check if it really is that user, for HTTP + * basic authentication... + */ + +static int authenticate_basic_user(request_rec *r) +{ + auth_config_rec *conf = ap_get_module_config(r->per_dir_config, + &auth_module); + const char *sent_pw; + char *real_pw; + apr_status_t invalid_pw; + int res; + + if ((res = ap_get_basic_auth_pw(r, &sent_pw))) { + return res; + } + + if (!conf->auth_pwfile) { + return DECLINED; + } + + if (!(real_pw = get_pw(r, r->user, conf->auth_pwfile))) { + if (!(conf->auth_authoritative)) { + return DECLINED; + } + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "user %s not found: %s", r->user, r->uri); + ap_note_basic_auth_failure(r); + return HTTP_UNAUTHORIZED; + } + invalid_pw = apr_password_validate(sent_pw, real_pw); + if (invalid_pw != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "user %s: authentication failure for \"%s\": " + "Password Mismatch", + r->user, r->uri); + ap_note_basic_auth_failure(r); + return HTTP_UNAUTHORIZED; + } + return OK; +} + +/* Checking ID */ + +static int check_user_access(request_rec *r) +{ + auth_config_rec *conf = ap_get_module_config(r->per_dir_config, + &auth_module); + char *user = r->user; + int m = r->method_number; + int method_restricted = 0; + register int x; + const char *t, *w; + apr_table_t *grpstatus; + const apr_array_header_t *reqs_arr = ap_requires(r); + require_line *reqs; + + /* BUG FIX: tadc, 11-Nov-1995. If there is no "requires" directive, + * then any user will do. + */ + if (!reqs_arr) { + return OK; + } + reqs = (require_line *)reqs_arr->elts; + + if (conf->auth_grpfile) { + grpstatus = groups_for_user(r->pool, user, conf->auth_grpfile); + } + else { + grpstatus = NULL; + } + + for (x = 0; x < reqs_arr->nelts; x++) { + + if (!(reqs[x].method_mask & (AP_METHOD_BIT << m))) { + continue; + } + + method_restricted = 1; + + t = reqs[x].requirement; + w = ap_getword_white(r->pool, &t); + if (!strcmp(w, "valid-user")) { + return OK; + } + if (!strcmp(w, "user")) { + while (t[0]) { + w = ap_getword_conf(r->pool, &t); + if (!strcmp(user, w)) { + return OK; + } + } + } + else if (!strcmp(w, "group")) { + if (!grpstatus) { + return DECLINED; /* DBM group? Something else? */ + } + + while (t[0]) { + w = ap_getword_conf(r->pool, &t); + if (apr_table_get(grpstatus, w)) { + return OK; + } + } + } + else if (conf->auth_authoritative) { + /* if we aren't authoritative, any require directive could be + * valid even if we don't grok it. However, if we are + * authoritative, we can warn the user they did something wrong. + * That something could be a missing "AuthAuthoritative off", but + * more likely is a typo in the require directive. + */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "access to %s failed, reason: unknown require " + "directive:\"%s\"", r->uri, reqs[x].requirement); + } + } + + if (!method_restricted) { + return OK; + } + + if (!(conf->auth_authoritative)) { + return DECLINED; + } + + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "access to %s failed, reason: user %s not allowed access", + r->uri, user); + + ap_note_basic_auth_failure(r); + return HTTP_UNAUTHORIZED; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_check_user_id(authenticate_basic_user,NULL,NULL,APR_HOOK_MIDDLE); + ap_hook_auth_checker(check_user_access,NULL,NULL,APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA auth_module = +{ + STANDARD20_MODULE_STUFF, + create_auth_dir_config, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server config */ + auth_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/modules/aaa/mod_authn_file.dsp b/modules/aaa/mod_auth.dsp similarity index 58% rename from modules/aaa/mod_authn_file.dsp rename to modules/aaa/mod_auth.dsp index 77cd4173050..b2d6863ce9f 100644 --- a/modules/aaa/mod_authn_file.dsp +++ b/modules/aaa/mod_auth.dsp @@ -1,24 +1,24 @@ -# Microsoft Developer Studio Project File - Name="mod_authn_file" - Package Owner=<4> +# Microsoft Developer Studio Project File - Name="mod_auth" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 -CFG=mod_authn_file - Win32 Debug +CFG=mod_auth - Win32 Release !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE -!MESSAGE NMAKE /f "mod_authn_file.mak". +!MESSAGE NMAKE /f "mod_auth.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE -!MESSAGE NMAKE /f "mod_authn_file.mak" CFG="mod_authn_file - Win32 Debug" +!MESSAGE NMAKE /f "mod_auth.mak" CFG="mod_auth - Win32 Release" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE -!MESSAGE "mod_authn_file - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "mod_authn_file - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_auth - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_auth - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project @@ -29,7 +29,7 @@ CPP=cl.exe MTL=midl.exe RSC=rc.exe -!IF "$(CFG)" == "mod_authn_file - Win32 Release" +!IF "$(CFG)" == "mod_auth - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -43,19 +43,19 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MD /W3 /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_authn_file" /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" +# ADD CPP /nologo /MD /W3 /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_auth" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_authn_file.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authn_file -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_authn_file.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authn_file +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_auth.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_auth.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth -!ELSEIF "$(CFG)" == "mod_authn_file - Win32 Debug" +!ELSEIF "$(CFG)" == "mod_auth - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -69,55 +69,55 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_authn_file" /FD /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" +# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_auth" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_authn_file.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authn_file -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_authn_file.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authn_file +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_auth.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_auth.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth !ENDIF # Begin Target -# Name "mod_authn_file - Win32 Release" -# Name "mod_authn_file - Win32 Debug" +# Name "mod_auth - Win32 Release" +# Name "mod_auth - Win32 Debug" # Begin Source File -SOURCE=.\mod_authn_file.c +SOURCE=.\mod_auth.c # End Source File # Begin Source File -SOURCE=.\mod_authn_file.rc +SOURCE=.\mod_auth.rc # End Source File # Begin Source File SOURCE=..\..\build\win32\win32ver.awk -!IF "$(CFG)" == "mod_authn_file - Win32 Release" +!IF "$(CFG)" == "mod_auth - Win32 Release" # PROP Ignore_Default_Tool 1 # Begin Custom Build - Creating Version Resource InputPath=..\..\build\win32\win32ver.awk -".\mod_authn_file.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_authn_file "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_authn_file.rc +".\mod_auth.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_auth "auth_module for Apache" ../../include/ap_release.h > .\mod_auth.rc # End Custom Build -!ELSEIF "$(CFG)" == "mod_authn_file - Win32 Debug" +!ELSEIF "$(CFG)" == "mod_auth - Win32 Debug" # PROP Ignore_Default_Tool 1 # Begin Custom Build - Creating Version Resource InputPath=..\..\build\win32\win32ver.awk -".\mod_authn_file.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_authn_file "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_authn_file.rc +".\mod_auth.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_auth "auth_module for Apache" ../../include/ap_release.h > .\mod_auth.rc # End Custom Build diff --git a/modules/aaa/mod_auth.exp b/modules/aaa/mod_auth.exp new file mode 100644 index 00000000000..76adad0a66b --- /dev/null +++ b/modules/aaa/mod_auth.exp @@ -0,0 +1 @@ +auth_module diff --git a/modules/aaa/mod_auth.h b/modules/aaa/mod_auth.h deleted file mode 100644 index bf334601b09..00000000000 --- a/modules/aaa/mod_auth.h +++ /dev/null @@ -1,111 +0,0 @@ -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * nor may "Apache" appear in their name, without prior written - * permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ - -#ifndef APACHE_MOD_AUTH_H -#define APACHE_MOD_AUTH_H - -#include "apr_pools.h" -#include "apr_hash.h" - -#include "httpd.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define AUTHN_PROVIDER_GROUP "authn" -#define AUTHN_DEFAULT_PROVIDER "file" - -typedef enum { - AUTH_DENIED, - AUTH_GRANTED, - AUTH_USER_FOUND, - AUTH_USER_NOT_FOUND, - AUTH_GENERAL_ERROR -} authn_status; - -typedef struct { - /* Given a username and password, expected to return AUTH_GRANTED - * if we can validate this user/password combination. - */ - authn_status (*check_password)(request_rec *r, const char *user, - const char *password); - - /* Given a user and realm, expected to return AUTH_USER_FOUND if we - * can find a md5 hash of 'user:realm:password' - */ - authn_status (*get_realm_hash)(request_rec *r, const char *user, - const char *realm, char **rethash); -} authn_provider; - -/* A linked-list of authn providers. */ -typedef struct authn_provider_list authn_provider_list; - -struct authn_provider_list { - const char *provider_name; - const authn_provider *provider; - authn_provider_list *next; -}; - -typedef struct { - /* For a given user, return a hash of all groups the user belongs to. */ - apr_hash_t * (*get_user_groups)(request_rec *r, const char *user); -} authz_provider; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/modules/aaa/mod_authn_anon.c b/modules/aaa/mod_auth_anon.c similarity index 68% rename from modules/aaa/mod_authn_anon.c rename to modules/aaa/mod_auth_anon.c index 28c1c81db9b..0726e9f295e 100644 --- a/modules/aaa/mod_authn_anon.c +++ b/modules/aaa/mod_auth_anon.c @@ -106,87 +106,85 @@ #include "http_request.h" #include "http_protocol.h" -typedef struct anon_auth_pw { +typedef struct anon_auth { char *password; - struct anon_auth_pw *next; -} anon_auth_pw; + struct anon_auth *next; +} anon_auth; typedef struct { - anon_auth_pw *passwords; - int nouserid; - int logemail; - int verifyemail; - int mustemail; - int authoritative; -} authn_anon_config_rec; + anon_auth *anon_auth_passwords; + int anon_auth_nouserid; + int anon_auth_logemail; + int anon_auth_verifyemail; + int anon_auth_mustemail; + int anon_auth_authoritative; +} anon_auth_config_rec; -static void *create_authn_anon_dir_config(apr_pool_t *p, char *d) +static void *create_anon_auth_dir_config(apr_pool_t *p, char *d) { - authn_anon_config_rec *conf = apr_palloc(p, sizeof(*conf)); + anon_auth_config_rec *conf = apr_palloc(p, sizeof(*conf)); /* just to illustrate the defaults really. */ - conf->passwords = NULL; + conf->anon_auth_passwords = NULL; - conf->nouserid = 0; - conf->logemail = 1; - conf->verifyemail = 0; - conf->mustemail = 1; - conf->authoritative = 0; + conf->anon_auth_nouserid = 0; + conf->anon_auth_logemail = 1; + conf->anon_auth_verifyemail = 0; + conf->anon_auth_mustemail = 1; + conf->anon_auth_authoritative = 0; return conf; } static const char *anon_set_string_slots(cmd_parms *cmd, void *my_config, const char *arg) { - authn_anon_config_rec *conf = my_config; - anon_auth_pw *first; + anon_auth_config_rec *conf = my_config; + anon_auth *first; - if (!(*arg)) { - return "Anonymous string cannot be empty, use Anonymous_NoUserId"; - } + if (!(*arg)) + return "Anonymous string cannot be empty, use Anonymous_NoUserId instead"; /* squeeze in a record */ - first = conf->passwords; + first = conf->anon_auth_passwords; - if (!(conf->passwords = apr_palloc(cmd->pool, sizeof(anon_auth_pw))) || - !(conf->passwords->password = apr_pstrdup(cmd->pool, arg))) { - return "Failed to claim memory for an anonymous password..."; - } + if (!(conf->anon_auth_passwords = apr_palloc(cmd->pool, sizeof(anon_auth))) || + !(conf->anon_auth_passwords->password = apr_pstrdup(cmd->pool, arg))) + return "Failed to claim memory for an anonymous password..."; /* and repair the next */ - conf->passwords->next = first; + conf->anon_auth_passwords->next = first; return NULL; } -static const command_rec authn_anon_cmds[] = +static const command_rec anon_auth_cmds[] = { AP_INIT_ITERATE("Anonymous", anon_set_string_slots, NULL, OR_AUTHCFG, "a space-separated list of user IDs"), AP_INIT_FLAG("Anonymous_MustGiveEmail", ap_set_flag_slot, - (void *)APR_OFFSETOF(authn_anon_config_rec, mustemail), + (void *)APR_OFFSETOF(anon_auth_config_rec, anon_auth_mustemail), OR_AUTHCFG, "Limited to 'on' or 'off'"), AP_INIT_FLAG("Anonymous_NoUserId", ap_set_flag_slot, - (void *)APR_OFFSETOF(authn_anon_config_rec, nouserid), + (void *)APR_OFFSETOF(anon_auth_config_rec, anon_auth_nouserid), OR_AUTHCFG, "Limited to 'on' or 'off'"), AP_INIT_FLAG("Anonymous_VerifyEmail", ap_set_flag_slot, - (void *)APR_OFFSETOF(authn_anon_config_rec, verifyemail), + (void *)APR_OFFSETOF(anon_auth_config_rec, anon_auth_verifyemail), OR_AUTHCFG, "Limited to 'on' or 'off'"), AP_INIT_FLAG("Anonymous_LogEmail", ap_set_flag_slot, - (void *)APR_OFFSETOF(authn_anon_config_rec, logemail), + (void *)APR_OFFSETOF(anon_auth_config_rec, anon_auth_logemail), OR_AUTHCFG, "Limited to 'on' or 'off'"), AP_INIT_FLAG("Anonymous_Authoritative", ap_set_flag_slot, - (void *)APR_OFFSETOF(authn_anon_config_rec, authoritative), + (void *)APR_OFFSETOF(anon_auth_config_rec, anon_auth_authoritative), OR_AUTHCFG, "Limited to 'on' or 'off'"), {NULL} }; -module AP_MODULE_DECLARE_DATA authn_anon_module; +module AP_MODULE_DECLARE_DATA auth_anon_module; static int anon_authenticate_basic_user(request_rec *r) { - authn_anon_config_rec *conf = ap_get_module_config(r->per_dir_config, - &authn_anon_module); + anon_auth_config_rec *conf = ap_get_module_config(r->per_dir_config, + &auth_anon_module); const char *sent_pw; int res = DECLINED; @@ -195,18 +193,18 @@ static int anon_authenticate_basic_user(request_rec *r) } /* Ignore if we are not configured */ - if (!conf->passwords) { + if (!conf->anon_auth_passwords) { return DECLINED; } /* Do we allow an empty userID and/or is it the magic one */ - if ((!(r->user[0])) && (conf->nouserid)) { + if ((!(r->user[0])) && (conf->anon_auth_nouserid)) { res = OK; } else { - anon_auth_pw *p = conf->passwords; + anon_auth *p = conf->anon_auth_passwords; res = DECLINED; while ((res == DECLINED) && (p != NULL)) { if (!(strcasecmp(r->user, p->password))) { @@ -215,13 +213,16 @@ static int anon_authenticate_basic_user(request_rec *r) p = p->next; } } - /* Is username is OK and password been filled out (if required) */ - if ((res == OK) && ((!conf->mustemail) || strlen(sent_pw)) && + if ( + /* username is OK */ + (res == OK) + /* password been filled out ? */ + && ((!conf->anon_auth_mustemail) || strlen(sent_pw)) /* does the password look like an email address ? */ - ((!conf->verifyemail) || - ((strpbrk("@", sent_pw) != NULL) && - (strpbrk(".", sent_pw) != NULL)))) { - if (conf->logemail && ap_is_initial_req(r)) { + && ((!conf->anon_auth_verifyemail) + || ((strpbrk("@", sent_pw) != NULL) + && (strpbrk(".", sent_pw) != NULL)))) { + if (conf->anon_auth_logemail && ap_is_initial_req(r)) { ap_log_rerror(APLOG_MARK, APLOG_INFO, APR_SUCCESS, r, "Anonymous: Passwd <%s> Accepted", sent_pw ? sent_pw : "\'none\'"); @@ -229,7 +230,7 @@ static int anon_authenticate_basic_user(request_rec *r) return OK; } else { - if (conf->authoritative) { + if (conf->anon_auth_authoritative) { ap_log_rerror(APLOG_MARK, APLOG_ERR, APR_SUCCESS, r, "Anonymous: Authoritative, Passwd <%s> not accepted", sent_pw ? sent_pw : "\'none\'"); @@ -241,18 +242,39 @@ static int anon_authenticate_basic_user(request_rec *r) return DECLINED; } +static int check_anon_access(request_rec *r) +{ +#ifdef NOTYET + conn_rec *c = r->connection; + anon_auth_config_rec *conf = ap_get_module_config(r->per_dir_config, + &auth_anon_module); + + if (!conf->anon_auth) { + return DECLINED; + } + + if (strcasecmp(r->connection->user, conf->anon_auth)) { + return DECLINED; + } + + return OK; +#endif + return DECLINED; +} + static void register_hooks(apr_pool_t *p) { ap_hook_check_user_id(anon_authenticate_basic_user,NULL,NULL,APR_HOOK_MIDDLE); + ap_hook_auth_checker(check_anon_access,NULL,NULL,APR_HOOK_MIDDLE); } -module AP_MODULE_DECLARE_DATA authn_anon_module = +module AP_MODULE_DECLARE_DATA auth_anon_module = { STANDARD20_MODULE_STUFF, - create_authn_anon_dir_config, /* dir config creater */ - NULL, /* dir merger ensure strictness */ - NULL, /* server config */ - NULL, /* merge server config */ - authn_anon_cmds, /* command apr_table_t */ - register_hooks /* register hooks */ + create_anon_auth_dir_config, /* dir config creater */ + NULL, /* dir merger ensure strictness */ + NULL, /* server config */ + NULL, /* merge server config */ + anon_auth_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ }; diff --git a/modules/aaa/mod_authz_dbm.dsp b/modules/aaa/mod_auth_anon.dsp similarity index 60% rename from modules/aaa/mod_authz_dbm.dsp rename to modules/aaa/mod_auth_anon.dsp index 833e7aecd36..9f2cd2d355d 100644 --- a/modules/aaa/mod_authz_dbm.dsp +++ b/modules/aaa/mod_auth_anon.dsp @@ -1,24 +1,24 @@ -# Microsoft Developer Studio Project File - Name="mod_authz_dbm" - Package Owner=<4> +# Microsoft Developer Studio Project File - Name="mod_auth_anon" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 -CFG=mod_authz_dbm - Win32 Debug +CFG=mod_auth_anon - Win32 Release !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE -!MESSAGE NMAKE /f "mod_authz_dbm.mak". +!MESSAGE NMAKE /f "mod_auth_anon.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE -!MESSAGE NMAKE /f "mod_authz_dbm.mak" CFG="mod_authz_dbm - Win32 Debug" +!MESSAGE NMAKE /f "mod_auth_anon.mak" CFG="mod_auth_anon - Win32 Release" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE -!MESSAGE "mod_authz_dbm - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "mod_authz_dbm - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_auth_anon - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_auth_anon - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project @@ -29,7 +29,7 @@ CPP=cl.exe MTL=midl.exe RSC=rc.exe -!IF "$(CFG)" == "mod_authz_dbm - Win32 Release" +!IF "$(CFG)" == "mod_auth_anon - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -43,19 +43,19 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MD /W3 /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_authz_dbm" /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" +# ADD CPP /nologo /MD /W3 /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_auth_anon" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_authz_dbm.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_dbm -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_authz_dbm.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_dbm +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_auth_anon.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_anon +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_auth_anon.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_anon -!ELSEIF "$(CFG)" == "mod_authz_dbm - Win32 Debug" +!ELSEIF "$(CFG)" == "mod_auth_anon - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -69,55 +69,55 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_authz_dbm" /FD /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" +# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_auth_anon" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_authz_dbm.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_dbm -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_authz_dbm.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_dbm +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_auth_anon.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_anon +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_auth_anon.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_anon !ENDIF # Begin Target -# Name "mod_authz_dbm - Win32 Release" -# Name "mod_authz_dbm - Win32 Debug" +# Name "mod_auth_anon - Win32 Release" +# Name "mod_auth_anon - Win32 Debug" # Begin Source File -SOURCE=.\mod_authz_dbm.c +SOURCE=.\mod_auth_anon.c # End Source File # Begin Source File -SOURCE=.\mod_authz_dbm.rc +SOURCE=.\mod_auth_anon.rc # End Source File # Begin Source File SOURCE=..\..\build\win32\win32ver.awk -!IF "$(CFG)" == "mod_authz_dbm - Win32 Release" +!IF "$(CFG)" == "mod_auth_anon - Win32 Release" # PROP Ignore_Default_Tool 1 # Begin Custom Build - Creating Version Resource InputPath=..\..\build\win32\win32ver.awk -".\mod_authz_dbm.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_authz_dbm "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_authz_dbm.rc +".\mod_auth_anon.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_auth_anon "auth_anon_module for Apache" ../../include/ap_release.h > .\mod_auth_anon.rc # End Custom Build -!ELSEIF "$(CFG)" == "mod_authz_dbm - Win32 Debug" +!ELSEIF "$(CFG)" == "mod_auth_anon - Win32 Debug" # PROP Ignore_Default_Tool 1 # Begin Custom Build - Creating Version Resource InputPath=..\..\build\win32\win32ver.awk -".\mod_authz_dbm.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_authz_dbm "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_authz_dbm.rc +".\mod_auth_anon.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_auth_anon "auth_anon_module for Apache" ../../include/ap_release.h > .\mod_auth_anon.rc # End Custom Build diff --git a/modules/aaa/mod_auth_anon.exp b/modules/aaa/mod_auth_anon.exp new file mode 100644 index 00000000000..63282532a9a --- /dev/null +++ b/modules/aaa/mod_auth_anon.exp @@ -0,0 +1 @@ +auth_anon_module diff --git a/modules/aaa/mod_auth_basic.c b/modules/aaa/mod_auth_basic.c deleted file mode 100644 index a5f99beff80..00000000000 --- a/modules/aaa/mod_auth_basic.c +++ /dev/null @@ -1,340 +0,0 @@ -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * nor may "Apache" appear in their name, without prior written - * permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - * Portions of this software are based upon public domain software - * originally written at the National Center for Supercomputing Applications, - * University of Illinois, Urbana-Champaign. - */ - -#include "apr_strings.h" -#include "apr_md5.h" /* for apr_password_validate */ -#include "apr_lib.h" /* for apr_isspace */ -#include "apr_base64.h" /* for apr_base64_decode et al */ -#define APR_WANT_STRFUNC /* for strcasecmp */ -#include "apr_want.h" - -#include "ap_config.h" -#include "httpd.h" -#include "http_config.h" -#include "http_core.h" -#include "http_log.h" -#include "http_protocol.h" -#include "http_request.h" -#include "ap_provider.h" - -#include "mod_auth.h" - -typedef struct { - authn_provider_list *providers; - char *dir; - int authoritative; -} auth_basic_config_rec; - -static void *create_auth_basic_dir_config(apr_pool_t *p, char *d) -{ - auth_basic_config_rec *conf = apr_pcalloc(p, sizeof(*conf)); - - conf->dir = d; - /* Any failures are fatal. */ - conf->authoritative = 1; - - return conf; -} - -static const char *add_authn_provider(cmd_parms *cmd, void *config, - const char *arg) -{ - auth_basic_config_rec *conf = (auth_basic_config_rec*)config; - authn_provider_list *newp; - const char *provider_name; - - if (strcasecmp(arg, "on") == 0) { - provider_name = AUTHN_DEFAULT_PROVIDER; - } - else if (strcasecmp(arg, "off") == 0) { - /* Clear all configured providers and return. */ - conf->providers = NULL; - return NULL; - } - else { - provider_name = apr_pstrdup(cmd->pool, arg); - } - - newp = apr_pcalloc(cmd->pool, sizeof(authn_provider_list)); - newp->provider_name = provider_name; - - /* lookup and cache the actual provider now */ - newp->provider = ap_lookup_provider(AUTHN_PROVIDER_GROUP, - newp->provider_name); - - if (newp->provider == NULL) { - /* by the time they use it, the provider should be loaded and - registered with us. */ - return apr_psprintf(cmd->pool, - "Unknown Authn provider: %s", - newp->provider_name); - } - - /* Add it to the list now. */ - if (!conf->providers) { - conf->providers = newp; - } - else { - authn_provider_list *last = conf->providers; - - while (last->next) { - last = last->next; - } - last->next = newp; - } - - return NULL; -} - -static const command_rec auth_basic_cmds[] = -{ - AP_INIT_ITERATE("AuthBasicProvider", add_authn_provider, NULL, ACCESS_CONF, - "specify the auth providers for a directory or location"), - AP_INIT_FLAG("AuthBasicAuthoritative", ap_set_flag_slot, - (void *)APR_OFFSETOF(auth_basic_config_rec, authoritative), - OR_AUTHCFG, - "Set to 'no' to allow access control to be passed along to " - "lower modules if the UserID is not known to this module"), - {NULL} -}; - -module AP_MODULE_DECLARE_DATA auth_basic_module; - -/* These functions return 0 if client is OK, and proper error status - * if not... either HTTP_UNAUTHORIZED, if we made a check, and it failed, or - * HTTP_INTERNAL_SERVER_ERROR, if things are so totally confused that we - * couldn't figure out how to tell if the client is authorized or not. - * - * If they return DECLINED, and all other modules also decline, that's - * treated by the server core as a configuration error, logged and - * reported as such. - */ - -static void note_basic_auth_failure(request_rec *r) -{ - apr_table_setn(r->err_headers_out, - (PROXYREQ_PROXY == r->proxyreq) ? "Proxy-Authenticate" - : "WWW-Authenticate", - apr_pstrcat(r->pool, "Basic realm=\"", ap_auth_name(r), - "\"", NULL)); -} - -static int get_basic_auth(request_rec *r, const char **user, - const char **pw) -{ - const char *auth_line; - char *decoded_line; - int length; - - /* Get the appropriate header */ - auth_line = apr_table_get(r->headers_in, (PROXYREQ_PROXY == r->proxyreq) - ? "Proxy-Authorization" - : "Authorization"); - - if (!auth_line) { - note_basic_auth_failure(r); - return HTTP_UNAUTHORIZED; - } - - if (strcasecmp(ap_getword(r->pool, &auth_line, ' '), "Basic")) { - /* Client tried to authenticate using wrong auth scheme */ - ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, - "client used wrong authentication scheme: %s", r->uri); - note_basic_auth_failure(r); - return HTTP_UNAUTHORIZED; - } - - /* Skip leading spaces. */ - while (apr_isspace(*auth_line)) { - auth_line++; - } - - decoded_line = apr_palloc(r->pool, apr_base64_decode_len(auth_line) + 1); - length = apr_base64_decode(decoded_line, auth_line); - /* Null-terminate the string. */ - decoded_line[length] = '\0'; - - *user = ap_getword_nulls(r->pool, (const char**)&decoded_line, ':'); - *pw = decoded_line; - - return OK; -} - -/* Determine user ID, and check if it really is that user, for HTTP - * basic authentication... - */ -static int authenticate_basic_user(request_rec *r) -{ - auth_basic_config_rec *conf = ap_get_module_config(r->per_dir_config, - &auth_basic_module); - const char *sent_user, *sent_pw, *current_auth; - int res; - authn_status auth_result; - authn_provider_list *current_provider; - - /* Are we configured to be Basic auth? */ - current_auth = ap_auth_type(r); - if (!current_auth || strcasecmp(current_auth, "Basic")) { - return DECLINED; - } - - /* We need an authentication realm. */ - if (!ap_auth_name(r)) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, - 0, r, "need AuthName: %s", r->uri); - return HTTP_INTERNAL_SERVER_ERROR; - } - - r->ap_auth_type = "Basic"; - - res = get_basic_auth(r, &sent_user, &sent_pw); - if (res) { - return res; - } - - current_provider = conf->providers; - do { - const authn_provider *provider; - - /* For now, if a provider isn't set, we'll be nice and use the file - * provider. - */ - if (!current_provider) { - provider = ap_lookup_provider(AUTHN_PROVIDER_GROUP, - AUTHN_DEFAULT_PROVIDER); - } - else { - provider = current_provider->provider; - } - - auth_result = provider->check_password(r, sent_user, sent_pw); - - /* Access is granted. Stop checking. */ - if (auth_result == AUTH_GRANTED) { - break; - } - - /* If we're not really configured for providers, stop now. */ - if (!conf->providers) { - break; - } - - current_provider = current_provider->next; - } while (current_provider); - - if (auth_result != AUTH_GRANTED) { - int return_code; - - /* If we're not authoritative, then any error is ignored. */ - if (!(conf->authoritative)) { - return DECLINED; - } - - switch (auth_result) { - case AUTH_DENIED: - ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, - "user %s: authentication failure for \"%s\": " - "Password Mismatch", - sent_user, r->uri); - return_code = HTTP_UNAUTHORIZED; - break; - case AUTH_USER_NOT_FOUND: - ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, - "user %s not found: %s", sent_user, r->uri); - return_code = HTTP_UNAUTHORIZED; - break; - case AUTH_GENERAL_ERROR: - default: - /* We'll assume that the module has already said what its error - * was in the logs. - */ - return_code = HTTP_INTERNAL_SERVER_ERROR; - break; - } - - /* If we're returning 403, tell them to try again. */ - if (return_code == HTTP_UNAUTHORIZED) { - note_basic_auth_failure(r); - } - return return_code; - } - - /* Now that we are done, set the request_rec values so others will know - * who we are. - */ - r->user = (char*)sent_user; - r->ap_auth_type = "Basic"; - - return OK; -} - -static void register_hooks(apr_pool_t *p) -{ - ap_hook_check_user_id(authenticate_basic_user,NULL,NULL,APR_HOOK_MIDDLE); -} - -module AP_MODULE_DECLARE_DATA auth_basic_module = -{ - STANDARD20_MODULE_STUFF, - create_auth_basic_dir_config, /* dir config creater */ - NULL, /* dir merger --- default is to override */ - NULL, /* server config */ - NULL, /* merge server config */ - auth_basic_cmds, /* command apr_table_t */ - register_hooks /* register hooks */ -}; diff --git a/modules/aaa/mod_auth_basic.dsp b/modules/aaa/mod_auth_basic.dsp deleted file mode 100644 index dfad8574538..00000000000 --- a/modules/aaa/mod_auth_basic.dsp +++ /dev/null @@ -1,128 +0,0 @@ -# Microsoft Developer Studio Project File - Name="mod_auth_basic" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=mod_auth_basic - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "mod_auth_basic.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "mod_auth_basic.mak" CFG="mod_auth_basic - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "mod_auth_basic - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "mod_auth_basic - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "mod_auth_basic - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MD /W3 /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "AAA_DECLARE_EXPORT" /Fd"Release\mod_auth_basic" /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_auth_basic.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_basic -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_auth_basic.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_basic - -!ELSEIF "$(CFG)" == "mod_auth_basic - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MDd /W3 /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "AAA_DECLARE_EXPORT" /Fd"Debug\mod_auth_basic" /FD /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_auth_basic.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_basic -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_auth_basic.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_basic - -!ENDIF - -# Begin Target - -# Name "mod_auth_basic - Win32 Release" -# Name "mod_auth_basic - Win32 Debug" -# Begin Source File - -SOURCE=.\mod_auth_basic.c -# End Source File -# Begin Source File - -SOURCE=.\mod_auth_basic.rc -# End Source File -# Begin Source File - -SOURCE=..\..\build\win32\win32ver.awk - -!IF "$(CFG)" == "mod_auth_basic - Win32 Release" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Creating Version Resource -InputPath=..\..\build\win32\win32ver.awk - -".\mod_auth_basic.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_auth_basic "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_auth_basic.rc - -# End Custom Build - -!ELSEIF "$(CFG)" == "mod_auth_basic - Win32 Debug" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Creating Version Resource -InputPath=..\..\build\win32\win32ver.awk - -".\mod_auth_basic.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_auth_basic "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_auth_basic.rc - -# End Custom Build - -!ENDIF - -# End Source File -# End Target -# End Project diff --git a/modules/aaa/mod_authz_dbm.c b/modules/aaa/mod_auth_dbm.c similarity index 54% rename from modules/aaa/mod_authz_dbm.c rename to modules/aaa/mod_auth_dbm.c index fa95303b6e3..c14e5fab47c 100644 --- a/modules/aaa/mod_authz_dbm.c +++ b/modules/aaa/mod_auth_dbm.c @@ -74,7 +74,7 @@ #include "apr_want.h" #include "apr_strings.h" #include "apr_dbm.h" -#include "apr_md5.h" +#include "apr_md5.h" /* for apr_password_validate */ #include "httpd.h" #include "http_config.h" @@ -83,82 +83,104 @@ #include "http_protocol.h" #include "http_request.h" /* for ap_hook_(check_user_id | auth_checker)*/ + typedef struct { - char *grpfile; - char *dbmtype; - int authoritative; -} authz_dbm_config_rec; + char *auth_dbmpwfile; + char *auth_dbmgrpfile; + char *auth_dbmtype; + int auth_dbmauthoritative; +} dbm_auth_config_rec; -/* This should go into APR; perhaps with some nice - * caching/locking/flocking of the open dbm file. - * - * Duplicated in mod_auth_dbm.c - */ -static apr_status_t get_dbm_entry_as_str(request_rec *r, char *user, - char *auth_dbmfile, char *dbtype, - char ** str) +static void *create_dbm_auth_dir_config(apr_pool_t *p, char *d) +{ + dbm_auth_config_rec *conf = apr_palloc(p, sizeof(*conf)); + + conf->auth_dbmpwfile = NULL; + conf->auth_dbmgrpfile = NULL; + conf->auth_dbmtype = "default"; + conf->auth_dbmauthoritative = 1; /* fortress is secure by default */ + + return conf; +} + +static const char *set_dbm_slot(cmd_parms *cmd, void *offset, + const char *f, const char *t) +{ + if (!t || strcmp(t, "dbm")) + return DECLINE_CMD; + + return ap_set_file_slot(cmd, offset, f); +} + +static const char *set_dbm_type(cmd_parms *cmd, + void *dir_config, + const char *arg) +{ + dbm_auth_config_rec *conf = dir_config; + + conf->auth_dbmtype = apr_pstrdup(cmd->pool, arg); + return NULL; +} + +static const command_rec dbm_auth_cmds[] = +{ + AP_INIT_TAKE1("AuthDBMUserFile", ap_set_file_slot, + (void *)APR_OFFSETOF(dbm_auth_config_rec, auth_dbmpwfile), + OR_AUTHCFG, "dbm database file containing user IDs and passwords"), + AP_INIT_TAKE1("AuthDBMGroupFile", ap_set_file_slot, + (void *)APR_OFFSETOF(dbm_auth_config_rec, auth_dbmgrpfile), + OR_AUTHCFG, "dbm database file containing group names and member user IDs"), + AP_INIT_TAKE12("AuthUserFile", set_dbm_slot, + (void *)APR_OFFSETOF(dbm_auth_config_rec, auth_dbmpwfile), + OR_AUTHCFG, NULL), + AP_INIT_TAKE12("AuthGroupFile", set_dbm_slot, + (void *)APR_OFFSETOF(dbm_auth_config_rec, auth_dbmgrpfile), + OR_AUTHCFG, NULL), + AP_INIT_TAKE1("AuthDBMType", set_dbm_type, + NULL, + OR_AUTHCFG, "what type of DBM file the user file is"), + AP_INIT_FLAG("AuthDBMAuthoritative", ap_set_flag_slot, + (void *)APR_OFFSETOF(dbm_auth_config_rec, auth_dbmauthoritative), + OR_AUTHCFG, "Set to 'no' to allow access control to be passed along to lower modules, if the UserID is not known in this module"), + {NULL} +}; + +module AP_MODULE_DECLARE_DATA auth_dbm_module; + +static char *get_dbm_pw(request_rec *r, + char *user, + char *auth_dbmpwfile, + char *dbtype) { apr_dbm_t *f; apr_datum_t d, q; char *pw = NULL; apr_status_t retval; q.dptr = user; - #ifndef NETSCAPE_DBM_COMPAT q.dsize = strlen(q.dptr); #else q.dsize = strlen(q.dptr) + 1; #endif - retval = apr_dbm_open_ex(&f, dbtype, auth_dbmfile, APR_DBM_READONLY, + retval = apr_dbm_open_ex(&f, dbtype, auth_dbmpwfile, APR_DBM_READONLY, APR_OS_DEFAULT, r->pool); - if (retval != APR_SUCCESS) { - return retval; + ap_log_rerror(APLOG_MARK, APLOG_ERR, retval, r, + "could not open dbm (type %s) auth file: %s", dbtype, + auth_dbmpwfile); + return NULL; } - - *str = NULL; - if (apr_dbm_fetch(f, q, &d) == APR_SUCCESS && d.dptr) { - *str = apr_palloc(r->pool, d.dsize + 1); + pw = apr_palloc(r->pool, d.dsize + 1); strncpy(pw, d.dptr, d.dsize); - *str[d.dsize] = '\0'; /* Terminate the string */ + pw[d.dsize] = '\0'; /* Terminate the string */ } apr_dbm_close(f); - - return retval; + return pw; } -static void *create_authz_dbm_dir_config(apr_pool_t *p, char *d) -{ - authz_dbm_config_rec *conf = apr_palloc(p, sizeof(*conf)); - - conf->grpfile = NULL; - conf->dbmtype = "default"; - conf->authoritative = 1; /* fortress is secure by default */ - - return conf; -} - -static const command_rec authz_dbm_cmds[] = -{ - AP_INIT_TAKE1("AuthDBMGroupFile", ap_set_file_slot, - (void *)APR_OFFSETOF(authz_dbm_config_rec, grpfile), - OR_AUTHCFG, "database file containing group names and member user IDs"), - AP_INIT_TAKE1("AuthzDBMType", ap_set_string_slot, - (void *)APR_OFFSETOF(authz_dbm_config_rec, dbmtype), - OR_AUTHCFG, "what type of DBM file the group file is"), - AP_INIT_FLAG("AuthzDBMAuthoritative", ap_set_flag_slot, - (void *)APR_OFFSETOF(authz_dbm_config_rec, authoritative), - OR_AUTHCFG, "Set to 'no' to allow access control to be passed along to " - "lower modules, if the group required is not found or empty, or the user " - " is not in the required groups. (default is yes.)"), - {NULL} -}; - -module AP_MODULE_DECLARE_DATA authz_dbm_module; - /* We do something strange with the group file. If the group file * contains any : we assume the format is * key=username value=":"groupname [":"anything here is ignored] @@ -170,110 +192,117 @@ module AP_MODULE_DECLARE_DATA authz_dbm_module; * mark@telescope.org, 22Sep95 */ -static apr_status_t get_dbm_grp(request_rec *r, char *user, char *dbmgrpfile, - char *dbtype, const char ** out) +static char *get_dbm_grp(request_rec *r, char *user, char *auth_dbmgrpfile, + char *dbtype) { - char *grp_data; + char *grp_data = get_dbm_pw(r, user, auth_dbmgrpfile,dbtype); char *grp_colon; char *grp_colon2; - apr_status_t status = get_dbm_entry_as_str(r, user, dbmgrpfile, - dbtype, &grp_data); - - if (status != APR_SUCCESS) { - return status; - } - - *out = NULL; - - if (grp_data == NULL) { - return APR_SUCCESS; - } + if (grp_data == NULL) + return NULL; if ((grp_colon = strchr(grp_data, ':')) != NULL) { grp_colon2 = strchr(++grp_colon, ':'); - if (grp_colon2) { + if (grp_colon2) *grp_colon2 = '\0'; - } - *out = grp_colon; - return APR_SUCCESS; + return grp_colon; } + return grp_data; +} + +static int dbm_authenticate_basic_user(request_rec *r) +{ + dbm_auth_config_rec *conf = ap_get_module_config(r->per_dir_config, + &auth_dbm_module); + const char *sent_pw; + char *real_pw, *colon_pw; + apr_status_t invalid_pw; + int res; + + if ((res = ap_get_basic_auth_pw(r, &sent_pw))) + return res; - return APR_SUCCESS; + if (!conf->auth_dbmpwfile) + return DECLINED; + + if (!(real_pw = get_dbm_pw(r, r->user, conf->auth_dbmpwfile, + conf->auth_dbmtype))) { + if (!(conf->auth_dbmauthoritative)) + return DECLINED; + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "DBM user %s not found: %s", r->user, r->filename); + ap_note_basic_auth_failure(r); + return HTTP_UNAUTHORIZED; + } + /* Password is up to first : if exists */ + colon_pw = strchr(real_pw, ':'); + if (colon_pw) { + *colon_pw = '\0'; + } + invalid_pw = apr_password_validate(sent_pw, real_pw); + if (invalid_pw != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "DBM user %s: authentication failure for \"%s\": " + "Password Mismatch", + r->user, r->uri); + ap_note_basic_auth_failure(r); + return HTTP_UNAUTHORIZED; + } + return OK; } /* Checking ID */ + static int dbm_check_auth(request_rec *r) { - authz_dbm_config_rec *conf = ap_get_module_config(r->per_dir_config, - &authz_dbm_module); + dbm_auth_config_rec *conf = ap_get_module_config(r->per_dir_config, + &auth_dbm_module); char *user = r->user; int m = r->method_number; - int required = 0; + const apr_array_header_t *reqs_arr = ap_requires(r); require_line *reqs = reqs_arr ? (require_line *) reqs_arr->elts : NULL; + register int x; const char *t; char *w; - apr_status_t status; - if (!conf->grpfile) { + if (!conf->auth_dbmgrpfile) return DECLINED; - } - - if (!reqs_arr) { + if (!reqs_arr) return DECLINED; - } for (x = 0; x < reqs_arr->nelts; x++) { - required |= 1; - - if (!(reqs[x].method_mask & (AP_METHOD_BIT << m))) { + if (!(reqs[x].method_mask & (AP_METHOD_BIT << m))) continue; - } t = reqs[x].requirement; w = ap_getword_white(r->pool, &t); - - if (!strcmp(w, "group")) { + + if (!strcmp(w, "group") && conf->auth_dbmgrpfile) { const char *orig_groups, *groups; char *v; - required |= 2; - - status = get_dbm_grp(r, user, conf->grpfile, conf->dbmtype, - &groups); - - if (status != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r, - "could not open dbm (type %s) group access file: %s", - conf->dbmtype, conf->grpfile); - return HTTP_INTERNAL_SERVER_ERROR; - } - - if (groups == NULL) { - if (!conf->authoritative) { + if (!(groups = get_dbm_grp(r, user, conf->auth_dbmgrpfile, + conf->auth_dbmtype))) { + if (!(conf->auth_dbmauthoritative)) return DECLINED; - } - ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "user %s not in DBM group file %s: %s", - user, conf->grpfile, r->filename); - + user, conf->auth_dbmgrpfile, r->filename); ap_note_basic_auth_failure(r); return HTTP_UNAUTHORIZED; } - orig_groups = groups; while (t[0]) { w = ap_getword_white(r->pool, &t); groups = orig_groups; while (groups[0]) { v = ap_getword(r->pool, &groups, ','); - if (!strcmp(v, w)) { + if (!strcmp(v, w)) return OK; - } } } ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, @@ -289,16 +318,18 @@ static int dbm_check_auth(request_rec *r) static void register_hooks(apr_pool_t *p) { + ap_hook_check_user_id(dbm_authenticate_basic_user, NULL, NULL, + APR_HOOK_MIDDLE); ap_hook_auth_checker(dbm_check_auth, NULL, NULL, APR_HOOK_MIDDLE); } -module AP_MODULE_DECLARE_DATA authz_dbm_module = +module AP_MODULE_DECLARE_DATA auth_dbm_module = { STANDARD20_MODULE_STUFF, - create_authz_dbm_dir_config, /* dir config creater */ - NULL, /* dir merger --- default is to override */ - NULL, /* server config */ - NULL, /* merge server config */ - authz_dbm_cmds, /* command apr_table_t */ - register_hooks /* register hooks */ + create_dbm_auth_dir_config, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server config */ + dbm_auth_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ }; diff --git a/modules/aaa/mod_authz_host.dsp b/modules/aaa/mod_auth_dbm.dsp similarity index 59% rename from modules/aaa/mod_authz_host.dsp rename to modules/aaa/mod_auth_dbm.dsp index 12ab8f741f2..59a25751630 100644 --- a/modules/aaa/mod_authz_host.dsp +++ b/modules/aaa/mod_auth_dbm.dsp @@ -1,24 +1,24 @@ -# Microsoft Developer Studio Project File - Name="mod_authz_host" - Package Owner=<4> +# Microsoft Developer Studio Project File - Name="mod_auth_dbm" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 -CFG=mod_authz_host - Win32 Debug +CFG=mod_auth_dbm - Win32 Release !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE -!MESSAGE NMAKE /f "mod_authz_host.mak". +!MESSAGE NMAKE /f "mod_auth_dbm.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE -!MESSAGE NMAKE /f "mod_authz_host.mak" CFG="mod_authz_host - Win32 Debug" +!MESSAGE NMAKE /f "mod_auth_dbm.mak" CFG="mod_auth_dbm - Win32 Release" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE -!MESSAGE "mod_authz_host - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "mod_authz_host - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_auth_dbm - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_auth_dbm - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project @@ -29,7 +29,7 @@ CPP=cl.exe MTL=midl.exe RSC=rc.exe -!IF "$(CFG)" == "mod_authz_host - Win32 Release" +!IF "$(CFG)" == "mod_auth_dbm - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -43,19 +43,19 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MD /W3 /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_authz_host" /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" +# ADD CPP /nologo /MD /W3 /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "AP_AUTH_DBM_USE_APR" /Fd"Release\mod_auth_dbm" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_authz_host.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_host -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_authz_host.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_host +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_auth_dbm.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_dbm +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_auth_dbm.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_dbm -!ELSEIF "$(CFG)" == "mod_authz_host - Win32 Debug" +!ELSEIF "$(CFG)" == "mod_auth_dbm - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -69,55 +69,55 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_authz_host" /FD /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" +# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "AP_AUTH_DBM_USE_APR" /Fd"Debug\mod_auth_dbm" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_authz_host.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_host -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_authz_host.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_host +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_auth_dbm.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_dbm +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_auth_dbm.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_dbm !ENDIF # Begin Target -# Name "mod_authz_host - Win32 Release" -# Name "mod_authz_host - Win32 Debug" +# Name "mod_auth_dbm - Win32 Release" +# Name "mod_auth_dbm - Win32 Debug" # Begin Source File -SOURCE=.\mod_authz_host.c +SOURCE=.\mod_auth_dbm.c # End Source File # Begin Source File -SOURCE=.\mod_authz_host.rc +SOURCE=.\mod_auth_dbm.rc # End Source File # Begin Source File SOURCE=..\..\build\win32\win32ver.awk -!IF "$(CFG)" == "mod_authz_host - Win32 Release" +!IF "$(CFG)" == "mod_auth_dbm - Win32 Release" # PROP Ignore_Default_Tool 1 # Begin Custom Build - Creating Version Resource InputPath=..\..\build\win32\win32ver.awk -".\mod_authz_host.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_authz_host "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_authz_host.rc +".\mod_auth_dbm.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_auth_dbm "auth_dbm_module for Apache" ../../include/ap_release.h > .\mod_auth_dbm.rc # End Custom Build -!ELSEIF "$(CFG)" == "mod_authz_host - Win32 Debug" +!ELSEIF "$(CFG)" == "mod_auth_dbm - Win32 Debug" # PROP Ignore_Default_Tool 1 # Begin Custom Build - Creating Version Resource InputPath=..\..\build\win32\win32ver.awk -".\mod_authz_host.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_authz_host "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_authz_host.rc +".\mod_auth_dbm.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_auth_dbm "auth_dbm_module for Apache" ../../include/ap_release.h > .\mod_auth_dbm.rc # End Custom Build diff --git a/modules/aaa/mod_auth_dbm.exp b/modules/aaa/mod_auth_dbm.exp new file mode 100644 index 00000000000..7038e8047d7 --- /dev/null +++ b/modules/aaa/mod_auth_dbm.exp @@ -0,0 +1 @@ +auth_dbm_module diff --git a/modules/aaa/mod_auth_digest.c b/modules/aaa/mod_auth_digest.c index 4abc035f93b..2ea178fff78 100644 --- a/modules/aaa/mod_auth_digest.c +++ b/modules/aaa/mod_auth_digest.c @@ -118,9 +118,6 @@ #include "util_md5.h" #include "apr_shm.h" #include "apr_rmm.h" -#include "ap_provider.h" - -#include "mod_auth.h" /* Disable shmem until pools/init gets sorted out * remove following two lines when fixed @@ -132,7 +129,8 @@ typedef struct digest_config_struct { const char *dir_name; - authn_provider_list *providers; + const char *pwfile; + const char *grpfile; const char *realm; char **qop_list; apr_sha1_ctx_t nonce_ctx; @@ -482,53 +480,17 @@ static const char *set_realm(cmd_parms *cmd, void *config, const char *realm) return DECLINE_CMD; } -static const char *add_authn_provider(cmd_parms *cmd, void *config, - const char *arg) +static const char *set_digest_file(cmd_parms *cmd, void *config, + const char *file) { - digest_config_rec *conf = (digest_config_rec*)config; - authn_provider_list *newp; - const char *provider_name; - - if (strcasecmp(arg, "on") == 0) { - provider_name = AUTHN_DEFAULT_PROVIDER; - } - else if (strcasecmp(arg, "off") == 0) { - /* Clear all configured providers and return. */ - conf->providers = NULL; - return NULL; - } - else { - provider_name = apr_pstrdup(cmd->pool, arg); - } - - newp = apr_pcalloc(cmd->pool, sizeof(authn_provider_list)); - newp->provider_name = provider_name; - - /* lookup and cache the actual provider now */ - newp->provider = ap_lookup_provider(AUTHN_PROVIDER_GROUP, - newp->provider_name); - - if (newp->provider == NULL) { - /* by the time they use it, the provider should be loaded and - registered with us. */ - return apr_psprintf(cmd->pool, - "Unknown Authn provider: %s", - newp->provider_name); - } - - /* Add it to the list now. */ - if (!conf->providers) { - conf->providers = newp; - } - else { - authn_provider_list *last = conf->providers; - - while (last->next) { - last = last->next; - } - last->next = newp; - } + ((digest_config_rec *) config)->pwfile = file; + return NULL; +} +static const char *set_group_file(cmd_parms *cmd, void *config, + const char *file) +{ + ((digest_config_rec *) config)->grpfile = file; return NULL; } @@ -681,8 +643,10 @@ static const command_rec digest_cmds[] = { AP_INIT_TAKE1("AuthName", set_realm, NULL, OR_AUTHCFG, "The authentication realm (e.g. \"Members Only\")"), - AP_INIT_ITERATE("AuthDigestProvider", add_authn_provider, NULL, ACCESS_CONF, - "specify the auth providers for a directory or location"), + AP_INIT_TAKE1("AuthDigestFile", set_digest_file, NULL, OR_AUTHCFG, + "The name of the file containing the usernames and password hashes"), + AP_INIT_TAKE1("AuthDigestGroupFile", set_group_file, NULL, OR_AUTHCFG, + "The name of the file containing the group names and members"), AP_INIT_ITERATE("AuthDigestQop", set_qop, NULL, OR_AUTHCFG, "A list of quality-of-protection options"), AP_INIT_TAKE1("AuthDigestNonceLifetime", set_nonce_lifetime, NULL, OR_AUTHCFG, @@ -1461,50 +1425,34 @@ static void note_digest_auth_failure(request_rec *r, */ static const char *get_hash(request_rec *r, const char *user, - digest_config_rec *conf) + const char *realm, const char *auth_pwfile) { - authn_status auth_result; - char *password; - authn_provider_list *current_provider; - - current_provider = conf->providers; - do { - const authn_provider *provider; - - /* For now, if a provider isn't set, we'll be nice and use the file - * provider. - */ - if (!current_provider) { - provider = ap_lookup_provider(AUTHN_PROVIDER_GROUP, - AUTHN_DEFAULT_PROVIDER); - } - else { - provider = current_provider->provider; - } - - /* We expect the password to be md5 hash of user:realm:password */ - auth_result = provider->get_realm_hash(r, user, conf->realm, - &password); + ap_configfile_t *f; + char l[MAX_STRING_LEN]; + const char *rpw; + char *w, *x; + apr_status_t sts; - /* User is found. Stop checking. */ - if (auth_result == AUTH_USER_FOUND) { - break; + if ((sts = ap_pcfg_openfile(&f, r->pool, auth_pwfile)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, sts, r, + "Digest: Could not open password file: %s", auth_pwfile); + return NULL; + } + while (!(ap_cfg_getline(l, MAX_STRING_LEN, f))) { + if ((l[0] == '#') || (!l[0])) { + continue; } + rpw = l; + w = ap_getword(r->pool, &rpw, ':'); + x = ap_getword(r->pool, &rpw, ':'); - /* If we're not really configured for providers, stop now. */ - if (!conf->providers) { - break; + if (x && w && !strcmp(user, w) && !strcmp(realm, x)) { + ap_cfg_closefile(f); + return apr_pstrdup(r->pool, rpw); } - - current_provider = current_provider->next; - } while (current_provider); - - if (auth_result != AUTH_USER_FOUND) { - return NULL; - } - else { - return password; } + ap_cfg_closefile(f); + return NULL; } static int check_nc(const request_rec *r, const digest_header_rec *resp, @@ -1863,7 +1811,11 @@ static int authenticate_digest_user(request_rec *r) return HTTP_UNAUTHORIZED; } - if (!(conf->ha1 = get_hash(r, r->user, conf))) { + if (!conf->pwfile) { + return DECLINED; + } + + if (!(conf->ha1 = get_hash(r, r->user, conf->realm, conf->pwfile))) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Digest: user `%s' in realm `%s' not found: %s", r->user, conf->realm, r->uri); @@ -1930,6 +1882,146 @@ static int authenticate_digest_user(request_rec *r) return OK; } + +/* + * Checking ID + */ + +static apr_table_t *groups_for_user(request_rec *r, const char *user, + const char *grpfile) +{ + ap_configfile_t *f; + apr_table_t *grps = apr_table_make(r->pool, 15); + apr_pool_t *sp; + char l[MAX_STRING_LEN]; + const char *group_name, *ll, *w; + apr_status_t sts; + + if ((sts = ap_pcfg_openfile(&f, r->pool, grpfile)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, sts, r, + "Digest: Could not open group file: %s", grpfile); + return NULL; + } + + if (apr_pool_create(&sp, r->pool) != APR_SUCCESS) { + return NULL; + } + + while (!(ap_cfg_getline(l, MAX_STRING_LEN, f))) { + if ((l[0] == '#') || (!l[0])) { + continue; + } + ll = l; + apr_pool_clear(sp); + + group_name = ap_getword(sp, &ll, ':'); + + while (ll[0]) { + w = ap_getword_conf(sp, &ll); + if (!strcmp(w, user)) { + apr_table_setn(grps, apr_pstrdup(r->pool, group_name), "in"); + break; + } + } + } + + ap_cfg_closefile(f); + apr_pool_destroy(sp); + return grps; +} + + +static int digest_check_auth(request_rec *r) +{ + const digest_config_rec *conf = + (digest_config_rec *) ap_get_module_config(r->per_dir_config, + &auth_digest_module); + const char *user = r->user; + int m = r->method_number; + int method_restricted = 0; + register int x; + const char *t, *w; + apr_table_t *grpstatus; + const apr_array_header_t *reqs_arr; + require_line *reqs; + + if (!(t = ap_auth_type(r)) || strcasecmp(t, "Digest")) { + return DECLINED; + } + + reqs_arr = ap_requires(r); + /* If there is no "requires" directive, then any user will do. + */ + if (!reqs_arr) { + return OK; + } + reqs = (require_line *) reqs_arr->elts; + + if (conf->grpfile) { + grpstatus = groups_for_user(r, user, conf->grpfile); + } + else { + grpstatus = NULL; + } + + for (x = 0; x < reqs_arr->nelts; x++) { + + if (!(reqs[x].method_mask & (AP_METHOD_BIT << m))) { + continue; + } + + method_restricted = 1; + + t = reqs[x].requirement; + w = ap_getword_white(r->pool, &t); + if (!strcasecmp(w, "valid-user")) { + return OK; + } + else if (!strcasecmp(w, "user")) { + while (t[0]) { + w = ap_getword_conf(r->pool, &t); + if (!strcmp(user, w)) { + return OK; + } + } + } + else if (!strcasecmp(w, "group")) { + if (!grpstatus) { + return DECLINED; + } + + while (t[0]) { + w = ap_getword_conf(r->pool, &t); + if (apr_table_get(grpstatus, w)) { + return OK; + } + } + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: access to %s failed, reason: unknown " + "require directive \"%s\"", + r->uri, reqs[x].requirement); + return DECLINED; + } + } + + if (!method_restricted) { + return OK; + } + + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: access to %s failed, reason: user %s not " + "allowed access", r->uri, user); + + note_digest_auth_failure(r, conf, + (digest_header_rec *) ap_get_module_config(r->request_config, + &auth_digest_module), + 0); + return HTTP_UNAUTHORIZED; +} + + /* * Authorization-Info header code */ @@ -2115,7 +2207,7 @@ static void register_hooks(apr_pool_t *p) ap_hook_child_init(initialize_child, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_post_read_request(parse_hdr_and_update_nc, parsePre, NULL, APR_HOOK_MIDDLE); ap_hook_check_user_id(authenticate_digest_user, NULL, NULL, APR_HOOK_MIDDLE); - + ap_hook_auth_checker(digest_check_auth, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_fixups(add_auth_info, NULL, NULL, APR_HOOK_MIDDLE); } diff --git a/modules/aaa/mod_authn_anon.dsp b/modules/aaa/mod_authn_anon.dsp deleted file mode 100644 index de9c8c67ee5..00000000000 --- a/modules/aaa/mod_authn_anon.dsp +++ /dev/null @@ -1,128 +0,0 @@ -# Microsoft Developer Studio Project File - Name="mod_authn_anon" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=mod_authn_anon - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "mod_authn_anon.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "mod_authn_anon.mak" CFG="mod_authn_anon - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "mod_authn_anon - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "mod_authn_anon - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "mod_authn_anon - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MD /W3 /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_authn_anon" /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_authn_anon.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authn_anon -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_authn_anon.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authn_anon - -!ELSEIF "$(CFG)" == "mod_authn_anon - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MDd /W3 /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_authn_anon" /FD /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_authn_anon.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authn_anon -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_authn_anon.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authn_anon - -!ENDIF - -# Begin Target - -# Name "mod_authn_anon - Win32 Release" -# Name "mod_authn_anon - Win32 Debug" -# Begin Source File - -SOURCE=.\mod_authn_anon.c -# End Source File -# Begin Source File - -SOURCE=.\mod_authn_anon.rc -# End Source File -# Begin Source File - -SOURCE=..\..\build\win32\win32ver.awk - -!IF "$(CFG)" == "mod_authn_anon - Win32 Release" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Creating Version Resource -InputPath=..\..\build\win32\win32ver.awk - -".\mod_authn_anon.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_authn_anon "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_authn_anon.rc - -# End Custom Build - -!ELSEIF "$(CFG)" == "mod_authn_anon - Win32 Debug" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Creating Version Resource -InputPath=..\..\build\win32\win32ver.awk - -".\mod_authn_anon.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_authn_anon "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_authn_anon.rc - -# End Custom Build - -!ENDIF - -# End Source File -# End Target -# End Project diff --git a/modules/aaa/mod_authn_dbm.c b/modules/aaa/mod_authn_dbm.c deleted file mode 100644 index 6c001bc7977..00000000000 --- a/modules/aaa/mod_authn_dbm.c +++ /dev/null @@ -1,206 +0,0 @@ -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * nor may "Apache" appear in their name, without prior written - * permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - * Portions of this software are based upon public domain software - * originally written at the National Center for Supercomputing Applications, - * University of Illinois, Urbana-Champaign. - */ - -/* - * http_auth: authentication - * - * Rob McCool & Brian Behlendorf. - * - * Adapted to Apache by rst. - * - */ - -#define APR_WANT_STRFUNC -#include "apr_want.h" -#include "apr_strings.h" -#include "apr_dbm.h" -#include "apr_md5.h" /* for apr_password_validate */ - -#include "ap_provider.h" -#include "httpd.h" -#include "http_config.h" -#include "http_core.h" -#include "http_log.h" -#include "http_protocol.h" -#include "http_request.h" /* for ap_hook_(check_user_id | auth_checker)*/ - -#include "mod_auth.h" - -typedef struct { - char *pwfile; - char *dbmtype; -} authn_dbm_config_rec; - -static void *create_authn_dbm_dir_config(apr_pool_t *p, char *d) -{ - authn_dbm_config_rec *conf = apr_palloc(p, sizeof(*conf)); - - conf->pwfile = NULL; - conf->dbmtype = "default"; - - return conf; -} - -static const char *set_dbm_type(cmd_parms *cmd, - void *dir_config, - const char *arg) -{ - authn_dbm_config_rec *conf = dir_config; - - conf->dbmtype = apr_pstrdup(cmd->pool, arg); - return NULL; -} - -static const command_rec authn_dbm_cmds[] = -{ - AP_INIT_TAKE1("AuthDBMUserFile", ap_set_file_slot, - (void *)APR_OFFSETOF(authn_dbm_config_rec, pwfile), - OR_AUTHCFG, "dbm database file containing user IDs and passwords"), - AP_INIT_TAKE1("AuthDBMType", set_dbm_type, - NULL, - OR_AUTHCFG, "what type of DBM file the user file is"), - {NULL} -}; - -module AP_MODULE_DECLARE_DATA authn_dbm_module; - -static apr_status_t fetch_dbm(const char *dbmtype, const char *dbmfile, - const char *user, apr_datum_t *val, - apr_pool_t *pool) -{ - apr_dbm_t *f; - apr_datum_t key; - apr_status_t rv; - - rv = apr_dbm_open_ex(&f, dbmtype, dbmfile, APR_DBM_READONLY, - APR_OS_DEFAULT, pool); - - if (rv != APR_SUCCESS) { - return rv; - } - - key.dptr = (char*)user; -#ifndef NETSCAPE_DBM_COMPAT - key.dsize = strlen(key.dptr); -#else - key.dsize = strlen(key.dptr) + 1; -#endif - - rv = apr_dbm_fetch(f, key, val); - - apr_dbm_close(f); - - return rv; -} - -static authn_status check_dbm_pw(request_rec *r, const char *user, - const char *password) -{ - authn_dbm_config_rec *conf = ap_get_module_config(r->per_dir_config, - &authn_dbm_module); - apr_datum_t dbm_pw; - apr_status_t rv; - char *dbm_password = NULL; - - rv = fetch_dbm(conf->dbmtype, conf->pwfile, user, &dbm_pw, r->pool); - - if (rv != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, - "could not open dbm (type %s) auth file: %s", - conf->dbmtype, conf->pwfile); - return AUTH_GENERAL_ERROR; - } - - if (dbm_pw.dptr) { - dbm_password = apr_pstrmemdup(r->pool, dbm_pw.dptr, dbm_pw.dsize); - } - - if (!dbm_password) { - return AUTH_USER_NOT_FOUND; - } - - rv = apr_password_validate(password, dbm_password); - - if (rv != APR_SUCCESS) { - return AUTH_DENIED; - } - - return AUTH_GRANTED; -} - -static const authn_provider authn_dbm_provider = -{ - &check_dbm_pw, - NULL, /* No realm support yet. */ -}; - -static void register_hooks(apr_pool_t *p) -{ - ap_register_provider(p, AUTHN_PROVIDER_GROUP, "dbm", &authn_dbm_provider); -} - -module AP_MODULE_DECLARE_DATA authn_dbm_module = -{ - STANDARD20_MODULE_STUFF, - create_authn_dbm_dir_config, /* dir config creater */ - NULL, /* dir merger --- default is to override */ - NULL, /* server config */ - NULL, /* merge server config */ - authn_dbm_cmds, /* command apr_table_t */ - register_hooks /* register hooks */ -}; diff --git a/modules/aaa/mod_authn_default.c b/modules/aaa/mod_authn_default.c deleted file mode 100644 index fa6a1896f16..00000000000 --- a/modules/aaa/mod_authn_default.c +++ /dev/null @@ -1,148 +0,0 @@ -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * nor may "Apache" appear in their name, without prior written - * permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - * Portions of this software are based upon public domain software - * originally written at the National Center for Supercomputing Applications, - * University of Illinois, Urbana-Champaign. - */ - -/* - * http_auth: authentication - * - * Rob McCool - * - * Adapted to Apache by rst. - * - * dirkx - Added Authoritative control to allow passing on to lower - * modules if and only if the userid is not known to this - * module. A known user with a faulty or absent password still - * causes an AuthRequired. The default is 'Authoritative', i.e. - * no control is passed along. - */ - -#include "apr_strings.h" -#include "apr_md5.h" /* for apr_password_validate */ - -#include "ap_config.h" -#include "httpd.h" -#include "http_config.h" -#include "http_core.h" -#include "http_log.h" -#include "http_protocol.h" -#include "http_request.h" - -typedef struct { - int authoritative; -} authn_default_config_rec; - -static void *create_authn_default_dir_config(apr_pool_t *p, char *d) -{ - authn_default_config_rec *conf = apr_palloc(p, sizeof(*conf)); - - conf->authoritative = 1; /* keep the fortress secure by default */ - return conf; -} - -static const command_rec authn_default_cmds[] = -{ - AP_INIT_FLAG("AuthDefaultAuthoritative", ap_set_flag_slot, - (void *)APR_OFFSETOF(authn_default_config_rec, - authoritative), - OR_AUTHCFG, - "Set to 'no' to allow access control to be passed along to " - "lower modules if the UserID is not known to this module. " - "(default is yes)."), - {NULL} -}; - -module AP_MODULE_DECLARE_DATA authn_default_module; - -static int authenticate_basic_user(request_rec *r) -{ - authn_default_config_rec *conf = ap_get_module_config(r->per_dir_config, - &authn_default_module); - const char *sent_pw; - int res; - - if ((res = ap_get_basic_auth_pw(r, &sent_pw))) { - return res; - } - - if (conf->authoritative == 0) { - return DECLINED; - } - - ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, - "access to %s failed, reason: verification of user id '%s' " - "not configured", - r->uri, r->user ? r->user : ""); - - ap_note_basic_auth_failure(r); - return HTTP_UNAUTHORIZED; -} - -static void register_hooks(apr_pool_t *p) -{ - ap_hook_check_user_id(authenticate_basic_user,NULL,NULL,APR_HOOK_LAST); -} - -module AP_MODULE_DECLARE_DATA authn_default_module = -{ - STANDARD20_MODULE_STUFF, - create_authn_default_dir_config,/* dir config creater */ - NULL, /* dir merger --- default is to override */ - NULL, /* server config */ - NULL, /* merge server config */ - authn_default_cmds, /* command apr_table_t */ - register_hooks /* register hooks */ -}; diff --git a/modules/aaa/mod_authn_default.dsp b/modules/aaa/mod_authn_default.dsp deleted file mode 100644 index 7e56e8fc34a..00000000000 --- a/modules/aaa/mod_authn_default.dsp +++ /dev/null @@ -1,128 +0,0 @@ -# Microsoft Developer Studio Project File - Name="mod_authn_default" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=mod_authn_default - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "mod_authn_default.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "mod_authn_default.mak" CFG="mod_authn_default - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "mod_authn_default - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "mod_authn_default - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "mod_authn_default - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MD /W3 /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_authn_default" /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_authn_default.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authn_default -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_authn_default.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authn_default - -!ELSEIF "$(CFG)" == "mod_authn_default - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MDd /W3 /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_authn_default" /FD /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_authn_default.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authn_default -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_authn_default.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authn_default - -!ENDIF - -# Begin Target - -# Name "mod_authn_default - Win32 Release" -# Name "mod_authn_default - Win32 Debug" -# Begin Source File - -SOURCE=.\mod_authn_default.c -# End Source File -# Begin Source File - -SOURCE=.\mod_authn_default.rc -# End Source File -# Begin Source File - -SOURCE=..\..\build\win32\win32ver.awk - -!IF "$(CFG)" == "mod_authn_default - Win32 Release" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Creating Version Resource -InputPath=..\..\build\win32\win32ver.awk - -".\mod_authn_default.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_authn_default "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_authn_default.rc - -# End Custom Build - -!ELSEIF "$(CFG)" == "mod_authn_default - Win32 Debug" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Creating Version Resource -InputPath=..\..\build\win32\win32ver.awk - -".\mod_authn_default.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_authn_default "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_authn_default.rc - -# End Custom Build - -!ENDIF - -# End Source File -# End Target -# End Project diff --git a/modules/aaa/mod_authn_file.c b/modules/aaa/mod_authn_file.c deleted file mode 100644 index 2188c540e96..00000000000 --- a/modules/aaa/mod_authn_file.c +++ /dev/null @@ -1,234 +0,0 @@ -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * nor may "Apache" appear in their name, without prior written - * permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - * Portions of this software are based upon public domain software - * originally written at the National Center for Supercomputing Applications, - * University of Illinois, Urbana-Champaign. - */ - -/* - * http_auth: authentication - * - * Rob McCool - * - * Adapted to Apache by rst. - * - * dirkx - Added Authoritative control to allow passing on to lower - * modules if and only if the userid is not known to this - * module. A known user with a faulty or absent password still - * causes an AuthRequired. The default is 'Authoritative', i.e. - * no control is passed along. - */ - -#include "apr_strings.h" -#include "apr_md5.h" /* for apr_password_validate */ - -#include "ap_config.h" -#include "ap_provider.h" -#include "httpd.h" -#include "http_config.h" -#include "http_core.h" -#include "http_log.h" -#include "http_protocol.h" -#include "http_request.h" - -#include "mod_auth.h" - -typedef struct { - char *pwfile; -} authn_file_config_rec; - -static void *create_authn_file_dir_config(apr_pool_t *p, char *d) -{ - authn_file_config_rec *conf = apr_palloc(p, sizeof(*conf)); - - conf->pwfile = NULL; /* just to illustrate the default really */ - return conf; -} - -static const char *set_authn_file_slot(cmd_parms *cmd, void *offset, - const char *f, const char *t) -{ - if (t && strcmp(t, "standard")) { - return apr_pstrcat(cmd->pool, "Invalid auth file type: ", t, NULL); - } - - return ap_set_file_slot(cmd, offset, f); -} - -static const command_rec authn_file_cmds[] = -{ - AP_INIT_TAKE12("AuthUserFile", set_authn_file_slot, - (void *)APR_OFFSETOF(authn_file_config_rec, pwfile), - OR_AUTHCFG, "text file containing user IDs and passwords"), - {NULL} -}; - -module AP_MODULE_DECLARE_DATA authn_file_module; - -static authn_status check_password(request_rec *r, const char *user, - const char *password) -{ - authn_file_config_rec *conf = ap_get_module_config(r->per_dir_config, - &authn_file_module); - ap_configfile_t *f; - char l[MAX_STRING_LEN]; - apr_status_t status; - char *file_password = NULL; - - status = ap_pcfg_openfile(&f, r->pool, conf->pwfile); - - if (status != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r, - "Could not open password file: %s", conf->pwfile); - return AUTH_GENERAL_ERROR; - } - - while (!(ap_cfg_getline(l, MAX_STRING_LEN, f))) { - const char *rpw, *w; - - /* Skip # or blank lines. */ - if ((l[0] == '#') || (!l[0])) { - continue; - } - - rpw = l; - w = ap_getword(r->pool, &rpw, ':'); - - if (!strcmp(user, w)) { - file_password = ap_getword(r->pool, &rpw, ':'); - break; - } - } - ap_cfg_closefile(f); - - if (!file_password) { - return AUTH_USER_NOT_FOUND; - } - - status = apr_password_validate(password, file_password); - if (status != APR_SUCCESS) { - return AUTH_DENIED; - } - - return AUTH_GRANTED; -} - -static authn_status get_realm_hash(request_rec *r, const char *user, - const char *realm, char **rethash) -{ - authn_file_config_rec *conf = ap_get_module_config(r->per_dir_config, - &authn_file_module); - ap_configfile_t *f; - char l[MAX_STRING_LEN]; - apr_status_t status; - char *file_hash = NULL; - - status = ap_pcfg_openfile(&f, r->pool, conf->pwfile); - - if (status != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r, - "Could not open password file: %s", conf->pwfile); - return AUTH_GENERAL_ERROR; - } - - while (!(ap_cfg_getline(l, MAX_STRING_LEN, f))) { - const char *rpw, *w, *x; - - /* Skip # or blank lines. */ - if ((l[0] == '#') || (!l[0])) { - continue; - } - - rpw = l; - w = ap_getword(r->pool, &rpw, ':'); - x = ap_getword(r->pool, &rpw, ':'); - - if (x && w && !strcmp(user, w) && !strcmp(realm, x)) { - /* Remember that this is a md5 hash of user:realm:password. */ - file_hash = ap_getword(r->pool, &rpw, ':'); - break; - } - } - ap_cfg_closefile(f); - - if (!file_hash) { - return AUTH_USER_NOT_FOUND; - } - - *rethash = file_hash; - - return AUTH_USER_FOUND; -} - -static const authn_provider authn_file_provider = -{ - &check_password, - &get_realm_hash, -}; - -static void register_hooks(apr_pool_t *p) -{ - ap_register_provider(p, AUTHN_PROVIDER_GROUP, "file", &authn_file_provider); -} - -module AP_MODULE_DECLARE_DATA authn_file_module = -{ - STANDARD20_MODULE_STUFF, - create_authn_file_dir_config, /* dir config creater */ - NULL, /* dir merger --- default is to override */ - NULL, /* server config */ - NULL, /* merge server config */ - authn_file_cmds, /* command apr_table_t */ - register_hooks /* register hooks */ -}; diff --git a/modules/aaa/mod_authz_default.c b/modules/aaa/mod_authz_default.c deleted file mode 100644 index 4fb5e669650..00000000000 --- a/modules/aaa/mod_authz_default.c +++ /dev/null @@ -1,171 +0,0 @@ -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * nor may "Apache" appear in their name, without prior written - * permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - * Portions of this software are based upon public domain software - * originally written at the National Center for Supercomputing Applications, - * University of Illinois, Urbana-Champaign. - */ - -/* - * http_auth: authentication - * - * Rob McCool - * - * Adapted to Apache by rst. - * - * dirkx - Added Authoritative control to allow passing on to lower - * modules if and only if the userid is not known to this - * module. A known user with a faulty or absent password still - * causes an AuthRequired. The default is 'Authoritative', i.e. - * no control is passed along. - */ - -#include "apr_strings.h" -#include "apr_md5.h" /* for apr_password_validate */ - -#include "ap_config.h" -#include "httpd.h" -#include "http_config.h" -#include "http_core.h" -#include "http_log.h" -#include "http_protocol.h" -#include "http_request.h" - -typedef struct { - int authoritative; -} authz_default_config_rec; - -static void *create_authz_default_dir_config(apr_pool_t *p, char *d) -{ - authz_default_config_rec *conf = apr_palloc(p, sizeof(*conf)); - - conf->authoritative = 1; /* keep the fortress secure by default */ - return conf; -} - -static const command_rec authz_default_cmds[] = -{ - AP_INIT_FLAG("AccessAuthoritative", ap_set_flag_slot, - (void *)APR_OFFSETOF(authz_default_config_rec, authoritative), - OR_AUTHCFG, - "Set to 'no' to allow access control to be passed along to " - "lower modules. (default is yes.)"), - {NULL} -}; - -module AP_MODULE_DECLARE_DATA authz_default_module; - -static int check_user_access(request_rec *r) -{ - authz_default_config_rec *conf = ap_get_module_config(r->per_dir_config, - &authz_default_module); - int m = r->method_number; - int method_restricted = 0; - register int x; - const apr_array_header_t *reqs_arr = ap_requires(r); - require_line *reqs; - - /* BUG FIX: tadc, 11-Nov-1995. If there is no "requires" directive, - * then any user will do. - */ - if (!reqs_arr) { - return OK; - } - reqs = (require_line *)reqs_arr->elts; - - for (x = 0; x < reqs_arr->nelts; x++) { - if (!(reqs[x].method_mask & (AP_METHOD_BIT << m))) { - continue; - } - method_restricted = 1; - break; - } - - if (method_restricted == 0) { - return OK; - } - - if (!(conf->authoritative)) { - return DECLINED; - } - - /* if we aren't authoritative, any require directive could be - * considered valid even if noone groked it. However, if we are - * authoritative, we can warn the user they did something wrong. - * - * That something could be a missing "AuthAuthoritative off", but - * more likely is a typo in the require directive. - */ - ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, - "access to %s failed, reason: require directives " - "present and no Authoritative handler.", r->uri); - - ap_note_basic_auth_failure(r); - return HTTP_UNAUTHORIZED; -} - -static void register_hooks(apr_pool_t *p) -{ - ap_hook_auth_checker(check_user_access,NULL,NULL,APR_HOOK_LAST); -} - -module AP_MODULE_DECLARE_DATA authz_default_module = -{ - STANDARD20_MODULE_STUFF, - create_authz_default_dir_config, /* dir config creater */ - NULL, /* dir merger --- default is to override */ - NULL, /* server config */ - NULL, /* merge server config */ - authz_default_cmds, /* command apr_table_t */ - register_hooks /* register hooks */ -}; diff --git a/modules/aaa/mod_authz_default.dsp b/modules/aaa/mod_authz_default.dsp deleted file mode 100644 index f565857f904..00000000000 --- a/modules/aaa/mod_authz_default.dsp +++ /dev/null @@ -1,128 +0,0 @@ -# Microsoft Developer Studio Project File - Name="mod_authz_default" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=mod_authz_default - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "mod_authz_default.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "mod_authz_default.mak" CFG="mod_authz_default - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "mod_authz_default - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "mod_authz_default - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "mod_authz_default - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MD /W3 /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_authz_default" /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_authz_default.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_default -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_authz_default.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_default - -!ELSEIF "$(CFG)" == "mod_authz_default - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MDd /W3 /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_authz_default" /FD /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_authz_default.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_default -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_authz_default.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_default - -!ENDIF - -# Begin Target - -# Name "mod_authz_default - Win32 Release" -# Name "mod_authz_default - Win32 Debug" -# Begin Source File - -SOURCE=.\mod_authz_default.c -# End Source File -# Begin Source File - -SOURCE=.\mod_authz_default.rc -# End Source File -# Begin Source File - -SOURCE=..\..\build\win32\win32ver.awk - -!IF "$(CFG)" == "mod_authz_default - Win32 Release" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Creating Version Resource -InputPath=..\..\build\win32\win32ver.awk - -".\mod_authz_default.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_authz_default "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_authz_default.rc - -# End Custom Build - -!ELSEIF "$(CFG)" == "mod_authz_default - Win32 Debug" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Creating Version Resource -InputPath=..\..\build\win32\win32ver.awk - -".\mod_authz_default.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_authz_default "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_authz_default.rc - -# End Custom Build - -!ENDIF - -# End Source File -# End Target -# End Project diff --git a/modules/aaa/mod_authz_groupfile.c b/modules/aaa/mod_authz_groupfile.c deleted file mode 100644 index 3be7eab722a..00000000000 --- a/modules/aaa/mod_authz_groupfile.c +++ /dev/null @@ -1,277 +0,0 @@ -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * nor may "Apache" appear in their name, without prior written - * permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - * Portions of this software are based upon public domain software - * originally written at the National Center for Supercomputing Applications, - * University of Illinois, Urbana-Champaign. - */ - -/* This module is triggered by an - * - * AuthGroupFile standard /path/to/file - * - * and the presense of a - * - * require group - * - * In an applicable limit/directory block for that method. - * - * If there are no AuthGroupFile directives valid for - * the request; we DECLINED. - * - * If the AuthGroupFile is defined; but somehow not - * accessible: we SERVER_ERROR (was DECLINED). - * - * If there are no 'require ' directives defined for - * this request then we DECLINED (was OK). - * - * If there are no 'require ' directives valid for - * this request method then we DECLINED. (was OK) - * - * If there are any 'require group' blocks and we - * are not in any group - we HTTP_UNAUTHORIZE - * unless we are non-authoritative; in which - * case we DECLINED. - * - */ - -#include "apr_strings.h" -#include "apr_md5.h" /* for apr_password_validate */ - -#include "ap_config.h" -#include "httpd.h" -#include "http_config.h" -#include "http_core.h" -#include "http_log.h" -#include "http_protocol.h" -#include "http_request.h" - -typedef struct { - char *groupfile; - int authoritative; -} authz_groupfile_config_rec; - -static void *create_authz_groupfile_dir_config(apr_pool_t *p, char *d) -{ - authz_groupfile_config_rec *conf = apr_palloc(p, sizeof(*conf)); - - conf->groupfile = NULL; - conf->authoritative = 1; /* keep the fortress secure by default */ - return conf; -} - -static const char *set_authz_groupfile_slot(cmd_parms *cmd, void *offset, const char *f, - const char *t) -{ - if (t && strcmp(t, "standard")) { - return apr_pstrcat(cmd->pool, "Invalid auth file type: ", t, NULL); - } - - return ap_set_file_slot(cmd, offset, f); -} - -static const command_rec authz_groupfile_cmds[] = -{ - AP_INIT_TAKE12("AuthGroupFile", set_authz_groupfile_slot, - (void *)APR_OFFSETOF(authz_groupfile_config_rec, groupfile), - OR_AUTHCFG, - "text file containing group names and member user IDs"), - AP_INIT_FLAG("AuthzGroupFileAuthoritative", ap_set_flag_slot, - (void *)APR_OFFSETOF(authz_groupfile_config_rec, - authoritative), - OR_AUTHCFG, - "Set to 'no' to allow access control to be passed along to " - "lower modules if the 'require group' fails. (default is " - "no)."), - {NULL} -}; - -module AP_MODULE_DECLARE_DATA authz_groupfile_module; - -static apr_status_t groups_for_user(apr_pool_t *p, char *user, char *grpfile, - apr_table_t ** out) -{ - ap_configfile_t *f; - apr_table_t *grps = apr_table_make(p, 15); - apr_pool_t *sp; - char l[MAX_STRING_LEN]; - const char *group_name, *ll, *w; - apr_status_t status; - - if ((status = ap_pcfg_openfile(&f, p, grpfile)) != APR_SUCCESS) { - return status ; - } - - apr_pool_create(&sp, p); - - while (!(ap_cfg_getline(l, MAX_STRING_LEN, f))) { - if ((l[0] == '#') || (!l[0])) { - continue; - } - ll = l; - apr_pool_clear(sp); - - group_name = ap_getword(sp, &ll, ':'); - - while (ll[0]) { - w = ap_getword_conf(sp, &ll); - if (!strcmp(w, user)) { - apr_table_setn(grps, apr_pstrdup(p, group_name), "in"); - break; - } - } - } - ap_cfg_closefile(f); - apr_pool_destroy(sp); - - *out = grps; - return APR_SUCCESS; -} - -/* Checking ID */ - -static int check_user_access(request_rec *r) -{ - authz_groupfile_config_rec *conf = ap_get_module_config(r->per_dir_config, - &authz_groupfile_module); - char *user = r->user; - int m = r->method_number; - int method_restricted = 0; - register int x,has_entries; - const char *t, *w; - apr_table_t *grpstatus; - const apr_array_header_t *reqs_arr = ap_requires(r); - require_line *reqs; - apr_status_t status; - - if (!reqs_arr) { - return DECLINED; /* XXX change from legacy */ - } - - reqs = (require_line *)reqs_arr->elts; - - /* If there is no group file - then we are not - * configured. So decline. - */ - if (!(conf->groupfile)) - return DECLINED; - - if ((status = groups_for_user(r->pool, user, conf->groupfile, - &grpstatus)) != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r, - "Could not open group file: %s", conf->groupfile); - return HTTP_INTERNAL_SERVER_ERROR; - }; - - has_entries = apr_table_elts(grpstatus)->nelts; - - for (x = 0; x < reqs_arr->nelts; x++) { - - if (!(reqs[x].method_mask & (AP_METHOD_BIT << m))) { - continue; - } - method_restricted |= 1; - - t = reqs[x].requirement; - w = ap_getword_white(r->pool, &t); - - if (!strcmp(w, "group")) { - method_restricted |= 2; - if (has_entries) { - while (t[0]) { - w = ap_getword_conf(r->pool, &t); - if (apr_table_get(grpstatus, w)) { - return OK; - } - } - } - } - } - - /* No applicable requires for this method seen at all */ - if (method_restricted == 0) { - return DECLINED; /* XXX change from legacy */ - } - - /* No applicable "requires group" for this method seen */ - if ((method_restricted & 2) == 0) { - return DECLINED; - } - - if (!(conf->authoritative)) { - return DECLINED; - } - - ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, - "access to %s failed, reason: user %s not part of the " - "'require'ed group(s).", r->uri, user); - - ap_note_basic_auth_failure(r); - return HTTP_UNAUTHORIZED; -} - -static void register_hooks(apr_pool_t *p) -{ - ap_hook_auth_checker(check_user_access,NULL,NULL,APR_HOOK_MIDDLE); -} - -module AP_MODULE_DECLARE_DATA authz_groupfile_module = -{ - STANDARD20_MODULE_STUFF, - create_authz_groupfile_dir_config,/* dir config creater */ - NULL, /* dir merger -- default is to override */ - NULL, /* server config */ - NULL, /* merge server config */ - authz_groupfile_cmds, /* command apr_table_t */ - register_hooks /* register hooks */ -}; diff --git a/modules/aaa/mod_authz_groupfile.dsp b/modules/aaa/mod_authz_groupfile.dsp deleted file mode 100644 index 6a2298b5cb6..00000000000 --- a/modules/aaa/mod_authz_groupfile.dsp +++ /dev/null @@ -1,128 +0,0 @@ -# Microsoft Developer Studio Project File - Name="mod_authz_groupfile" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=mod_authz_groupfile - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "mod_authz_groupfile.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "mod_authz_groupfile.mak" CFG="mod_authz_groupfile - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "mod_authz_groupfile - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "mod_authz_groupfile - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "mod_authz_groupfile - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MD /W3 /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_authz_groupfile" /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_authz_groupfile.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_groupfile -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_authz_groupfile.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_groupfile - -!ELSEIF "$(CFG)" == "mod_authz_groupfile - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MDd /W3 /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_authz_groupfile" /FD /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_authz_groupfile.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_groupfile -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_authz_groupfile.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_groupfile - -!ENDIF - -# Begin Target - -# Name "mod_authz_groupfile - Win32 Release" -# Name "mod_authz_groupfile - Win32 Debug" -# Begin Source File - -SOURCE=.\mod_authz_groupfile.c -# End Source File -# Begin Source File - -SOURCE=.\mod_authz_groupfile.rc -# End Source File -# Begin Source File - -SOURCE=..\..\build\win32\win32ver.awk - -!IF "$(CFG)" == "mod_authz_groupfile - Win32 Release" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Creating Version Resource -InputPath=..\..\build\win32\win32ver.awk - -".\mod_authz_groupfile.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_authz_groupfile "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_authz_groupfile.rc - -# End Custom Build - -!ELSEIF "$(CFG)" == "mod_authz_groupfile - Win32 Debug" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Creating Version Resource -InputPath=..\..\build\win32\win32ver.awk - -".\mod_authz_groupfile.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_authz_groupfile "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_authz_groupfile.rc - -# End Custom Build - -!ENDIF - -# End Source File -# End Target -# End Project diff --git a/modules/aaa/mod_authz_user.c b/modules/aaa/mod_authz_user.c deleted file mode 100644 index a2befbd8813..00000000000 --- a/modules/aaa/mod_authz_user.c +++ /dev/null @@ -1,198 +0,0 @@ -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * nor may "Apache" appear in their name, without prior written - * permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - * Portions of this software are based upon public domain software - * originally written at the National Center for Supercomputing Applications, - * University of Illinois, Urbana-Champaign. - */ - -/* http_auth: - * authentication - * - * Rob McCool - * - * Adapted to Apache by rst. - * - * dirkx - Added Authoritative control to allow passing on to lower - * modules if and only if the userid is not known to this - * module. A known user with a faulty or absent password still - * causes an AuthRequired. The default is 'Authoritative', i.e. - * no control is passed along. - */ - -#include "apr_strings.h" - -#include "ap_config.h" -#include "httpd.h" -#include "http_config.h" -#include "http_core.h" -#include "http_log.h" -#include "http_protocol.h" -#include "http_request.h" - -typedef struct { - int authoritative; -} authz_user_config_rec; - -static void *create_authz_user_dir_config(apr_pool_t *p, char *d) -{ - authz_user_config_rec *conf = apr_palloc(p, sizeof(*conf)); - - conf->authoritative = 1; /* keep the fortress secure by default */ - return conf; -} - -static const command_rec authz_user_cmds[] = -{ - AP_INIT_FLAG("AuthzUserAuthoritative", ap_set_flag_slot, - (void *)APR_OFFSETOF(authz_user_config_rec, authoritative), - OR_AUTHCFG, - "Set to 'no' to allow access control to be passed along to " - "lower modules if the 'require user' or 'require valid-user' " - "statement is not met. (default: yes)."), - {NULL} -}; - -module AP_MODULE_DECLARE_DATA authz_user_module; - -static int check_user_access(request_rec *r) -{ - authz_user_config_rec *conf = ap_get_module_config(r->per_dir_config, - &authz_user_module); - char *user = r->user; - int m = r->method_number; - int method_restricted = 0; - register int x; - const char *t, *w; - const apr_array_header_t *reqs_arr = ap_requires(r); - require_line *reqs; - - /* BUG FIX: tadc, 11-Nov-1995. If there is no "requires" directive, - * then any user will do. - */ - if (!reqs_arr) { - return DECLINED; - } - reqs = (require_line *)reqs_arr->elts; - - for (x = 0; x < reqs_arr->nelts; x++) { - - if (!(reqs[x].method_mask & (AP_METHOD_BIT << m))) { - continue; - } - - /* Note that there are applicable requirements - */ - method_restricted |= 1; - - t = reqs[x].requirement; - w = ap_getword_white(r->pool, &t); - if (!strcmp(w, "valid-user")) { - return OK; - } - if (!strcmp(w, "user")) { - /* And note that there are applicable requirements - * which we consider ourselves the owner of. - */ - method_restricted |= 2; - while (t[0]) { - w = ap_getword_conf(r->pool, &t); - if (!strcmp(user, w)) { - return OK; - } - } - } - } - - if (method_restricted == 0) { - /* no applicable requirements at all */ - return DECLINED; - } - /* There are require methods which we do not - * understand. - */ - if ((method_restricted & 2) == 0) { - /* no requirements of which we consider ourselves - * the owner. - */ - return DECLINED; - } - - if (!conf->authoritative) { - return DECLINED; - } - - ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, - "access to %s failed, reason: user '%s' does not meet " - "'require'ments for user/valid-user to be allowed access", - r->uri, user); - - ap_note_basic_auth_failure(r); - return HTTP_UNAUTHORIZED; -} - -static void register_hooks(apr_pool_t *p) -{ - ap_hook_auth_checker(check_user_access, NULL, NULL, APR_HOOK_MIDDLE); -} - -module AP_MODULE_DECLARE_DATA authz_user_module = -{ - STANDARD20_MODULE_STUFF, - create_authz_user_dir_config, /* dir config creater */ - NULL, /* dir merger --- default is to override */ - NULL, /* server config */ - NULL, /* merge server config */ - authz_user_cmds, /* command apr_table_t */ - register_hooks /* register hooks */ -}; diff --git a/modules/aaa/mod_authz_user.dsp b/modules/aaa/mod_authz_user.dsp deleted file mode 100644 index ef710f5410b..00000000000 --- a/modules/aaa/mod_authz_user.dsp +++ /dev/null @@ -1,128 +0,0 @@ -# Microsoft Developer Studio Project File - Name="mod_authz_user" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=mod_authz_user - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "mod_authz_user.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "mod_authz_user.mak" CFG="mod_authz_user - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "mod_authz_user - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "mod_authz_user - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "mod_authz_user - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MD /W3 /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_authz_user" /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_authz_user.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_user -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /map /machine:I386 /out:"Release/mod_authz_user.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_user - -!ELSEIF "$(CFG)" == "mod_authz_user - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MDd /W3 /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c -# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_authz_user" /FD /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_authz_user.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_user -# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386 /out:"Debug/mod_authz_user.so" /base:@..\..\os\win32\BaseAddr.ref,mod_authz_user - -!ENDIF - -# Begin Target - -# Name "mod_authz_user - Win32 Release" -# Name "mod_authz_user - Win32 Debug" -# Begin Source File - -SOURCE=.\mod_authz_user.c -# End Source File -# Begin Source File - -SOURCE=.\mod_authz_user.rc -# End Source File -# Begin Source File - -SOURCE=..\..\build\win32\win32ver.awk - -!IF "$(CFG)" == "mod_authz_user - Win32 Release" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Creating Version Resource -InputPath=..\..\build\win32\win32ver.awk - -".\mod_authz_user.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_authz_user "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_authz_user.rc - -# End Custom Build - -!ELSEIF "$(CFG)" == "mod_authz_user - Win32 Debug" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Creating Version Resource -InputPath=..\..\build\win32\win32ver.awk - -".\mod_authz_user.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - awk -f ../../build/win32/win32ver.awk mod_authz_user "auth_basic_module for Apache" ../../include/ap_release.h > .\mod_authz_user.rc - -# End Custom Build - -!ENDIF - -# End Source File -# End Target -# End Project diff --git a/modules/arch/netware/mod_auth_anon.def b/modules/arch/netware/mod_auth_anon.def new file mode 100644 index 00000000000..ab6b138f816 --- /dev/null +++ b/modules/arch/netware/mod_auth_anon.def @@ -0,0 +1 @@ +EXPORT auth_anon_module diff --git a/modules/arch/netware/mod_auth_basic.def b/modules/arch/netware/mod_auth_basic.def deleted file mode 100644 index 0a6f81aa216..00000000000 --- a/modules/arch/netware/mod_auth_basic.def +++ /dev/null @@ -1 +0,0 @@ -EXPORT auth_basic_module diff --git a/modules/arch/netware/mod_auth_dbm.def b/modules/arch/netware/mod_auth_dbm.def new file mode 100644 index 00000000000..830f194d11a --- /dev/null +++ b/modules/arch/netware/mod_auth_dbm.def @@ -0,0 +1 @@ +EXPORT auth_dbm_module diff --git a/modules/arch/netware/mod_authn_anon.def b/modules/arch/netware/mod_authn_anon.def deleted file mode 100644 index 78bb61be2df..00000000000 --- a/modules/arch/netware/mod_authn_anon.def +++ /dev/null @@ -1 +0,0 @@ -EXPORT authn_anon_module diff --git a/modules/arch/netware/mod_authn_dbm.def b/modules/arch/netware/mod_authn_dbm.def deleted file mode 100644 index 7a242b03171..00000000000 --- a/modules/arch/netware/mod_authn_dbm.def +++ /dev/null @@ -1,2 +0,0 @@ -EXPORT authn_dbm_module - diff --git a/modules/arch/netware/mod_authn_default.def b/modules/arch/netware/mod_authn_default.def deleted file mode 100644 index fb94aa37fb9..00000000000 --- a/modules/arch/netware/mod_authn_default.def +++ /dev/null @@ -1 +0,0 @@ -EXPORT authn_default_module diff --git a/modules/arch/netware/mod_authn_file.def b/modules/arch/netware/mod_authn_file.def deleted file mode 100644 index fd0765a10b2..00000000000 --- a/modules/arch/netware/mod_authn_file.def +++ /dev/null @@ -1,3 +0,0 @@ -EXPORT authn_file_module - - diff --git a/modules/arch/netware/mod_authz_dbm.def b/modules/arch/netware/mod_authz_dbm.def deleted file mode 100644 index d52639c15b6..00000000000 --- a/modules/arch/netware/mod_authz_dbm.def +++ /dev/null @@ -1 +0,0 @@ -EXPORT authz_dbm_module diff --git a/modules/arch/netware/mod_authz_default.def b/modules/arch/netware/mod_authz_default.def deleted file mode 100644 index 164564f540d..00000000000 --- a/modules/arch/netware/mod_authz_default.def +++ /dev/null @@ -1 +0,0 @@ -EXPORT authz_default_module diff --git a/modules/arch/netware/mod_authz_groupfile.def b/modules/arch/netware/mod_authz_groupfile.def deleted file mode 100644 index 25d955519a7..00000000000 --- a/modules/arch/netware/mod_authz_groupfile.def +++ /dev/null @@ -1,2 +0,0 @@ -EXPORT authz_groupfile_module - diff --git a/modules/arch/netware/mod_authz_user.def b/modules/arch/netware/mod_authz_user.def deleted file mode 100644 index 043418b620f..00000000000 --- a/modules/arch/netware/mod_authz_user.def +++ /dev/null @@ -1 +0,0 @@ -EXPORT authz_user_module diff --git a/modules/dav/main/providers.c b/modules/dav/main/providers.c index c808dcd53f4..5358a04835a 100644 --- a/modules/dav/main/providers.c +++ b/modules/dav/main/providers.c @@ -54,18 +54,36 @@ #include "apr_pools.h" #include "apr_hash.h" -#include "ap_provider.h" #include "mod_dav.h" -#define DAV_PROVIDER_GROUP "dav" + +static apr_hash_t *dav_repos_providers = NULL; + + +static apr_status_t dav_cleanup_providers(void *ctx) +{ + dav_repos_providers = NULL; + return APR_SUCCESS; +} DAV_DECLARE(void) dav_register_provider(apr_pool_t *p, const char *name, const dav_provider *provider) { - ap_register_provider(p, DAV_PROVIDER_GROUP, name, provider); + if (dav_repos_providers == NULL) { + dav_repos_providers = apr_hash_make(p); + apr_pool_cleanup_register(p, NULL, dav_cleanup_providers, apr_pool_cleanup_null); + } + + /* just set it. no biggy if it was there before. */ + apr_hash_set(dav_repos_providers, name, APR_HASH_KEY_STRING, provider); } const dav_provider * dav_lookup_provider(const char *name) { - return ap_lookup_provider(DAV_PROVIDER_GROUP, name); + /* Better watch out against no registered providers */ + if (dav_repos_providers == NULL) { + return NULL; + } + + return apr_hash_get(dav_repos_providers, name, APR_HASH_KEY_STRING); } diff --git a/modules/loggers/config.m4 b/modules/loggers/config.m4 index 4e383cd3063..8d4304abc4d 100644 --- a/modules/loggers/config.m4 +++ b/modules/loggers/config.m4 @@ -6,6 +6,4 @@ APACHE_MODPATH_INIT(loggers) APACHE_MODULE(log_config, logging configuration, , , yes) -APACHE_MODULE(logio, input and output logging, , , no) - APACHE_MODPATH_FINISH diff --git a/modules/loggers/mod_logio.c b/modules/loggers/mod_logio.c deleted file mode 100644 index 64c364d4b61..00000000000 --- a/modules/loggers/mod_logio.c +++ /dev/null @@ -1,226 +0,0 @@ -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * nor may "Apache" appear in their name, without prior written - * permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - * Portions of this software are based upon public domain software - * originally written at the National Center for Supercomputing Applications, - * University of Illinois, Urbana-Champaign. - */ - -/* - * Written by Bojan Smojver : - * - * The argument to LogFormat and CustomLog is a string, which can include - * literal characters copied into the log files, and '%' directives as - * follows: - * - * %...I: bytes received, including request and headers, cannot be zero - * %...O: bytes sent, including headers, cannot be zero - * - */ - -#include "apr_strings.h" -#include "apr_lib.h" -#include "apr_hash.h" -#include "apr_optional.h" - -#define APR_WANT_STRFUNC -#include "apr_want.h" - -#include "ap_config.h" -#include "mod_log_config.h" -#include "httpd.h" -#include "http_config.h" -#include "http_protocol.h" - -module AP_MODULE_DECLARE_DATA logio_module; - -static const char logio_filter_name[] = "LOG_INPUT_OUTPUT"; - -/* - * Logging of input and output config... - */ - -typedef struct logio_config_t { - apr_off_t bytes_in; - apr_off_t bytes_out; -} logio_config_t; - -/* - * Format items... - */ - -static const char *log_bytes_in(request_rec *r, char *a) -{ - logio_config_t *cf = ap_get_module_config(r->connection->conn_config, - &logio_module); - - return apr_off_t_toa(r->pool, cf->bytes_in); -} - -static const char *log_bytes_out(request_rec *r, char *a) -{ - logio_config_t *cf = ap_get_module_config(r->connection->conn_config, - &logio_module); - - return apr_off_t_toa(r->pool, cf->bytes_out); -} - -/* - * Reset counters after logging... - */ - -static int logio_transaction(request_rec *r) -{ - logio_config_t *cf = ap_get_module_config(r->connection->conn_config, - &logio_module); - - cf->bytes_in = cf->bytes_out = 0; - - return OK; -} - -/* - * Logging of input and output filters... - */ - -static apr_status_t logio_out_filter(ap_filter_t *f, - apr_bucket_brigade *bb) { - apr_off_t length; - logio_config_t *cf = ap_get_module_config(f->c->conn_config, &logio_module); - - if (!cf) { /* Create config */ - cf = apr_pcalloc(f->c->pool, sizeof(*cf)); - ap_set_module_config(f->c->conn_config, &logio_module, cf); - } - - apr_brigade_length (bb, 0, &length); - - if (length > 0) - cf->bytes_out += length; - - return ap_pass_brigade(f->next, bb); -} - -static apr_status_t logio_in_filter(ap_filter_t *f, - apr_bucket_brigade *bb, - ap_input_mode_t mode, - apr_read_type_e block, - apr_off_t readbytes) { - apr_off_t length; - apr_status_t status; - logio_config_t *cf = ap_get_module_config(f->c->conn_config, &logio_module); - - status = ap_get_brigade(f->next, bb, mode, block, readbytes); - - if (!cf) { /* Create config */ - cf = apr_pcalloc(f->c->pool, sizeof(*cf)); - ap_set_module_config(f->c->conn_config, &logio_module, cf); - } - - apr_brigade_length (bb, 0, &length); - - if (length > 0) - cf->bytes_in += length; - - return status; -} - -/* - * The hooks... - */ - -static int logio_pre_conn(conn_rec *c) { - ap_add_input_filter(logio_filter_name, NULL, NULL, c); - ap_add_output_filter(logio_filter_name, NULL, NULL, c); - - return OK; -} - -static int logio_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) -{ - static APR_OPTIONAL_FN_TYPE(ap_register_log_handler) *log_pfn_register; - - log_pfn_register = APR_RETRIEVE_OPTIONAL_FN(ap_register_log_handler); - - if (log_pfn_register) { - log_pfn_register(p, "I", log_bytes_in, 0); - log_pfn_register(p, "O", log_bytes_out, 0); - } - - return OK; -} - -static void register_hooks(apr_pool_t *p) -{ - static const char *pre[] = { "mod_log_config.c", NULL }; - - ap_hook_pre_connection(logio_pre_conn, NULL, NULL, APR_HOOK_MIDDLE); - ap_hook_pre_config(logio_pre_config, NULL, NULL, APR_HOOK_REALLY_FIRST); - ap_hook_log_transaction(logio_transaction, pre, NULL, APR_HOOK_MIDDLE); - - ap_register_input_filter(logio_filter_name, logio_in_filter, NULL, - AP_FTYPE_NETWORK - 1); - ap_register_output_filter(logio_filter_name, logio_out_filter, NULL, - AP_FTYPE_NETWORK - 1); -} - -module AP_MODULE_DECLARE_DATA logio_module = -{ - STANDARD20_MODULE_STUFF, - NULL, /* create per-dir config */ - NULL, /* merge per-dir config */ - NULL, /* server config */ - NULL, /* merge server config */ - NULL, /* command apr_table_t */ - register_hooks /* register hooks */ -}; diff --git a/os/netware/modules.c b/os/netware/modules.c index 1ec622eaa48..966f9c731ef 100644 --- a/os/netware/modules.c +++ b/os/netware/modules.c @@ -12,7 +12,8 @@ extern module mpm_netware_module; extern module http_module; extern module so_module; extern module mime_module; -extern module authz_host_module; +extern module access_module; +extern module auth_module; extern module negotiation_module; extern module include_module; extern module autoindex_module; @@ -35,7 +36,8 @@ module *ap_prelinked_modules[] = { &http_module, &so_module, &mime_module, - &authz_host_module, + &access_module, + &auth_module, &negotiation_module, &include_module, &autoindex_module, @@ -60,7 +62,8 @@ module *ap_preloaded_modules[] = { &http_module, &so_module, &mime_module, - &authz_host_module, + &access_module, + &auth_module, &negotiation_module, &include_module, &autoindex_module, diff --git a/os/win32/BaseAddr.ref b/os/win32/BaseAddr.ref index 5fdf1c57a0f..e954eabedf6 100644 --- a/os/win32/BaseAddr.ref +++ b/os/win32/BaseAddr.ref @@ -9,7 +9,7 @@ ; module name base-address max-size libhttpd 0x6FF00000 0x000A0000 -mod_auth_basic 0x6FEF0000 0x00010000 +mod_auth_anon 0x6FEF0000 0x00010000 mod_auth_digest 0x6FED0000 0x00020000 mod_cern_meta 0x6FEC0000 0x00010000 mod_expires 0x6FEB0000 0x00010000 @@ -20,6 +20,7 @@ mod_speling 0x6FE60000 0x00010000 mod_status 0x6FE50000 0x00010000 mod_usertrack 0x6FE40000 0x00010000 mod_file_cache 0x6FE20000 0x00020000 +mod_auth_dbm 0x6FE10000 0x00010000 mod_unique_id 0x6FE00000 0x00010000 mod_vhost_alias 0x6FDF0000 0x00010000 mod_mime_magic 0x6FDE0000 0x00010000 @@ -30,9 +31,11 @@ mod_proxy_connect 0x6FD90000 0x00010000 mod_proxy_ftp 0x6FD80000 0x00010000 mod_proxy_http 0x6FD70000 0x00010000 mod_ssl 0x6FD00000 0x00070000 +mod_access 0x6FCF0000 0x00010000 mod_actions 0x6FCE0000 0x00010000 mod_alias 0x6FCD0000 0x00010000 mod_asis 0x6FCC0000 0x00010000 +mod_auth 0x6FCB0000 0x00010000 mod_autoindex 0x6FCA0000 0x00010000 mod_cgi 0x6FC90000 0x00010000 mod_dir 0x6FC80000 0x00010000 @@ -51,12 +54,3 @@ mod_mem_cache 0x6FBC0000 0x00010000 mod_deflate 0x6FBA0000 0x00020000 mod_ext_filter 0x6FB90000 0x00010000 mod_charset_lite 0x6FB80000 0x00010000 -mod_authn_anon 0x6FB70000 0x00010000 -mod_authn_dbm 0x6FB60000 0x00010000 -mod_authn_default 0x6FB50000 0x00010000 -mod_authn_file 0x6FB40000 0x00010000 -mod_authz_dbm 0x6FB30000 0x00010000 -mod_authz_default 0x6FB20000 0x00010000 -mod_authz_groupfile 0x6FB10000 0x00010000 -mod_authz_host 0x6FB00000 0x00010000 -mod_authz_user 0x6FAF0000 0x00010000 diff --git a/server/Makefile.in b/server/Makefile.in index ff90fd06288..47f028f6901 100644 --- a/server/Makefile.in +++ b/server/Makefile.in @@ -13,8 +13,8 @@ LTLIBRARY_SOURCES = \ util_script.c util_md5.c util_cfgtree.c util_ebcdic.c util_time.c \ rfc1413.c connection.c listen.c \ mpm_common.c util_charset.c util_debug.c util_xml.c \ - util_filter.c $(top_srcdir)/server/exports.c buildmark.c scoreboard.c \ - error_bucket.c protocol.c core.c request.c provider.c + util_filter.c exports.c buildmark.c scoreboard.c \ + error_bucket.c protocol.c core.c request.c TARGETS = delete-exports $(LTLIBRARY_NAME) $(CORE_IMPLIB_FILE) export_vars.h httpd.exp @@ -46,8 +46,7 @@ delete-exports: fi \ fi -# full path required to keep BSD make happy -$(top_srcdir)/server/exports.c: +exports.c: $(AWK) -f $(top_srcdir)/build/make_exports.awk $(EXPORT_FILES) > $@ export_vars.h: diff --git a/server/provider.c b/server/provider.c deleted file mode 100644 index d90a5e349e6..00000000000 --- a/server/provider.c +++ /dev/null @@ -1,117 +0,0 @@ -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * nor may "Apache" appear in their name, without prior written - * permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - * - */ - -#include "apr_pools.h" -#include "apr_hash.h" - -#include "ap_provider.h" - -static apr_hash_t *global_providers = NULL; - -static apr_status_t cleanup_global_providers(void *ctx) -{ - global_providers = NULL; - return APR_SUCCESS; -} - -AP_DECLARE(apr_status_t) ap_register_provider(apr_pool_t *pool, - const char *provider_group, - const char *provider_name, - const void *provider) -{ - apr_hash_t *provider_group_hash; - - if (global_providers == NULL) { - global_providers = apr_hash_make(pool); - apr_pool_cleanup_register(pool, NULL, cleanup_global_providers, - apr_pool_cleanup_null); - } - - provider_group_hash = apr_hash_get(global_providers, provider_group, - APR_HASH_KEY_STRING); - - if (!provider_group_hash) { - provider_group_hash = apr_hash_make(pool); - apr_hash_set(global_providers, provider_group, APR_HASH_KEY_STRING, - provider_group_hash); - - } - - /* just set it. no biggy if it was there before. */ - apr_hash_set(provider_group_hash, provider_name, APR_HASH_KEY_STRING, - provider); - - return APR_SUCCESS; -} - -AP_DECLARE(void *) ap_lookup_provider(const char *provider_group, - const char *provider_name) -{ - apr_hash_t *provider_group_hash; - - if (global_providers == NULL) { - return NULL; - } - - provider_group_hash = apr_hash_get(global_providers, provider_group, - APR_HASH_KEY_STRING); - - if (provider_group_hash == NULL) { - return NULL; - } - - return apr_hash_get(provider_group_hash, provider_name, - APR_HASH_KEY_STRING); -} diff --git a/support/dbmmanage b/support/dbmmanage deleted file mode 100644 index 49190f13e06..00000000000 --- a/support/dbmmanage +++ /dev/null @@ -1,350 +0,0 @@ -#!/usr/bin/perl -# ==================================================================== -# The Apache Software License, Version 1.1 -# -# Copyright (c) 2000-2002 The Apache Software Foundation. All rights -# reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# -# 3. The end-user documentation included with the redistribution, -# if any, must include the following acknowledgment: -# "This product includes software developed by the -# Apache Software Foundation (http://www.apache.org/)." -# Alternately, this acknowledgment may appear in the software itself, -# if and wherever such third-party acknowledgments normally appear. -# -# 4. The names "Apache" and "Apache Software Foundation" must -# not be used to endorse or promote products derived from this -# software without prior written permission. For written -# permission, please contact apache@apache.org. -# -# 5. Products derived from this software may not be called "Apache", -# nor may "Apache" appear in their name, without prior written -# permission of the Apache Software Foundation. -# -# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR -# ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -# SUCH DAMAGE. -# ==================================================================== -# -# This software consists of voluntary contributions made by many -# individuals on behalf of the Apache Software Foundation. For more -# information on the Apache Software Foundation, please see -# . -# - -#for more functionality see the HTTPD::UserAdmin module: -# http://www.perl.com/CPAN/modules/by-module/HTTPD/HTTPD-Tools-x.xx.tar.gz -# -# usage: dbmmanage - -package dbmmanage; -# -ldb -lndbm -lgdbm -lsdbm -BEGIN { @AnyDBM_File::ISA = qw(DB_File NDBM_File GDBM_File SDBM_File) } -use strict; -use Fcntl; -use AnyDBM_File (); - -sub usage { - my $cmds = join "|", sort keys %dbmc::; - die <$command(); -untie %DB; - - -my $x; -sub genseed { - my $psf; - if ($not_unix) { - srand (time ^ $$ or time ^ ($$ + ($$ << 15))); - } - else { - for (qw(-xlwwa -le)) { - `ps $_ 2>/dev/null`; - $psf = $_, last unless $?; - } - srand (time ^ $$ ^ unpack("%L*", `ps $psf | gzip -f`)); - } - @range = (qw(. /), '0'..'9','a'..'z','A'..'Z'); - $x = int scalar @range; -} - -sub randchar { - join '', map $range[rand $x], 1..shift||1; -} - -sub saltpw_crypt { - genseed() unless @range; - return $newstyle_salt ? - join '', "_", randchar, "a..", randchar(4) : - randchar(2); -} - -sub cryptpw_crypt { - my ($pw, $salt) = @_; - $salt = saltpw_crypt unless $salt; - crypt $pw, $salt; -} - -sub saltpw_md5 { - genseed() unless @range; - randchar(8); -} - -sub cryptpw_md5 { - my($pw, $salt) = @_; - $salt = saltpw_md5 unless $salt; - Crypt::PasswdMD5::apache_md5_crypt($pw, $salt); -} - -sub cryptpw_sha1 { - my($pw, $salt) = @_; - '{SHA}' . Digest::SHA1::sha1_base64($pw) . "="; -} - -sub cryptpw { - if ($crypt_method eq "md5") { - return cryptpw_md5(@_); - } elsif ($crypt_method eq "sha1") { - return cryptpw_sha1(@_); - } elsif ($crypt_method eq "crypt") { - return cryptpw_crypt(@_); - } - @_[0]; # otherwise return plaintext -} - -sub getpass { - my $prompt = shift || "Enter password:"; - - unless($not_unix) { - open STDIN, "/dev/tty" or warn "couldn't open /dev/tty $!\n"; - system "stty -echo;"; - } - - my($c,$pwd); - print STDERR $prompt; - while (($c = getc(STDIN)) ne '' and $c ne "\n" and $c ne "\r") { - $pwd .= $c; - } - - system "stty echo" unless $not_unix; - print STDERR "\n"; - die "Can't use empty password!\n" unless length $pwd; - return $pwd; -} - -sub dbmc::update { - die "Sorry, user `$key' doesn't exist!\n" unless $DB{$key}; - $crypted_pwd = (split /:/, $DB{$key}, 3)[0] if $crypted_pwd eq '.'; - $groups = (split /:/, $DB{$key}, 3)[1] if !$groups || $groups eq '.'; - $comment = (split /:/, $DB{$key}, 3)[2] if !$comment || $comment eq '.'; - if (!$crypted_pwd || $crypted_pwd eq '-') { - dbmc->adduser; - } - else { - dbmc->add; - } -} - -sub dbmc::add { - die "Can't use empty password!\n" unless $crypted_pwd; - unless($is_update) { - die "Sorry, user `$key' already exists!\n" if $DB{$key}; - } - $groups = '' if $groups eq '-'; - $comment = '' if $comment eq '-'; - $groups .= ":" . $comment if $comment; - $crypted_pwd .= ":" . $groups if $groups; - $DB{$key} = $crypted_pwd; - my $action = $is_update ? "updated" : "added"; - print "User $key $action with password encrypted to $DB{$key} using $crypt_method\n"; -} - -sub dbmc::adduser { - my $value = getpass "New password:"; - die "They don't match, sorry.\n" unless getpass("Re-type new password:") eq $value; - $crypted_pwd = cryptpw $value; - dbmc->add; -} - -sub dbmc::delete { - die "Sorry, user `$key' doesn't exist!\n" unless $DB{$key}; - delete $DB{$key}, print "`$key' deleted\n"; -} - -sub dbmc::view { - print $key ? "$key:$DB{$key}\n" : map { "$_:$DB{$_}\n" if $DB{$_} } keys %DB; -} - -sub dbmc::check { - die "Sorry, user `$key' doesn't exist!\n" unless $DB{$key}; - my $chkpass = (split /:/, $DB{$key}, 3)[0]; - my $testpass = getpass(); - if (substr($chkpass, 0, 6) eq '$apr1$') { - need_md5_crypt; - $crypt_method = "md5"; - } elsif (substr($chkpass, 0, 5) eq '{SHA}') { - need_sha1_crypt; - $crypt_method = "sha1"; - } elsif (length($chkpass) == 13 && $chkpass ne $testpass) { - $crypt_method = "crypt"; - } else { - $crypt_method = "plain"; - } - print $crypt_method . (cryptpw($testpass, $chkpass) eq $chkpass - ? " password ok\n" : " password mismatch\n"); -} - -sub dbmc::import { - while(defined($_ = ) and chomp) { - ($key,$crypted_pwd,$groups,$comment) = split /:/, $_, 4; - dbmc->add; - } -} - diff --git a/support/log_server_status b/support/log_server_status deleted file mode 100644 index f9c871d8355..00000000000 --- a/support/log_server_status +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/perl -# ==================================================================== -# The Apache Software License, Version 1.1 -# -# Copyright (c) 2000-2002 The Apache Software Foundation. All rights -# reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# -# 3. The end-user documentation included with the redistribution, -# if any, must include the following acknowledgment: -# "This product includes software developed by the -# Apache Software Foundation (http://www.apache.org/)." -# Alternately, this acknowledgment may appear in the software itself, -# if and wherever such third-party acknowledgments normally appear. -# -# 4. The names "Apache" and "Apache Software Foundation" must -# not be used to endorse or promote products derived from this -# software without prior written permission. For written -# permission, please contact apache@apache.org. -# -# 5. Products derived from this software may not be called "Apache", -# nor may "Apache" appear in their name, without prior written -# permission of the Apache Software Foundation. -# -# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR -# ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -# SUCH DAMAGE. -# ==================================================================== -# -# This software consists of voluntary contributions made by many -# individuals on behalf of the Apache Software Foundation. For more -# information on the Apache Software Foundation, please see -# . -# -# Log Server Status -# Mark J Cox, UK Web Ltd 1996, mark@ukweb.com -# -# This script is designed to be run at a frequent interval by something -# like cron. It connects to the server and downloads the status -# information. It reformats the information to a single line and logs -# it to a file. Make sure the directory $wherelog is writable by the -# user who runs this script. -# -require 'sys/socket.ph'; - -$wherelog = "/var/log/graph/"; # Logs will be like "/var/log/graph/19960312" -$server = "localhost"; # Name of server, could be "www.foo.com" -$port = "80"; # Port on server -$request = "/status/?auto"; # Request to send - -sub tcp_connect -{ - local($host,$port) =@_; - $sockaddr='S n a4 x8'; - chop($hostname=`hostname`); - $port=(getservbyname($port, 'tcp'))[2] unless $port =~ /^\d+$/; - $me=pack($sockaddr,&AF_INET,0,(gethostbyname($hostname))[4]); - $them=pack($sockaddr,&AF_INET,$port,(gethostbyname($host))[4]); - socket(S,&PF_INET,&SOCK_STREAM,(getprotobyname('tcp'))[2]) || - die "socket: $!"; - bind(S,$me) || return "bind: $!"; - connect(S,$them) || return "connect: $!"; - select(S); - $| = 1; - select(stdout); - return ""; -} - -### Main - -{ - $year=`date +%y`; - chomp($year); - $year += ($year < 70) ? 2000 : 1900; - $date = $year . `date +%m%d:%H%M%S`; - chomp($date); - ($day,$time)=split(/:/,$date); - $res=&tcp_connect($server,$port); - open(OUT,">>$wherelog$day"); - if ($res) { - print OUT "$time:-1:-1:-1:-1:$res\n"; - exit 1; - } - print S "GET $request\n"; - while () { - $requests=$1 if ( m|^BusyServers:\ (\S+)|); - $idle=$1 if ( m|^IdleServers:\ (\S+)|); - $number=$1 if ( m|sses:\ (\S+)|); - $cpu=$1 if (m|^CPULoad:\ (\S+)|); - } - print OUT "$time:$requests:$idle:$number:$cpu\n"; -} - - diff --git a/support/logresolve.pl b/support/logresolve.pl deleted file mode 100644 index b99a5b8d837..00000000000 --- a/support/logresolve.pl +++ /dev/null @@ -1,261 +0,0 @@ -#!/usr/bin/perl -# ==================================================================== -# The Apache Software License, Version 1.1 -# -# Copyright (c) 2000-2002 The Apache Software Foundation. All rights -# reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# -# 3. The end-user documentation included with the redistribution, -# if any, must include the following acknowledgment: -# "This product includes software developed by the -# Apache Software Foundation (http://www.apache.org/)." -# Alternately, this acknowledgment may appear in the software itself, -# if and wherever such third-party acknowledgments normally appear. -# -# 4. The names "Apache" and "Apache Software Foundation" must -# not be used to endorse or promote products derived from this -# software without prior written permission. For written -# permission, please contact apache@apache.org. -# -# 5. Products derived from this software may not be called "Apache", -# nor may "Apache" appear in their name, without prior written -# permission of the Apache Software Foundation. -# -# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR -# ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -# SUCH DAMAGE. -# ==================================================================== -# -# This software consists of voluntary contributions made by many -# individuals on behalf of the Apache Software Foundation. For more -# information on the Apache Software Foundation, please see -# . -# -# logresolve.pl -# -# v 1.2 by robh @ imdb.com -# -# usage: logresolve.pl outfile -# -# input = Apache/NCSA/.. logfile with IP numbers at start of lines -# output = same logfile with IP addresses resolved to hostnames where -# name lookups succeeded. -# -# this differs from the C based 'logresolve' in that this script -# spawns a number ($CHILDREN) of subprocesses to resolve addresses -# concurrently and sets a short timeout ($TIMEOUT) for each lookup in -# order to keep things moving quickly. -# -# the parent process handles caching of IP->hostnames using a Perl hash -# it also avoids sending the same IP to multiple child processes to be -# resolved multiple times concurrently. -# -# Depending on the settings of $CHILDREN and $TIMEOUT you should see -# significant reductions in the overall time taken to resolve your -# logfiles. With $CHILDREN=40 and $TIMEOUT=5 I've seen 200,000 - 300,000 -# logfile lines processed per hour compared to ~45,000 per hour -# with 'logresolve'. -# -# I haven't yet seen any noticable reduction in the percentage of IPs -# that fail to get resolved. Your mileage will no doubt vary. 5s is long -# enough to wait IMO. -# -# Known to work with FreeBSD 2.2 -# Known to have problems with Solaris -# -# 980417 - use 'sockaddr_un' for bind/connect to make the script work -# with linux. Fix from Luuk de Boer - -require 5.004; - -$|=1; - -use FileHandle; -use Socket; - -use strict; -no strict 'refs'; - -use vars qw($PROTOCOL); -$PROTOCOL = 0; - -my $CHILDREN = 40; -my $TIMEOUT = 5; - -my $filename; -my %hash = (); -my $parent = $$; - -my @children = (); -for (my $child = 1; $child <=$CHILDREN; $child++) { - my $f = fork(); - if (!$f) { - $filename = "./.socket.$parent.$child"; - if (-e $filename) { unlink($filename) || warn "$filename .. $!\n";} - &child($child); - exit(0); - } - push(@children, $f); -} - -&parent; -&cleanup; - -## remove all temporary files before shutting down -sub cleanup { - # die kiddies, die - kill(15, @children); - for (my $child = 1; $child <=$CHILDREN; $child++) { - if (-e "./.socket.$parent.$child") { - unlink("./.socket.$parent.$child") - || warn ".socket.$parent.$child $!"; - } - } -} - -sub parent { - # Trap some possible signals to trigger temp file cleanup - $SIG{'KILL'} = $SIG{'INT'} = $SIG{'PIPE'} = \&cleanup; - - my %CHILDSOCK; - my $filename; - - ## fork child processes. Each child will create a socket connection - ## to this parent and use an unique temp filename to do so. - for (my $child = 1; $child <=$CHILDREN; $child++) { - $CHILDSOCK{$child}= FileHandle->new; - - if (!socket($CHILDSOCK{$child}, AF_UNIX, SOCK_STREAM, $PROTOCOL)) { - warn "parent socket to child failed $!"; - } - $filename = "./.socket.$parent.$child"; - my $response; - do { - $response = connect($CHILDSOCK{$child}, sockaddr_un($filename)); - if ($response != 1) { - sleep(1); - } - } while ($response != 1); - $CHILDSOCK{$child}->autoflush; - } - ## All child processes should now be ready or at worst warming up - - my (@buffer, $child, $ip, $rest, $hostname, $response); - ## read the logfile lines from STDIN - while() { - @buffer = (); # empty the logfile line buffer array. - $child = 1; # children are numbered 1..N, start with #1 - - # while we have a child to talk to and data to give it.. - do { - push(@buffer, $_); # buffer the line - ($ip, $rest) = split(/ /, $_, 2); # separate IP form rest - - unless ($hash{$ip}) { # resolve if unseen IP - $CHILDSOCK{$child}->print("$ip\n"); # pass IP to next child - $hash{$ip} = $ip; # don't look it up again. - $child++; - } - } while (($child < ($CHILDREN-1)) and ($_ = )); - - ## now poll each child for a response - while (--$child > 0) { - $response = $CHILDSOCK{$child}->getline; - chomp($response); - # child sends us back both the IP and HOSTNAME, no need for us - # to remember what child received any given IP, and no worries - # what order we talk to the children - ($ip, $hostname) = split(/\|/, $response, 2); - $hash{$ip} = $hostname; - } - - # resolve all the logfiles lines held in the log buffer array.. - for (my $line = 0; $line <=$#buffer; $line++) { - # get next buffered line - ($ip, $rest) = split(/ /, $buffer[$line], 2); - # separate IP from rest and replace with cached hostname - printf STDOUT ("%s %s", $hash{$ip}, $rest); - } - } -} - -######################################## - -sub child { - # arg = numeric ID - how the parent refers to me - my $me = shift; - - # add trap for alarm signals. - $SIG{'ALRM'} = sub { die "alarmed"; }; - - # create a socket to communicate with parent - socket(INBOUND, AF_UNIX, SOCK_STREAM, $PROTOCOL) - || die "Error with Socket: !$\n"; - $filename = "./.socket.$parent.$me"; - bind(INBOUND, sockaddr_un($filename)) - || die "Error Binding $filename: $!\n"; - listen(INBOUND, 5) || die "Error Listening: $!\n"; - - my ($ip, $send_back); - my $talk = FileHandle->new; - - # accept a connection from the parent process. We only ever have - # have one connection where we exchange 1 line of info with the - # parent.. 1 line in (IP address), 1 line out (IP + hostname). - accept($talk, INBOUND) || die "Error Accepting: $!\n"; - # disable I/O buffering just in case - $talk->autoflush; - # while the parent keeps sending data, we keep responding.. - while(($ip = $talk->getline)) { - chomp($ip); - # resolve the IP if time permits and send back what we found.. - $send_back = sprintf("%s|%s", $ip, &nslookup($ip)); - $talk->print($send_back."\n"); - } -} - -# perform a time restricted hostname lookup. -sub nslookup { - # get the IP as an arg - my $ip = shift; - my $hostname = undef; - - # do the hostname lookup inside an eval. The eval will use the - # already configured SIGnal handler and drop out of the {} block - # regardless of whether the alarm occured or not. - eval { - alarm($TIMEOUT); - $hostname = gethostbyaddr(gethostbyname($ip), AF_INET); - alarm(0); - }; - if ($@ =~ /alarm/) { - # useful for debugging perhaps.. - # print "alarming, isn't it? ($ip)"; - } - - # return the hostname or the IP address itself if there is no hostname - $hostname ne "" ? $hostname : $ip; -} - - diff --git a/support/phf_abuse_log.cgi b/support/phf_abuse_log.cgi deleted file mode 100644 index 87543ce5f48..00000000000 --- a/support/phf_abuse_log.cgi +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/perl - -# This script is used to detect people trying to abuse the security hole which -# existed in A CGI script direstributed with Apache 1.0.3 and earlier versions. -# You can redirect them to here using the "" suggestion -# in httpd.conf. -# -# The format logged to is -# "[date] remote_addr remote_host [date] referrer user_agent". - -$LOG = "/var/log/phf_log"; - -require "ctime.pl"; -$when = &ctime(time); -$when =~ s/\n//go; -$ENV{HTTP_USER_AGENT} .= " via $ENV{HTTP_VIA}" if($ENV{HTTP_VIA}); - -open(LOG, ">>$LOG") || die "boo hoo, phf_log $!"; -print LOG "[$when] $ENV{REMOTE_ADDR} $ENV{REMOTE_HOST} $ENV{$HTTP_REFERER} $ENV{HTTP_USER_AGENT}\n"; -close(LOG); - -print "Content-type: text/html\r\n\r\nSmile, you're on Candid Camera.\n"; diff --git a/support/split-logfile b/support/split-logfile deleted file mode 100644 index c0f34861aab..00000000000 --- a/support/split-logfile +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/perl -# ==================================================================== -# The Apache Software License, Version 1.1 -# -# Copyright (c) 2000-2001 The Apache Software Foundation. All rights -# reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# -# 3. The end-user documentation included with the redistribution, -# if any, must include the following acknowledgment: -# "This product includes software developed by the -# Apache Software Foundation (http://www.apache.org/)." -# Alternately, this acknowledgment may appear in the software itself, -# if and wherever such third-party acknowledgments normally appear. -# -# 4. The names "Apache" and "Apache Software Foundation" must -# not be used to endorse or promote products derived from this -# software without prior written permission. For written -# permission, please contact apache@apache.org. -# -# 5. Products derived from this software may not be called "Apache", -# nor may "Apache" appear in their name, without prior written -# permission of the Apache Software Foundation. -# -# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR -# ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -# SUCH DAMAGE. -# ==================================================================== -# -# This software consists of voluntary contributions made by many -# individuals on behalf of the Apache Software Foundation. For more -# information on the Apache Software Foundation, please see -# . - -# This script will take a combined Web server access -# log file and break its contents into separate files. -# It assumes that the first field of each line is the -# virtual host identity (put there by "%v"), and that -# the logfiles should be named that+".log" in the current -# directory. -# -# The combined log file is read from stdin. Records read -# will be appended to any existing log files. -# -%is_open = (); - -while ($log_line = ) { - # - # Get the first token from the log record; it's the - # identity of the virtual host to which the record - # applies. - # - ($vhost) = split (/\s/, $log_line); - # - # Normalize the virtual host name to all lowercase. - # If it's blank, the request was handled by the default - # server, so supply a default name. This shouldn't - # happen, but caution rocks. - # - $vhost = lc ($vhost) or "access"; - # - # If the log file for this virtual host isn't opened - # yet, do it now. - # - if (! $is_open{$vhost}) { - open $vhost, ">>${vhost}.log" - or die ("Can't open ${vhost}.log"); - $is_open{$vhost} = 1; - } - # - # Strip off the first token (which may be null in the - # case of the default server), and write the edited - # record to the current log file. - # - $log_line =~ s/^\S*\s+//; - printf $vhost "%s", $log_line; -} -exit 0; -- 2.47.3