diff --git a/doku.php b/doku.php index 3963a5aa0..990bb43d3 100644 --- a/doku.php +++ b/doku.php @@ -20,13 +20,8 @@ if (isset($_SERVER['HTTP_X_DOKUWIKI_DO'])){ $ACT = 'show'; } +// load and initialize the core system require_once(DOKU_INC.'inc/init.php'); -require_once(DOKU_INC.'inc/common.php'); -require_once(DOKU_INC.'inc/events.php'); -require_once(DOKU_INC.'inc/pageutils.php'); -require_once(DOKU_INC.'inc/html.php'); -require_once(DOKU_INC.'inc/auth.php'); -require_once(DOKU_INC.'inc/actions.php'); //import variables $QUERY = trim($_REQUEST['id']); diff --git a/inc/FeedParser.php b/inc/FeedParser.php index f37888f01..9d00e7abf 100644 --- a/inc/FeedParser.php +++ b/inc/FeedParser.php @@ -6,9 +6,6 @@ */ if(!defined('DOKU_INC')) die('meh.'); -require_once(DOKU_INC.'inc/HTTPClient.php'); -require_once(DOKU_INC.'inc/SimplePie.php'); - /** * We override some methods of the original SimplePie class here diff --git a/inc/JSON.php b/inc/JSON.php index 7ec400092..332827f4c 100644 --- a/inc/JSON.php +++ b/inc/JSON.php @@ -59,7 +59,6 @@ // for DokuWiki if(!defined('DOKU_INC')) die('meh.'); -require_once(DOKU_INC.'inc/utf8.php'); /** * Marker constant for JSON::decode(), used to flag stack state diff --git a/inc/actions.php b/inc/actions.php index 1fda0584e..7f9cb26d0 100644 --- a/inc/actions.php +++ b/inc/actions.php @@ -7,8 +7,6 @@ */ if(!defined('DOKU_INC')) die('meh.'); -require_once(DOKU_INC.'inc/template.php'); - /** * Call the needed action handlers diff --git a/inc/auth.php b/inc/auth.php index c18104487..33626cf80 100644 --- a/inc/auth.php +++ b/inc/auth.php @@ -10,8 +10,6 @@ */ if(!defined('DOKU_INC')) die('meh.'); -require_once(DOKU_INC.'inc/common.php'); -require_once(DOKU_INC.'inc/io.php'); // some ACL level defines define('AUTH_NONE',0); @@ -22,15 +20,23 @@ define('AUTH_UPLOAD',8); define('AUTH_DELETE',16); define('AUTH_ADMIN',255); -global $conf; - -if($conf['useacl']){ - require_once(DOKU_INC.'inc/blowfish.php'); - require_once(DOKU_INC.'inc/mail.php'); - +/** + * Initialize the auth system. + * + * This function is automatically called at the end of init.php + * + * This used to be the main() of the auth.php + * + * @todo backend loading maybe should be handled by the class autoloader + * @todo maybe split into multiple functions at the XXX marked positions + */ +function auth_setup(){ + global $conf; global $auth; - // load the the backend auth functions and instantiate the auth object + if(!$conf['useacl']) return false; + + // load the the backend auth functions and instantiate the auth object XXX if (@file_exists(DOKU_INC.'inc/auth/'.$conf['authtype'].'.class.php')) { require_once(DOKU_INC.'inc/auth/basic.class.php'); require_once(DOKU_INC.'inc/auth/'.$conf['authtype'].'.class.php'); @@ -50,51 +56,49 @@ if($conf['useacl']){ } else { nice_die($lang['authmodfailed']); } -} -// do the login either by cookie or provided credentials -if($conf['useacl']){ - if($auth){ - if (!isset($_REQUEST['u'])) $_REQUEST['u'] = ''; - if (!isset($_REQUEST['p'])) $_REQUEST['p'] = ''; - if (!isset($_REQUEST['r'])) $_REQUEST['r'] = ''; - $_REQUEST['http_credentials'] = false; - if (!$conf['rememberme']) $_REQUEST['r'] = false; + if(!$auth) return; - // streamline HTTP auth credentials (IIS/rewrite -> mod_php) - if(isset($_SERVER['HTTP_AUTHORIZATION'])){ - list($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']) = - explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6))); - } + // do the login either by cookie or provided credentials XXX + if (!isset($_REQUEST['u'])) $_REQUEST['u'] = ''; + if (!isset($_REQUEST['p'])) $_REQUEST['p'] = ''; + if (!isset($_REQUEST['r'])) $_REQUEST['r'] = ''; + $_REQUEST['http_credentials'] = false; + if (!$conf['rememberme']) $_REQUEST['r'] = false; - // if no credentials were given try to use HTTP auth (for SSO) - if(empty($_REQUEST['u']) && empty($_COOKIE[DOKU_COOKIE]) && !empty($_SERVER['PHP_AUTH_USER'])){ - $_REQUEST['u'] = $_SERVER['PHP_AUTH_USER']; - $_REQUEST['p'] = $_SERVER['PHP_AUTH_PW']; - $_REQUEST['http_credentials'] = true; - } - - // apply cleaning - $_REQUEST['u'] = $auth->cleanUser($_REQUEST['u']); - - if(isset($_REQUEST['authtok'])){ - // when an authentication token is given, trust the session - auth_validateToken($_REQUEST['authtok']); - }elseif(!is_null($auth) && $auth->canDo('external')){ - // external trust mechanism in place - $auth->trustExternal($_REQUEST['u'],$_REQUEST['p'],$_REQUEST['r']); - }else{ - $evdata = array( - 'user' => $_REQUEST['u'], - 'password' => $_REQUEST['p'], - 'sticky' => $_REQUEST['r'], - 'silent' => $_REQUEST['http_credentials'], - ); - trigger_event('AUTH_LOGIN_CHECK', $evdata, 'auth_login_wrapper'); - } + // streamline HTTP auth credentials (IIS/rewrite -> mod_php) + if(isset($_SERVER['HTTP_AUTHORIZATION'])){ + list($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']) = + explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6))); } - //load ACL into a global array + // if no credentials were given try to use HTTP auth (for SSO) + if(empty($_REQUEST['u']) && empty($_COOKIE[DOKU_COOKIE]) && !empty($_SERVER['PHP_AUTH_USER'])){ + $_REQUEST['u'] = $_SERVER['PHP_AUTH_USER']; + $_REQUEST['p'] = $_SERVER['PHP_AUTH_PW']; + $_REQUEST['http_credentials'] = true; + } + + // apply cleaning + $_REQUEST['u'] = $auth->cleanUser($_REQUEST['u']); + + if(isset($_REQUEST['authtok'])){ + // when an authentication token is given, trust the session + auth_validateToken($_REQUEST['authtok']); + }elseif(!is_null($auth) && $auth->canDo('external')){ + // external trust mechanism in place + $auth->trustExternal($_REQUEST['u'],$_REQUEST['p'],$_REQUEST['r']); + }else{ + $evdata = array( + 'user' => $_REQUEST['u'], + 'password' => $_REQUEST['p'], + 'sticky' => $_REQUEST['r'], + 'silent' => $_REQUEST['http_credentials'], + ); + trigger_event('AUTH_LOGIN_CHECK', $evdata, 'auth_login_wrapper'); + } + + //load ACL into a global array XXX global $AUTH_ACL; if(is_readable(DOKU_CONF.'acl.auth.php')){ $AUTH_ACL = file(DOKU_CONF.'acl.auth.php'); diff --git a/inc/cache.php b/inc/cache.php index 2e22edfb1..571b314cd 100644 --- a/inc/cache.php +++ b/inc/cache.php @@ -7,9 +7,6 @@ */ if(!defined('DOKU_INC')) die('meh.'); -require_once(DOKU_INC.'inc/io.php'); -require_once(DOKU_INC.'inc/pageutils.php'); -require_once(DOKU_INC.'inc/parserutils.php'); class cache { var $key = ''; // primary identifier for this item diff --git a/inc/common.php b/inc/common.php index 9cadb56fd..ef35ca863 100644 --- a/inc/common.php +++ b/inc/common.php @@ -7,13 +7,6 @@ */ if(!defined('DOKU_INC')) die('meh.'); -require_once(DOKU_INC.'inc/io.php'); -require_once(DOKU_INC.'inc/changelog.php'); -require_once(DOKU_INC.'inc/utf8.php'); -require_once(DOKU_INC.'inc/mail.php'); -require_once(DOKU_INC.'inc/parserutils.php'); -require_once(DOKU_INC.'inc/infoutils.php'); -require_once DOKU_INC.'inc/subscription.php'; /** * These constants are used with the recents function diff --git a/inc/events.php b/inc/events.php index e6b608f20..1c82af003 100644 --- a/inc/events.php +++ b/inc/events.php @@ -7,7 +7,6 @@ */ if(!defined('DOKU_INC')) die('meh.'); -require_once(DOKU_INC.'inc/pluginutils.php'); class Doku_Event { diff --git a/inc/form.php b/inc/form.php index 0a6bc2bba..cebaf4608 100644 --- a/inc/form.php +++ b/inc/form.php @@ -7,7 +7,6 @@ */ if(!defined('DOKU_INC')) die('meh.'); -require_once(DOKU_INC.'inc/html.php'); /** * Class for creating simple HTML forms. diff --git a/inc/fulltext.php b/inc/fulltext.php index 94c68d675..58d17422a 100644 --- a/inc/fulltext.php +++ b/inc/fulltext.php @@ -7,8 +7,6 @@ */ if(!defined('DOKU_INC')) die('meh.'); -require_once(DOKU_INC.'inc/indexer.php'); - /** * The fulltext search diff --git a/inc/html.php b/inc/html.php index 8a215f440..5e1d0bab3 100644 --- a/inc/html.php +++ b/inc/html.php @@ -8,8 +8,6 @@ if(!defined('DOKU_INC')) die('meh.'); if(!defined('NL')) define('NL',"\n"); -require_once(DOKU_INC.'inc/parserutils.php'); -require_once(DOKU_INC.'inc/form.php'); /** * Convenience function to quickly build a wikilink diff --git a/inc/indexer.php b/inc/indexer.php index 39592e8f4..07b67c014 100644 --- a/inc/indexer.php +++ b/inc/indexer.php @@ -7,9 +7,6 @@ */ if(!defined('DOKU_INC')) die('meh.'); -require_once(DOKU_INC.'inc/io.php'); -require_once(DOKU_INC.'inc/utf8.php'); -require_once(DOKU_INC.'inc/parserutils.php'); // set the minimum token length to use in the index (note, this doesn't apply to numeric tokens) if (!defined('IDX_MINWORDLENGTH')) define('IDX_MINWORDLENGTH',2); diff --git a/inc/infoutils.php b/inc/infoutils.php index d5356969b..6f2874fe5 100644 --- a/inc/infoutils.php +++ b/inc/infoutils.php @@ -7,7 +7,6 @@ */ if(!defined('DOKU_INC')) die('meh.'); if(!defined('DOKU_MESSAGEURL')) define('DOKU_MESSAGEURL','http://update.dokuwiki.org/check/'); -require_once(DOKU_INC.'inc/HTTPClient.php'); /** * Check for new messages from upstream diff --git a/inc/init.php b/inc/init.php index 6fb9559ce..3cff40073 100644 --- a/inc/init.php +++ b/inc/init.php @@ -37,6 +37,9 @@ if (!defined('DOKU_E_LEVEL')) { error_reporting(DOKU_E_LEVEL); } +// load libraries +require_once(DOKU_INC.'inc/load.php'); + // init memory caches global $cache_revinfo; $cache_revinfo = array(); @@ -245,6 +248,8 @@ init_files(); scriptify(DOKU_CONF.'users.auth'); scriptify(DOKU_CONF.'acl.auth'); +// setup authentication system +auth_setup(); /** * Checks paths from config file @@ -526,7 +531,6 @@ EOT; exit; } - /** * A realpath() replacement * @@ -588,5 +592,3 @@ function fullpath($path,$exists=false){ return $finalpath; } - - diff --git a/inc/io.php b/inc/io.php index 32a6f7b8e..1d69dabc9 100644 --- a/inc/io.php +++ b/inc/io.php @@ -7,10 +7,6 @@ */ if(!defined('DOKU_INC')) die('meh.'); -require_once(DOKU_INC.'inc/common.php'); -require_once(DOKU_INC.'inc/HTTPClient.php'); -require_once(DOKU_INC.'inc/events.php'); -require_once(DOKU_INC.'inc/utf8.php'); /** * Removes empty directories diff --git a/inc/load.php b/inc/load.php new file mode 100644 index 000000000..9d305e3a9 --- /dev/null +++ b/inc/load.php @@ -0,0 +1,98 @@ + + */ + +// setup class autoloader +spl_autoload_register('load_autoload'); + +// require all the common libraries +// for a e few of these order does matter +require_once(DOKU_INC.'inc/DifferenceEngine.php'); +require_once(DOKU_INC.'inc/EmailAddressValidator.php'); +require_once(DOKU_INC.'inc/SimplePie.php'); +require_once(DOKU_INC.'inc/FeedParser.php'); +require_once(DOKU_INC.'inc/HTTPClient.php'); +require_once(DOKU_INC.'inc/IXR_Library.php'); +require_once(DOKU_INC.'inc/JSON.php'); +require_once(DOKU_INC.'inc/JpegMeta.php'); +require_once(DOKU_INC.'inc/TarLib.class.php'); +require_once(DOKU_INC.'inc/ZipLib.class.php'); +require_once(DOKU_INC.'inc/adLDAP.php'); +require_once(DOKU_INC.'inc/blowfish.php'); +require_once(DOKU_INC.'inc/feedcreator.class.php'); +require_once(DOKU_INC.'inc/geshi.php'); +require_once(DOKU_INC.'inc/actions.php'); +require_once(DOKU_INC.'inc/cache.php'); +require_once(DOKU_INC.'inc/changelog.php'); +require_once(DOKU_INC.'inc/cliopts.php'); +require_once(DOKU_INC.'inc/common.php'); +require_once(DOKU_INC.'inc/confutils.php'); +require_once(DOKU_INC.'inc/pluginutils.php'); +require_once(DOKU_INC.'inc/plugin.php'); +require_once(DOKU_INC.'inc/plugincontroller.class.php'); +require_once(DOKU_INC.'inc/events.php'); +require_once(DOKU_INC.'inc/form.php'); +require_once(DOKU_INC.'inc/fulltext.php'); +require_once(DOKU_INC.'inc/html.php'); +require_once(DOKU_INC.'inc/httputils.php'); +require_once(DOKU_INC.'inc/indexer.php'); +require_once(DOKU_INC.'inc/infoutils.php'); +require_once(DOKU_INC.'inc/init.php'); +require_once(DOKU_INC.'inc/io.php'); +require_once(DOKU_INC.'inc/load.php'); +require_once(DOKU_INC.'inc/mail.php'); +require_once(DOKU_INC.'inc/media.php'); +require_once(DOKU_INC.'inc/pageutils.php'); +require_once(DOKU_INC.'inc/parserutils.php'); +require_once(DOKU_INC.'inc/search.php'); +require_once(DOKU_INC.'inc/subscription.php'); +require_once(DOKU_INC.'inc/template.php'); +require_once(DOKU_INC.'inc/toolbar.php'); +require_once(DOKU_INC.'inc/utf8.php'); +require_once(DOKU_INC.'inc/auth.php'); + +/** + * spl_autoload_register callback + * + * Contains a static list of DokuWiki's core classes and automatically + * requires their associated php files when an object is instantiated. + * + * @author Andreas Gohr + * @todo add generic loading of plugins here + */ +function load_autoload($name){ + static $classes = null; + if(is_null($classes)) $classes = array( + 'DokuHTTPClient' => DOKU_INC.'inc/HTTPClient.php', + 'DokuEvent' => DOKU_INC.'inc/', + 'JSON' => DOKU_INC.'inc/JSON.php', + 'adLDAP' => DOKU_INC.'inc/adLDAP.php', + 'Diff' => DOKU_INC.'inc/DifferenceEngine.php', + 'UnifiedDiffFormatter' => DOKU_INC.'inc/DifferenceEngine.php', + 'TableDiffFormatter' => DOKU_INC.'inc/DifferenceEngine.php', + 'cache' => DOKU_INC.'inc/cache.php', + 'cache_parser' => DOKU_INC.'inc/cache.php', + 'cache_instructions' => DOKU_INC.'inc/cache.php', + 'cache_renderer' => DOKU_INC.'inc/cache.php', + 'Doku_Event' => DOKU_INC.'inc/events.php', + 'Doku_Event_Handler' => DOKU_INC.'inc/events.php', + 'Doku_Form' => DOKU_INC.'inc/form.php', + 'EmailAddressValidator' => DOKU_INC.'inc/EmailAddressValidator.php', + 'JpegMeta' => DOKU_INC.'inc/JpegMeta.php', + 'FeedParser' => DOKU_INC.'inc/FeedParser.php', + 'utf8_entity_decoder' => DOKU_INC.'inc/utf8.php', + 'IXR_Server' => DOKU_INC.'inc/IXR_Library.php', + 'IXR_Client' => DOKU_INC.'inc/IXR_Library.php', + 'Doku_Plugin_Controller'=> DOKU_INC.'inc/plugincontroller.class.php', + 'GeSHi' => DOKU_INC.'inc/geshi.php', + ); + + if(isset($classes[$name])){ + require_once($classes[$name]); + return; + } +} + diff --git a/inc/mail.php b/inc/mail.php index 3b0592b8b..6d1652fc0 100644 --- a/inc/mail.php +++ b/inc/mail.php @@ -7,8 +7,6 @@ */ if(!defined('DOKU_INC')) die('meh.'); -require_once(DOKU_INC.'inc/utf8.php'); -require_once(DOKU_INC.'inc/EmailAddressValidator.php'); // end of line for mail lines - RFC822 says CRLF but postfix (and other MTAs?) // think different diff --git a/inc/media.php b/inc/media.php index 3850f4e33..444e6d432 100644 --- a/inc/media.php +++ b/inc/media.php @@ -8,9 +8,6 @@ if(!defined('DOKU_INC')) die('meh.'); if(!defined('NL')) define('NL',"\n"); -require_once(DOKU_INC.'inc/html.php'); -require_once(DOKU_INC.'inc/search.php'); -require_once(DOKU_INC.'inc/JpegMeta.php'); /** * Lists pages which currently use a media file selected for deletion diff --git a/inc/parserutils.php b/inc/parserutils.php index 471d46903..34d9e5282 100644 --- a/inc/parserutils.php +++ b/inc/parserutils.php @@ -8,10 +8,6 @@ */ if(!defined('DOKU_INC')) die('meh.'); -require_once(DOKU_INC.'inc/confutils.php'); -require_once(DOKU_INC.'inc/pageutils.php'); -require_once(DOKU_INC.'inc/pluginutils.php'); -require_once(DOKU_INC.'inc/cache.php'); /** * Returns the parsed Wikitext in XHTML for the given id and revision. diff --git a/inc/pluginutils.php b/inc/pluginutils.php index 8294d1ec8..a8656a96a 100644 --- a/inc/pluginutils.php +++ b/inc/pluginutils.php @@ -8,7 +8,6 @@ // plugin related constants if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); -require_once(DOKU_INC.'inc/plugincontroller.class.php'); $plugin_types = array('admin','syntax','action','renderer', 'helper'); diff --git a/inc/search.php b/inc/search.php index 2b9a51fb3..ce4fefe06 100644 --- a/inc/search.php +++ b/inc/search.php @@ -7,7 +7,6 @@ */ if(!defined('DOKU_INC')) die('meh.'); -require_once(DOKU_INC.'inc/common.php'); /** * recurse direcory diff --git a/inc/subscription.php b/inc/subscription.php index f7614014f..e98129b77 100644 --- a/inc/subscription.php +++ b/inc/subscription.php @@ -14,8 +14,6 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) */ -require_once DOKU_INC.'/inc/pageutils.php'; - /** * Get the name of the metafile tracking subscriptions to target page or * namespace diff --git a/inc/toolbar.php b/inc/toolbar.php index 9140970d1..5d1149df3 100644 --- a/inc/toolbar.php +++ b/inc/toolbar.php @@ -7,8 +7,6 @@ */ if(!defined('DOKU_INC')) die('meh.'); -require_once(DOKU_INC.'inc/JSON.php'); - /** * Prepares and prints an JavaScript array with all toolbar buttons