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
This commit is contained in:
parent
9486a2e929
commit
043eae70c4
3 changed files with 47 additions and 25 deletions
|
@ -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 @@ private function _readDB()
|
|||
|
||||
// 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'];
|
||||
|
|
30
index.php
30
index.php
|
@ -100,6 +100,7 @@
|
|||
$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 @@ function renderPage()
|
|||
exit;
|
||||
}
|
||||
if (!tokenOk($_POST['token'])) die('Wrong token.');
|
||||
importFile();
|
||||
importFile($LINKSDB);
|
||||
exit;
|
||||
}
|
||||
|
||||
|
@ -1707,15 +1704,10 @@ function($a, $b) { return $a['order'] - $b['order']; }
|
|||
|
||||
// -----------------------------------------------------------------------------------------------
|
||||
// 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']);
|
||||
|
|
|
@ -338,6 +338,13 @@ public function testLinkRealUrlWithRedirector()
|
|||
$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('://')));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue