From 043eae70c4c57b0447b56a58b64ce9d102895396 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Thu, 24 Mar 2016 19:40:12 +0100 Subject: [PATCH] Fixes #480: add an option to urlencode redirector URL * New config: `$GLOBALS['config']['REDIRECTOR_URLENCODE']` (default `true`). * Parameter added to LinkDB constructor. * Fixes a bug with urlencode and escaped url. * In `index.php`, LinkDB is now instanciate once for `importFile()` and `showDaily()`. * TU --- application/LinkDB.php | 35 +++++++++++++++++++++++++++++------ index.php | 30 +++++++++++------------------- tests/LinkDBTest.php | 7 +++++++ 3 files changed, 47 insertions(+), 25 deletions(-) diff --git a/application/LinkDB.php b/application/LinkDB.php index a62341f..1cb70de 100644 --- a/application/LinkDB.php +++ b/application/LinkDB.php @@ -65,22 +65,40 @@ class LinkDB implements Iterator, Countable, ArrayAccess // link redirector set in user settings. private $_redirector; + /** + * Set this to `true` to urlencode link behind redirector link, `false` to leave it untouched. + * + * Example: + * anonym.to needs clean URL while dereferer.org needs urlencoded URL. + * + * @var boolean $redirectorEncode parameter: true or false + */ + private $redirectorEncode; + /** * Creates a new LinkDB * * Checks if the datastore exists; else, attempts to create a dummy one. * - * @param string $datastore datastore file path. - * @param boolean $isLoggedIn is the user logged in? - * @param boolean $hidePublicLinks if true all links are private. - * @param string $redirector link redirector set in user settings. + * @param string $datastore datastore file path. + * @param boolean $isLoggedIn is the user logged in? + * @param boolean $hidePublicLinks if true all links are private. + * @param string $redirector link redirector set in user settings. + * @param boolean $redirectorEncode Enable urlencode on redirected urls (default: true). */ - function __construct($datastore, $isLoggedIn, $hidePublicLinks, $redirector = '') + function __construct( + $datastore, + $isLoggedIn, + $hidePublicLinks, + $redirector = '', + $redirectorEncode = true + ) { $this->_datastore = $datastore; $this->_loggedIn = $isLoggedIn; $this->_hidePublicLinks = $hidePublicLinks; $this->_redirector = $redirector; + $this->redirectorEncode = $redirectorEncode === true; $this->_checkDB(); $this->_readDB(); } @@ -278,7 +296,12 @@ You use the community supported version of the original Shaarli project, by Seba // Do not use the redirector for internal links (Shaarli note URL starting with a '?'). if (!empty($this->_redirector) && !startsWith($link['url'], '?')) { - $link['real_url'] = $this->_redirector . urlencode($link['url']); + $link['real_url'] = $this->_redirector; + if ($this->redirectorEncode) { + $link['real_url'] .= urlencode(unescape($link['url'])); + } else { + $link['real_url'] .= $link['url']; + } } else { $link['real_url'] = $link['url']; diff --git a/index.php b/index.php index 735615f..d3369a2 100644 --- a/index.php +++ b/index.php @@ -100,6 +100,7 @@ $GLOBALS['config']['ENABLE_LOCALCACHE'] = true; $GLOBALS['config']['UPDATECHECK_BRANCH'] = 'stable'; $GLOBALS['config']['UPDATECHECK_INTERVAL'] = 86400; +$GLOBALS['config']['REDIRECTOR_URLENCODE'] = true; /* * Plugin configuration @@ -706,7 +707,8 @@ function showDailyRSS() { $GLOBALS['config']['DATASTORE'], isLoggedIn(), $GLOBALS['config']['HIDE_PUBLIC_LINKS'], - $GLOBALS['redirector'] + $GLOBALS['redirector'], + $GLOBALS['config']['REDIRECTOR_URLENCODE'] ); /* Some Shaarlies may have very few links, so we need to look @@ -791,16 +793,10 @@ function showDailyRSS() { * Show the 'Daily' page. * * @param PageBuilder $pageBuilder Template engine wrapper. + * @param LinkDB $LINKSDB LinkDB instance. */ -function showDaily($pageBuilder) +function showDaily($pageBuilder, $LINKSDB) { - $LINKSDB = new LinkDB( - $GLOBALS['config']['DATASTORE'], - isLoggedIn(), - $GLOBALS['config']['HIDE_PUBLIC_LINKS'], - $GLOBALS['redirector'] - ); - $day=Date('Ymd',strtotime('-1 day')); // Yesterday, in format YYYYMMDD. if (isset($_GET['day'])) $day=$_GET['day']; @@ -892,7 +888,8 @@ function renderPage() $GLOBALS['config']['DATASTORE'], isLoggedIn(), $GLOBALS['config']['HIDE_PUBLIC_LINKS'], - $GLOBALS['redirector'] + $GLOBALS['redirector'], + $GLOBALS['config']['REDIRECTOR_URLENCODE'] ); $updater = new Updater( @@ -1043,7 +1040,7 @@ function renderPage() // Daily page. if ($targetPage == Router::$PAGE_DAILY) { - showDaily($PAGE); + showDaily($PAGE, $LINKSDB); } // ATOM and RSS feed. @@ -1638,7 +1635,7 @@ HTML; exit; } if (!tokenOk($_POST['token'])) die('Wrong token.'); - importFile(); + importFile($LINKSDB); exit; } @@ -1707,15 +1704,10 @@ HTML; // ----------------------------------------------------------------------------------------------- // Process the import file form. -function importFile() +function importFile($LINKSDB) { if (!isLoggedIn()) { die('Not allowed.'); } - $LINKSDB = new LinkDB( - $GLOBALS['config']['DATASTORE'], - isLoggedIn(), - $GLOBALS['config']['HIDE_PUBLIC_LINKS'], - $GLOBALS['redirector'] - ); + $filename=$_FILES['filetoupload']['name']; $filesize=$_FILES['filetoupload']['size']; $data=file_get_contents($_FILES['filetoupload']['tmp_name']); diff --git a/tests/LinkDBTest.php b/tests/LinkDBTest.php index 52d3140..b055fe9 100644 --- a/tests/LinkDBTest.php +++ b/tests/LinkDBTest.php @@ -338,6 +338,13 @@ class LinkDBTest extends PHPUnit_Framework_TestCase $db = new LinkDB(self::$testDatastore, false, false, $redirector); foreach($db as $link) { $this->assertStringStartsWith($redirector, $link['real_url']); + $this->assertNotFalse(strpos($link['real_url'], urlencode('://'))); + } + + $db = new LinkDB(self::$testDatastore, false, false, $redirector, false); + foreach($db as $link) { + $this->assertStringStartsWith($redirector, $link['real_url']); + $this->assertFalse(strpos($link['real_url'], urlencode('://'))); } }