/** * Takes an input url and extracts the topic id * * @return integer Topic id */ protected function _getTidFromUrl() { /* Try to intval the url */ if (!intval($this->request['topic_url'])) { /* Friendly URL */ if ($this->settings['use_friendly_urls']) { /* remove base url from url */ $this->request['topic_url'] = str_replace($this->settings['_original_base_url'], '', $this->request['topic_url']); $this->request['topic_url'] = str_replace(array('/index.php/', '/index.php?/'), '/', $this->request['topic_url']); $templates = IPSLib::buildFurlTemplates(); preg_match($templates['showtopic']['in']['regex'], $this->request['topic_url'], $match); $old_id = intval(trim($match[1])); } else { preg_match('/(\\?|&)(t|showtopic)=(\\d+)($|&)/', $this->request['topic_url'], $match); $old_id = intval(trim($match[3])); } } else { $old_id = intval($this->request['topic_url']); } return $old_id; }
/** * Try and deconstruct the link if it's a FURRY FURL * * @access protected * @param string Incoming URL * @return array Array of request data or false */ protected function _checkForFurl($url) { $_urlBits = array(); $_toTest = $url; $templates = array(); if (is_file(FURL_CACHE_PATH)) { $templates = array(); require FURL_CACHE_PATH; /*noLibHook*/ $_seoTemplates = $templates; } else { /* Attempt to write it */ $_seoTemplates = IPSLib::buildFurlTemplates(); try { IPSLib::cacheFurlTemplates(); } catch (Exception $e) { } } if (is_array($_seoTemplates) and count($_seoTemplates)) { foreach ($_seoTemplates as $key => $data) { if (empty($data['in']['regex'])) { continue; } if (preg_match($data['in']['regex'], $_toTest, $matches)) { 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]); } $_urlBits[$k] = $v; } } if (strpos($_toTest, $_seoTemplates['__data__']['varBlock']) !== false) { $_parse = substr($_toTest, strpos($_toTest, $_seoTemplates['__data__']['varBlock']) + strlen($_seoTemplates['__data__']['varBlock'])); $_data = explode($_seoTemplates['__data__']['varSep'], $_parse); $_c = 0; foreach ($_data as $_v) { if (!$_c) { $k = IPSText::parseCleanKey($_v); $v = ''; $_c++; } else { $v = IPSText::parseCleanValue($_v); $_c = 0; $_urlBits[$k] = $v; } } } break; } } //----------------------------------------- // 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, '?'); if ($_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); $_urlBits[$k] = $v; } } } /* Process URL bits for extra ? in them */ if (is_array($_urlBits) and count($_urlBits)) { foreach ($_urlBits as $k => $v) { if (strstr($v, '?')) { list($rvalue, $more) = explode('?', $v); if ($rvalue and $more) { /* Reset key with correct value */ $_v = $rvalue; $_urlBits[$k] = $_v; /* Now add in the other value */ if (strstr($more, '=')) { list($_k, $_v) = explode('=', $more); if ($_k and $_v) { $_urlBits[$_k] = $_v; } } } } } } } return count($_urlBits) ? $_urlBits : false; }
protected static function init() { if (is_file(FURL_CACHE_PATH)) { $templates = array(); require FURL_CACHE_PATH; /*noLibHook*/ self::$_seoTemplates = $templates; } else { /* Attempt to write it */ self::$_seoTemplates = IPSLib::buildFurlTemplates(); try { IPSLib::cacheFurlTemplates(); } catch (Exception $e) { } } }
/** * 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), '&'); } } }
/** * Takes an input url and extracts the topic id * * @access private * @return integer Topic id */ private function _getTidFromUrl() { /* Try to intval the url */ if (!intval($this->request['topic_url'])) { /* Friendly URL */ if ($this->settings['use_friendly_urls']) { $templates = IPSLib::buildFurlTemplates(); preg_match($templates['showtopic']['in']['regex'], $this->request['topic_url'], $match); $old_id = intval(trim($match[1])); } else { preg_match("/(\\?|&)(t|showtopic)=(\\d+)(\$|&)/", $this->request['topic_url'], $match); $old_id = intval(trim($match[3])); } } else { $old_id = intval($this->request['topic_url']); } return $old_id; }