X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=index.php;h=850b350e9c5ad1c2dbae08c5573b929aaf22749b;hb=refs%2Ftags%2Fv0.6.5;hp=231b63f65bc5df8470aaeb79fe6b1864649a2a68;hpb=7eb0a832018621b3662f9fb5c45c0a67f5936088;p=github%2Fshaarli%2FShaarli.git diff --git a/index.php b/index.php index 231b63f6..850b350e 100644 --- a/index.php +++ b/index.php @@ -1,6 +1,6 @@ /shaarli/ define('WEB_PATH', substr($_SERVER["REQUEST_URI"], 0, 1+strrpos($_SERVER["REQUEST_URI"], '/', 0))); @@ -268,7 +268,10 @@ $GLOBALS['redirector'] = !empty($GLOBALS['redirector']) ? escape($GLOBALS['redir // a token depending of deployment salt, user password, and the current ip define('STAY_SIGNED_IN_TOKEN', sha1($GLOBALS['hash'].$_SERVER["REMOTE_ADDR"].$GLOBALS['salt'])); -autoLocale($_SERVER['HTTP_ACCEPT_LANGUAGE']); // Sniff browser language and set date format accordingly. +// Sniff browser language and set date format accordingly. +if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { + autoLocale($_SERVER['HTTP_ACCEPT_LANGUAGE']); +} header('Content-Type: text/html; charset=utf-8'); // We use UTF-8 for proper international characters handling. //================================================================================================== @@ -531,33 +534,6 @@ function getMaxFileSize() return $maxsize; } -/* Converts a linkdate time (YYYYMMDD_HHMMSS) of an article to a timestamp (Unix epoch) - (used to build the ADD_DATE attribute in Netscape-bookmarks file) - PS: I could have used strptime(), but it does not exist on Windows. I'm too kind. */ -function linkdate2timestamp($linkdate) -{ - if(strcmp($linkdate, '_000000') !== 0 || !$linkdate){ - $Y=$M=$D=$h=$m=$s=0; - $r = sscanf($linkdate,'%4d%2d%2d_%2d%2d%2d',$Y,$M,$D,$h,$m,$s); - return mktime($h,$m,$s,$M,$D,$Y); - } - return time(); -} - -/* Converts a linkdate time (YYYYMMDD_HHMMSS) of an article to a RFC822 date. - (used to build the pubDate attribute in RSS feed.) */ -function linkdate2rfc822($linkdate) -{ - return date('r',linkdate2timestamp($linkdate)); // 'r' is for RFC822 date format. -} - -/* Converts a linkdate time (YYYYMMDD_HHMMSS) of an article to a ISO 8601 date. - (used to build the updated tags in ATOM feed.) */ -function linkdate2iso8601($linkdate) -{ - return date('c',linkdate2timestamp($linkdate)); // 'c' is for ISO 8601 date format. -} - // ------------------------------------------------------------------------------------------ // Token management for XSRF protection // Token should be used in any form which acts on data (create,update,delete,import...). @@ -630,7 +606,7 @@ class pageBuilder if (!empty($_GET['searchtags'])) { $searchcrits .= '&searchtags=' . urlencode($_GET['searchtags']); } - elseif (!empty($_GET['searchterm'])) { + if (!empty($_GET['searchterm'])) { $searchcrits .= '&searchterm=' . urlencode($_GET['searchterm']); } $this->tpl->assign('searchcrits', $searchcrits); @@ -716,11 +692,19 @@ function showRSS() // Read links from database (and filter private links if user it not logged in). // Optionally filter the results: - if (!empty($_GET['searchterm'])) { - $linksToDisplay = $LINKSDB->filter(LinkFilter::$FILTER_TEXT, $_GET['searchterm']); + $searchtags = !empty($_GET['searchtags']) ? escape($_GET['searchtags']) : ''; + $searchterm = !empty($_GET['searchterm']) ? escape($_GET['searchterm']) : ''; + if (! empty($searchtags) && ! empty($searchterm)) { + $linksToDisplay = $LINKSDB->filter( + LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT, + array($searchtags, $searchterm) + ); + } + elseif ($searchtags) { + $linksToDisplay = $LINKSDB->filter(LinkFilter::$FILTER_TAG, $searchtags); } - elseif (!empty($_GET['searchtags'])) { - $linksToDisplay = $LINKSDB->filter(LinkFilter::$FILTER_TAG, trim($_GET['searchtags'])); + elseif ($searchterm) { + $linksToDisplay = $LINKSDB->filter(LinkFilter::$FILTER_TEXT, $searchterm); } else { $linksToDisplay = $LINKSDB; @@ -749,14 +733,16 @@ function showRSS() { $link = $linksToDisplay[$keys[$i]]; $guid = $pageaddr.'?'.smallHash($link['linkdate']); - $rfc822date = linkdate2rfc822($link['linkdate']); + $date = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['linkdate']); $absurl = $link['url']; if (startsWith($absurl,'?')) $absurl=$pageaddr.$absurl; // make permalink URL absolute if ($usepermalinks===true) echo ''.$link['title'].''.$guid.''.$guid.''; else echo ''.$link['title'].''.$guid.''.$absurl.''; - if (!$GLOBALS['config']['HIDE_TIMESTAMPS'] || isLoggedIn()) echo ''.escape($rfc822date)."\n"; + if (!$GLOBALS['config']['HIDE_TIMESTAMPS'] || isLoggedIn()) { + echo ''.escape($date->format(DateTime::RSS))."\n"; + } if ($link['tags']!='') // Adding tags to each RSS entry (as mentioned in RSS specification) { foreach(explode(' ',$link['tags']) as $tag) { echo ''.$tag.''."\n"; } @@ -812,11 +798,19 @@ function showATOM() ); // Optionally filter the results: - if (!empty($_GET['searchterm'])) { - $linksToDisplay = $LINKSDB->filter(LinkFilter::$FILTER_TEXT, $_GET['searchterm']); + $searchtags = !empty($_GET['searchtags']) ? escape($_GET['searchtags']) : ''; + $searchterm = !empty($_GET['searchterm']) ? escape($_GET['searchterm']) : ''; + if (! empty($searchtags) && ! empty($searchterm)) { + $linksToDisplay = $LINKSDB->filter( + LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT, + array($searchtags, $searchterm) + ); } - else if (!empty($_GET['searchtags'])) { - $linksToDisplay = $LINKSDB->filter(LinkFilter::$FILTER_TAG, trim($_GET['searchtags'])); + elseif ($searchtags) { + $linksToDisplay = $LINKSDB->filter(LinkFilter::$FILTER_TAG, $searchtags); + } + elseif ($searchterm) { + $linksToDisplay = $LINKSDB->filter(LinkFilter::$FILTER_TEXT, $searchterm); } else { $linksToDisplay = $LINKSDB; @@ -837,8 +831,9 @@ function showATOM() { $link = $linksToDisplay[$keys[$i]]; $guid = $pageaddr.'?'.smallHash($link['linkdate']); - $iso8601date = linkdate2iso8601($link['linkdate']); - $latestDate = max($latestDate,$iso8601date); + $date = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['linkdate']); + $iso8601date = $date->format(DateTime::ISO8601); + $latestDate = max($latestDate, $iso8601date); $absurl = $link['url']; if (startsWith($absurl,'?')) $absurl=$pageaddr.$absurl; // make permalink URL absolute $entries.=''.$link['title'].''; @@ -846,7 +841,10 @@ function showATOM() $entries.=''.$guid.''; else $entries.=''.$guid.''; - if (!$GLOBALS['config']['HIDE_TIMESTAMPS'] || isLoggedIn()) $entries.=''.escape($iso8601date).''; + + if (!$GLOBALS['config']['HIDE_TIMESTAMPS'] || isLoggedIn()) { + $entries.=''.escape($iso8601date).''; + } // Add permalink in description $descriptionlink = '(Permalink)'; @@ -952,8 +950,7 @@ function showDailyRSS() { // For each day. foreach ($days as $day => $linkdates) { - $daydate = linkdate2timestamp($day.'_000000'); // Full text date - $rfc822date = linkdate2rfc822($day.'_000000'); + $dayDate = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $day.'_000000'); $absurl = escape(index_url($_SERVER).'?do=daily&day='.$day); // Absolute URL of the corresponding "Daily" page. // Build the HTML body of this RSS entry. @@ -966,7 +963,8 @@ function showDailyRSS() { $l = $LINKSDB[$linkdate]; $l['formatedDescription'] = format_description($l['description'], $GLOBALS['redirector']); $l['thumbnail'] = thumbnail($l['url']); - $l['timestamp'] = linkdate2timestamp($l['linkdate']); + $l_date = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $l['linkdate']); + $l['timestamp'] = $l_date->getTimestamp(); if (startsWith($l['url'], '?')) { $l['url'] = index_url($_SERVER) . $l['url']; // make permalink URL absolute } @@ -976,10 +974,10 @@ function showDailyRSS() { // Then build the HTML for this day: $tpl = new RainTPL; $tpl->assign('title', $GLOBALS['title']); - $tpl->assign('daydate', $daydate); + $tpl->assign('daydate', $dayDate->getTimestamp()); $tpl->assign('absurl', $absurl); $tpl->assign('links', $links); - $tpl->assign('rfc822date', escape($rfc822date)); + $tpl->assign('rssdate', escape($dayDate->format(DateTime::RSS))); $html = $tpl->draw('dailyrss', $return_string=true); echo $html . PHP_EOL; @@ -1035,7 +1033,8 @@ function showDaily($pageBuilder) $linksToDisplay[$key]['taglist']=$taglist; $linksToDisplay[$key]['formatedDescription'] = format_description($link['description'], $GLOBALS['redirector']); $linksToDisplay[$key]['thumbnail'] = thumbnail($link['url']); - $linksToDisplay[$key]['timestamp'] = linkdate2timestamp($link['linkdate']); + $date = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['linkdate']); + $linksToDisplay[$key]['timestamp'] = $date->getTimestamp(); } /* We need to spread the articles on 3 columns. @@ -1060,11 +1059,12 @@ function showDaily($pageBuilder) $fill[$index]+=$length; } + $dayDate = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $day.'_000000'); $data = array( 'linksToDisplay' => $linksToDisplay, 'linkcount' => count($LINKSDB), 'cols' => $columns, - 'day' => linkdate2timestamp($day.'_000000'), + 'day' => $dayDate->getTimestamp(), 'previousday' => $previousday, 'nextday' => $nextday, ); @@ -1164,11 +1164,19 @@ function renderPage() if ($targetPage == Router::$PAGE_PICWALL) { // Optionally filter the results: - if (!empty($_GET['searchterm'])) { - $links = $LINKSDB->filter(LinkFilter::$FILTER_TEXT, $_GET['searchterm']); + $searchtags = !empty($_GET['searchtags']) ? escape($_GET['searchtags']) : ''; + $searchterm = !empty($_GET['searchterm']) ? escape($_GET['searchterm']) : ''; + if (! empty($searchtags) && ! empty($searchterm)) { + $links = $LINKSDB->filter( + LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT, + array($searchtags, $searchterm) + ); } - elseif (! empty($_GET['searchtags'])) { - $links = $LINKSDB->filter(LinkFilter::$FILTER_TAG, trim($_GET['searchtags'])); + elseif ($searchtags) { + $links = $LINKSDB->filter(LinkFilter::$FILTER_TAG, $searchtags); + } + elseif ($searchterm) { + $links = $LINKSDB->filter(LinkFilter::$FILTER_TEXT, $searchterm); } else { $links = $LINKSDB; @@ -1569,7 +1577,7 @@ function renderPage() $link = array( 'title' => trim($_POST['lf_title']), 'url' => $url, - 'description' => trim($_POST['lf_description']), + 'description' => $_POST['lf_description'], 'private' => (isset($_POST['lf_private']) ? 1 : 0), 'linkdate' => $linkdate, 'tags' => str_replace(',', ' ', $tags) @@ -1780,7 +1788,8 @@ HTML; ($exportWhat=='private' && $link['private']!=0) || ($exportWhat=='public' && $link['private']==0)) { - echo '
'.$link['title']."\n"; if ($link['description']!='') echo '
'.$link['description']."\n"; @@ -1962,29 +1971,46 @@ function importFile() // This function fills all the necessary fields in the $PAGE for the template 'linklist.html' function buildLinkList($PAGE,$LINKSDB) { - // ---- Filter link database according to parameters - $search_type = ''; - $search_crits = ''; + // Filter link database according to parameters. + $searchtags = !empty($_GET['searchtags']) ? escape($_GET['searchtags']) : ''; + $searchterm = !empty($_GET['searchterm']) ? escape(trim($_GET['searchterm'])) : ''; $privateonly = !empty($_SESSION['privateonly']) ? true : false; - // Fulltext search - if (isset($_GET['searchterm'])) { - $search_crits = escape(trim($_GET['searchterm'])); - $search_type = LinkFilter::$FILTER_TEXT; - $linksToDisplay = $LINKSDB->filter($search_type, $search_crits, false, $privateonly); + // Search tags + fullsearch. + if (! empty($searchtags) && ! empty($searchterm)) { + $linksToDisplay = $LINKSDB->filter( + LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT, + array($searchtags, $searchterm), + false, + $privateonly + ); } - // Search by tag - elseif (isset($_GET['searchtags'])) { - $search_crits = explode(' ', escape(trim($_GET['searchtags']))); - $search_type = LinkFilter::$FILTER_TAG; - $linksToDisplay = $LINKSDB->filter($search_type, $search_crits, false, $privateonly); + // Search by tags. + elseif (! empty($searchtags)) { + $linksToDisplay = $LINKSDB->filter( + LinkFilter::$FILTER_TAG, + $searchtags, + false, + $privateonly + ); + } + // Fulltext search. + elseif (! empty($searchterm)) { + $linksToDisplay = $LINKSDB->filter( + LinkFilter::$FILTER_TEXT, + $searchterm, + false, + $privateonly + ); } // Detect smallHashes in URL. - elseif (isset($_SERVER['QUERY_STRING']) - && preg_match('/[a-zA-Z0-9-_@]{6}(&.+?)?/', $_SERVER['QUERY_STRING'])) { - $search_type = LinkFilter::$FILTER_HASH; - $search_crits = substr(trim($_SERVER["QUERY_STRING"], '/'), 0, 6); - $linksToDisplay = $LINKSDB->filter($search_type, $search_crits); + elseif (! empty($_SERVER['QUERY_STRING']) + && preg_match('/[a-zA-Z0-9-_@]{6}(&.+?)?/', $_SERVER['QUERY_STRING']) + ) { + $linksToDisplay = $LINKSDB->filter( + LinkFilter::$FILTER_HASH, + substr(trim($_SERVER["QUERY_STRING"], '/'), 0, 6) + ); if (count($linksToDisplay) == 0) { $PAGE->render404('The link you are trying to reach does not exist or has been deleted.'); @@ -2023,7 +2049,8 @@ function buildLinkList($PAGE,$LINKSDB) $link['description'] = format_description($link['description'], $GLOBALS['redirector']); $classLi = ($i % 2) != 0 ? '' : 'publicLinkHightLight'; $link['class'] = $link['private'] == 0 ? $classLi : 'private'; - $link['timestamp'] = linkdate2timestamp($link['linkdate']); + $date = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['linkdate']); + $link['timestamp'] = $date->getTimestamp(); $taglist = explode(' ', $link['tags']); uasort($taglist, 'strcasecmp'); $link['taglist'] = $taglist; @@ -2039,21 +2066,18 @@ function buildLinkList($PAGE,$LINKSDB) } // Compute paging navigation - $searchterm = empty($_GET['searchterm']) ? '' : '&searchterm=' . $_GET['searchterm']; - $searchtags = empty($_GET['searchtags']) ? '' : '&searchtags=' . $_GET['searchtags']; + $searchtagsUrl = empty($searchtags) ? '' : '&searchtags=' . urlencode($searchtags); + $searchtermUrl = empty($searchterm) ? '' : '&searchterm=' . urlencode($searchterm); $previous_page_url = ''; if ($i != count($keys)) { - $previous_page_url = '?page=' . ($page+1) . $searchterm . $searchtags; + $previous_page_url = '?page=' . ($page+1) . $searchtermUrl . $searchtagsUrl; } $next_page_url=''; if ($page>1) { - $next_page_url = '?page=' . ($page-1) . $searchterm . $searchtags; + $next_page_url = '?page=' . ($page-1) . $searchtermUrl . $searchtagsUrl; } - $token = ''; - if (isLoggedIn()) { - $token = getToken(); - } + $token = isLoggedIn() ? getToken() : ''; // Fill all template fields. $data = array( @@ -2063,8 +2087,8 @@ function buildLinkList($PAGE,$LINKSDB) 'page_current' => $page, 'page_max' => $pagecount, 'result_count' => count($linksToDisplay), - 'search_type' => $search_type, - 'search_crits' => $search_crits, + 'search_term' => $searchterm, + 'search_tags' => $searchtags, 'redirector' => empty($GLOBALS['redirector']) ? '' : $GLOBALS['redirector'], // Optional redirector URL. 'token' => $token, 'links' => $linkDisp,