aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorArthurHoaro <arthur@hoa.ro>2016-12-20 11:06:22 +0100
committerArthurHoaro <arthur@hoa.ro>2017-01-03 09:47:15 +0100
commitb3051a6aae446e063c3b6fa4a6a600357a9f24af (patch)
treebefc1823dfc935fd827e6753b48f53d8150c3493
parente0177549c760b143efdd17b1579e0c0199dce939 (diff)
downloadShaarli-b3051a6aae446e063c3b6fa4a6a600357a9f24af.tar.gz
Shaarli-b3051a6aae446e063c3b6fa4a6a600357a9f24af.tar.zst
Shaarli-b3051a6aae446e063c3b6fa4a6a600357a9f24af.zip
Fixes presence of empty tags for private tags and in search results
* Private tags: make sure empty tags are properly filtered * Search results: * Use preg_split instead of function combination * Add normalize_spaces to remove extra whitespaces displaying empty tags search
-rw-r--r--application/LinkFilter.php2
-rw-r--r--application/Utils.php13
-rw-r--r--index.php6
-rw-r--r--tests/UtilsTest.php14
4 files changed, 30 insertions, 5 deletions
diff --git a/application/LinkFilter.php b/application/LinkFilter.php
index daa6d9cc..57ebfd5c 100644
--- a/application/LinkFilter.php
+++ b/application/LinkFilter.php
@@ -348,7 +348,7 @@ class LinkFilter
348 $tagsOut = $casesensitive ? $tags : mb_convert_case($tags, MB_CASE_LOWER, 'UTF-8'); 348 $tagsOut = $casesensitive ? $tags : mb_convert_case($tags, MB_CASE_LOWER, 'UTF-8');
349 $tagsOut = str_replace(',', ' ', $tagsOut); 349 $tagsOut = str_replace(',', ' ', $tagsOut);
350 350
351 return array_values(array_filter(explode(' ', trim($tagsOut)), 'strlen')); 351 return preg_split('/\s+/', $tagsOut, -1, PREG_SPLIT_NO_EMPTY);
352 } 352 }
353} 353}
354 354
diff --git a/application/Utils.php b/application/Utils.php
index 62902341..35d65224 100644
--- a/application/Utils.php
+++ b/application/Utils.php
@@ -257,3 +257,16 @@ function generate_api_secret($username, $salt)
257 257
258 return str_shuffle(substr(hash_hmac('sha512', uniqid($salt), $username), 10, 12)); 258 return str_shuffle(substr(hash_hmac('sha512', uniqid($salt), $username), 10, 12));
259} 259}
260
261/**
262 * Trim string, replace sequences of whitespaces by a single space.
263 * PHP equivalent to `normalize-space` XSLT function.
264 *
265 * @param string $string Input string.
266 *
267 * @return mixed Normalized string.
268 */
269function normalize_spaces($string)
270{
271 return preg_replace('/\s{2,}/', ' ', trim($string));
272}
diff --git a/index.php b/index.php
index dd9b48bd..427eb239 100644
--- a/index.php
+++ b/index.php
@@ -1601,8 +1601,8 @@ function renderPage($conf, $pluginManager, $LINKSDB)
1601function buildLinkList($PAGE,$LINKSDB, $conf, $pluginManager) 1601function buildLinkList($PAGE,$LINKSDB, $conf, $pluginManager)
1602{ 1602{
1603 // Used in templates 1603 // Used in templates
1604 $searchtags = !empty($_GET['searchtags']) ? escape($_GET['searchtags']) : ''; 1604 $searchtags = !empty($_GET['searchtags']) ? escape(normalize_spaces($_GET['searchtags'])) : '';
1605 $searchterm = !empty($_GET['searchterm']) ? escape($_GET['searchterm']) : ''; 1605 $searchterm = !empty($_GET['searchterm']) ? escape(normalize_spaces($_GET['searchterm'])) : '';
1606 1606
1607 // Smallhash filter 1607 // Smallhash filter
1608 if (! empty($_SERVER['QUERY_STRING']) 1608 if (! empty($_SERVER['QUERY_STRING'])
@@ -1649,7 +1649,7 @@ function buildLinkList($PAGE,$LINKSDB, $conf, $pluginManager)
1649 } else { 1649 } else {
1650 $link['updated_timestamp'] = ''; 1650 $link['updated_timestamp'] = '';
1651 } 1651 }
1652 $taglist = explode(' ', $link['tags']); 1652 $taglist = preg_split('/\s+/', $link['tags'], -1, PREG_SPLIT_NO_EMPTY);
1653 uasort($taglist, 'strcasecmp'); 1653 uasort($taglist, 'strcasecmp');
1654 $link['taglist'] = $taglist; 1654 $link['taglist'] = $taglist;
1655 // Check for both signs of a note: starting with ? and 7 chars long. 1655 // Check for both signs of a note: starting with ? and 7 chars long.
diff --git a/tests/UtilsTest.php b/tests/UtilsTest.php
index 0cf9a921..c885f552 100644
--- a/tests/UtilsTest.php
+++ b/tests/UtilsTest.php
@@ -253,7 +253,7 @@ class UtilsTest extends PHPUnit_Framework_TestCase
253 is_session_id_valid('c0ZqcWF3VFE2NmJBdm1HMVQ0ZHJ3UmZPbTFsNGhkNHI=') 253 is_session_id_valid('c0ZqcWF3VFE2NmJBdm1HMVQ0ZHJ3UmZPbTFsNGhkNHI=')
254 ); 254 );
255 } 255 }
256 256
257 /** 257 /**
258 * Test generateSecretApi. 258 * Test generateSecretApi.
259 */ 259 */
@@ -270,4 +270,16 @@ class UtilsTest extends PHPUnit_Framework_TestCase
270 $this->assertFalse(generate_api_secret('', '')); 270 $this->assertFalse(generate_api_secret('', ''));
271 $this->assertFalse(generate_api_secret(false, false)); 271 $this->assertFalse(generate_api_secret(false, false));
272 } 272 }
273
274 /**
275 * Test normalize_spaces.
276 */
277 public function testNormalizeSpace()
278 {
279 $str = ' foo bar is important ';
280 $this->assertEquals('foo bar is important', normalize_spaces($str));
281 $this->assertEquals('foo', normalize_spaces('foo'));
282 $this->assertEquals('', normalize_spaces(''));
283 $this->assertEquals(null, normalize_spaces(null));
284 }
273} 285}