check_feature('feature_wiki'); if (! isset($_REQUEST["source"])) { $access->check_feature('feature_history'); } else { $access->check_feature('feature_source'); } // Get the page from the request var or default it to HomePage if (! isset($_REQUEST["page"])) { $smarty->assign('msg', tra("No page indicated")); $smarty->display("error.tpl"); die; } else { $page = $_REQUEST["page"]; $smarty->assign_by_ref('page', $_REQUEST["page"]); } $auto_query_args = ['page', 'oldver', 'newver', 'diff_style', 'paginate', 'history_offset']; // Now check permissions to access this page if (! isset($_REQUEST["source"])) { $access->check_permission('tiki_p_wiki_view_history', '', 'wiki page', $_REQUEST['page']); } else { $access->check_permission('tiki_p_wiki_view_source', '', 'wiki page', $_REQUEST['page']); } $info = $tikilib->get_page_info($page); if (empty($info)) { // First, try cleaning the url to see if it matches an existing page. TikiLib::lib('wiki')->clean_url_suffix_and_redirect($page, $type = '', $path = '', $prefix = ''); // If after cleaning the url, the page does not exist then display an error $smarty->assign('msg', tra('No page indicated')); $smarty->display('error.tpl'); die; } $tikilib->get_perm_object($_REQUEST['page'], 'wiki page', $info); if (isset($_REQUEST['preview'], $_REQUEST['flaggedrev'], $_REQUEST['page']) && $prefs['flaggedrev_approval'] == 'y' && $tiki_p_wiki_approve == 'y') { $targetFlag = null; if (isset($_REQUEST['approve'])) { $targetFlag = 'OK'; $targetVersion = (int) $_REQUEST['approve']; } elseif (isset($_REQUEST['unapprove'])) { $targetFlag = 'REJECT'; $targetVersion = (int) $_REQUEST['unapprove']; } if ($targetFlag) { $flaggedrevisionlib = TikiLib::lib('flaggedrevision'); $flaggedrevisionlib->flag_revision($info['pageName'], $targetVersion, 'moderation', $targetFlag); } } $smarty->assign_by_ref('info', $info); if ($prefs['feature_contribution'] == 'y') { $contributionlib = TikiLib::lib('contribution'); $contributions = $contributionlib->get_assigned_contributions($page, 'wiki page'); $smarty->assign_by_ref('contributions', $contributions); if ($prefs['feature_contributor_wiki'] == 'y') { $contributors = $logslib->get_wiki_contributors($info); $smarty->assign_by_ref('contributors', $contributors); } } $paginate = (isset($_REQUEST['paginate']) && $_REQUEST['paginate'] == 'on') || ! isset($_REQUEST['diff_style']); $smarty->assign('paginate', $paginate); if (isset($_REQUEST['history_offset']) && $paginate) { $history_offset = (int) $_REQUEST['history_offset']; } else { $history_offset = 0; } $smarty->assign('history_offset', $history_offset); if (isset($_REQUEST['history_pagesize']) && $paginate) { $history_pagesize = (int) $_REQUEST['history_pagesize']; } elseif (isset($_SESSION['history_pagesize'])) { $history_pagesize = (int) $_SESSION['history_pagesize']; } else { $history_pagesize = (int) $prefs['maxRecords']; } $_SESSION['history_pagesize'] = $history_pagesize; $smarty->assign('history_pagesize', $history_pagesize); // fetch page history, but omit the actual page content (to save memory) $history = $histlib->get_page_history($page, false, $history_offset, $paginate ? $history_pagesize : -1); $smarty->assign('history_cant', $histlib->get_nb_history($page) - 1); if ($prefs['flaggedrev_approval'] == 'y') { $flaggedrevisionlib = TikiLib::lib('flaggedrevision'); if ($flaggedrevisionlib->page_requires_approval($page)) { $approved_versions = $flaggedrevisionlib->get_versions_with($page, 'moderation', 'OK'); $rejected_versions = $flaggedrevisionlib->get_versions_with($page, 'moderation', 'REJECT'); $smarty->assign('flaggedrev_approval', true); $info['approved'] = in_array($info['version'], $approved_versions); $info['rejected'] = in_array($info['version'], $rejected_versions); $new_history = []; foreach ($history as $version) { $version['approved'] = in_array($version['version'], $approved_versions); $version['rejected'] = in_array($version['version'], $rejected_versions); if ($version['rejected']) { $version['rejection_reason'] = $flaggedrevisionlib->get_flag_comment($page, $version['version'], 'moderation', 'REJECT'); } if ($tiki_p_wiki_view_latest == 'y' || $version['approved'] || $version['rejected']) { $new_history[] = $version; } } while ($tiki_p_wiki_approve != 'y' && sizeof($new_history) > 0 && ! $new_history[0]['approved'] && ! $new_history[0]['rejected']) { array_shift($new_history); } $history = $new_history; } } if (! isset($_REQUEST['show_all_versions'])) { $_SESSION['show_all_versions'] = isset($_SESSION['show_all_versions']) ? $_SESSION['show_all_versions'] : 'y'; } else { $_SESSION['show_all_versions'] = $_REQUEST['show_all_versions'] === 'n' ? 'n' : 'y'; } $sessions = []; if (count($history) > 0) { $lastuser = ''; // calculate edit session info $lasttime = 0; // secs $idletime = 1800; // max gap between edits in sessions 30 mins? Maybe should use a pref? for ($i = 0, $cnt = count($history); $i < $cnt; $i++) { if ((isset($history[$i]['user']) && $history[$i]['user'] != $lastuser) || (isset($history[$i]['lastModif']) && $lasttime - $history[$i]['lastModif'] > $idletime)) { $sessions[] = $history[$i]; //$history[$i]['session'] = $history[$i]['version']; } elseif (count($sessions) > 0) { $history[$i]['session'] = $sessions[count($sessions) - 1]['version']; } if (isset($history[$i]['user'])) { $lastuser = $history[$i]['user']; } else { $lastuser = ''; } if (isset($history[$i]['lastModif'])) { $lasttime = $history[$i]['lastModif']; } else { $lasttime = 0; } } $csesh = count($sessions) + 1; foreach ($history as &$h) { // move ending 'version' into starting 'session' if (! empty($h['session'])) { foreach ($history as &$h2) { if ($h2['version'] == $h['session']) { $h2['session'] = $h['version']; } } $h['session'] = ''; } } if ($_SESSION['show_all_versions'] == "n") { for ($i = 0, $cnt = count($history); $i < $cnt; $i++) { // remove versions inside sessions if (! empty($history[$i]['session']) && $i < $cnt - 1) { $seshend = $history[$i]['session']; $i++; for ($i; $i < $cnt; $i++) { if ($history[$i]['version'] >= $seshend) { unset($history[$i]); } else { $i--; break; } } } } } } $smarty->assign('show_all_versions', $_SESSION['show_all_versions']); $history_versions = []; $history_sessions = []; reset($history); foreach ($history as &$h) { // as $h has been used by reference before it needs to be so again (it seems) $history_versions[] = (int)$h['version']; $history_sessions[] = isset($h['session']) ? (int)$h['session'] : 0; } $history_versions = array_reverse($history_versions); $history_sessions = array_reverse($history_sessions); $history_versions[] = (int) $info['version']; // current is last one $history_sessions[] = 0; $smarty->assign_by_ref('history', $history); // for pagination $smarty->assign('ver_cant', count($history_versions)); if (isset($_REQUEST['clear_versions'])) { unset($_REQUEST['clear_versions']); unset($_REQUEST['newver']); unset($_REQUEST['newver_idx']); unset($_REQUEST['oldver']); unset($_REQUEST['oldver_idx']); unset($_REQUEST['compare']); unset($_REQUEST['diff_style']); } // calculate version and offset if (isset($_REQUEST['bothver_idx'])) { if ($_REQUEST['bothver_idx'] == 0) { $_REQUEST['bothver_idx'] = 1; } $_REQUEST['oldver_idx'] = $_REQUEST['bothver_idx'] - 1; $_REQUEST['newver_idx'] = $_REQUEST['bothver_idx']; if ($_SESSION['show_all_versions'] == 'n' && ! empty($history_sessions[$_REQUEST['bothver_idx']])) { $_REQUEST['oldver_idx'] = $_REQUEST['bothver_idx']; } } if (isset($_REQUEST['newver_idx'])) { $newver = $history_versions[$_REQUEST['newver_idx']]; } else { if (isset($_REQUEST['newver']) && $_REQUEST['newver'] > 0) { $newver = (int)$_REQUEST["newver"]; if (in_array($newver, $history_versions)) { $_REQUEST['newver_idx'] = array_search($newver, $history_versions); } else { $_REQUEST['newver_idx'] = array_search($newver, $history_sessions); } } else { $newver = $history_versions[count($history_versions) - 1]; $_REQUEST['newver_idx'] = count($history_versions) - 1; } } if (isset($_REQUEST['oldver_idx'])) { $oldver = $history_versions[$_REQUEST['oldver_idx']]; if ($_SESSION['show_all_versions'] == 'n' && ! empty($history_sessions[$_REQUEST['oldver_idx']])) { $oldver = $history_sessions[$_REQUEST['oldver_idx']]; } } else { if (isset($_REQUEST['oldver']) && $_REQUEST['oldver'] > 0) { $oldver = (int)$_REQUEST["oldver"]; if (in_array($oldver, $history_versions)) { $_REQUEST['oldver_idx'] = array_search($oldver, $history_versions); } else { $_REQUEST['oldver_idx'] = array_search($oldver, $history_sessions); } } else { $oldver = $history_versions[count($history_versions) - 1]; $_REQUEST['oldver_idx'] = count($history_versions) - 1; } } if ($_REQUEST['oldver_idx'] + 1 == $_REQUEST['newver_idx']) { $_REQUEST['bothver_idx'] = $_REQUEST['newver_idx']; } $_REQUEST['oldver'] = $oldver; $_REQUEST['newver'] = $newver; // source view if (isset($_REQUEST['source_idx'])) { $source = $history_versions[$_REQUEST['source_idx']]; } else { if (isset($_REQUEST['source'])) { $source = (int)$_REQUEST["source"]; if ($source > 0) { $_REQUEST['source_idx'] = array_search($source, $history_versions); } else { $_REQUEST['source_idx'] = count($history_versions) - 1; $smarty->assign('noHistory', true); } } } if (isset($_REQUEST['preview_idx'])) { $preview = $history_versions[$_REQUEST['preview_idx']]; } else { if (isset($_REQUEST['preview_date'])) { $_REQUEST['preview'] = (int)$histlib->get_version_by_time($page, $_REQUEST["preview_date"]); } if (isset($_REQUEST['preview'])) { $preview = (int)$_REQUEST["preview"]; if ($_REQUEST['preview'] > 0) { $_REQUEST['preview_idx'] = array_search($preview, $history_versions); } else { $_REQUEST['preview_idx'] = count($history_versions) - 1; $smarty->assign('noHistory', true); } } } if (isset($_REQUEST['version'])) { $rversion = $_REQUEST['version']; } $smarty->assign('source', false); if (isset($source)) { if ($source == '' && isset($rversion)) { $source = $rversion; } if ($source == $info["version"] || $source == 0) { $smarty->assign('sourced', $info["data"]); $smarty->assign('source', $info['version']); } else { $version = $histlib->get_version($page, $source); if ($version) { $smarty->assign('sourced', $version["data"]); $smarty->assign('source', $source); } } } $smarty->assign('preview', false); if (isset($preview)) { if ($preview == '' && isset($rversion)) { $preview = $rversion; } if ($preview == $info['version'] || $preview == 0) { if ($prefs['flaggedrev_approval'] != 'y' || ! $flaggedrevisionlib->page_requires_approval($page) || $info['approved'] || $info['rejected'] || $tiki_p_wiki_approve == 'y') { $previewd = (new WikiLibOutput($info, $info['data'], ['preview_mode' => true, 'is_html' => $info['is_html']]))->parsedValue; $smarty->assign('previewd', $previewd); } $smarty->assign('preview', $info['version']); } else { $version = $histlib->get_version($page, $preview); if ($version) { $previewd = (new WikiLibOutput($version, $version['data'], ['preview_mode' => true, 'is_html' => $version['is_html']]))->parsedValue; $smarty->assign('previewd', $previewd); $smarty->assign('preview', $preview); } } $smarty->assign('flaggedrev_preview_approved', isset($approved_versions) && in_array($preview, $approved_versions)); $smarty->assign('flaggedrev_preview_rejected', isset($rejected_versions) && in_array($preview, $rejected_versions)); } if (isset($preview)) { $smarty->assign('current', $preview); } elseif (isset($source)) { $smarty->assign('current', $source); } elseif ($newver) { $smarty->assign('current', $newver); } elseif ($oldver) { $smarty->assign('current', $oldver); } else { $smarty->assign('current', 0); } if ($prefs['feature_multilingual'] == 'y' && isset($_REQUEST['show_translation_history'])) { $multilinguallib = TikiLib::lib('multilingual'); $smarty->assign('show_translation_history', 1); $sources = $multilinguallib->getSourceHistory($info['page_id']); $targets = $multilinguallib->getTargetHistory($info['page_id']); } else { $sources = []; $targets = []; } $smarty->assign_by_ref('translation_sources', $sources); $smarty->assign_by_ref('translation_targets', $targets); if (isset($_REQUEST["diff2"])) { // previous compatibility if ($_REQUEST["diff2"] == '' && isset($rversion)) { $_REQUEST["diff2"] = $rversion; } $_REQUEST["compare"] = "y"; $oldver = (int)$_REQUEST["diff2"]; } if (! isset($newver)) { $newver = 0; } if ($prefs['feature_multilingual'] == 'y') { $multilinguallib = TikiLib::lib('multilingual'); $langLib = TikiLib::lib('language'); $languages = $langLib->list_languages(); $smarty->assign_by_ref('languages', $languages); if (isset($_REQUEST["update_translation"])) { // Update translation button clicked. Forward request to edit page of translation. if (isset($_REQUEST['tra_lang'])) { $target = $_REQUEST['tra_lang']; } else { die('Invalid call to this page. Specify tra_lang'); } // Find appropriate translation page $langs = $multilinguallib->getTranslations('wiki page', $info['page_id'], $info['pageName'], true); $pageName = ''; foreach ($langs as $pageInfo) { if ($target == (string)$pageInfo['lang']) { $pageName = $pageInfo['objName']; } } // Build URI / Redirect $diff_style = isset($_REQUEST['diff_style']) ? rawurlencode($_REQUEST['diff_style']) : rawurlencode($info['is_html'] === '1' ? 'htmldiff' : $prefs['default_wiki_diff_style']); $comment = rawurlencode("Updating from $page at version {$info['version']}"); if ($newver == 0) { $newver = $info['version']; } if ($pageName) { $uri = "tiki-editpage.php?page=$pageName&source_page=$page&diff_style=$diff_style&oldver=$oldver&newver=$newver&comment=$comment"; } else { $uri = "tiki-edit_translation.php?page=$page"; } header("Location: $uri"); exit; } } $current_version = $info["version"]; $comparing = isset($_GET['newver']) || isset($_GET['oldver']); $not_comparing = $comparing ? 'false' : 'true'; $headerlib->add_jq_onready( <<= ver)); }); } }); if (\$("input[name=newver][checked=checked]").length) { \$("input[name=newver][checked=checked]").change(); \$("input[name=oldver][checked=checked]").change(); } else if ($not_comparing) { \$("input[name=newver]:eq(0)").prop("checked", "checked").change(); \$("input[name=oldver]:eq(1)").prop("checked", "checked").change(); } JS ); if ($comparing) { histlib_helper_setup_diff($page, $oldver, $newver, (! empty($_REQUEST['diff_style']) ? $_REQUEST['diff_style'] : '')); if (isset($approved_versions)) { $smarty->assign('flaggedrev_compare_approve', ! in_array($newver, $approved_versions)); } } else { $smarty->assign('diff_style', $info['is_html'] === '1' ? 'htmldiff' : $prefs['default_wiki_diff_style']); } if ($info["flag"] == 'L') { $smarty->assign('lock', true); } else { $smarty->assign('lock', false); } if (isset($_REQUEST['nohistory'])) { $smarty->assign('noHistory', true); } $smarty->assign('editable', TikiLib::lib('wiki')->is_editable($page, $user, $info)); TikiLib::events()->trigger( 'tiki.wiki.view', array_merge( [ 'type' => 'wiki page', 'object' => $page, 'user' => $GLOBALS['user'], ], $info ) ); // disallow robots to index page: $smarty->assign('page_user', $info['user']); $smarty->assign('metatag_robots', 'NOINDEX, NOFOLLOW'); include_once('tiki-section_options.php'); if ($prefs['feature_theme_control'] == 'y') { $cat_type = 'wiki page'; $cat_objid = $_REQUEST['page']; include('tiki-tc.php'); } // Display the template $smarty->assign('mid', 'tiki-pagehistory.tpl'); $smarty->display("tiki.tpl");