diff -r 902822492a68 -r fe660c52c48f includes/pageprocess.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/includes/pageprocess.php Wed Jun 13 16:07:17 2007 -0400 @@ -0,0 +1,457 @@ + + */ + +class PageProcessor +{ + + /** + * Page ID and namespace of the page handled by this instance + * @var string + */ + + var $page_id; + var $namespace; + + /** + * Tracks if the page we're loading exists in the database or not. + * @var bool + */ + + var $page_exists = false; + + /** + * Permissions! + * @var object + */ + + var $perms = null; + + /** + * Switch to track if redirects are allowed. Defaults to true. + * @var bool + */ + + var $allow_redir = true; + + /** + * If this is set to true, this will call the header and footer funcs on $template when render() is called. + * @var bool + */ + + var $send_headers = false; + + /** + * Cache the fetched text so we don't fetch it from the DB twice. + * @var string + */ + + var $text_cache = ''; + + /** + * Debugging information to track errors. You can set enable to false to disable sending debug information. + * @var array + */ + + var $debug = array( + 'enable' => true, + 'works' => false + ); + + /** + * Constructor. + * @param string The page ID (urlname) of the page + * @param string The namespace of the page + */ + + function __construct( $page_id, $namespace ) + { + global $db, $session, $paths, $template, $plugins; // Common objects + + // See if we can get some debug info + if ( function_exists('debug_backtrace') && $this->debug['enable'] ) + { + $this->debug['works'] = true; + $this->debug['backtrace'] = enano_debug_print_backtrace(true); + } + + // First things first - check page existence and permissions + + if ( !isset($paths->nslist[$namespace]) ) + { + $this->send_error('The namespace "' . htmlspecialchars($namespace) . '" does not exist.'); + } + + $this->_setup( $page_id, $namespace ); + + } + + /** + * The main method to send the page content. Also responsible for checking permissions. + */ + + function send() + { + global $db, $session, $paths, $template, $plugins; // Common objects + if ( !$this->perms->get_permissions('read') ) + { + $this->err_access_denied(); + return false; + } + if ( $this->namespace == 'Special' || $this->namespace == 'Admin' ) + { + if ( !$this->page_exists ) + { + redirect( makeUrl(getConfig('main_page')), 'Can\'t find special page', 'The special or administration page you requested does not exist. You will now be transferred to the main page.', 2 ); + } + $func_name = "page_{$this->namespace}_{$this->page_id}"; + if ( function_exists($func_name) ) + { + return @call_user_func($func_name); + } + else + { + $title = 'Page backend not found'; + $message = "The administration page you are looking for was properly registered using the page API, but the backend function + ($fname) was not found. If this is a plugin page, then this is almost certainly a bug with the plugin."; + + if ( $this->send_headers ) + { + $template->tpl_strings['PAGE_NAME'] = $title; + $template->header(); + echo "
$message
"; + $template->footer(); + } + else + { + echo "$message
"; + } + return false; + } + } + else if ( in_array($this->namespace, array('Article', 'User', 'Project', 'Help', 'File', 'Category')) && $this->page_exists ) + { + // Send as regular page + $text = $this->fetch_text(); + if ( $text == 'err_no_text_rows' ) + { + $this->err_no_rows(); + return false; + } + else + { + $this->render(); + } + } + else if ( ( $this->namespace == 'Template' || $this->namespace == 'System' ) && $this->page_exists ) + { + $this->header(); + + $text = $this->fetch_text(); + $text = preg_replace('/' . $db->latest_query . ''; + if ( $this->send_headers ) + { + $template->tpl_strings['PAGE_NAME'] = $title; + $template->header(); + echo "
$message
"; + $template->footer(); + } + else + { + echo "$message
"; + } + } + + /** + * Tell the user the page doesn't exist, and present them with their options. + * @access private + */ + + function err_page_not_existent() + { + global $db, $session, $paths, $template, $plugins; // Common objects + + $this->header(); + header('HTTP/1.1 404 Not Found'); + echo 'You have requested a page that doesn\'t exist yet.'; + if ( $session->get_permissions('create_page') ) + { + echo ' You can create this page, or return to the homepage.'; + } + else + { + echo ' Return to the homepage.
'; + } + if ( $session->get_permissions('history_rollback') ) + { + $e = $db->sql_query('SELECT * FROM ' . table_prefix . 'logs WHERE action=\'delete\' AND page_id=\'' . $this->page_id . '\' AND namespace=\'' . $this->namespace . '\' ORDER BY time_id DESC;'); + if ( !$e ) + { + $db->_die('The deletion log could not be selected.'); + } + if ( $db->numrows() > 0 ) + { + $r = $db->fetchrow(); + echo 'This page also appears to have some log entries in the database - it seems that it was deleted on ' . $r['date_string'] . '. You can probably roll back the deletion.
'; + } + $db->free_result(); + } + echo '+ HTTP Error: 404 Not Found +
'; + $this->footer(); + } + + /** + * PHP 4 constructor. + * @see PageProcessor::__construct() + */ + + function PageProcessor( $page_id, $namespace ) + { + $this->__construct($page_id, $namespace); + } + + /** + * Send an error message and die + * @var string Error message + * @var bool If true, send DBAL's debugging information as well + */ + + function send_error($message, $sql = false) + { + global $db, $session, $paths, $template, $plugins; // Common objects + + $content = "$message
"; + $template->tpl_strings['PAGE_NAME'] = 'General error in page fetcher'; + + if ( $this->debug['works'] ) + { + $content .= $this->debug['backtrace']; + } + + header('HTTP/1.1 500 Internal Server Error'); + + $template->header(); + echo $content; + $template->footer(); + + $db->close(); + + exit; + + } + +} // class PageProcessor + +?>