* Invision Power Services * IP.Board v3.1.4 * Primary controller * Last Updated: $LastChangedDate: 2010-10-22 16:22:45 -0400 (Fri, 22 Oct 2010) $ * * * @author $Author: ips_terabyte $ * @copyright (c) 2001 - 2009 Invision Power Services, Inc. * @license http://www.invisionpower.com/community/board/license.html * @package IP.Board * @link http://www.invisionpower.com * @since 14th May 2003 * @version $Rev: 7019 $ */ /** * Class "Controller" * A very simple public facing interface to resolve incoming data into * a command class * * @author Matt Mecham * @since Wednesday 14th May 2008 * @package IP.Board */ class ipsController { /** * Registry reference * * @access private * @var object */ private $registry; /** * Command * * @access public * @var string */ static public $cmd; /** * Constructor * * @access private * @return void */ private function __construct() { } /** * Public facing function to run the controller * * @access public * @return void */ static public function run() { $instance = new ipsController(); $instance->init(); $instance->handleRequest(); } /** * Initialize ipsRegistry and this class * * @access protected * @return void */ protected function init() { $this->registry = ipsRegistry::instance(); $this->registry->init(); } /** * Handle the incoming request using the command resolver * * @access protected * @return void */ protected function handleRequest() { $cmd_r = new ipsController_CommandResolver(); try { self::$cmd = $cmd_r->getCommand( $this->registry ); } catch( Exception $e ) { $msg = $e->getMessage(); /* An error occured, so throw a 404 */ try { $this->registry->getClass('output')->showError( 'incorrect_furl', 404, null, null, 404 ); } catch( Exception $e ) { print $msg; exit(); } } IPSDebug::setMemoryDebugFlag( "Everything up until execute call", 0 ); self::$cmd->execute( $this->registry ); } } /** * Class "Command Resolver" * Resolves the incoming data * * @author Matt Mecham * @since Wednesday 14th May 2008 * @package IP.Board */ class ipsController_CommandResolver { /**#@+ * Internal strings to remember * * @access private * @var string */ private static $base_cmd; private static $ajax_cmd; private static $default_cmd; private static $modules_dir = 'modules_public'; private static $class_dir = 'public'; /**#@-*/ /** * Constructor * * @access public * @return void */ public function __construct() { if ( ! self::$base_cmd ) { self::$base_cmd = ipsRegistry::$current_module == 'ajax' ? new ReflectionClass( 'ipsAjaxCommand' ) : new ReflectionClass( 'ipsCommand' ); self::$default_cmd = new ipsCommand_default(); self::$modules_dir = ( IPS_AREA != 'admin' ) ? 'modules_public' : 'modules_admin'; self::$class_dir = ( IPS_AREA != 'admin' ) ? 'public' : 'admin'; } } /** * Retreive the command * * @access public * @param object ipsRegistry reference * @return object */ public function getCommand( ipsRegistry $registry ) { $_NOW = IPSDebug::getMemoryDebugFlag(); $module = ipsRegistry::$current_module; $section = ipsRegistry::$current_section; $filepath = IPSLib::getAppDir( IPS_APP_COMPONENT ) . '/' . self::$modules_dir . '/' . $module . '/'; /* Bug Fix #21009 */ if ( ! ipsRegistry::$applications[ IPS_APP_COMPONENT ]['app_enabled'] ) { throw new Exception( "The specified application has been disabled" ); } /* Got a section? */ if ( ! $section ) { if ( file_exists( $filepath . 'defaultSection.php' ) ) { $DEFAULT_SECTION = ''; require( $filepath . 'defaultSection.php' ); if ( $DEFAULT_SECTION ) { $section = $DEFAULT_SECTION; } } } $_classname = self::$class_dir . '_' . IPS_APP_COMPONENT . '_' . $module . '_'; if ( file_exists( $filepath . 'manualResolver.php' ) ) { $classname = IPSLib::loadActionOverloader( $filepath . 'manualResolver.php' , $_classname . 'manualResolver' ); } else if ( file_exists( $filepath . $section . '.php' ) ) { $classname = IPSLib::loadActionOverloader( $filepath . $section . '.php' , $_classname . $section ); } IPSDebug::setMemoryDebugFlag( "Controller getCommand executed" ); if ( class_exists( $classname ) ) { $cmd_class = new ReflectionClass( $classname ); if ( $cmd_class->isSubClassOf( self::$base_cmd ) ) { return $cmd_class->newInstance(); } else { throw new Exception( "$section в $module не существует!" ); } } # Fudge it to return just the default object return clone self::$default_cmd; } } abstract class ipsCommand { /**#@+ * Registry Object Shortcuts * * @access protected * @var object */ protected $registry; protected $DB; protected $settings; protected $request; protected $lang; protected $member; protected $memberData; protected $cache; protected $caches; /**#@-*/ /** * Constructor * * @access public * @return void */ final public function __construct() { } /** * Make the registry shortcuts * * @access public * @param object ipsRegistry reference * @return void */ public function makeRegistryShortcuts( ipsRegistry $registry ) { /* Make registry objects */ $this->registry = $registry; $this->DB = $this->registry->DB(); $this->settings =& $this->registry->fetchSettings(); $this->request =& $this->registry->fetchRequest(); $this->lang = $this->registry->getClass('class_localization'); $this->member = $this->registry->member(); $this->memberData =& $this->registry->member()->fetchMemberData(); $this->cache = $this->registry->cache(); $this->caches =& $this->registry->cache()->fetchCaches(); } /** * Execute the command (call doExecute) * * @access public * @param object ipsRegistry reference * @return void */ public function execute( ipsRegistry $registry ) { $this->makeRegistryShortcuts( $registry ); $this->doExecute( $registry ); } /** * Do execute method (must be overriden) * * @access protected * @param object ipsRegistry reference * @return void */ protected abstract function doExecute( ipsRegistry $registry ); } /** * Abstract class for handling ajax requests **/ abstract class ipsAjaxCommand { /**#@+ * Registry Object Shortcuts * * @access protected * @var object */ protected $registry; protected $DB; protected $settings; protected $request; protected $lang; protected $member; protected $cache; protected $ajax; /**#@-*/ /** * Constructor * * @access public * @return void */ final public function __construct() { } /** * Magic function to catch all the ajax methods * * @access public * @param string $func Function name being called * @param array $arguments Array of parameters * @return mixed **/ public function __call( $func, $arguments ) { if( method_exists( $this->ajax, $func ) ) { foreach( $arguments as $k => $v ) { if( is_string( $v ) ) { /* Remove unused hook comments */ // $arguments[$k] = preg_replace( "##", '', $arguments[$k] ); } } return call_user_func_array( array( $this->ajax, $func ), $arguments ); } } /** * Creates all the registry shorctus * * @access public * @param object ipsRegistry reference * @return void **/ public function makeRegistryShortcuts( ipsRegistry $registry ) { /* Make registry objects */ $this->registry = $registry; $this->DB = $this->registry->DB(); $this->settings =& $this->registry->fetchSettings(); $this->request =& $this->registry->fetchRequest(); $this->lang = $this->registry->getClass('class_localization'); $this->member = $this->registry->member(); $this->memberData =& $this->registry->member()->fetchMemberData(); $this->cache = $this->registry->cache(); $this->caches =& $this->registry->cache()->fetchCaches(); $classToLoad = IPSLib::loadLibrary( IPS_KERNEL_PATH . 'classAjax.php', 'classAjax' ); $this->ajax = new $classToLoad(); IPSDebug::fireBug( 'registerExceptionHandler' ); IPSDebug::fireBug( 'registerErrorHandler' ); } /** * Executes the ajax request, checks secure key * * @access public * @param object ipsRegistry reference * @return void **/ public function execute( ipsRegistry $registry ) { /* Setup Shortcuts First */ $this->makeRegistryShortcuts( $registry ); /* Check the secure key */ $this->request['secure_key'] = $this->request['secure_key'] ? $this->request['secure_key'] : $this->request['md5check']; //if( $this->request['secure_key'] && $this->request['secure_key'] != $this->member->form_hash ) if( $this->request['secure_key'] != $this->member->form_hash ) { IPSDebug::fireBug( 'error', array( "The security key did not match the member's form hash" ) ); $this->returnString( 'nopermission' ); } $this->doExecute( $registry ); } /** * Do execute method (must be overriden) * * @access protected * @param object ipsRegistry reference * @return void */ protected abstract function doExecute( ipsRegistry $registry ); } class ipsCommand_default extends ipsCommand { /** * Do execute method * * @access protected * @param object ipsRegistry reference * @return void */ protected function doExecute( ipsRegistry $registry ) { $modules_dir = ( IPS_AREA != 'admin' ) ? 'modules_public' : 'modules_admin'; $filepath = IPSLib::getAppDir( IPS_APP_COMPONENT ) . '/' . $modules_dir . '/' . ipsRegistry::$current_module . '/' . ipsRegistry::$current_section . '.php'; $filepath = str_replace( DOC_IPS_ROOT_PATH, '', $filepath ); //----------------------------------------- // Redirect to board index //----------------------------------------- if ( ! (IPS_APP_COMPONENT == 'forums' AND ipsRegistry::$current_module == 'forums' AND ipsRegistry::$current_section == 'boards') ) { if( IPB_THIS_SCRIPT == 'admin' ) { $registry->output->silentRedirect( ipsRegistry::$settings['_base_url'] ); } else { $registry->output->silentRedirect( ipsRegistry::$settings['_original_base_url'] ); } } //----------------------------------------- // Uh oh, this is a big one.. (no forums app) //----------------------------------------- if ( ! file_exists( $filepath ) ) { $this->registry->getClass('output')->showError( array( 'command_file_missing', $filepath ), 401100, null, null, 404 ); } else { $this->registry->getClass('output')->showError( array( 'command_class_incorrect', $filepath ), 401200, null, null, 404 ); } } }