/** * Get a cookie. * Abstract layer allows us to do some checking, etc * * @param string Cookie name * @return mixed * @since 2.0 */ public static function get($name) { /* Check internal data first */ if (isset(self::$_cookiesSet[$name])) { return self::$_cookiesSet[$name]; } else { if (isset($_COOKIE[ipsRegistry::$settings['cookie_id'] . $name])) { $_value = $_COOKIE[ipsRegistry::$settings['cookie_id'] . $name]; $_couldBeJson = stripslashes(urldecode($_value)); $_test = json_decode($_couldBeJson, true); if (is_array($_test)) { return IPSLib::parseIncomingRecursively($_test); } else { return IPSText::parseCleanValue(urldecode($_value)); } } else { return FALSE; } } }
/** * INIT furls * Performs set up and figures out any incoming links * * @return @e void */ protected static function _fUrlInit() { /** * Fix request uri */ self::_fixRequestUri(); if (ipsRegistry::$settings['use_friendly_urls']) { /* Grab and store accessing URL */ self::$_uri = preg_replace("/s=(&|\$)/", '', str_replace('/?', '/' . IPS_PUBLIC_SCRIPT . '?', $_SERVER['REQUEST_URI'])); $_urlBits = array(); /* Grab FURL data... */ if (!IN_DEV and is_file(FURL_CACHE_PATH)) { $templates = array(); include FURL_CACHE_PATH; /*noLibHook*/ self::$_seoTemplates = $templates; } else { /* Attempt to write it */ self::$_seoTemplates = IPSLib::buildFurlTemplates(); try { IPSLib::cacheFurlTemplates(); } catch (Exception $e) { } } if (is_array(self::$_seoTemplates) and count(self::$_seoTemplates)) { $uri = $_SERVER['REQUEST_URI'] ? $_SERVER['REQUEST_URI'] : @getenv('REQUEST_URI'); /* Bug 21295 - remove known URL from test URI */ $_t = !empty(ipsRegistry::$settings['board_url']) ? @parse_url(ipsRegistry::$settings['board_url']) : @parse_url(ipsRegistry::$settings['base_url']); $_toTest = ($_t['path'] and $_t['path'] != '/') ? preg_replace("#^{$_t['path']}#", '', $uri) : str_replace($_t['scheme'] . '://' . $_t['host'], '', $uri); $_404Check = $_toTest; //We want to retain any /index.php for this test later in this block of code $_toTest = str_ireplace(array('//' . IPS_PUBLIC_SCRIPT . '?', '/' . IPS_PUBLIC_SCRIPT . '?', '/' . IPS_PUBLIC_SCRIPT), '', $_toTest); $_gotMatch = false; foreach (self::$_seoTemplates as $key => $data) { if (empty($data['in']['regex'])) { continue; } /* Clean up regex */ $data['in']['regex'] = str_replace('#{__varBlock__}', preg_quote(self::$_seoTemplates['__data__']['varBlock'], '#'), $data['in']['regex']); if (preg_match($data['in']['regex'], $_toTest, $matches)) { $_gotMatch = true; /* Handling pages as a special thing? */ if ($data['isPagesMode']) { if (strstr($_toTest, self::$_seoTemplates['__data__']['varPage'])) { preg_match('#(' . preg_quote(self::$_seoTemplates['__data__']['varPage'], '#') . '(\\d+?))(?:$|' . preg_quote(self::$_seoTemplates['__data__']['varBlock'], '#') . ')#', $_toTest, $pageMatches); if ($pageMatches[1]) { $k = 'page'; $_GET[$k] = intval($pageMatches[2]); $_POST[$k] = intval($pageMatches[2]); $_REQUEST[$k] = intval($pageMatches[2]); $_urlBits[$k] = intval($pageMatches[2]); ipsRegistry::$request[$k] = intval($pageMatches[2]); $_toTest = str_replace($pageMatches[1], '', $_toTest); } } else { /* Redirect all < 3.4 links to the new sexy awesome format if need be */ if (self::$_seoTemplates['__data__']['varBlock'] != '/page__' && $uri && strstr($uri, '/page__')) { preg_match('#(.*)(page__.*)$#', $uri, $matches); $url = $matches[1]; $query = $matches[2]; $newQuery = '?'; $data = explode('__', substr($query, 6)); for ($i = 0, $j = count($data); $i < $j; $i++) { $newQuery .= ($i % 2 == 0 ? '&' : '=') . $data[$i]; } /* Class output not created here */ header("HTTP/1.1 301 Moved Permanently"); header("Location: " . $_t['scheme'] . '://' . $_t['host'] . $url . $newQuery); exit; } } } if (is_array($data['in']['matches'])) { foreach ($data['in']['matches'] as $_replace) { $k = IPSText::parseCleanKey($_replace[0]); if (strpos($_replace[1], '$') !== false) { $v = IPSText::parseCleanValue($matches[intval(str_replace('$', '', $_replace[1]))]); } else { $v = IPSText::parseCleanValue($_replace[1]); } $_GET[$k] = $v; $_POST[$k] = $v; $_REQUEST[$k] = $v; $_urlBits[$k] = $v; ipsRegistry::$request[$k] = $v; } } if (strpos($_toTest, self::$_seoTemplates['__data__']['varBlock']) !== false) { /* Changed how the input variables are parsed based on feedback in bug report 24907 @link http://community.invisionpower.com/tracker/issue-24907-member-list-pagination-not-work-with-checkbox Input variables now preserve array depth properly as a result */ $_parse = substr($_toTest, strpos($_toTest, self::$_seoTemplates['__data__']['varBlock']) + strlen(self::$_seoTemplates['__data__']['varBlock'])); $_data = explode(self::$_seoTemplates['__data__']['varSep'], $_parse); $_query = ''; foreach ($_data as $line) { list($k, $v) = explode(self::$_seoTemplates['__data__']['varJoin'], $line); $_query .= $k . '=' . $v . '&'; } $_data = array(); parse_str($_query, $_data); $_data = IPSLib::parseIncomingRecursively($_data); foreach ($_data as $k => $v) { $_GET[$k] = $v; $_POST[$k] = $v; $_REQUEST[$k] = $v; $_urlBits[$k] = $v; ipsRegistry::$request[$k] = $v; } } break; } } /* Check against the original request for 404 error */ $_404checkPass = false; if (!strstr($_404Check, '&') and !strstr($_404Check, '=') and (strstr($_404Check, IPS_PUBLIC_SCRIPT . '?/') or !strstr($_404Check, '.php'))) { $_404checkPass = true; } if (strstr($_404Check, '/' . IPS_PUBLIC_SCRIPT)) { if (preg_match("#(.+?)/" . preg_quote(IPS_PUBLIC_SCRIPT) . "#", $_404Check, $matches) and !is_file(DOC_IPS_ROOT_PATH . preg_replace('/(.+?)\\?.+/', '$1', $_404Check))) { $_404checkPass = true; } } /* Got a match? */ if (!defined('CCS_GATEWAY_CALLED') and !defined('IPS_ENFORCE_ACCESS') and !defined('LOFIVERSION_CALLED') and IPS_IS_MOBILE_APP === false and IPS_DEFAULT_PUBLIC_APP == 'forums' and $_gotMatch === false and $_toTest and $_toTest != '/' and $_toTest != '/?' and $_404checkPass) { self::$_noFurlMatch = true; } //----------------------------------------- // If using query string furl, extract any // secondary query string. // Ex: http://localhost/index.php?/path/file.html?key=value // Will pull the key=value properly //----------------------------------------- $_qmCount = substr_count($_toTest, '?'); /* We don't want to check for secondary query strings in the ACP */ if (!IN_ACP && $_qmCount > 1) { $_secondQueryString = substr($_toTest, strrpos($_toTest, '?') + 1); $_secondParams = explode('&', $_secondQueryString); if (count($_secondParams)) { foreach ($_secondParams as $_param) { list($k, $v) = explode('=', $_param); $k = IPSText::parseCleanKey($k); $v = IPSText::parseCleanValue($v); $_GET[$k] = $v; $_REQUEST[$k] = $v; $_urlBits[$k] = $v; ipsRegistry::$request[$k] = $v; } } } /* Process URL bits for extra ? in them */ /* We don't want to check for secondary query strings in the ACP */ if (!IN_ACP && is_array($_GET) and count($_GET)) { foreach ($_GET as $k => $v) { /* Nexus sends &url=.... as a parameter, which can have a ? in it, but we don't want to strip that out of the parameter or consider those values part of the input */ if ($k == 'url') { continue; } if (!is_array($v) and strstr($v, '?')) { list($rvalue, $more) = explode('?', $v); if ($rvalue and $more) { //$k = IPSText::parseCleanKey( $_k ); //$v = IPSText::parseCleanValue( $_v ); /* Reset key with correct value */ $_v = IPSText::parseCleanValue($rvalue); $_GET[$k] = $_v; $_REQUEST[$k] = $_v; $_urlBits[$k] = $_v; ipsRegistry::$request[$k] = $_v; /* Now add in the other value */ if (strstr($more, '=')) { list($_k, $_v) = explode('=', $more); if ($_k and $_v) { $_GET[$_k] = $_v; $_REQUEST[$_k] = $_v; $_urlBits[$_k] = $_v; ipsRegistry::$request[$_k] = $_v; } } } } } } } /* Reformat basic URL */ if (is_array($_urlBits)) { ipsRegistry::$settings['query_string_real'] = trim(http_build_query($_urlBits), '&'); } } }
/** * Initiate the registry * * @access public * @return @e void */ public static function init() { if (self::$initiated === TRUE) { return FALSE; } self::$initiated = TRUE; /* Log current upgrade step */ self::logUpgradeStep(); /* Load static classes */ require IPS_ROOT_PATH . "sources/base/core.php"; /*noLibHook*/ require IPS_ROOT_PATH . "sources/base/ipsMember.php"; /*noLibHook*/ require_once IPS_ROOT_PATH . "setup/sources/base/setup.php"; /*noLibHook*/ /* Load conf global and set up DB */ if (IPS_IS_UPGRADER) { if (!is_file(DOC_IPS_ROOT_PATH . "conf_global.php")) { print "Cannot locate: " . DOC_IPS_ROOT_PATH . "conf_global.php"; exit; } self::loadConfGlobal(); /* Got settings? */ if (!ipsRegistry::$settings['sql_driver']) { print "Settings not loaded from: " . DOC_IPS_ROOT_PATH . "conf_global.php - did you mean to install?"; exit; } self::setDBHandle(); } else { /* Ensure char set is defined */ if (!defined('IPS_DOC_CHAR_SET')) { define('IPS_DOC_CHAR_SET', strtoupper(IPSSetUp::charSet)); } if (!defined('IPS_CACHE_PATH')) { define('IPS_CACHE_PATH', DOC_IPS_ROOT_PATH); } require IPS_ROOT_PATH . "setup/sources/base/install.php"; /*noLibHook*/ } /* Input set up... */ if (is_array($_POST) and count($_POST)) { foreach ($_POST as $key => $value) { # Skip post arrays if (!is_array($value)) { $_POST[$key] = IPSText::stripslashes($value); } } } //----------------------------------------- // Clean globals, first. //----------------------------------------- IPSLib::cleanGlobals($_GET); IPSLib::cleanGlobals($_POST); IPSLib::cleanGlobals($_COOKIE); IPSLib::cleanGlobals($_REQUEST); # GET first $input = IPSLib::parseIncomingRecursively($_GET, array()); # Then overwrite with POST self::$request = IPSLib::parseIncomingRecursively($_POST, $input); # Assign request method self::$request['request_method'] = strtolower(my_getenv('REQUEST_METHOD')); self::_setUpAppData(); /* Make sure it's a string */ if (is_array(self::$request['section'])) { self::$request['section'] = ''; } /* Get caches */ self::$handles['caches'] = ips_CacheRegistry::instance(); if (IPS_IS_UPGRADER) { /* Make sure all is well before we proceed */ self::instance()->setUpSettings(); /* Build module and application caches */ self::instance()->checkCaches(); /* Load 'legacy' systems */ $file = ''; if (IPSSetUp::is300plus() === TRUE) { $file = '3xx.php'; } else { if (IPSSetUp::is200plus() === TRUE) { $file = '2xx.php'; } else { $file = '1xx.php'; } } require_once IPS_ROOT_PATH . 'setup/sources/legacy/' . $file; /*noLibHook*/ self::instance()->setClass('legacy', new upgradeLegacy(self::instance())); } /* Set up member */ self::$handles['member'] = ips_MemberRegistry::instance(); # Thaw saved data IPSSetUp::thawSavedData(); /* Gather other classes */ require_once IPS_ROOT_PATH . 'setup/sources/classes/output/output.php'; /*noLibHook*/ self::instance()->setClass('output', new output(self::instance(), TRUE)); # Fetch global config if (self::readGlobalConfig() === FALSE) { self::getClass('output')->addError("Could not load config.xml"); } if (IPS_IS_UPGRADER) { /* Check session status */ $validationStatus = self::member()->sessionClass()->getStatus(); $validationMessage = self::member()->sessionClass()->getMessage(); if (self::$request['section'] and self::$request['section'] != 'index' and !$validationStatus) { /* Force log in */ self::getClass('output')->setTitle("Upgrader: Error"); self::getClass('output')->setNextAction(''); self::getClass('output')->addContent(self::getClass('output')->template()->page_error($validationMessage)); self::getClass('output')->sendOutput(); exit; } } else { # Installer locked? if (is_file(DOC_IPS_ROOT_PATH . 'cache/installer_lock.php')) { self::getClass('output')->setTitle("Installer: Error"); self::getClass('output')->setNextAction(''); self::getClass('output')->addContent(self::getClass('output')->template()->page_locked()); self::getClass('output')->sendOutput(); exit; } } }