function invoke($ignore_level = 0) { global $DB, $FUNCS, $PAGE, $AUTH, $CTX, $k_cache_file; if ($ignore_level > 0) { $ignore_canonical_url = 1; // if set, the url used to access page is not checked to be canonical. if ($ignore_level > 1) { $ignore_context = 1; // if set, all canonical GET variables are ignored. Page always remains in home-view. } } // $page_id, $folder_id and $archive_date are mutually exclusive. // If more than one are provided, $page_id will be preferred over the // others and $folder_id will be preferred over $archive_date. // All ids will be preferred over names. // comment_id actually resolves to becoming the page_id of // the associated page hence it is processed the foremost. $page_id = null; $folder_id = null; $archive_date = null; $page_name = null; $folder_name = null; $comment_id = null; $comment_date = ''; if (!$ignore_context) { // if comment id given, find the associated page_id if (isset($_GET['comment']) && $FUNCS->is_non_zero_natural($_GET['comment'])) { $rs = $DB->select(K_TBL_COMMENTS, array('page_id', 'date', 'approved'), "id='" . $DB->sanitize(intval($_GET['comment'])) . "'"); if (count($rs)) { $comment_id = intval($_GET['comment']); $comment_date = $rs[0]['date']; $_GET['p'] = $rs[0]['page_id']; } } if (isset($_GET['p']) && $FUNCS->is_non_zero_natural($_GET['p'])) { $page_id = (int) $_GET['p']; } else { if (isset($_GET['f']) && $FUNCS->is_non_zero_natural($_GET['f'])) { $folder_id = (int) $_GET['f']; } else { if (isset($_GET['d']) && $FUNCS->is_non_zero_natural($_GET['d'])) { $date = (int) $_GET['d']; // example valid values: // ?d=20080514 // ?d=200805 // ?d=2008 $len = strlen($date); if ($len >= 4) { $year = substr($date, 0, 4); $archive_date = $year; if ($len >= 6) { $month = substr($date, 4, 2); $archive_date .= '-' . $month; if ($len > 6) { $day = substr($date, 6, 2); $archive_date .= '-' . $day; } } if ($day) { $next_archive_date = date('Y-m-d H:i:s', mktime(0, 0, 0, $month, $day + 1, $year)); $is_archive_day_view = 1; } elseif ($month) { $next_archive_date = date('Y-m-d H:i:s', mktime(0, 0, 0, $month + 1, 1, $year)); $is_archive_month_view = 1; } else { $next_archive_date = date('Y-m-d H:i:s', mktime(0, 0, 0, 1, 1, $year + 1)); $is_archive_year_view = 1; } $archive_date = $FUNCS->make_date($archive_date); } } else { if (isset($_GET['pname']) && $FUNCS->is_title_clean($_GET['pname'])) { $page_name = $_GET['pname']; } else { if (isset($_GET['fname']) && $FUNCS->is_title_clean($_GET['fname'])) { $folder_name = $_GET['fname']; } } } } } } else { $CTX->ignore_context = 1; // necessary for nested_pages with prettyurls } if ($AUTH->user->access_level >= K_ACCESS_LEVEL_SUPER_ADMIN) { $DB->begin(); // Serialize access for super-admins.. hack of a semaphore $DB->update(K_TBL_SETTINGS, array('k_value' => K_COUCH_VERSION), "k_key='k_couch_version'"); } // Get the requested page. // for folder view and archive view, page_id would be null, // causing the default page to be loaded. // $CTX->folder_info = !is_null($folder_name) ? $folder_name : (!is_null($folder_id) ? (int) $folder_id : null); // added for 404 on non-existent folders if (!is_null($page_name)) { $PAGE = new KWebpage(null, null, $page_name); } else { $PAGE = new KWebpage(null, $page_id); } if ($PAGE->error) { ob_end_clean(); $DB->rollback(); if ($PAGE->err_msg == 'Page not found') { header('HTTP/1.1 404 Not Found'); header('Status: 404 Not Found'); header('Content-Type: text/html; charset=' . K_CHARSET); $html = ''; if (file_exists(K_SITE_DIR . '404.php')) { $html = $FUNCS->file_get_contents(K_SITE_URL . '404.php'); } if (!$html) { $html = 'Page not found'; } } else { die('ERROR: ' . $PAGE->err_msg); } } else { $access_level = $PAGE->get_access_level($inherited); $AUTH->check_access($access_level); // set the requested view, if any if ($folder_id) { $PAGE->is_folder_view = 1; $PAGE->folder_id = $folder_id; } elseif ($archive_date) { $PAGE->is_archive_view = 1; $PAGE->archive_date = $archive_date; $PAGE->next_archive_date = $next_archive_date; if ($is_archive_day_view) { $PAGE->is_archive_day_view = 1; } elseif ($is_archive_month_view) { $PAGE->is_archive_month_view = 1; } else { $PAGE->is_archive_year_view = 1; } $PAGE->day = $day; $PAGE->month = $month; $PAGE->year = $year; } elseif ($folder_name) { if (!$PAGE->changed_from_folder_to_page) { // can happen with nested pages $PAGE->is_folder_view = 1; $PAGE->folder_name = $folder_name; } } elseif ($comment_id) { // not a view but just to remind the page that it was fetched on the basis of comment id. $PAGE->comment_id = $comment_id; $PAGE->comment_date = $comment_date; } $html = ob_get_contents(); ob_end_clean(); // HOOK: pre_process_page $FUNCS->dispatch_event('pre_process_page', array(&$html, &$PAGE, &$ignore_canonical_url)); $parser = new KParser($html); $html = $parser->get_HTML(); //echo $parser->get_info(); $FUNCS->post_process_page(); if ($AUTH->user->access_level >= K_ACCESS_LEVEL_SUPER_ADMIN) { $DB->commit(1); } // Verify that the url used to access this page is the page's canonical url if ($comment_id) { // if page accessed via comment_id, rectify the url $canonical_url = K_SITE_URL . $PAGE->link; if ($PAGE->comment_page) { $sep = strpos($canonical_url, '?') === false ? '?' : '&'; $canonical_url .= $sep . 'comments_pg=' . $PAGE->comment_page; } $redirect_url = $canonical_url . "#comment-" . $comment_id; } elseif (K_PRETTY_URLS && $_SERVER['REQUEST_METHOD'] != 'POST' && !$PAGE->parent_id && $CTX->script != '404.php' && !$ignore_canonical_url) { $url = $FUNCS->get_url(); if ($url) { if ($_GET['_nr_']) { //page link being masqueraded. Normalize before comparision. $masq_tpl_name = $FUNCS->get_pretty_template_link($PAGE->tpl_name); /*masquereded name*/ $unmasq_tpl_name = $FUNCS->get_pretty_template_link_ex($PAGE->tpl_name, $dummy, 0); /*unmasquereded name*/ $canonical_url = K_SITE_URL . $unmasq_tpl_name . substr($PAGE->link, strlen($masq_tpl_name)); //replace masquered name with unmasqueraded } else { $canonical_url = K_SITE_URL . $PAGE->link; } if ($url != $canonical_url) { // Redirect to canonical url // append querystring params, if any $sep = ''; foreach ($_GET as $qk => $qv) { if ($qk == 'p' || $qk == 'f' || $qk == 'd' || $qk == 'fname' || $qk == 'pname' || $qk == '_nr_') { continue; } $qs .= $sep . $qk . '=' . urlencode($qv); $sep = '&'; } if ($qs) { $qs = '?' . $qs; } if ($_GET['_nr_']) { //page link being masqueraded $redirect_url = K_SITE_URL . $PAGE->link . $qs; } else { $redirect_url = $canonical_url . $qs; } } } } } $content_type = $PAGE->content_type ? $PAGE->content_type : 'text/html'; $content_type_header = 'Content-Type: ' . $content_type . ';'; $content_type_header .= ' charset=' . K_CHARSET; // Add our link to the document (if not commercial license) // Apply only to text/html, text/html-sandboxed, application/xhtml+xml mime-types // application/xml and text/xml can also be used to serve xhtml documents but we'll allow that. if (!(K_PAID_LICENSE || K_REMOVE_FOOTER_LINK)) { if (strpos($content_type, 'html') !== false) { $_cnt = preg_match_all("/<\\/[^\\S]*BODY[^\\S]*>/is", $html, $matches, PREG_OFFSET_CAPTURE); if ($_cnt) { $_split_at = $matches[0][count($matches[0]) - 1][1]; } else { $_cnt = preg_match_all("/<\\/[^\\S]*HTML[^\\S]*>/is", $html, $matches, PREG_OFFSET_CAPTURE); if ($_cnt) { $_split_at = $matches[0][count($matches[0]) - 1][1]; } } $_link = "\n <div style=\"clear:both; text-align: center; z-index:99999 !important; display:block !important; visibility:visible !important;\">\n <div style=\"position:relative; top:0; margin-right:auto;margin-left:auto; z-index:99999; display:block !important; visibility:visible !important;\">\n <center><a href=\"http://www.couchcms.com/\" title=\"CouchCMS - Simple Open-Source Content Management\" style=\"display:block !important; visibility:visible !important;\">Powered by CouchCMS</a></center><br />\n </div>\n </div>\n "; if ($_split_at) { $_pre = substr($html, 0, $_split_at); $_post = substr($html, $_split_at); $html = $_pre . $_link . $_post; } else { $html .= $_link; } } } // HOOK: alter_final_page_output $FUNCS->dispatch_event('alter_final_page_output', array(&$html, &$PAGE, &$k_cache_file, &$redirect_url, &$content_type_header)); // See if ouput needs to be cached if ($k_cache_file && strlen(trim($html)) && !$PAGE->no_cache) { $handle = @fopen($k_cache_file, 'w'); if ($handle) { if ($redirect_url) { $pg['redirect_url'] = $redirect_url; } else { $pg['mime_type'] = $content_type_header; $cached_html = $html . "\n<!-- Cached page"; if (!K_PAID_LICENSE) { $cached_html .= " served by CouchCMS - Simple Open-Source Content Management"; } $cached_html .= " -->\n"; $pg['cached_html'] = $cached_html; if ($PAGE->err_msg == 'Page not found') { $pg['res_404'] = 1; } } @flock($handle, LOCK_EX); @fwrite($handle, serialize($pg)); @flock($handle, LOCK_UN); @fclose($handle); } } if ($redirect_url) { header("Location: " . $redirect_url, TRUE, 301); die; } if (!K_PAID_LICENSE) { $html .= "\n<!-- Page generated by CouchCMS - Simple Open-Source Content Management"; $html .= " -->\n"; } if (defined('K_IS_MY_TEST_MACHINE')) { $html .= "\n<!-- in: " . k_timer_stop() . " -->\n"; $html .= "\n<!-- Queries: " . $DB->queries . " -->\n"; } header($content_type_header); echo $html; }
</cms:if> </cms:form> </cms:capture> <cms:if form_validated > <cms:php> k_install("<cms:show acct_name/>", "<cms:show acct_pwd/>", "<cms:show acct_email/>"); </cms:php> <cms:if k_install_error > <div class="error"> <h3>Installation failed!</h3> <cms:show k_install_error /> </div> <cms:else /> <div class="success"> <h3>Installation successful!</h3> Please <a href="<cms:php> echo K_ADMIN_URL . K_ADMIN_PAGE; </cms:php>"><b>login</b></a> using the information you provided. </div> </cms:if> <cms:else /> <cms:show my_form /> </cms:if> <?php echo $FUNCS->login_footer(); ?> <?php /////////////////////////// $html = ob_get_contents(); ob_end_clean(); $parser = new KParser($html); echo $parser->get_HTML(); die;
function embed($html = '', $is_code = 0) { global $CTX, $TAGS; if (!$is_code) { $filename = trim($html); if (!strlen($filename)) { return; } } else { if (!strlen(trim($html))) { return; } $code = $html; } // get the 'obj_sc' object placed by the calling 'do_shortcode' tag on context stack $node =& $CTX->get_object('obj_sc', 'do_shortcodes'); if (is_null($node)) { // Not called from a shortcode handler. //.. handle using a new instance of parser if (!$is_code) { if (defined('K_SNIPPETS_DIR')) { // always defined relative to the site $base_snippets_dir = K_SITE_DIR . K_SNIPPETS_DIR . '/'; } else { $base_snippets_dir = K_COUCH_DIR . 'snippets/'; } $filepath = $base_snippets_dir . ltrim(trim($filename), '/\\'); $html = @file_get_contents($filepath); if ($html === FALSE) { return; } } $parser = new KParser($html); return $parser->get_HTML(); } // prepare parameters for the surrogate 'embed' tag $params = array(); $param = array(); if ($is_code) { $param['lhs'] = 'code'; } $param['op'] = '='; $param['rhs'] = $filename ? $filename : $code; $params[] = $param; // invoke 'embed' $html = $TAGS->embed($params, $node); return $html; }
function process_match_route($params, $node) { global $FUNCS, $CTX, $PAGE, $TAGS; if (count($node->children)) { die("ERROR: Tag \"" . $node->name . "\" is a self closing tag"); } $attr = $FUNCS->get_named_vars(array('path' => '', 'masterpage' => '', 'debug' => '0', 'is_404' => '0'), $params); extract($attr); $path = trim($path); $masterpage = trim($masterpage); $debug = $debug == 1 ? 1 : 0; $is_404 = $is_404 == 1 ? 1 : 0; if ($path == '') { $path = $_GET['q']; } if ($masterpage == '') { $masterpage = $PAGE->tpl_name; } $routes =& $this->get_routes($masterpage); if (!count($routes)) { if ($debug) { $html = '<pre><b><font color="red">No routes defined.</font></b></pre>'; } return $html; } $html = '<pre>'; if ($debug) { $html .= 'Path to match: <i>' . htmlspecialchars($path, ENT_QUOTES, K_CHARSET) . '</i><br/><br/>'; } $found = null; foreach ($routes as $route) { if ($debug) { $html .= 'Trying route <b>' . $route->name . ':</b><br/>'; $html .= 'Pattern: <i>' . htmlspecialchars($route->path, ENT_QUOTES, K_CHARSET) . '</i><br/>'; $html .= 'Regex: <i>' . htmlspecialchars($route->regex, ENT_QUOTES, K_CHARSET) . '</i><br/>'; } if ($route->isMatch($path, $_SERVER)) { $found = $route; if ($debug) { $html .= '<b><font color="green">Matched!</font></b> <br/>Following variable(s) will be set:<br/>'; $html .= ' k_matched_route = ' . $route->name . '<br />'; foreach ($route->values as $k => $v) { if ($route->wildcard && $k == $route->wildcard) { $wildcard_count = count($route->values[$route->wildcard]); $html .= ' rt_wildcard_count = ' . $wildcard_count . '<br/>'; $html .= ' rt_' . $k . ' = ' . htmlspecialchars(implode('/', $route->values[$route->wildcard]), ENT_QUOTES, K_CHARSET) . '<br/>'; for ($x = 0; $x < $wildcard_count; $x++) { $html .= ' rt_' . $k . '_' . ($x + 1) . ' = ' . htmlspecialchars($route->values[$route->wildcard][$x], ENT_QUOTES, K_CHARSET) . '<br/>'; } } else { $html .= ' rt_' . $k . ' = ' . htmlspecialchars($v, ENT_QUOTES, K_CHARSET) . '<br/>'; } } $html .= '<br/>'; } break; } else { if ($debug) { $html .= '<b><font color="red">Failed!</font></b><br/>Reason: '; foreach ($route->debug as $msg) { $html .= $msg . '<br/>'; } $html .= '<br/>'; } } } if ($found) { $route = $found; $CTX->set('k_matched_route', $route->name, 'global'); $vars = array(); foreach ($route->values as $k => $v) { if ($route->wildcard && $k == $route->wildcard) { $wildcard_count = count($route->values[$route->wildcard]); $vars['rt_wildcard_count'] = $wildcard_count; $vars['rt_' . $k] = implode('/', $route->values[$route->wildcard]); for ($x = 0; $x < $wildcard_count; $x++) { $vars['rt_' . $k . '_' . ($x + 1)] = $route->values[$route->wildcard][$x]; } } else { $vars['rt_' . $k] = $v; } } $CTX->set_all($vars, 'global'); // execute filters if any $str_filters = $route->filters; // e.g. 'test=1,abc,3 | test2 | test3=xyz' if (strlen($str_filters)) { if ($debug) { $html .= 'Following filter(s) will be called:<br/>'; } $arr_filters = array_filter(array_map("trim", preg_split("/(?<!\\\\)\\|/", $str_filters))); // split on unescaped '|' foreach ($arr_filters as $filter) { $filter = str_replace('\\|', '|', $filter); // filter has arguments? e.g. 'test=1,2,3' $arr_args = array_filter(array_map("trim", preg_split("/(?<!\\\\)\\=/", $filter))); // split on unescaped '=' $filter = $arr_args[0]; $args = ''; if (isset($arr_args[1])) { $str_args = str_replace('\\=', '=', $arr_args[1]); // multiple arguments? $arr_args = array_filter(array_map("trim", preg_split("/(?<!\\\\)\\,/", $str_args))); // split on unescaped ',' for ($x = 0; $x < count($arr_args); $x++) { $args .= " arg_" . ($x + 1) . "='" . str_replace(array("\\,", "'"), array(",", "\\'"), $arr_args[$x]) . "'"; } $args = " arg_count='" . count($arr_args) . "'" . $args; } else { $args = " arg_count='0'"; } if ($filter) { $filter = 'filters/' . $filter . '.html'; if (!$debug) { $code = "\n <cms:set rs= '' />\n\n <cms:capture into='rs' scope='parent'>\n <cms:embed '{$filter}' {$args} />\n </cms:capture>\n\n <cms:php>global \$CTX; \$CTX->set( 'rs', trim(\$CTX->get('rs')) ); </cms:php>\n\n <cms:if rs >\n <cms:abort rs is_404 />\n </cms:if>\n "; $parser = new KParser($code, $node->line_num, 0, '', $node->ID); $parser->get_HTML(); } else { $html .= ' ' . $filter . ' (' . htmlspecialchars($args, ENT_QUOTES, K_CHARSET) . ' ) <br/>'; } } } } } else { $CTX->set('k_matched_route', '', 'global'); if ($debug) { $html .= '<h3><font color="red">No matching route found.</font></h3>'; } elseif ($is_404) { $params = array(array('lhs' => 'msg', 'op' => '=', 'rhs' => ''), array('lhs' => 'is_404', 'op' => '=', 'rhs' => '1')); $TAGS->abort($params, $node); } } $html .= '</pre>'; if ($debug) { return $html; } }
function resolve_dynamic_params() { if (!$this->system && $this->dynamic) { $arr_dynamic = array_map("trim", explode('|', $this->dynamic)); foreach ($arr_dynamic as $dyn_param) { if (in_array($dyn_param, array('desc', 'type', 'order', 'group', 'separator'))) { $dyn_param = 'k_' . $dyn_param; } if (array_key_exists($dyn_param, $this) && $this->{$dyn_param}) { if (defined('K_SNIPPETS_DIR')) { // always defined relative to the site $base_snippets_dir = K_SITE_DIR . K_SNIPPETS_DIR . '/'; } else { $base_snippets_dir = K_COUCH_DIR . 'snippets/'; } $filepath = $base_snippets_dir . ltrim(trim($this->{$dyn_param}), '/\\'); if (file_exists($filepath)) { $html = @file_get_contents($filepath); if (strlen($html)) { $parser = new KParser($html); $this->{$dyn_param} = $parser->get_HTML(); } } } } } }
function smart_embed($params, $node) { global $CTX, $FUNCS, $PAGE; if (count($node->children)) { die("ERROR: Tag \"" . $node->name . "\" is a self closing tag"); } extract($FUNCS->get_named_vars(array('folder' => '', 'debug' => '0'), $params)); // sanitize params $debug = trim($debug); if (defined('K_SNIPPETS_DIR')) { // always defined relative to the site $base_snippets_dir = K_SITE_DIR . K_SNIPPETS_DIR; } else { $base_snippets_dir = K_COUCH_DIR . 'snippets'; } $folder = trim(trim($folder), '/\\'); $folder_name = $folder; if (!$folder_name) { $folder_name = '/'; } $folder = $base_snippets_dir . ($folder ? '/' . $folder : ''); //full path // What are the files available in the specified folder? // First check if info available from cache if (array_key_exists($folder_name, $FUNCS->cached_files)) { $available_files = $FUNCS->cached_files[$folder_name]; } else { $available_files = array(); if (is_dir($folder) && ($fp = opendir($folder))) { while (($file = readdir($fp)) !== false) { if (is_file($folder . '/' . $file)) { $pi = $FUNCS->pathinfo($file); if ($pi['filename']) { $available_files[$pi['filename']] = $pi['basename']; } } } closedir($fp); // cache results $FUNCS->cached_files[$folder_name] = $available_files; } else { if (!$debug) { return; } } } // What are the candidate file names for the current view? // First check cache if (array_key_exists('cached_valid_files_for_view', $FUNCS)) { $valid_files = $FUNCS->cached_valid_files_for_view; } else { // What is the current view? if ($PAGE->tpl_is_clonable) { //views associated only with clonable templates if ($PAGE->is_master) { if ($PAGE->is_folder_view) { $view = 'folder'; } elseif ($PAGE->is_archive_view) { $view = 'archive'; } else { $view = 'home'; } } else { $view = 'page'; } } $valid_files = array(); $tplname = $PAGE->tpl_name; $pos = strrpos($tplname, '.'); if ($pos !== false) { $tplname = substr($tplname, 0, $pos); //$tplext = substr( $tplname, $pos+1 ); } $tplname = str_replace('/', '-', $tplname); if ($view) { // clonable template switch ($view) { case 'page': if ($PAGE->nested_page_obj) { $arr =& $PAGE->nested_page_obj->root->get_parents_by_id($PAGE->id); if (is_array($arr)) { for ($x = 0; $x < count($arr); $x++) { if ($x == 0) { $valid_files[] = $tplname . '-page_ex-' . $arr[$x]->name; } $valid_files[] = $tplname . '-page-' . $arr[$x]->name; } } } else { $valid_files[] = $tplname . '-page-' . $PAGE->page_name; } $valid_files[] = $tplname . '-page'; $valid_files[] = $tplname . '-default'; $valid_files[] = 'page'; $valid_files[] = 'default'; break; case 'folder': $folders =& $PAGE->folders; $arr = $folders->get_parents_by_id($PAGE->folder_id); if (is_array($arr)) { for ($x = 0; $x < count($arr); $x++) { if ($x == 0) { $valid_files[] = $tplname . '-folder_ex-' . $arr[$x]->name; } $valid_files[] = $tplname . '-folder-' . $arr[$x]->name; } } $valid_files[] = $tplname . '-folder'; $valid_files[] = $tplname . '-list'; $valid_files[] = $tplname . '-default'; $valid_files[] = 'folder'; $valid_files[] = 'list'; $valid_files[] = 'default'; break; case 'archive': $valid_files[] = $tplname . '-archive'; $valid_files[] = $tplname . '-list'; $valid_files[] = $tplname . '-default'; $valid_files[] = 'archive'; $valid_files[] = 'list'; $valid_files[] = 'default'; break; case 'home': $valid_files[] = $tplname . '-home'; $valid_files[] = $tplname . '-list'; $valid_files[] = $tplname . '-default'; $valid_files[] = 'home'; $valid_files[] = 'list'; $valid_files[] = 'default'; } } else { // non-clonable template $valid_files[] = $tplname . '-default'; $valid_files[] = 'default'; } // Cache results $FUNCS->cached_valid_files_for_view = $valid_files; } // Choose the first candidate file present within the available files foreach ($valid_files as $valid_file) { if (array_key_exists($valid_file, $available_files)) { $chosen_file = $available_files[$valid_file]; break; } } // Embed chosen file if (!$debug) { if ($chosen_file) { $html = @file_get_contents($folder . '/' . $chosen_file); if ($html) { $parser = new KParser($html, $node->line_num, 0, '', $node->ID); return $parser->get_HTML(); } } } else { // output debug info if ($view) { $html = '<h2>' . $view . '-view </h2>'; } $folder = str_replace(K_SITE_DIR, '', $folder); $html .= 'Looking for files in folder <i>' . $folder . '</i>: '; $html .= '<ul>'; foreach ($valid_files as $valid_file) { $html .= '<li>'; $html .= $chosen_file && $available_files[$valid_file] == $chosen_file ? '<b>' . $valid_file . ' * </b>' : $valid_file; $html .= '</li>'; } $html .= '</ul><b>'; if ($chosen_file) { $html .= 'Chosen file: ' . $chosen_file; } else { $html .= 'No suitable file found'; } $html .= '</b><br /><br />'; return $html; } }