<?php
/**
- * Shaarli v0.6.2 - Shaare your links...
+ * Shaarli v0.6.3 - Shaare your links...
*
* The personal, minimalist, super-fast, no-database Delicious clone.
*
// Banned IPs
$GLOBALS['config']['IPBANS_FILENAME'] = $GLOBALS['config']['DATADIR'].'/ipbans.php';
+// Processed updates file.
+$GLOBALS['config']['UPDATES_FILE'] = $GLOBALS['config']['DATADIR'].'/updates.txt';
+
// Access log
$GLOBALS['config']['LOG_FILE'] = $GLOBALS['config']['DATADIR'].'/log.txt';
// For updates check of Shaarli
$GLOBALS['config']['UPDATECHECK_FILENAME'] = $GLOBALS['config']['DATADIR'].'/lastupdatecheck.txt';
+// Set ENABLE_UPDATECHECK to disabled by default.
+$GLOBALS['config']['ENABLE_UPDATECHECK'] = false;
+
// RainTPL cache directory (keep the trailing slash!)
$GLOBALS['config']['RAINTPL_TMP'] = 'tmp/';
// Raintpl template directory (keep the trailing slash!)
// Atom & RSS feed cache directory
$GLOBALS['config']['PAGECACHE'] = 'pagecache';
-
/*
* Global configuration
*/
//);
$GLOBALS['config']['ENABLED_PLUGINS'] = array('qrcode');
-//$GLOBALS['plugins']['WALLABAG_URL'] = 'https://demo.wallabag.org/';
+// Initialize plugin parameters array.
+$GLOBALS['plugins'] = array();
// PubSubHubbub support. Put an empty string to disable, or put your hub url here to enable.
$GLOBALS['config']['PUBSUBHUB_URL'] = '';
/*
* PHP configuration
*/
-define('shaarli_version', '0.6.2');
+define('shaarli_version', '0.6.3');
// http://server.com/x/shaarli --> /shaarli/
define('WEB_PATH', substr($_SERVER["REQUEST_URI"], 0, 1+strrpos($_SERVER["REQUEST_URI"], '/', 0)));
require_once 'application/Config.php';
require_once 'application/PluginManager.php';
require_once 'application/Router.php';
+require_once 'application/Updater.php';
// Ensure the PHP version is supported
try {
$GLOBALS['redirector']
);
+ $updater = new Updater(
+ read_updates_file($GLOBALS['config']['UPDATES_FILE']),
+ $GLOBALS,
+ $LINKSDB,
+ isLoggedIn()
+ );
+ try {
+ $newUpdates = $updater->update();
+ if (! empty($newUpdates)) {
+ write_updates_file(
+ $GLOBALS['config']['UPDATES_FILE'],
+ $updater->getDoneUpdates()
+ );
+ }
+ }
+ catch(Exception $e) {
+ die($e->getMessage());
+ }
+
$PAGE = new pageBuilder;
// Determine which page will be rendered.
// Call plugin hooks for header, footer and includes, specifying which page will be rendered.
// Then assign generated data to RainTPL.
$common_hooks = array(
+ 'includes',
'header',
'footer',
- 'includes',
);
$pluginManager = PluginManager::getInstance();
foreach($common_hooks as $name) {
// We sort tags alphabetically, then choose a font size according to count.
// First, find max value.
- $maxcount=0; foreach($tags as $key=>$value) $maxcount=max($maxcount,$value);
- ksort($tags);
+ $maxcount = 0;
+ foreach ($tags as $value) {
+ $maxcount = max($maxcount, $value);
+ }
+
+ // Sort tags alphabetically: case insensitive, support locale if avalaible.
+ uksort($tags, function($a, $b) {
+ // Collator is part of PHP intl.
+ if (class_exists('Collator')) {
+ $c = new Collator(setlocale(LC_ALL, 0));
+ return $c->compare($a, $b);
+ } else {
+ return strcasecmp($a, $b);
+ }
+ });
+
$tagList=array();
foreach($tags as $key=>$value)
- // Tag font size scaling: default 15 and 30 logarithm bases affect scaling, 22 and 6 are arbitrary font sizes for max and min sizes.
+ // Tag font size scaling: default 15 and 30 logarithm bases affect scaling, 22 and 6 are arbitrary font sizes for max and min sizes.
{
$tagList[$key] = array('count'=>$value,'size'=>log($value, 15) / log($maxcount, 30) * (22-6) + 6);
}
// -------- User clicked the "Save" button when editing a link: Save link to database.
if (isset($_POST['save_edit']))
{
- if (!tokenOk($_POST['token'])) die('Wrong token.'); // Go away!
- $tags = trim(preg_replace('/\s\s+/',' ', $_POST['lf_tags'])); // Remove multiple spaces.
- $tags = implode(' ', array_unique(explode(' ', $tags))); // Remove duplicates.
- $linkdate=$_POST['lf_linkdate'];
+ // Go away!
+ if (! tokenOk($_POST['token'])) {
+ die('Wrong token.');
+ }
+ // Remove multiple spaces.
+ $tags = trim(preg_replace('/\s\s+/', ' ', $_POST['lf_tags']));
+ // Remove first '-' char in tags.
+ $tags = preg_replace('/(^| )\-/', '$1', $tags);
+ // Remove duplicates.
+ $tags = implode(' ', array_unique(explode(' ', $tags)));
+ $linkdate = $_POST['lf_linkdate'];
$url = trim($_POST['lf_url']);
- if (!startsWith($url,'http:') && !startsWith($url,'https:') && !startsWith($url,'ftp:') && !startsWith($url,'magnet:') && !startsWith($url,'?') && !startsWith($url,'javascript:'))
- $url = 'http://'.$url;
- $link = array('title'=>trim($_POST['lf_title']),'url'=>$url,'description'=>trim($_POST['lf_description']),'private'=>(isset($_POST['lf_private']) ? 1 : 0),
- 'linkdate'=>$linkdate,'tags'=>str_replace(',',' ',$tags));
- if ($link['title']=='') $link['title']=$link['url']; // If title is empty, use the URL as title.
+ if (! startsWith($url, 'http:') && ! startsWith($url, 'https:')
+ && ! startsWith($url, 'ftp:') && ! startsWith($url, 'magnet:')
+ && ! startsWith($url, '?') && ! startsWith($url, 'javascript:')
+ ) {
+ $url = 'http://' . $url;
+ }
+
+ $link = array(
+ 'title' => trim($_POST['lf_title']),
+ 'url' => $url,
+ 'description' => trim($_POST['lf_description']),
+ 'private' => (isset($_POST['lf_private']) ? 1 : 0),
+ 'linkdate' => $linkdate,
+ 'tags' => str_replace(',', ' ', $tags)
+ );
+ // If title is empty, use the URL as title.
+ if ($link['title'] == '') {
+ $link['title'] = $link['url'];
+ }
$pluginManager->executeHooks('save_link', $link);
$LINKSDB[$linkdate] = $link;
- $LINKSDB->savedb($GLOBALS['config']['PAGECACHE']); // Save to disk.
+ $LINKSDB->savedb($GLOBALS['config']['PAGECACHE']);
pubsubhub();
// If we are called from the bookmarklet, we must close the popup:
exit;
}
- $returnurl = !empty($_POST['returnurl']) ? escape($_POST['returnurl']): '?';
+ $returnurl = !empty($_POST['returnurl']) ? $_POST['returnurl'] : '?';
$location = generateLocation($returnurl, $_SERVER['HTTP_HOST'], array('addlink', 'post', 'edit_link'));
- $location .= '#'.smallHash($_POST['lf_linkdate']); // Scroll to the link which has been edited.
- header('Location: '. $location); // After saving the link, redirect to the page the user was on.
+ // Scroll to the link which has been edited.
+ $location .= '#' . smallHash($_POST['lf_linkdate']);
+ // After saving the link, redirect to the page the user was on.
+ header('Location: '. $location);
exit;
}
exit;
}
+ // Plugin administration page
+ if ($targetPage == Router::$PAGE_PLUGINSADMIN) {
+ $pluginMeta = $pluginManager->getPluginsMeta();
+
+ // Split plugins into 2 arrays: ordered enabled plugins and disabled.
+ $enabledPlugins = array_filter($pluginMeta, function($v) { return $v['order'] !== false; });
+ // Load parameters.
+ $enabledPlugins = load_plugin_parameter_values($enabledPlugins, $GLOBALS['plugins']);
+ uasort(
+ $enabledPlugins,
+ function($a, $b) { return $a['order'] - $b['order']; }
+ );
+ $disabledPlugins = array_filter($pluginMeta, function($v) { return $v['order'] === false; });
+
+ $PAGE->assign('enabledPlugins', $enabledPlugins);
+ $PAGE->assign('disabledPlugins', $disabledPlugins);
+ $PAGE->renderPage('pluginsadmin');
+ exit;
+ }
+
+ // Plugin administration form action
+ if ($targetPage == Router::$PAGE_SAVE_PLUGINSADMIN) {
+ try {
+ if (isset($_POST['parameters_form'])) {
+ unset($_POST['parameters_form']);
+ foreach ($_POST as $param => $value) {
+ $GLOBALS['plugins'][$param] = escape($value);
+ }
+ }
+ else {
+ $GLOBALS['config']['ENABLED_PLUGINS'] = save_plugin_config($_POST);
+ }
+ writeConfig($GLOBALS, isLoggedIn());
+ }
+ catch (Exception $e) {
+ error_log(
+ 'ERROR while saving plugin configuration:.' . PHP_EOL .
+ $e->getMessage()
+ );
+
+ // TODO: do not handle exceptions/errors in JS.
+ echo '<script>alert("'. $e->getMessage() .'");document.location=\'?do='. Router::$PAGE_PLUGINSADMIN .'\';</script>';
+ exit;
+ }
+ header('Location: ?do='. Router::$PAGE_PLUGINSADMIN);
+ exit;
+ }
+
// -------- Otherwise, simply display search form and links:
showLinkList($PAGE, $LINKSDB);
exit;
return true;
}
-try {
- mergeDeprecatedConfig($GLOBALS, isLoggedIn());
-} catch(Exception $e) {
- error_log(
- 'ERROR while merging deprecated options.php file.' . PHP_EOL .
- $e->getMessage()
- );
-}
-
if (isset($_SERVER["QUERY_STRING"]) && startswith($_SERVER["QUERY_STRING"],'do=genthumbnail')) { genThumbnail(); exit; } // Thumbnail generation/cache does not need the link database.
if (isset($_SERVER["QUERY_STRING"]) && startswith($_SERVER["QUERY_STRING"],'do=rss')) { showRSS(); exit; }
if (isset($_SERVER["QUERY_STRING"]) && startswith($_SERVER["QUERY_STRING"],'do=atom')) { showATOM(); exit; }