// set the default handler $gBitSmarty->loadFilter('pre', 'tr'); // $gBitSmarty->loadFilter('output','trimwhitespace'); if (isset($_REQUEST['highlight'])) { $gBitSmarty->loadFilter('output', 'highlight'); } } BitSystem::loadSingleton(); // first thing we do, is check to see if our version of bitweaver is up to date. // we need to know about this before any other package is loaded to ensure that we can exclude stuff that isn't backwards compatible. // BIT_INSTALL is set by the installer and LOGIN_VALIDATE is set in users/validate.php if (!empty($gBitSystem->mConfig) && version_compare(MIN_BIT_VERSION, $gBitSystem->getVersion(), '>') && !(defined('BIT_INSTALL') || defined('LOGIN_VALIDATE'))) { define('INSTALLER_FORCE', TRUE); } BitSystem::prependIncludePath(UTIL_PKG_PATH . '/'); BitSystem::prependIncludePath(EXTERNAL_LIBS_PATH . 'pear/'); require_once LANGUAGES_PKG_PATH . 'BitLanguage.php'; BitLanguage::loadSingleton(); // collects information about the browser - needed for various browser specific theme settings require_once UTIL_PKG_PATH . 'phpsniff/phpSniff.class.php'; global $gSniffer; $gSniffer = new phpSniff(); if (file_exists(ini_get('browscap'))) { $browserInfo = array_merge($gSniffer->_browser_info, get_browser(null, true)); $gBitSmarty->assignByRef('gBrowserInfo', $browserInfo); } else { $gBitSmarty->assignByRef('gBrowserInfo', $gSniffer->_browser_info); } // set various classes global global $gBitUser, $gTicket, $userlib, $gBitDbType, $gLibertySystem; if ($gBitSystem->isDatabaseValid()) {
/** * Initiolize BitInstaller * @access public */ function BitInstaller() { parent::__construct(); $this->getWebServerUid(); }
/** * createTempPassword * * @param array $pLogin * @param array $pPass * @access public * @return TRUE on success, FALSE on failure - mErrors will contain reason for failure */ function createTempPassword($pLogin, $pPass) { global $gBitSystem; $ret = array('', ''); if (empty($pLogin)) { $pLogin = $this->getField('email'); } if (!empty($pLogin)) { $pass = BitSystem::genPass(); $provpass = md5($pass); $loginCol = strpos($pLogin, '@') ? 'email' : 'login'; #temp passwords good for 3 days -- prob should be an config option $passDue = $gBitSystem->getUTCTime() + 60 * 60 * 24 * 3; $query = "UPDATE `" . BIT_DB_PREFIX . "users_users` SET `provpass` = ?, `provpass_expires` = ? WHERE `" . $loginCol . "` = ?"; $result = $this->mDb->query($query, array($provpass, $passDue, $pLogin)); $ret = array($pass, $provpass); } return $ret; }
/** * Special parsing for a particular page of a multipage article * * Temporary remove <PRE></PRE> secions to protect * from broke <PRE> tags and leave well known <PRE> * behaviour (i.e. type all text inside AS IS w/o * any interpretation) * @param string Data to process * @param integer Number of page to extract * @return string Extracted page */ function getPage(&$data, $i) { $preparsed = array(); preg_match_all("/(<[Pp][Rr][Ee]>)((.|\n)*?)(<\\/[Pp][Rr][Ee]>)/", $data, $preparse); $idx = 0; foreach (array_unique($preparse[2]) as $pp) { $key = md5(BitSystem::genPass()); $aux["key"] = $key; $aux["data"] = $pp; $preparsed[] = $aux; $data = str_replace($preparse[1][$idx] . $pp . $preparse[4][$idx], $key, $data); $idx = $idx + 1; } // Get slides $parts = explode(defined('PAGE_SEP') ? PAGE_SEP : "...page...", $data); if (substr($parts[$i - 1], 1, 5) == "<br/>") { $ret = substr($parts[$i - 1], 6); } else { $ret = $parts[$i - 1]; } // Replace back <PRE> sections foreach ($preparsed as $pp) { $ret = str_replace($pp["key"], "<pre>" . $pp["data"] . "</pre>", $ret); } return $ret; }
function parseData($pParseHash, &$pCommonObject) { global $gBitSystem, $gLibertySystem, $gBitUser, $page; $data = $pParseHash['data']; $contentId = $pParseHash['content_id']; // this is used for setting the links when section editing is enabled $section_count = 1; if ($gBitSystem->isPackageActive('wiki')) { require_once WIKI_PKG_PATH . 'BitPage.php'; } // if the object isn't loaded, we'll try and get the content prefs manually if (!empty($pCommonObject->mPrefs)) { $contentPrefs = $pCommonObject->mPrefs; } elseif (empty($pCommonObject->mContentId) && !empty($contentId)) { $contentPrefs = $pCommonObject->loadPreferences($contentId); } // only strip out html if needed if ($gBitSystem->isFeatureActive('content_allow_html') || $gBitSystem->isFeatureActive('content_force_allow_html')) { // we allow html unconditionally with this parser } elseif (!empty($contentPrefs['content_enter_html'])) { // we allow html on a per page basis } else { // we are parsing this page and we either have no way of checking permissions or we have no need for html $data = htmlspecialchars($data, ENT_NOQUOTES, 'UTF-8'); } // Extract [link] sections (to be re-inserted later) $noparsedlinks = array(); // This section matches [...]. // Added handling for [[foo] sections. -rlpowell preg_match_all("/(?<!\\[)\\[([^\\[][^\\]]+)\\]/", $data, $noparseurl); foreach (array_unique($noparseurl[1]) as $np) { $key = md5(BitSystem::genPass()); $aux["key"] = $key; $aux["data"] = $np; $noparsedlinks[] = $aux; $data = str_replace("{$np}", $key, $data); } // Replace special characters //done after url catching because otherwise urls of dyn. sites will be modified $this->parseHtmlchar($data); //$data = strip_tags($data); // BiDi markers $bidiCount = 0; $bidiCount = preg_match_all("/(\\{l2r\\})/", $data, $pages); $bidiCount += preg_match_all("/(\\{r2l\\})/", $data, $pages); $data = preg_replace("/\\{l2r\\}/", "<div dir='ltr'>", $data); $data = preg_replace("/\\{r2l\\}/", "<div dir='rtl'>", $data); $data = preg_replace("/\\{lm\\}/", "‎", $data); $data = preg_replace("/\\{rm\\}/", "‏", $data); // Parse MediaWiki-style pipe syntax tables. if ((strpos($data, "{|") === 0 || strpos($data, "\n{|") !== FALSE) && strpos($data, "\n|}") !== FALSE) { $data = $this->parseMediawikiTables($data); } // ============================================= this should go - xing // Replace dynamic variables // Dynamic variables are similar to dynamic content but they are editable // from the page directly, intended for short data, not long text but text // will work too // Now won't match HTML-style '%nn' letter codes. /* if (preg_match_all("/%([^% 0-9][^% 0-9][^% ]*)%/",$data,$dvars)) { // remove repeated elements $dvars = array_unique($dvars[1]); // Now replace each dynamic variable by a pair composed of the // variable value and a text field to edit the variable. Each foreach($dvars as $dvar) { $query = "select `data` from `".BIT_DB_PREFIX."liberty_dynamic_variables` where `name`=?"; $result = $this->mDb->query($query,Array($dvar)); if($result->numRows()) { $value = $result->fetchRow(); $value = $value["data"]; } else { //Default value is NULL $value = "NaV"; } // Now build 2 divs $id = 'dyn_'.$dvar; if( $gBitUser->hasPermission( 'p_wiki_edit_dynvar' ) ) { $span1 = "<span style='display:inline;' id='dyn_".$dvar."_display'><a class='dynavar' onclick='javascript:toggle_dynamic_var(\"$dvar\");' title='".tra('Click to edit dynamic variable').": $dvar'>$value</a></span>"; $span2 = "<span style='display:none;' id='dyn_".$dvar."_edit'><input type='text' name='dyn_".$dvar."' value='".$value."' /></span>"; } else { $span1 = "<span class='dynavar' style='display:inline;' id='dyn_".$dvar."_display'>$value</span>"; $span2 = ''; } $html = $span1.$span2; //It's important to replace only once $dvar_preg = preg_quote( $dvar ); $data = preg_replace("+%$dvar_preg%+",$html,$data,1); //Further replacements only with the value $data = str_replace("%$dvar%",$value,$data); } //At the end put an update button //<br /><div style="text-align:center"><input type="submit" name="dyn_update" value="'.tra('Update variables').'"/></div> $data='<form method="post" name="dyn_vars">'.$data.'<div style="display:none;"><input type="submit" name="_dyn_update" value="'.tra('Update variables').'"/></div></form>'; } */ // Replace boxes - add a new line that we can have something like: ^!heading^ without the need for a \n after the initial ^ - \n will be removed below $data = preg_replace("/\\^([^\\^]+)\\^/", "<div class=\"alert alert-info bitbox\"><!-- bitremovebr -->\n\$1</div>", $data); // Replace colors ~~color:text~~ $data = preg_replace("/\\~\\~([^\\:]+):([^\\~]+)\\~\\~/", "<span style=\"color:\$1;\">\$2</span>", $data); // Replace background colors ++color:text++ $data = preg_replace("/\\+\\+([^\\s][^\\: ]+):([^\\+]+)\\+\\+/", "<span style=\"background:\$1;\">\$2</span>", $data); // Underlined text $data = preg_replace("/===([^\\=]+)===/", "<span style=\"text-decoration:underline;\">\$1</span>", $data); // Center text $data = preg_replace("/::(.+?)::/", "<div style=\"text-align:center;\">\$1</div>", $data); // Line breaks $data = preg_replace('/%%%/', '<br />', $data); // reinsert hash-replaced links into page foreach ($noparsedlinks as $np) { $data = str_replace($np["key"], $np["data"], $data); } $links = $this->getLinks($data); // Note that there're links that are replaced foreach ($links as $link) { if (strstr($link, $_SERVER["SERVER_NAME"]) || !strstr($link, '//')) { $attributes = ''; } else { $attributes = 'class="external"'; } // comments and anonymously created pages get nofollow if ($pCommonObject && (get_class($pCommonObject) == 'comments' || isset($pCommonObject->mInfo['user_id']) && $pCommonObject->mInfo['user_id'] == ANONYMOUS_USER_ID)) { $attributes .= ' rel="nofollow" '; } // The (?<!\[) stuff below is to give users an easy way to // enter square brackets in their output; things like [[foo] // get rendered as [foo]. -rlpowell // prepare link for pattern usage $link2 = str_replace("/", "\\/", preg_quote($link)); $pattern = "/(?<!\\[)\\[{$link2}\\|([^\\]\\|]+)([^\\]])*\\]/"; $data = preg_replace($pattern, "<a {$attributes} href='{$link}'>\$1</a>", $data); $pattern = "/(?<!\\[)\\[{$link2}\\]/"; $data = preg_replace($pattern, "<a {$attributes} href='{$link}'>{$link}</a>", $data); } // Handle double square brackets. -rlpowell $data = str_replace("[[", "[", $data); // now that all links have been taken care of, we can replace all email addresses with the encoded form // this will also encode email addressed that have not been linked using [] $data = encode_email_addresses($data); if ($gBitSystem->getConfig('wiki_tables') != 'new') { // New syntax for tables if (preg_match_all("/\\|\\|(.*)\\|\\|/", $data, $tables)) { $maxcols = 1; $cols = array(); for ($i = 0; $i < count($tables[0]); $i++) { $rows = explode('||', $tables[0][$i]); $col[$i] = array(); for ($j = 0; $j < count($rows); $j++) { $cols[$i][$j] = explode('|', $rows[$j]); if (count($cols[$i][$j]) > $maxcols) { $maxcols = count($cols[$i][$j]); } } } for ($i = 0; $i < count($tables[0]); $i++) { $repl = '<table class="table">'; for ($j = 0; $j < count($cols[$i]); $j++) { $ncols = count($cols[$i][$j]); if ($ncols == 1 && !$cols[$i][$j][0]) { continue; } $repl .= '<tr class="' . ($j % 2 ? 'even' : 'odd') . '">'; for ($k = 0; $k < $ncols; $k++) { $repl .= '<td '; if ($k == $ncols - 1 && $ncols < $maxcols) { $repl .= ' colspan="' . ($maxcols - $k) . '"'; } $repl .= '>' . $cols[$i][$j][$k] . '</td>'; } $repl .= '</tr>'; } $repl .= '</table>'; $data = str_replace($tables[0][$i], $repl, $data); } } } else { // New syntax for tables // REWRITE THIS CODE if (preg_match_all("/\\|\\|(.*?)\\|\\|/s", $data, $tables)) { $maxcols = 1; $cols = array(); for ($i = 0; $i < count($tables[0]); $i++) { $rows = preg_split("/(\n|\\<br\\/\\>)/", $tables[0][$i]); $col[$i] = array(); for ($j = 0; $j < count($rows); $j++) { $rows[$j] = str_replace('||', '', $rows[$j]); $cols[$i][$j] = explode('|', $rows[$j]); if (count($cols[$i][$j]) > $maxcols) { $maxcols = count($cols[$i][$j]); } } } for ($i = 0; $i < count($tables[0]); $i++) { $repl = '<table class="table table-striped">'; if (preg_match("#^~#", $cols[$i][0][0]) && ($cols[$i][0][0] = preg_replace("#^~#", "", $cols[$i][0][0]))) { $th = TRUE; } else { $th = FALSE; } for ($j = 0; $j < count($cols[$i]); $j++) { $ncols = count($cols[$i][$j]); if ($ncols == 1 && !$cols[$i][$j][0]) { continue; } if ($j == 0 && $th) { $repl .= '<tr>'; } else { $repl .= '<tr class="' . ($j % 2 ? 'odd' : 'even') . '">'; } for ($k = 0; $k < $ncols; $k++) { $thd = $j == 0 && $th ? 'th' : 'td'; $repl .= "<{$thd}"; if ($k == $ncols - 1 && $ncols < $maxcols) { $repl .= ' colspan="' . ($maxcols - $k) . '"'; } $repl .= ">" . str_replace("\\n", "<br />", $cols[$i][$j][$k]) . "</{$thd}>"; } $repl .= '</tr>'; } $repl .= '</table>'; $data = str_replace($tables[0][$i], $repl, $data); } } } // Now tokenize the expression and process the tokens // Use tab and newline as tokenizing characters as well //// $lines = explode("\n", $data); $data = ''; $listbeg = array(); $divdepth = array(); $inTable = 0; // loop: process all lines foreach ($lines as $line) { // bitweaver now ignores leading space because it is *VERY* disturbing to unaware users - spiderr // unless 'feature_wiki_preserve_leading_blanks is set'. This is used for sites that have // migrated from TikiWiki and have lots of pages whose formatting depends on the presevation of leading spaces if (!$gBitSystem->isFeatureActive('wiki_preserve_leading_blanks')) { $line = trim($line); } // check if we are inside a table, if so, ignore monospaced and do // not insert <br/> $inTable += substr_count($line, "<table"); $inTable -= substr_count($line, "</table"); // If the first character is ' ' and we are not in pre then we are in pre // bitweaver now ignores leading space because it is *VERY* disturbing to unaware users - spiderr if (substr($line, 0, 1) == ' ' && $gBitSystem->isFeatureActive('wiki_monosp') && $inTable == 0) { // This is not list item -- must close lists currently opened while (count($listbeg)) { $data .= array_shift($listbeg); } // If the first character is space then // change spaces for $line = '<span style="font-family:monospace;">' . str_replace(' ', ' ', substr($line, 1)) . '</span>'; } // Title bars $line = preg_replace("/\\-\\=([^=]+)\\=\\-/", "<div class='bitbar'>\$1</div><!-- bitremovebr -->", $line); // Monospaced text $line = preg_replace("/-\\+(.*?)\\+-/", "<code>\$1</code>", $line); // Bold text $line = preg_replace("/__(.*?)__/", "<strong>\$1</strong>", $line); // Italics $line = preg_replace("/''(.*?)''/", "<em>\$1</em>", $line); // Definition lists $line = preg_replace("/^;([^:]+):(.+)/", "<dl><dt>\$1</dt><dd>\$2</dd></dl><!-- bitremovebr -->", $line); // This line is parseable then we have to see what we have if (substr($line, 0, 3) == '---') { // This is not list item -- must close lists currently opened while (count($listbeg)) { $data .= array_shift($listbeg); } $line = '<hr/>'; } else { $litype = substr($line, 0, 1); if ($litype == '*' || $litype == '#') { $listlevel = $this->howManyAtStart($line, $litype); $liclose = '</li>'; $addremove = 0; if ($listlevel < count($listbeg)) { while ($listlevel != count($listbeg)) { $data .= array_shift($listbeg); } if (substr(current($listbeg), 0, 5) != '</li>') { $liclose = ''; } } elseif ($listlevel > count($listbeg)) { $listyle = ''; while ($listlevel != count($listbeg)) { array_unshift($listbeg, $litype == '*' ? '</ul>' : '</ol>'); if ($listlevel == count($listbeg)) { $listate = substr($line, $listlevel, 1); if (($listate == '+' || $listate == '-') && !($litype == '*' && !strstr(current($listbeg), '</ul>') || $litype == '#' && !strstr(current($listbeg), '</ol>'))) { $thisid = 'id' . microtime() * 1000000; $data .= '<br /><a id="flipper' . $thisid . '" href="javascript:flipWithSign(\'' . $thisid . '\',1)">[' . ($listate == '-' ? '+' : '-') . ']</a>'; $listyle = ' id="' . $thisid . '" style="display:' . ($listate == '+' ? 'block' : 'none') . ';"'; $addremove = 1; } } $data .= $litype == '*' ? "<ul{$listyle}>" : "<ol{$listyle}>"; } $liclose = ''; } if ($litype == '*' && !strstr(current($listbeg), '</ul>') || $litype == '#' && !strstr(current($listbeg), '</ol>')) { $data .= array_shift($listbeg); $listyle = ''; $listate = substr($line, $listlevel, 1); if ($listate == '+' || $listate == '-') { $thisid = 'id' . microtime() * 1000000; $data .= '<br /><a id="flipper' . $thisid . '" href="javascript:flipWithSign(\'' . $thisid . '\',1)">[' . ($listate == '-' ? '+' : '-') . ']</a>'; $listyle = ' id="' . $thisid . '" style="display:' . ($listate == '+' ? 'block' : 'none') . ';"'; $addremove = 1; } $data .= $litype == '*' ? "<ul{$listyle}>" : "<ol{$listyle}>"; $liclose = ''; array_unshift($listbeg, $litype == '*' ? '</li></ul>' : '</li></ol>'); } $line = $liclose . '<li>' . substr($line, $listlevel + $addremove); if (substr(current($listbeg), 0, 5) != '</li>') { array_unshift($listbeg, '</li>' . array_shift($listbeg)); } } elseif ($litype == '+') { // Must append paragraph for list item of given depth... $listlevel = $this->howManyAtStart($line, $litype); // Close lists down to requested level while ($listlevel < count($listbeg)) { $data .= array_shift($listbeg); } if (count($listbeg)) { if (substr(current($listbeg), 0, 5) != '</li>') { array_unshift($listbeg, '</li>' . array_shift($listbeg)); $liclose = '<li>'; } else { $liclose = '<br />'; } } else { $liclose = ''; } $line = $liclose . substr($line, count($listbeg)); } else { // This is not list item -- must close lists currently opened while (count($listbeg)) { $data .= array_shift($listbeg); } // Get count of (possible) header signs at start $hdrlevel = $this->howManyAtStart($line, '!'); // If 1st char on line is '!' and its count less than 6 (max in HTML) if ($litype == '!' && $hdrlevel > 0 && $hdrlevel <= 6) { // OK. Parse headers here... $aclose = ''; $edit_link = ''; $addremove = 0; // Close lower level divs if opened for (; current($divdepth) >= $hdrlevel; array_shift($divdepth)) { $data .= '</div>'; } // May be spesial signs present after '!'s? $divstate = substr($line, $hdrlevel, 1); if ($divstate == '+' || $divstate == '-') { // OK. Must insert flipper after HEADER, and then open new div... $thisid = 'id' . microtime() * 1000000; $aclose = '<a id="flipper' . $thisid . '" href="javascript:flipWithSign(\'' . $thisid . '\',1)">[' . ($divstate == '-' ? '+' : '-') . ']</a>'; $aclose .= '<div id="' . $thisid . '" style="display:' . ($divstate == '+' ? 'block' : 'none') . ';">'; array_unshift($divdepth, $hdrlevel); $addremove = 1; } if ($gBitSystem->isFeatureActive('wiki_section_edit') && $gBitUser->hasPermission('p_wiki_update_page')) { if ($hdrlevel == $gBitSystem->getConfig('wiki_section_edit')) { $edit_url = WIKI_PKG_URL . "edit.php?content_id=" . $contentId . "&section=" . $section_count++; $edit_link = '<span class="editsection" style="float:right;margin-left:5px;">[<a href="' . $edit_url . '">' . tra("edit") . '</a>]</span>'; } } $hTagLevel = $hdrlevel + 1; // there should only be 1 <h1> per html document $line = $edit_link . "<h{$hTagLevel}>" . substr($line, $hdrlevel + $addremove) . "</h{$hTagLevel}>" . $aclose; } elseif (!strcmp($line, "...page...")) { // Close lists and divs currently opened while (count($listbeg)) { $data .= array_shift($listbeg); } while (count($divdepth)) { $data .= '</div>'; array_shift($divdepth); } // Leave line unchanged... index.php will split wiki here $line = "...page..."; } else { // Usual paragraph. if ($inTable == 0) { $line .= '<br />'; } } } } $data .= $line; } // Close lists may remains opened while (count($listbeg)) { $data .= array_shift($listbeg); } // Close header divs may remains opened for ($i = 1; $i <= count($divdepth); $i++) { $data .= '</div>'; } // Close BiDi DIVs if any for ($i = 0; $i < $bidiCount; $i++) { $data .= "</div>"; } $data = str_replace("<!-- bitremovebr --><br />", "", $data); return $data; }