Moved functions_routing.inc.php into a class.

This commit is contained in:
Markus Birth 2022-02-12 04:41:33 +01:00
parent 4bee231cc6
commit 2470c65175
Signed by: mbirth
GPG Key ID: A9928D7A098C3A9A
4 changed files with 545 additions and 511 deletions

View File

@ -1,490 +0,0 @@
<?php
if (IN_serendipity !== true) {
die ("Don't hack!");
}
function serveIndex() {
global $serendipity;
$serendipity['view'] = 'start';
if ($serendipity['GET']['action'] == 'search') {
$serendipity['view'] = 'search';
$serendipity['uriArguments'] = array(PATH_SEARCH, urlencode($serendipity['GET']['searchTerm']));
} else {
$serendipity['uriArguments'][] = PATH_ARCHIVES;
}
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}
function serve404() {
global $serendipity;
$serendipity['view'] = '404';
$serendipity['viewtype'] = '404_4';
$serendipity['content_message'] = URL_NOT_FOUND;
header('HTTP/1.0 404 Not found');
header('Status: 404 Not found');
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}
/* Attempt to locate hidden variables within the URI */
function locateHiddenVariables($_args) {
global $serendipity;
foreach ($_args AS $k => $v){
if ($v == PATH_COMMENTS || $v == PATH_CATEGORIES || $v == PATH_ARCHIVE || $v == PATH_ARCHIVES) {
continue;
}
if (strlen($v) > 0) {
if ($v[0] == 'P') { /* Page */
$page = substr($v, 1);
if (is_numeric($page)) {
$serendipity['GET']['page'] = $page;
unset($_args[$k]);
unset($serendipity['uriArguments'][$k]);
}
} elseif ($v[0] == 'A') { /* Author */
$url_author = substr($v, 1);
if (is_numeric($url_author)) {
$serendipity['GET']['viewAuthor'] = (int)$url_author;
unset($_args[$k]);
}
} elseif ($v == 'summary') { /* Summary */
$serendipity['short_archives'] = true;
if (! array_key_exists('head_subtitle', $serendipity)) {
$serendipity['head_subtitle'] = '';
}
$serendipity['head_subtitle'] .= SUMMARY . ' - ';
unset($_args[$k]);
} elseif ($v[0] == 'C') { /* category */
$cat = substr($v, 1);
if (is_numeric($cat)) {
$serendipity['GET']['category'] = $cat;
unset($_args[$k]);
}
}
}
}
return $_args;
}
function serveComments() {
global $serendipity;
$serendipity['view'] = 'comments';
$uri = $_SERVER['REQUEST_URI'];
$_args = serendipity_getUriArguments($uri, true); // Need to also match "." character
$timedesc = array();
/* Attempt to locate hidden variables within the URI */
foreach ($_args AS $k => $v){
if ($v == PATH_COMMENTS) {
continue;
}
if (preg_match('@^(last|f|t|from|to)[\s_-]*([\d/ -]+)$@', strtolower(urldecode($v)), $m)) {
if ($m[1] == 'last') {
$usetime = time() - ($m[2]*86400);
$serendipity['GET']['commentStartTime'] = $usetime;
$timedesc['start'] = serendipity_strftime(DATE_FORMAT_SHORT, $usetime);
continue;
}
$date = strtotime($m[2]);
if ($date < 1) {
continue;
}
if ($m[1] == 'f' || $m[1] == 'from') {
$serendipity['GET']['commentStartTime'] = $date;
$timedesc['start'] = serendipity_strftime(DATE_FORMAT_SHORT, $date);
} else {
$serendipity['GET']['commentEndTime'] = $date;
$timedesc['end'] = serendipity_strftime(DATE_FORMAT_SHORT, $date);
}
} elseif ($v == 'trackbacks' || $v == 'comments_and_trackbacks' || $v == 'comments') {
$serendipity['GET']['commentMode'] = $v;
} elseif (!empty($v)) {
$serendipity['GET']['viewCommentAuthor'] .= urldecode($v);
}
}
$serendipity['head_title'] = COMMENTS_FROM . ' ' . serendipity_specialchars($serendipity['GET']['viewCommentAuthor']);
if (isset($timedesc['start']) && isset($timedesc['end'])) {
$serendipity['head_title'] .= ' (' . $timedesc['start'] . ' - ' . $timedesc['end'] . ')';
} elseif (isset($timedesc['start'])) {
$serendipity['head_title'] .= ' (&gt; ' . $timedesc['start'] . ')';
} elseif (isset($timedesc['end'])) {
$serendipity['head_title'] .= ' (&lt; ' . $timedesc['end'] . ')';
}
$serendipity['head_subtitle'] = $serendipity['blogTitle'];
$serendipity['GET']['action'] = 'comments';
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}
function serveJS($js_mode) {
global $serendipity;
$serendipity['view'] = 'js';
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) {
header('Cache-Control: no-cache');
} else {
header('Cache-Control:');
header('Pragma:');
header('Expires: ' . gmdate('D, d M Y H:i:s \G\M\T', time()+3600));
}
header('Content-type: application/javascript; charset=' . LANG_CHARSET);
$out = "";
// FIXFIX: including genpage without any given action will generate the
// default page which is unneccessary, set action to empty to only make
// the fix below
$serendipity['GET']['action'] = 'empty';
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
// HOTFIX: The staticpage plugin spews out a 404 error in the genpage hook,
// because it assumes that all "normal" content pages could belong to it.
// We need to override the header at this point (again), so that the files
// will be properly parsed. Another (maybe better) idea would be to actually
// not include genpage.inc.php at this point and init smarty differently,
// or to make sure the "genpage" event hook is not called at this point.
header('HTTP/1.0 200 OK');
header('Status: 200 OK');
if ($js_mode == "serendipity_admin.js") {
serendipity_plugin_api::hook_event('js_backend', $out);
} else {
serendipity_plugin_api::hook_event('js', $out);
}
echo $out;
}
function serveCSS($css_mode) {
global $serendipity;
serendipity_smarty_init();
$serendipity['view'] = 'css';
include(S9Y_INCLUDE_PATH . 'serendipity.css.php');
}
function serveSearch() {
global $serendipity;
$serendipity['view'] = 'search';
$_args = $serendipity['uriArguments'];
/* Attempt to locate hidden variables within the URI */
$search = array();
foreach ($_args AS $k => $v){
if ($v == PATH_SEARCH) {
continue;
}
if ($v[0] == 'P') { /* Page */
$page = substr($v, 1);
if (is_numeric($page)) {
$serendipity['GET']['page'] = $page;
unset($_args[$k]);
unset($serendipity['uriArguments'][$k]);
} else {
$search[] = $v;
}
} else {
$search[] = $v;
}
}
$serendipity['GET']['action'] = 'search';
$serendipity['GET']['searchTerm'] = urldecode(serendipity_specialchars(strip_tags(implode(' ', $search))));
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}
function serveAuthorPage($matches) {
global $serendipity;
$serendipity['view'] = 'authors';
$serendipity['GET']['viewAuthor'] = $matches[1];
$serendipity['GET']['action'] = 'read';
locateHiddenVariables($serendipity['uriArguments']);
$matches[1] = serendipity_searchPermalink($serendipity['permalinkAuthorStructure'], implode('/', $serendipity['uriArguments']), $matches[1], 'author');
$serendipity['GET']['viewAuthor'] = $matches[1];
$serendipity['GET']['action'] = 'read';
$uInfo = serendipity_fetchUsers($serendipity['GET']['viewAuthor']);
if (!is_array($uInfo)) {
$serendipity['view'] = '404';
$serendipity['viewtype'] = '404_3';
header('HTTP/1.0 404 Not found');
header('Status: 404 Not found');
} else {
$serendipity['head_title'] = sprintf(ENTRIES_FOR, $uInfo[0]['realname']);
$serendipity['head_subtitle'] = $serendipity['blogTitle'];
}
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}
function serveCategory($matches) {
global $serendipity;
$serendipity['view'] = 'categories';
$uri = $_SERVER['REQUEST_URI'];
$is_multicat = (isset($serendipity['POST']['isMultiCat']) && is_array($serendipity['POST']['multiCat']));
if ($is_multicat) {
$serendipity['GET']['category'] = serendipity_specialchars(implode(';', $serendipity['POST']['multiCat']));
$serendipity['uriArguments'][] = PATH_CATEGORIES;
$serendipity['uriArguments'][] = serendipity_db_escape_string($serendipity['GET']['category']) . '-multi';
} elseif (preg_match('@/([0-9;]+)@', $uri, $multimatch)) {
if (stristr($multimatch[1], ';')) {
$is_multicat = true;
$serendipity['GET']['category'] = $multimatch[1];
}
}
$serendipity['GET']['action'] = 'read';
$_args = locateHiddenVariables($serendipity['uriArguments']);
if (!$is_multicat) {
$matches[1] = serendipity_searchPermalink($serendipity['permalinkCategoryStructure'], implode('/', $_args), $matches[1], 'category');
$serendipity['GET']['category'] = $matches[1];
}
$cInfo = serendipity_fetchCategoryInfo($serendipity['GET']['category']);
serendipity_plugin_api::hook_event('multilingual_strip_langs',$cInfo, array('category_name'));
if (!is_array($cInfo)) {
$serendipity['view'] = '404';
$serendipity['viewtype'] = '404_2';
header('HTTP/1.0 404 Not found');
header('Status: 404 Not found');
} else {
$serendipity['head_title'] = $cInfo['category_name'];
if (isset($serendipity['GET']['page'])) {
$serendipity['head_title'] .= " - " . serendipity_specialchars($serendipity['GET']['page']);
}
$serendipity['head_subtitle'] = $serendipity['blogTitle'];
}
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}
function serveArchive() {
global $serendipity;
$serendipity['view'] = 'archive';
$serendipity['GET']['action'] = 'archives';
locateHiddenVariables($serendipity['uriArguments']);
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}
function gotoAdmin() {
global $serendipity;
$base = $serendipity['baseURL'];
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
$base = str_replace('http://', 'https://', $base);
}
header('Status: 302 Found');
header("Location: {$base}serendipity_admin.php");
}
function servePlugin($matches) {
global $serendipity;
$serendipity['view'] = 'plugin';
if (strpos($matches[2], 'admin/') !== false) {
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}
serendipity_plugin_api::hook_event('external_plugin', $matches[2]);
}
function serveFeed($matches) {
global $serendipity;
$serendipity['view'] = 'feed';
header('Content-Type: text/html; charset=utf-8');
$uri = $_SERVER['REQUEST_URI'];
if (preg_match('@/(index|atom[0-9]*|rss|comments|trackbacks|comments_and_trackbacks|opml)\.(rss[0-9]?|rdf|rss|xml|atom)@', $uri, $vmatches)) {
list($_GET['version'], $_GET['type']) = serendipity_discover_rss($vmatches[1], $vmatches[2]);
}
if (is_array($matches)) {
if (preg_match('@(/?' . preg_quote(PATH_FEEDS, '@') . '/)(.+?)(?:\.rss)?$@i', $uri, $uriparts)) {
if (strpos($uriparts[2], $serendipity['permalinkCategoriesPath']) === 0) {
$catid = serendipity_searchPermalink($serendipity['permalinkFeedCategoryStructure'], $uriparts[2], $matches[1], 'category');
if (is_numeric($catid) && $catid > 0) {
$_GET['category'] = $catid;
}
} elseif (strpos($uriparts[2], $serendipity['permalinkAuthorsPath']) === 0) {
$authorid = serendipity_searchPermalink($serendipity['permalinkFeedAuthorStructure'], $uriparts[2], $matches[1], 'author');
if (is_numeric($authorid) && $authorid > 0) {
$_GET['viewAuthor'] = $authorid;
}
}
}
}
include(S9Y_INCLUDE_PATH . 'rss.php');
}
function serveEntry($matches) {
global $serendipity;
$serendipity['view'] = 'entry';
$uri = $_SERVER['REQUEST_URI'];
if (isset($serendipity['GET']['id'])) {
$matches[1] = (int)$serendipity['GET']['id'];
} elseif (isset($_GET['p'])) {
$matches[1] = $_GET['p'];
} else {
$matches[1] = serendipity_searchPermalink($serendipity['permalinkStructure'], $uri, (!empty($matches[2]) ? $matches[2] : $matches[1]), 'entry');
}
serendipity_rememberComment();
if (!empty($serendipity['POST']['submit']) && !isset($_REQUEST['serendipity']['csuccess'])) {
$comment['url'] = $serendipity['POST']['url'];
$comment['comment'] = (is_string($serendipity['POST']['comment']) ? trim($serendipity['POST']['comment']) : '');
$comment['name'] = $serendipity['POST']['name'];
$comment['email'] = $serendipity['POST']['email'];
$comment['subscribe'] = $serendipity['POST']['subscribe'] ?? false;
$comment['parent_id'] = $serendipity['POST']['replyTo'];
if (!empty($comment['comment'])) {
if (serendipity_saveComment($serendipity['POST']['entry_id'], $comment, 'NORMAL')) {
$sc_url = ($_SERVER['HTTPS'] == 'on' ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . (strstr($_SERVER['REQUEST_URI'], '?') ? '&' : '?') . 'serendipity[csuccess]=' . (isset($serendipity['csuccess']) ? $serendipity['csuccess'] : 'true');
if (serendipity_isResponseClean($sc_url)) {
header('Status: 302 Found');
header('Location: ' . $sc_url);
}
exit;
} else {
$serendipity['messagestack']['comments'][] = COMMENT_NOT_ADDED;
}
} else {
$serendipity['messagestack']['comments'][] = sprintf(EMPTY_COMMENT, '', '');
}
}
$id = (int)$matches[1];
if ($id === 0) {
$id = false;
}
$serendipity['GET']['action'] = 'read';
$serendipity['GET']['id'] = $id;
$title = serendipity_db_query("SELECT title FROM {$serendipity['dbPrefix']}entries WHERE id=$id AND isdraft = 'false' " . (!serendipity_db_bool($serendipity['showFutureEntries']) ? " AND timestamp <= " . serendipity_db_time() : ''), true);
if (is_array($title)) {
$serendipity['head_title'] = serendipity_specialchars($title[0]);
$serendipity['head_subtitle'] = serendipity_specialchars($serendipity['blogTitle']);
} else {
$serendipity['view'] = '404';
$serendipity['viewtype'] = '404_1';
header('HTTP/1.0 404 Not found');
header('Status: 404 Not found');
}
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}
function serveArchives() {
global $serendipity;
$serendipity['view'] = 'archives';
$_args = locateHiddenVariables($serendipity['uriArguments']);
/* We must always *assume* that Year, Month and Day are the first 3 arguments */
$year = $_args[1] ?? null;
$month = $_args[2] ?? null;
$day = $_args[3] ?? null;
//if ($year == "archives") {
// unset($year);
//}
$serendipity['GET']['action'] = 'read';
$serendipity['GET']['hidefooter'] = true;
if (!isset($year)) {
$year = date('Y');
$month = date('m');
$day = date('j');
$serendipity['GET']['action'] = null;
$serendipity['GET']['hidefooter'] = null;
}
if (isset($year) && !is_numeric($year)) {
$year = date('Y');
}
if (isset($month) && !is_numeric($month)) {
$month = date('m');
}
if (isset($day) && !is_numeric($day)) {
$day = date('d');
}
switch($serendipity['calendar']) {
case 'gregorian':
default:
$gday = 1;
if ($day) {
$ts = mktime(0, 0, 0, $month, $day, $year);
$te = mktime(23, 59, 59, $month, $day, $year);
$date = serendipity_formatTime(DATE_FORMAT_ENTRY, $ts, false);
} else {
$ts = mktime(0, 0, 0, $month, $gday, $year);
if (!isset($gday2)) {
$gday2 = date('t', $ts);
}
$te = mktime(23, 59, 59, $month, $gday2, $year);
$date = serendipity_formatTime('%B %Y', $ts, false);
}
break;
case 'persian-utf8':
require_once S9Y_INCLUDE_PATH . 'include/functions_calendars.inc.php';
$gday = 1;
if ($day) {
$ts = persian_mktime(0, 0, 0, $month, $day, $year);
$te = persian_mktime(23, 59, 59, $month, $day, $year);
$date = serendipity_formatTime(DATE_FORMAT_ENTRY, $ts, false);
} else {
$ts = persian_mktime(0, 0, 0, $month, $gday, $year);
if (!isset($gday2)) {
$gday2 = persian_date_utf('t', $ts);
}
$te = persian_mktime(23, 59, 59, $month, $gday2, $year);
$date = serendipity_formatTime('%B %Y', $ts, false);
}
list($year, $month, $day) = p2g ($year, $month, $day);
break;
}
$serendipity['range'] = array($ts, $te);
if ($serendipity['GET']['action'] == 'read') {
if ($serendipity['GET']['category'] ?? false) {
$cInfo = serendipity_fetchCategoryInfo($serendipity['GET']['category']);
$serendipity['head_title'] = $cInfo['category_name'];
}
if (!isset($serendipity['head_subtitle'])) {
$serendipity['head_subtitle'] = '';
}
$serendipity['head_subtitle'] .= sprintf(ENTRIES_FOR, $date);
}
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}

View File

@ -1,9 +1,12 @@
<?php
# Copyright (c) 2003-2005, Jannis Hermanns (on behalf the Serendipity Developer Team)
# All rights reserved. See LICENSE file for licensing details
// Serendipity
// See LICENSE file for license information.
require_once __DIR__ . '/lib/bootstrap.php';
use Serendipity\Routing;
// We need to set this to return a 200 since we use .htaccess ErrorDocument
// rules to handle archives.
header('HTTP/1.0 200');
@ -11,7 +14,6 @@ header('Status: 200 OK');
// Session are needed to also remember an autologin user on the frontend
include('serendipity_config.inc.php');
include('include/functions_routing.inc.php');
header('Content-Type: text/html; charset='. LANG_CHARSET);
if ($serendipity['CacheControl']) {
@ -67,44 +69,45 @@ if (preg_match(PAT_APPROVE, $uri, $res) && $serendipity['serendipityAuthedUser']
define('DATA_TRACKBACK_APPROVED', false);
}
$routing = new Routing($serendipity);
if (preg_match(PAT_ARCHIVES, $uri, $matches) || isset($serendipity['GET']['range']) && is_numeric($serendipity['GET']['range'])) {
serveArchives();
$routing->serveArchives();
} else if (preg_match(PAT_PERMALINK, $uri, $matches) ||
preg_match(PAT_COMMENTSUB, $uri, $matches) ||
isset($serendipity['GET']['id']) ||
isset($_GET['p'])) {
serveEntry($matches);
$routing->serveEntry($matches);
} elseif (preg_match(PAT_PERMALINK_FEEDCATEGORIES, $uri, $matches) || preg_match(PAT_PERMALINK_FEEDAUTHORS, $uri, $matches) || preg_match(PAT_FEEDS, $uri)) {
serveFeed($matches);
$routing->serveFeed($matches);
exit;
} else if (preg_match(PAT_PLUGIN, $uri, $matches)) {
servePlugin($matches);
$routing->servePlugin($matches);
exit;
} else if (preg_match(PAT_ADMIN, $uri)) {
gotoAdmin();
$routing->gotoAdmin();
exit;
} else if (preg_match(PAT_ARCHIVE, $uri)) {
serveArchive();
$routing->serveArchive();
} else if ((isset($serendipity['POST']['isMultiCat']) && is_array($serendipity['POST']['multiCat'])) ||
preg_match(PAT_PERMALINK_CATEGORIES, $uri, $matches)) {
serveCategory($matches);
$routing->serveCategory($matches);
} else if (preg_match(PAT_PERMALINK_AUTHORS, $uri, $matches)) {
serveAuthorPage($matches);
$routing->serveAuthorPage($matches);
} else if (preg_match(PAT_SEARCH, $uri, $matches)) {
serveSearch();
$routing->serveSearch();
} elseif (preg_match(PAT_CSS, $uri, $matches)) {
serveCSS($matches[1]);
$routing->serveCSS($matches[1]);
exit;
} elseif (preg_match(PAT_JS, $uri, $matches)) {
serveJS($matches[1]);
$routing->serveJS($matches[1]);
exit;
} else if (preg_match(PAT_COMMENTS, $uri, $matches)) {
serveComments();
$routing->serveComments();
} else if (preg_match('@/(index(\.php|\.html)?)|'. preg_quote($serendipity['indexFile']) .'@', $uri) ||
preg_match('@^/' . preg_quote(trim($serendipity['serendipityHTTPPath'], '/')) . '/?(\?.*)?$@', $uri)) {
serveIndex();
$routing->serveIndex();
} else {
serve404();
$routing->serve404();
}
if (empty($serendipity['smarty_file'])) {

518
lib/Serendipity/Routing.php Normal file
View File

@ -0,0 +1,518 @@
<?php
// Serendipity
// See LICENSE file for license information.
namespace Serendipity;
class Routing
{
public function __construct(&$serendipity)
{
$this->serendipity =& $serendipity;
}
public function serveIndex()
{
$this->serendipity['view'] = 'start';
if ($this->serendipity['GET']['action'] == 'search') {
$this->serendipity['view'] = 'search';
$this->serendipity['uriArguments'] = array(PATH_SEARCH, urlencode($this->serendipity['GET']['searchTerm']));
} else {
$this->serendipity['uriArguments'][] = PATH_ARCHIVES;
}
// TODO: REMOVE - BACKWARDS COMPATIBILITY
$serendipity =& $this->serendipity;
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}
public function serve404()
{
$this->serendipity['view'] = '404';
$this->serendipity['viewtype'] = '404_4';
$this->serendipity['content_message'] = URL_NOT_FOUND;
header('HTTP/1.0 404 Not found');
header('Status: 404 Not found');
// TODO: REMOVE - BACKWARDS COMPATIBILITY
$serendipity =& $this->serendipity;
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}
/* Attempt to locate hidden variables within the URI */
protected function locateHiddenVariables($_args)
{
foreach ($_args as $k => $v) {
if ($v == PATH_COMMENTS || $v == PATH_CATEGORIES || $v == PATH_ARCHIVE || $v == PATH_ARCHIVES) {
continue;
}
if (strlen($v) <= 0) {
continue;
}
if ($v[0] == 'P') { /* Page */
$page = substr($v, 1);
if (is_numeric($page)) {
$this->serendipity['GET']['page'] = $page;
unset($_args[$k]);
unset($this->serendipity['uriArguments'][$k]);
}
} elseif ($v[0] == 'A') { /* Author */
$url_author = substr($v, 1);
if (is_numeric($url_author)) {
$this->serendipity['GET']['viewAuthor'] = (int)$url_author;
unset($_args[$k]);
}
} elseif ($v == 'summary') { /* Summary */
$this->serendipity['short_archives'] = true;
if (!array_key_exists('head_subtitle', $this->serendipity)) {
$this->serendipity['head_subtitle'] = '';
}
$this->serendipity['head_subtitle'] .= SUMMARY . ' - ';
unset($_args[$k]);
} elseif ($v[0] == 'C') { /* category */
$cat = substr($v, 1);
if (is_numeric($cat)) {
$this->serendipity['GET']['category'] = $cat;
unset($_args[$k]);
}
}
}
return $_args;
}
public function serveComments()
{
$this->serendipity['view'] = 'comments';
$uri = $_SERVER['REQUEST_URI'];
$_args = serendipity_getUriArguments($uri, true); // Need to also match "." character
$timedesc = array();
/* Attempt to locate hidden variables within the URI */
foreach ($_args as $k => $v) {
if ($v == PATH_COMMENTS) {
continue;
}
if (preg_match('@^(last|f|t|from|to)[\s_-]*([\d/ -]+)$@', strtolower(urldecode($v)), $m)) {
if ($m[1] == 'last') {
$usetime = time() - ($m[2]*86400);
$this->serendipity['GET']['commentStartTime'] = $usetime;
$timedesc['start'] = serendipity_strftime(DATE_FORMAT_SHORT, $usetime);
continue;
}
$date = strtotime($m[2]);
if ($date < 1) {
continue;
}
if ($m[1] == 'f' || $m[1] == 'from') {
$this->serendipity['GET']['commentStartTime'] = $date;
$timedesc['start'] = serendipity_strftime(DATE_FORMAT_SHORT, $date);
} else {
$this->serendipity['GET']['commentEndTime'] = $date;
$timedesc['end'] = serendipity_strftime(DATE_FORMAT_SHORT, $date);
}
} elseif ($v == 'trackbacks' || $v == 'comments_and_trackbacks' || $v == 'comments') {
$this->serendipity['GET']['commentMode'] = $v;
} elseif (!empty($v)) {
$this->serendipity['GET']['viewCommentAuthor'] .= urldecode($v);
}
}
$this->serendipity['head_title'] = COMMENTS_FROM . ' ' . serendipity_specialchars($this->serendipity['GET']['viewCommentAuthor']);
if (isset($timedesc['start']) && isset($timedesc['end'])) {
$this->serendipity['head_title'] .= ' (' . $timedesc['start'] . ' - ' . $timedesc['end'] . ')';
} elseif (isset($timedesc['start'])) {
$this->serendipity['head_title'] .= ' (&gt; ' . $timedesc['start'] . ')';
} elseif (isset($timedesc['end'])) {
$this->serendipity['head_title'] .= ' (&lt; ' . $timedesc['end'] . ')';
}
$this->serendipity['head_subtitle'] = $this->serendipity['blogTitle'];
$this->serendipity['GET']['action'] = 'comments';
// TODO: REMOVE - BACKWARDS COMPATIBILITY
$serendipity =& $this->serendipity;
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}
public function serveJS($js_mode)
{
$this->serendipity['view'] = 'js';
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) {
header('Cache-Control: no-cache');
} else {
header('Cache-Control:');
header('Pragma:');
header('Expires: ' . gmdate('D, d M Y H:i:s \G\M\T', time() + 3600));
}
header('Content-type: application/javascript; charset=' . LANG_CHARSET);
$out = "";
// FIXFIX: including genpage without any given action will generate the
// default page which is unneccessary, set action to empty to only make
// the fix below
$this->serendipity['GET']['action'] = 'empty';
// TODO: REMOVE - BACKWARDS COMPATIBILITY
$serendipity =& $this->serendipity;
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
// HOTFIX: The staticpage plugin spews out a 404 error in the genpage hook,
// because it assumes that all "normal" content pages could belong to it.
// We need to override the header at this point (again), so that the files
// will be properly parsed. Another (maybe better) idea would be to actually
// not include genpage.inc.php at this point and init smarty differently,
// or to make sure the "genpage" event hook is not called at this point.
header('HTTP/1.0 200 OK');
header('Status: 200 OK');
if ($js_mode == "serendipity_admin.js") {
\serendipity_plugin_api::hook_event('js_backend', $out);
} else {
\serendipity_plugin_api::hook_event('js', $out);
}
echo $out;
}
public function serveCSS($css_mode)
{
serendipity_smarty_init();
$this->serendipity['view'] = 'css';
include(S9Y_INCLUDE_PATH . 'serendipity.css.php');
}
public function serveSearch()
{
$this->serendipity['view'] = 'search';
$_args = $this->serendipity['uriArguments'];
/* Attempt to locate hidden variables within the URI */
$search = array();
foreach ($_args as $k => $v) {
if ($v == PATH_SEARCH) {
continue;
}
if ($v[0] == 'P') { /* Page */
$page = substr($v, 1);
if (is_numeric($page)) {
$this->serendipity['GET']['page'] = $page;
unset($_args[$k]);
unset($this->serendipity['uriArguments'][$k]);
} else {
$search[] = $v;
}
} else {
$search[] = $v;
}
}
$this->serendipity['GET']['action'] = 'search';
$this->serendipity['GET']['searchTerm'] = urldecode(serendipity_specialchars(strip_tags(implode(' ', $search))));
// TODO: REMOVE - BACKWARDS COMPATIBILITY
$serendipity =& $this->serendipity;
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}
public function serveAuthorPage($matches)
{
$this->serendipity['view'] = 'authors';
$this->serendipity['GET']['viewAuthor'] = $matches[1];
$this->serendipity['GET']['action'] = 'read';
$this->locateHiddenVariables($this->serendipity['uriArguments']);
$matches[1] = serendipity_searchPermalink($this->serendipity['permalinkAuthorStructure'], implode('/', $this->serendipity['uriArguments']), $matches[1], 'author');
$this->serendipity['GET']['viewAuthor'] = $matches[1];
$this->serendipity['GET']['action'] = 'read';
$uInfo = serendipity_fetchUsers($this->serendipity['GET']['viewAuthor']);
if (!is_array($uInfo)) {
$this->serendipity['view'] = '404';
$this->serendipity['viewtype'] = '404_3';
header('HTTP/1.0 404 Not found');
header('Status: 404 Not found');
} else {
$this->serendipity['head_title'] = sprintf(ENTRIES_FOR, $uInfo[0]['realname']);
$this->serendipity['head_subtitle'] = $this->serendipity['blogTitle'];
}
// TODO: REMOVE - BACKWARDS COMPATIBILITY
$serendipity =& $this->serendipity;
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}
public function serveCategory($matches)
{
$this->serendipity['view'] = 'categories';
$uri = $_SERVER['REQUEST_URI'];
$is_multicat = (isset($this->serendipity['POST']['isMultiCat']) && is_array($this->serendipity['POST']['multiCat']));
if ($is_multicat) {
$this->serendipity['GET']['category'] = serendipity_specialchars(implode(';', $this->serendipity['POST']['multiCat']));
$this->serendipity['uriArguments'][] = PATH_CATEGORIES;
$this->serendipity['uriArguments'][] = serendipity_db_escape_string($this->serendipity['GET']['category']) . '-multi';
} elseif (preg_match('@/([0-9;]+)@', $uri, $multimatch)) {
if (stristr($multimatch[1], ';')) {
$is_multicat = true;
$this->serendipity['GET']['category'] = $multimatch[1];
}
}
$this->serendipity['GET']['action'] = 'read';
$_args = $this->locateHiddenVariables($this->serendipity['uriArguments']);
if (!$is_multicat) {
$matches[1] = serendipity_searchPermalink($this->serendipity['permalinkCategoryStructure'], implode('/', $_args), $matches[1], 'category');
$this->serendipity['GET']['category'] = $matches[1];
}
$cInfo = serendipity_fetchCategoryInfo($this->serendipity['GET']['category']);
\serendipity_plugin_api::hook_event('multilingual_strip_langs',$cInfo, array('category_name'));
if (!is_array($cInfo)) {
$this->serendipity['view'] = '404';
$this->serendipity['viewtype'] = '404_2';
header('HTTP/1.0 404 Not found');
header('Status: 404 Not found');
} else {
$this->serendipity['head_title'] = $cInfo['category_name'];
if (isset($this->serendipity['GET']['page'])) {
$this->serendipity['head_title'] .= " - " . serendipity_specialchars($this->serendipity['GET']['page']);
}
$this->serendipity['head_subtitle'] = $this->serendipity['blogTitle'];
}
// TODO: REMOVE - BACKWARDS COMPATIBILITY
$serendipity =& $this->serendipity;
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}
public function serveArchive()
{
$this->serendipity['view'] = 'archive';
$this->serendipity['GET']['action'] = 'archives';
$this->locateHiddenVariables($this->serendipity['uriArguments']);
// TODO: REMOVE - BACKWARDS COMPATIBILITY
$serendipity =& $this->serendipity;
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}
public function gotoAdmin()
{
$base = $this->serendipity['baseURL'];
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
$base = str_replace('http://', 'https://', $base);
}
header('Status: 302 Found');
header("Location: {$base}serendipity_admin.php");
}
public function servePlugin($matches) {
$this->serendipity['view'] = 'plugin';
// TODO: REMOVE - BACKWARDS COMPATIBILITY
$serendipity =& $this->serendipity;
if (strpos($matches[2], 'admin/') !== false) {
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}
\serendipity_plugin_api::hook_event('external_plugin', $matches[2]);
}
public function serveFeed($matches)
{
$this->serendipity['view'] = 'feed';
header('Content-Type: text/html; charset=utf-8');
$uri = $_SERVER['REQUEST_URI'];
if (preg_match('@/(index|atom[0-9]*|rss|comments|trackbacks|comments_and_trackbacks|opml)\.(rss[0-9]?|rdf|rss|xml|atom)@', $uri, $vmatches)) {
list($_GET['version'], $_GET['type']) = serendipity_discover_rss($vmatches[1], $vmatches[2]);
}
if (is_array($matches)) {
if (preg_match('@(/?' . preg_quote(PATH_FEEDS, '@') . '/)(.+?)(?:\.rss)?$@i', $uri, $uriparts)) {
if (strpos($uriparts[2], $this->serendipity['permalinkCategoriesPath']) === 0) {
$catid = serendipity_searchPermalink($this->serendipity['permalinkFeedCategoryStructure'], $uriparts[2], $matches[1], 'category');
if (is_numeric($catid) && $catid > 0) {
$_GET['category'] = $catid;
}
} elseif (strpos($uriparts[2], $this->serendipity['permalinkAuthorsPath']) === 0) {
$authorid = serendipity_searchPermalink($this->serendipity['permalinkFeedAuthorStructure'], $uriparts[2], $matches[1], 'author');
if (is_numeric($authorid) && $authorid > 0) {
$_GET['viewAuthor'] = $authorid;
}
}
}
}
// TODO: REMOVE - BACKWARDS COMPATIBILITY
$serendipity =& $this->serendipity;
include(S9Y_INCLUDE_PATH . 'rss.php');
}
public function serveEntry($matches)
{
$this->serendipity['view'] = 'entry';
$uri = $_SERVER['REQUEST_URI'];
if (isset($this->serendipity['GET']['id'])) {
$matches[1] = (int)$this->serendipity['GET']['id'];
} elseif (isset($_GET['p'])) {
$matches[1] = $_GET['p'];
} else {
$matches[1] = serendipity_searchPermalink($this->serendipity['permalinkStructure'], $uri, (!empty($matches[2]) ? $matches[2] : $matches[1]), 'entry');
}
serendipity_rememberComment();
if (!empty($this->serendipity['POST']['submit']) && !isset($_REQUEST['serendipity']['csuccess'])) {
$comment['url'] = $this->serendipity['POST']['url'];
$comment['comment'] = (is_string($this->serendipity['POST']['comment']) ? trim($this->serendipity['POST']['comment']) : '');
$comment['name'] = $this->serendipity['POST']['name'];
$comment['email'] = $this->serendipity['POST']['email'];
$comment['subscribe'] = $this->serendipity['POST']['subscribe'] ?? false;
$comment['parent_id'] = $this->serendipity['POST']['replyTo'];
if (!empty($comment['comment'])) {
if (serendipity_saveComment($this->serendipity['POST']['entry_id'], $comment, 'NORMAL')) {
$sc_url = ($_SERVER['HTTPS'] == 'on' ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . (strstr($_SERVER['REQUEST_URI'], '?') ? '&' : '?') . 'serendipity[csuccess]=' . (isset($this->serendipity['csuccess']) ? $this->serendipity['csuccess'] : 'true');
if (serendipity_isResponseClean($sc_url)) {
header('Status: 302 Found');
header('Location: ' . $sc_url);
}
exit;
} else {
$this->serendipity['messagestack']['comments'][] = COMMENT_NOT_ADDED;
}
} else {
$this->serendipity['messagestack']['comments'][] = sprintf(EMPTY_COMMENT, '', '');
}
}
$id = (int)$matches[1];
if ($id === 0) {
$id = false;
}
$this->serendipity['GET']['action'] = 'read';
$this->serendipity['GET']['id'] = $id;
$title = serendipity_db_query("SELECT title FROM {$this->serendipity['dbPrefix']}entries WHERE id=$id AND isdraft = 'false' " . (!serendipity_db_bool($this->serendipity['showFutureEntries']) ? " AND timestamp <= " . serendipity_db_time() : ''), true);
if (is_array($title)) {
$this->serendipity['head_title'] = serendipity_specialchars($title[0]);
$this->serendipity['head_subtitle'] = serendipity_specialchars($this->serendipity['blogTitle']);
} else {
$this->serendipity['view'] = '404';
$this->serendipity['viewtype'] = '404_1';
header('HTTP/1.0 404 Not found');
header('Status: 404 Not found');
}
// TODO: REMOVE - BACKWARDS COMPATIBILITY
$serendipity =& $this->serendipity;
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}
public function serveArchives()
{
$this->serendipity['view'] = 'archives';
$_args = $this->locateHiddenVariables($this->serendipity['uriArguments']);
/* We must always *assume* that Year, Month and Day are the first 3 arguments */
$year = $_args[1] ?? null;
$month = $_args[2] ?? null;
$day = $_args[3] ?? null;
//if ($year == "archives") {
// unset($year);
//}
$this->serendipity['GET']['action'] = 'read';
$this->serendipity['GET']['hidefooter'] = true;
if (!isset($year)) {
$year = date('Y');
$month = date('m');
$day = date('j');
$this->serendipity['GET']['action'] = null;
$this->serendipity['GET']['hidefooter'] = null;
}
if (isset($year) && !is_numeric($year)) {
$year = date('Y');
}
if (isset($month) && !is_numeric($month)) {
$month = date('m');
}
if (isset($day) && !is_numeric($day)) {
$day = date('d');
}
switch($this->serendipity['calendar']) {
case 'gregorian':
default:
$gday = 1;
if ($day) {
$ts = mktime(0, 0, 0, $month, $day, $year);
$te = mktime(23, 59, 59, $month, $day, $year);
$date = serendipity_formatTime(DATE_FORMAT_ENTRY, $ts, false);
} else {
$ts = mktime(0, 0, 0, $month, $gday, $year);
if (!isset($gday2)) {
$gday2 = date('t', $ts);
}
$te = mktime(23, 59, 59, $month, $gday2, $year);
$date = serendipity_formatTime('%B %Y', $ts, false);
}
break;
case 'persian-utf8':
require_once S9Y_INCLUDE_PATH . 'include/functions_calendars.inc.php';
$gday = 1;
if ($day) {
$ts = persian_mktime(0, 0, 0, $month, $day, $year);
$te = persian_mktime(23, 59, 59, $month, $day, $year);
$date = serendipity_formatTime(DATE_FORMAT_ENTRY, $ts, false);
} else {
$ts = persian_mktime(0, 0, 0, $month, $gday, $year);
if (!isset($gday2)) {
$gday2 = persian_date_utf('t', $ts);
}
$te = persian_mktime(23, 59, 59, $month, $gday2, $year);
$date = serendipity_formatTime('%B %Y', $ts, false);
}
list($year, $month, $day) = p2g ($year, $month, $day);
break;
}
$this->serendipity['range'] = array($ts, $te);
if ($this->serendipity['GET']['action'] == 'read') {
if ($this->serendipity['GET']['category'] ?? false) {
$cInfo = serendipity_fetchCategoryInfo($this->serendipity['GET']['category']);
$this->serendipity['head_title'] = $cInfo['category_name'];
}
if (!isset($this->serendipity['head_subtitle'])) {
$this->serendipity['head_subtitle'] = '';
}
$this->serendipity['head_subtitle'] .= sprintf(ENTRIES_FOR, $date);
}
// TODO: REMOVE - BACKWARDS COMPATIBILITY
$serendipity =& $this->serendipity;
include(S9Y_INCLUDE_PATH . 'include/genpage.inc.php');
}
}

View File

@ -1,9 +1,12 @@
<?php
# Copyright (c) 2003-2005, Jannis Hermanns (on behalf the Serendipity Developer Team)
# All rights reserved. See LICENSE file for licensing details
// Serendipity
// See LICENSE file for license information.
require_once __DIR__ . '/lib/bootstrap.php';
use Serendipity\Routing;
define('IN_installer', true);
define('IN_upgrader', true);
define('IN_serendipity', true);
@ -36,8 +39,8 @@ if (isset($serendipity['GET']['adminModule']) && $serendipity['GET']['adminModul
serendipity_login(true);
if (serendipity_userLoggedIn()) {
// login with external authentication - reload page to set language settings correct for user
include_once S9Y_INCLUDE_PATH . 'include/functions_routing.inc.php';
gotoAdmin();
$routing = new Routing($serendipity);
$routing->gotoAdmin();
return true;
}
}