aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorArthurHoaro <arthur@hoa.ro>2020-01-18 17:59:37 +0100
committerGitHub <noreply@github.com>2020-01-18 17:59:37 +0100
commit1001cc108fec759b076c9f6e12b71dea5d49fe9b (patch)
treed7b57a982129b2006d388c2f9d25d29eceee891a
parent12523aea3458504be91854ce2f37d4f5991ccea2 (diff)
parenta39acb2518f272df8a601af72c13eabe2719dcb8 (diff)
downloadShaarli-1001cc108fec759b076c9f6e12b71dea5d49fe9b.tar.gz
Shaarli-1001cc108fec759b076c9f6e12b71dea5d49fe9b.tar.zst
Shaarli-1001cc108fec759b076c9f6e12b71dea5d49fe9b.zip
Fix an issue with private tags and fix nomarkdown tag (#1399)
Fix an issue with private tags and fix nomarkdown tag
-rw-r--r--application/bookmark/BookmarkFileService.php9
-rw-r--r--application/formatter/BookmarkDefaultFormatter.php2
-rw-r--r--application/formatter/BookmarkFormatter.php35
-rw-r--r--application/formatter/BookmarkMarkdownFormatter.php8
-rw-r--r--application/formatter/FormatterFactory.php11
-rw-r--r--index.php39
-rw-r--r--tests/bookmark/BookmarkFileServiceTest.php41
-rw-r--r--tests/feed/FeedBuilderTest.php2
-rw-r--r--tests/formatter/BookmarkDefaultFormatterTest.php23
-rw-r--r--tests/formatter/BookmarkMarkdownFormatterTest.php2
-rw-r--r--tests/formatter/BookmarkRawFormatterTest.php2
-rw-r--r--tests/formatter/FormatterFactoryTest.php2
-rw-r--r--tests/netscape/BookmarkExportTest.php2
13 files changed, 145 insertions, 33 deletions
diff --git a/application/bookmark/BookmarkFileService.php b/application/bookmark/BookmarkFileService.php
index a56cc92b..9c59e139 100644
--- a/application/bookmark/BookmarkFileService.php
+++ b/application/bookmark/BookmarkFileService.php
@@ -8,6 +8,7 @@ use Exception;
8use Shaarli\Bookmark\Exception\BookmarkNotFoundException; 8use Shaarli\Bookmark\Exception\BookmarkNotFoundException;
9use Shaarli\Bookmark\Exception\EmptyDataStoreException; 9use Shaarli\Bookmark\Exception\EmptyDataStoreException;
10use Shaarli\Config\ConfigManager; 10use Shaarli\Config\ConfigManager;
11use Shaarli\Formatter\BookmarkMarkdownFormatter;
11use Shaarli\History; 12use Shaarli\History;
12use Shaarli\Legacy\LegacyLinkDB; 13use Shaarli\Legacy\LegacyLinkDB;
13use Shaarli\Legacy\LegacyUpdater; 14use Shaarli\Legacy\LegacyUpdater;
@@ -130,7 +131,7 @@ class BookmarkFileService implements BookmarkServiceInterface
130 } 131 }
131 132
132 if ($visibility === null) { 133 if ($visibility === null) {
133 $visibility = $this->isLoggedIn ? 'all' : 'public'; 134 $visibility = $this->isLoggedIn ? BookmarkFilter::$ALL : BookmarkFilter::$PUBLIC;
134 } 135 }
135 136
136 $bookmark = $this->bookmarks[$id]; 137 $bookmark = $this->bookmarks[$id];
@@ -287,9 +288,13 @@ class BookmarkFileService implements BookmarkServiceInterface
287 $caseMapping = []; 288 $caseMapping = [];
288 foreach ($bookmarks as $bookmark) { 289 foreach ($bookmarks as $bookmark) {
289 foreach ($bookmark->getTags() as $tag) { 290 foreach ($bookmark->getTags() as $tag) {
290 if (empty($tag) || (! $this->isLoggedIn && startsWith($tag, '.'))) { 291 if (empty($tag)
292 || (! $this->isLoggedIn && startsWith($tag, '.'))
293 || $tag === BookmarkMarkdownFormatter::NO_MD_TAG
294 ) {
291 continue; 295 continue;
292 } 296 }
297
293 // The first case found will be displayed. 298 // The first case found will be displayed.
294 if (!isset($caseMapping[strtolower($tag)])) { 299 if (!isset($caseMapping[strtolower($tag)])) {
295 $caseMapping[strtolower($tag)] = $tag; 300 $caseMapping[strtolower($tag)] = $tag;
diff --git a/application/formatter/BookmarkDefaultFormatter.php b/application/formatter/BookmarkDefaultFormatter.php
index 7550c556..c6c59064 100644
--- a/application/formatter/BookmarkDefaultFormatter.php
+++ b/application/formatter/BookmarkDefaultFormatter.php
@@ -34,7 +34,7 @@ class BookmarkDefaultFormatter extends BookmarkFormatter
34 */ 34 */
35 protected function formatTagList($bookmark) 35 protected function formatTagList($bookmark)
36 { 36 {
37 return escape($bookmark->getTags()); 37 return escape(parent::formatTagList($bookmark));
38 } 38 }
39 39
40 /** 40 /**
diff --git a/application/formatter/BookmarkFormatter.php b/application/formatter/BookmarkFormatter.php
index c82c3452..a80d83fc 100644
--- a/application/formatter/BookmarkFormatter.php
+++ b/application/formatter/BookmarkFormatter.php
@@ -20,6 +20,9 @@ abstract class BookmarkFormatter
20 */ 20 */
21 protected $conf; 21 protected $conf;
22 22
23 /** @var bool */
24 protected $isLoggedIn;
25
23 /** 26 /**
24 * @var array Additional parameters than can be used for specific formatting 27 * @var array Additional parameters than can be used for specific formatting
25 * e.g. index_url for Feed formatting 28 * e.g. index_url for Feed formatting
@@ -30,9 +33,10 @@ abstract class BookmarkFormatter
30 * LinkDefaultFormatter constructor. 33 * LinkDefaultFormatter constructor.
31 * @param ConfigManager $conf 34 * @param ConfigManager $conf
32 */ 35 */
33 public function __construct(ConfigManager $conf) 36 public function __construct(ConfigManager $conf, bool $isLoggedIn)
34 { 37 {
35 $this->conf = $conf; 38 $this->conf = $conf;
39 $this->isLoggedIn = $isLoggedIn;
36 } 40 }
37 41
38 /** 42 /**
@@ -172,7 +176,7 @@ abstract class BookmarkFormatter
172 */ 176 */
173 protected function formatTagList($bookmark) 177 protected function formatTagList($bookmark)
174 { 178 {
175 return $bookmark->getTags(); 179 return $this->filterTagList($bookmark->getTags());
176 } 180 }
177 181
178 /** 182 /**
@@ -184,7 +188,7 @@ abstract class BookmarkFormatter
184 */ 188 */
185 protected function formatTagString($bookmark) 189 protected function formatTagString($bookmark)
186 { 190 {
187 return implode(' ', $bookmark->getTags()); 191 return implode(' ', $this->formatTagList($bookmark));
188 } 192 }
189 193
190 /** 194 /**
@@ -253,4 +257,29 @@ abstract class BookmarkFormatter
253 } 257 }
254 return 0; 258 return 0;
255 } 259 }
260
261 /**
262 * Format tag list, e.g. remove private tags if the user is not logged in.
263 *
264 * @param array $tags
265 *
266 * @return array
267 */
268 protected function filterTagList(array $tags): array
269 {
270 if ($this->isLoggedIn === true) {
271 return $tags;
272 }
273
274 $out = [];
275 foreach ($tags as $tag) {
276 if (strpos($tag, '.') === 0) {
277 continue;
278 }
279
280 $out[] = $tag;
281 }
282
283 return $out;
284 }
256} 285}
diff --git a/application/formatter/BookmarkMarkdownFormatter.php b/application/formatter/BookmarkMarkdownFormatter.php
index 7797bfbf..077e5312 100644
--- a/application/formatter/BookmarkMarkdownFormatter.php
+++ b/application/formatter/BookmarkMarkdownFormatter.php
@@ -36,10 +36,12 @@ class BookmarkMarkdownFormatter extends BookmarkDefaultFormatter
36 * LinkMarkdownFormatter constructor. 36 * LinkMarkdownFormatter constructor.
37 * 37 *
38 * @param ConfigManager $conf instance 38 * @param ConfigManager $conf instance
39 * @param bool $isLoggedIn
39 */ 40 */
40 public function __construct(ConfigManager $conf) 41 public function __construct(ConfigManager $conf, bool $isLoggedIn)
41 { 42 {
42 parent::__construct($conf); 43 parent::__construct($conf, $isLoggedIn);
44
43 $this->parsedown = new \Parsedown(); 45 $this->parsedown = new \Parsedown();
44 $this->escape = $conf->get('security.markdown_escape', true); 46 $this->escape = $conf->get('security.markdown_escape', true);
45 $this->allowedProtocols = $conf->get('security.allowed_protocols', []); 47 $this->allowedProtocols = $conf->get('security.allowed_protocols', []);
@@ -79,7 +81,7 @@ class BookmarkMarkdownFormatter extends BookmarkDefaultFormatter
79 protected function formatTagList($bookmark) 81 protected function formatTagList($bookmark)
80 { 82 {
81 $out = parent::formatTagList($bookmark); 83 $out = parent::formatTagList($bookmark);
82 if (($pos = array_search(self::NO_MD_TAG, $out)) !== false) { 84 if ($this->isLoggedIn === false && ($pos = array_search(self::NO_MD_TAG, $out)) !== false) {
83 unset($out[$pos]); 85 unset($out[$pos]);
84 return array_values($out); 86 return array_values($out);
85 } 87 }
diff --git a/application/formatter/FormatterFactory.php b/application/formatter/FormatterFactory.php
index 0d2c0466..5f282f68 100644
--- a/application/formatter/FormatterFactory.php
+++ b/application/formatter/FormatterFactory.php
@@ -16,14 +16,19 @@ class FormatterFactory
16 /** @var ConfigManager instance */ 16 /** @var ConfigManager instance */
17 protected $conf; 17 protected $conf;
18 18
19 /** @var bool */
20 protected $isLoggedIn;
21
19 /** 22 /**
20 * FormatterFactory constructor. 23 * FormatterFactory constructor.
21 * 24 *
22 * @param ConfigManager $conf 25 * @param ConfigManager $conf
26 * @param bool $isLoggedIn
23 */ 27 */
24 public function __construct(ConfigManager $conf) 28 public function __construct(ConfigManager $conf, bool $isLoggedIn)
25 { 29 {
26 $this->conf = $conf; 30 $this->conf = $conf;
31 $this->isLoggedIn = $isLoggedIn;
27 } 32 }
28 33
29 /** 34 /**
@@ -33,7 +38,7 @@ class FormatterFactory
33 * 38 *
34 * @return BookmarkFormatter instance. 39 * @return BookmarkFormatter instance.
35 */ 40 */
36 public function getFormatter($type = null) 41 public function getFormatter(string $type = null)
37 { 42 {
38 $type = $type ? $type : $this->conf->get('formatter', 'default'); 43 $type = $type ? $type : $this->conf->get('formatter', 'default');
39 $className = '\\Shaarli\\Formatter\\Bookmark'. ucfirst($type) .'Formatter'; 44 $className = '\\Shaarli\\Formatter\\Bookmark'. ucfirst($type) .'Formatter';
@@ -41,6 +46,6 @@ class FormatterFactory
41 $className = '\\Shaarli\\Formatter\\BookmarkDefaultFormatter'; 46 $className = '\\Shaarli\\Formatter\\BookmarkDefaultFormatter';
42 } 47 }
43 48
44 return new $className($this->conf); 49 return new $className($this->conf, $this->isLoggedIn);
45 } 50 }
46} 51}
diff --git a/index.php b/index.php
index 013b01af..a39fc762 100644
--- a/index.php
+++ b/index.php
@@ -70,6 +70,7 @@ use Shaarli\Bookmark\BookmarkFileService;
70use \Shaarli\Config\ConfigManager; 70use \Shaarli\Config\ConfigManager;
71use \Shaarli\Feed\CachedPage; 71use \Shaarli\Feed\CachedPage;
72use \Shaarli\Feed\FeedBuilder; 72use \Shaarli\Feed\FeedBuilder;
73use Shaarli\Formatter\BookmarkMarkdownFormatter;
73use Shaarli\Formatter\FormatterFactory; 74use Shaarli\Formatter\FormatterFactory;
74use \Shaarli\History; 75use \Shaarli\History;
75use \Shaarli\Languages; 76use \Shaarli\Languages;
@@ -351,7 +352,7 @@ function showDailyRSS($bookmarkService, $conf, $loginManager)
351 echo '<language>en-en</language>'; 352 echo '<language>en-en</language>';
352 echo '<copyright>'. $pageaddr .'</copyright>'. PHP_EOL; 353 echo '<copyright>'. $pageaddr .'</copyright>'. PHP_EOL;
353 354
354 $factory = new FormatterFactory($conf); 355 $factory = new FormatterFactory($conf, $loginManager->isLoggedIn());
355 $formatter = $factory->getFormatter(); 356 $formatter = $factory->getFormatter();
356 $formatter->addContextData('index_url', index_url($_SERVER)); 357 $formatter->addContextData('index_url', index_url($_SERVER));
357 // For each day. 358 // For each day.
@@ -441,7 +442,7 @@ function showDaily($pageBuilder, $bookmarkService, $conf, $pluginManager, $login
441 $linksToDisplay = []; 442 $linksToDisplay = [];
442 } 443 }
443 444
444 $factory = new FormatterFactory($conf); 445 $factory = new FormatterFactory($conf, $loginManager->isLoggedIn());
445 $formatter = $factory->getFormatter(); 446 $formatter = $factory->getFormatter();
446 // We pre-format some fields for proper output. 447 // We pre-format some fields for proper output.
447 foreach ($linksToDisplay as $key => $bookmark) { 448 foreach ($linksToDisplay as $key => $bookmark) {
@@ -630,7 +631,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM
630 631
631 // Get only bookmarks which have a thumbnail. 632 // Get only bookmarks which have a thumbnail.
632 // Note: we do not retrieve thumbnails here, the request is too heavy. 633 // Note: we do not retrieve thumbnails here, the request is too heavy.
633 $factory = new FormatterFactory($conf); 634 $factory = new FormatterFactory($conf, $loginManager->isLoggedIn());
634 $formatter = $factory->getFormatter(); 635 $formatter = $factory->getFormatter();
635 foreach ($links as $key => $link) { 636 foreach ($links as $key => $link) {
636 if ($link->getThumbnail() !== false) { 637 if ($link->getThumbnail() !== false) {
@@ -753,7 +754,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM
753 exit; 754 exit;
754 } 755 }
755 756
756 $factory = new FormatterFactory($conf); 757 $factory = new FormatterFactory($conf, $loginManager->isLoggedIn());
757 // Generate data. 758 // Generate data.
758 $feedGenerator = new FeedBuilder( 759 $feedGenerator = new FeedBuilder(
759 $bookmarkService, 760 $bookmarkService,
@@ -1183,7 +1184,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM
1183 $bookmarkService->addOrSet($bookmark, false); 1184 $bookmarkService->addOrSet($bookmark, false);
1184 1185
1185 // To preserve backward compatibility with 3rd parties, plugins still use arrays 1186 // To preserve backward compatibility with 3rd parties, plugins still use arrays
1186 $factory = new FormatterFactory($conf); 1187 $factory = new FormatterFactory($conf, $loginManager->isLoggedIn());
1187 $formatter = $factory->getFormatter('raw'); 1188 $formatter = $factory->getFormatter('raw');
1188 $data = $formatter->format($bookmark); 1189 $data = $formatter->format($bookmark);
1189 $pluginManager->executeHooks('save_link', $data); 1190 $pluginManager->executeHooks('save_link', $data);
@@ -1230,7 +1231,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM
1230 if (!count($ids)) { 1231 if (!count($ids)) {
1231 die('no id provided'); 1232 die('no id provided');
1232 } 1233 }
1233 $factory = new FormatterFactory($conf); 1234 $factory = new FormatterFactory($conf, $loginManager->isLoggedIn());
1234 $formatter = $factory->getFormatter('raw'); 1235 $formatter = $factory->getFormatter('raw');
1235 foreach ($ids as $id) { 1236 foreach ($ids as $id) {
1236 $id = (int) escape($id); 1237 $id = (int) escape($id);
@@ -1286,7 +1287,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM
1286 } else { 1287 } else {
1287 $private = $_GET['newVisibility'] === 'private'; 1288 $private = $_GET['newVisibility'] === 'private';
1288 } 1289 }
1289 $factory = new FormatterFactory($conf); 1290 $factory = new FormatterFactory($conf, $loginManager->isLoggedIn());
1290 $formatter = $factory->getFormatter('raw'); 1291 $formatter = $factory->getFormatter('raw');
1291 foreach ($ids as $id) { 1292 foreach ($ids as $id) {
1292 $id = (int) escape($id); 1293 $id = (int) escape($id);
@@ -1324,14 +1325,18 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM
1324 exit; 1325 exit;
1325 } 1326 }
1326 1327
1327 $factory = new FormatterFactory($conf); 1328 $factory = new FormatterFactory($conf, $loginManager->isLoggedIn());
1328 $formatter = $factory->getFormatter('raw'); 1329 $formatter = $factory->getFormatter('raw');
1329 $formattedLink = $formatter->format($link); 1330 $formattedLink = $formatter->format($link);
1331 $tags = $bookmarkService->bookmarksCountPerTag();
1332 if ($conf->get('formatter') === 'markdown') {
1333 $tags[BookmarkMarkdownFormatter::NO_MD_TAG] = 1;
1334 }
1330 $data = array( 1335 $data = array(
1331 'link' => $formattedLink, 1336 'link' => $formattedLink,
1332 'link_is_new' => false, 1337 'link_is_new' => false,
1333 'http_referer' => (isset($_SERVER['HTTP_REFERER']) ? escape($_SERVER['HTTP_REFERER']) : ''), 1338 'http_referer' => (isset($_SERVER['HTTP_REFERER']) ? escape($_SERVER['HTTP_REFERER']) : ''),
1334 'tags' => $bookmarkService->bookmarksCountPerTag(), 1339 'tags' => $tags,
1335 ); 1340 );
1336 $pluginManager->executeHooks('render_editlink', $data); 1341 $pluginManager->executeHooks('render_editlink', $data);
1337 1342
@@ -1391,17 +1396,21 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM
1391 'private' => $private, 1396 'private' => $private,
1392 ]; 1397 ];
1393 } else { 1398 } else {
1394 $factory = new FormatterFactory($conf); 1399 $factory = new FormatterFactory($conf, $loginManager->isLoggedIn());
1395 $formatter = $factory->getFormatter('raw'); 1400 $formatter = $factory->getFormatter('raw');
1396 $link = $formatter->format($bookmark); 1401 $link = $formatter->format($bookmark);
1397 } 1402 }
1398 1403
1404 $tags = $bookmarkService->bookmarksCountPerTag();
1405 if ($conf->get('formatter') === 'markdown') {
1406 $tags[BookmarkMarkdownFormatter::NO_MD_TAG] = 1;
1407 }
1399 $data = [ 1408 $data = [
1400 'link' => $link, 1409 'link' => $link,
1401 'link_is_new' => $link_is_new, 1410 'link_is_new' => $link_is_new,
1402 'http_referer' => (isset($_SERVER['HTTP_REFERER']) ? escape($_SERVER['HTTP_REFERER']) : ''), 1411 'http_referer' => (isset($_SERVER['HTTP_REFERER']) ? escape($_SERVER['HTTP_REFERER']) : ''),
1403 'source' => (isset($_GET['source']) ? $_GET['source'] : ''), 1412 'source' => (isset($_GET['source']) ? $_GET['source'] : ''),
1404 'tags' => $bookmarkService->bookmarksCountPerTag(), 1413 'tags' => $tags,
1405 'default_private_links' => $conf->get('privacy.default_private_links', false), 1414 'default_private_links' => $conf->get('privacy.default_private_links', false),
1406 ]; 1415 ];
1407 $pluginManager->executeHooks('render_editlink', $data); 1416 $pluginManager->executeHooks('render_editlink', $data);
@@ -1451,7 +1460,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM
1451 } 1460 }
1452 1461
1453 try { 1462 try {
1454 $factory = new FormatterFactory($conf); 1463 $factory = new FormatterFactory($conf, $loginManager->isLoggedIn());
1455 $formatter = $factory->getFormatter('raw'); 1464 $formatter = $factory->getFormatter('raw');
1456 $PAGE->assign( 1465 $PAGE->assign(
1457 'links', 1466 'links',
@@ -1633,7 +1642,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM
1633 $bookmark->setThumbnail($thumbnailer->get($bookmark->getUrl())); 1642 $bookmark->setThumbnail($thumbnailer->get($bookmark->getUrl()));
1634 $bookmarkService->set($bookmark); 1643 $bookmarkService->set($bookmark);
1635 1644
1636 $factory = new FormatterFactory($conf); 1645 $factory = new FormatterFactory($conf, $loginManager->isLoggedIn());
1637 echo json_encode($factory->getFormatter('raw')->format($bookmark)); 1646 echo json_encode($factory->getFormatter('raw')->format($bookmark));
1638 exit; 1647 exit;
1639 } 1648 }
@@ -1655,7 +1664,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM
1655 */ 1664 */
1656function buildLinkList($PAGE, $linkDb, $conf, $pluginManager, $loginManager) 1665function buildLinkList($PAGE, $linkDb, $conf, $pluginManager, $loginManager)
1657{ 1666{
1658 $factory = new FormatterFactory($conf); 1667 $factory = new FormatterFactory($conf, $loginManager->isLoggedIn());
1659 $formatter = $factory->getFormatter(); 1668 $formatter = $factory->getFormatter();
1660 1669
1661 // Used in templates 1670 // Used in templates
diff --git a/tests/bookmark/BookmarkFileServiceTest.php b/tests/bookmark/BookmarkFileServiceTest.php
index 1b438a7f..4900d41d 100644
--- a/tests/bookmark/BookmarkFileServiceTest.php
+++ b/tests/bookmark/BookmarkFileServiceTest.php
@@ -12,6 +12,7 @@ use ReflectionClass;
12use Shaarli; 12use Shaarli;
13use Shaarli\Bookmark\Exception\BookmarkNotFoundException; 13use Shaarli\Bookmark\Exception\BookmarkNotFoundException;
14use Shaarli\Config\ConfigManager; 14use Shaarli\Config\ConfigManager;
15use Shaarli\Formatter\BookmarkMarkdownFormatter;
15use Shaarli\History; 16use Shaarli\History;
16 17
17/** 18/**
@@ -1026,6 +1027,46 @@ class BookmarkFileServiceTest extends TestCase
1026 } 1027 }
1027 1028
1028 /** 1029 /**
1030 * Test linksCountPerTag public tags with filter.
1031 * Equal occurrences should be sorted alphabetically.
1032 */
1033 public function testCountTagsNoMarkdown()
1034 {
1035 $expected = [
1036 'cartoon' => 3,
1037 'dev' => 2,
1038 'tag1' => 1,
1039 'tag2' => 1,
1040 'tag3' => 1,
1041 'tag4' => 1,
1042 'web' => 4,
1043 'gnu' => 2,
1044 'hashtag' => 2,
1045 'sTuff' => 2,
1046 '-exclude' => 1,
1047 '.hidden' => 1,
1048 'Mercurial' => 1,
1049 'css' => 1,
1050 'free' => 1,
1051 'html' => 1,
1052 'media' => 1,
1053 'newTagToCount' => 1,
1054 'samba' => 1,
1055 'software' => 1,
1056 'stallman' => 1,
1057 'ut' => 1,
1058 'w3c' => 1,
1059 ];
1060 $bookmark = new Bookmark();
1061 $bookmark->setTags(['newTagToCount', BookmarkMarkdownFormatter::NO_MD_TAG]);
1062 $this->privateLinkDB->add($bookmark);
1063
1064 $tags = $this->privateLinkDB->bookmarksCountPerTag();
1065
1066 $this->assertEquals($expected, $tags, var_export($tags, true));
1067 }
1068
1069 /**
1029 * Allows to test LinkDB's private methods 1070 * Allows to test LinkDB's private methods
1030 * 1071 *
1031 * @see 1072 * @see
diff --git a/tests/feed/FeedBuilderTest.php b/tests/feed/FeedBuilderTest.php
index a43ff672..54671891 100644
--- a/tests/feed/FeedBuilderTest.php
+++ b/tests/feed/FeedBuilderTest.php
@@ -51,7 +51,7 @@ class FeedBuilderTest extends \PHPUnit\Framework\TestCase
51 $refLinkDB = new \ReferenceLinkDB(); 51 $refLinkDB = new \ReferenceLinkDB();
52 $refLinkDB->write(self::$testDatastore); 52 $refLinkDB->write(self::$testDatastore);
53 $history = new History('sandbox/history.php'); 53 $history = new History('sandbox/history.php');
54 $factory = new FormatterFactory($conf); 54 $factory = new FormatterFactory($conf, true);
55 self::$formatter = $factory->getFormatter(); 55 self::$formatter = $factory->getFormatter();
56 self::$bookmarkService = new BookmarkFileService($conf, $history, true); 56 self::$bookmarkService = new BookmarkFileService($conf, $history, true);
57 57
diff --git a/tests/formatter/BookmarkDefaultFormatterTest.php b/tests/formatter/BookmarkDefaultFormatterTest.php
index fe42a208..382a560e 100644
--- a/tests/formatter/BookmarkDefaultFormatterTest.php
+++ b/tests/formatter/BookmarkDefaultFormatterTest.php
@@ -29,7 +29,7 @@ class BookmarkDefaultFormatterTest extends TestCase
29 { 29 {
30 copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php'); 30 copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php');
31 $this->conf = new ConfigManager(self::$testConf); 31 $this->conf = new ConfigManager(self::$testConf);
32 $this->formatter = new BookmarkDefaultFormatter($this->conf); 32 $this->formatter = new BookmarkDefaultFormatter($this->conf, true);
33 } 33 }
34 34
35 /** 35 /**
@@ -153,4 +153,25 @@ class BookmarkDefaultFormatterTest extends TestCase
153 $link['description'] 153 $link['description']
154 ); 154 );
155 } 155 }
156
157 /**
158 * Make sure that private tags are properly filtered out when the user is logged out.
159 */
160 public function testFormatTagListRemovePrivate(): void
161 {
162 $this->formatter = new BookmarkDefaultFormatter($this->conf, false);
163
164 $bookmark = new Bookmark();
165 $bookmark->setId($id = 11);
166 $bookmark->setTags($tags = ['bookmark', '.private', 'othertag']);
167
168 $link = $this->formatter->format($bookmark);
169
170 unset($tags[1]);
171 $tags = array_values($tags);
172
173 $this->assertSame(11, $link['id']);
174 $this->assertSame($tags, $link['taglist']);
175 $this->assertSame(implode(' ', $tags), $link['tags']);
176 }
156} 177}
diff --git a/tests/formatter/BookmarkMarkdownFormatterTest.php b/tests/formatter/BookmarkMarkdownFormatterTest.php
index 0ca7f802..f1f12c04 100644
--- a/tests/formatter/BookmarkMarkdownFormatterTest.php
+++ b/tests/formatter/BookmarkMarkdownFormatterTest.php
@@ -29,7 +29,7 @@ class BookmarkMarkdownFormatterTest extends TestCase
29 { 29 {
30 copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php'); 30 copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php');
31 $this->conf = new ConfigManager(self::$testConf); 31 $this->conf = new ConfigManager(self::$testConf);
32 $this->formatter = new BookmarkMarkdownFormatter($this->conf); 32 $this->formatter = new BookmarkMarkdownFormatter($this->conf, true);
33 } 33 }
34 34
35 /** 35 /**
diff --git a/tests/formatter/BookmarkRawFormatterTest.php b/tests/formatter/BookmarkRawFormatterTest.php
index ceb6fb73..4491b035 100644
--- a/tests/formatter/BookmarkRawFormatterTest.php
+++ b/tests/formatter/BookmarkRawFormatterTest.php
@@ -29,7 +29,7 @@ class BookmarkRawFormatterTest extends TestCase
29 { 29 {
30 copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php'); 30 copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php');
31 $this->conf = new ConfigManager(self::$testConf); 31 $this->conf = new ConfigManager(self::$testConf);
32 $this->formatter = new BookmarkRawFormatter($this->conf); 32 $this->formatter = new BookmarkRawFormatter($this->conf, true);
33 } 33 }
34 34
35 /** 35 /**
diff --git a/tests/formatter/FormatterFactoryTest.php b/tests/formatter/FormatterFactoryTest.php
index 317c0b2d..5adf3ffd 100644
--- a/tests/formatter/FormatterFactoryTest.php
+++ b/tests/formatter/FormatterFactoryTest.php
@@ -28,7 +28,7 @@ class FormatterFactoryTest extends TestCase
28 { 28 {
29 copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php'); 29 copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php');
30 $this->conf = new ConfigManager(self::$testConf); 30 $this->conf = new ConfigManager(self::$testConf);
31 $this->factory = new FormatterFactory($this->conf); 31 $this->factory = new FormatterFactory($this->conf, true);
32 } 32 }
33 33
34 /** 34 /**
diff --git a/tests/netscape/BookmarkExportTest.php b/tests/netscape/BookmarkExportTest.php
index 011d19ac..6c948bba 100644
--- a/tests/netscape/BookmarkExportTest.php
+++ b/tests/netscape/BookmarkExportTest.php
@@ -46,7 +46,7 @@ class BookmarkExportTest extends \PHPUnit\Framework\TestCase
46 self::$refDb->write(self::$testDatastore); 46 self::$refDb->write(self::$testDatastore);
47 $history = new History('sandbox/history.php'); 47 $history = new History('sandbox/history.php');
48 self::$bookmarkService = new BookmarkFileService($conf, $history, true); 48 self::$bookmarkService = new BookmarkFileService($conf, $history, true);
49 $factory = new FormatterFactory($conf); 49 $factory = new FormatterFactory($conf, true);
50 self::$formatter = $factory->getFormatter('raw'); 50 self::$formatter = $factory->getFormatter('raw');
51 } 51 }
52 52