From bee33239ed444f9724422fe5234cd79997500519 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Thu, 23 Jan 2020 22:26:38 +0100 Subject: Fix all relative link to work with new URL --- index.php | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index b53b16fe..d3cb33d3 100644 --- a/index.php +++ b/index.php @@ -979,7 +979,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM if ($oldhash != $conf->get('credentials.hash')) { echo ''; + .'");document.location=\'./?do=changepasswd\';'; exit; } // Save new password @@ -1002,10 +1002,10 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM ); // TODO: do not handle exceptions/errors in JS. - echo ''; + echo ''; exit; } - echo ''; + echo ''; exit; } else { // show the change password form. @@ -1051,7 +1051,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM ) { $_SESSION['warnings'][] = t( 'You have enabled or changed thumbnails mode. ' - .'Please synchronize them.' + .'Please synchronize them.' ); } $conf->set('thumbnails.mode', $thumbnailsMode); @@ -1067,10 +1067,10 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM ); // TODO: do not handle exceptions/errors in JS. - echo ''; + echo ''; exit; } - echo ''; + echo ''; exit; } else { // Show the configuration form. @@ -1130,7 +1130,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM } $bookmarkService->save(); $delete = empty($_POST['totag']); - $redirect = $delete ? 'do=changetag' : 'searchtags='. urlencode(escape($_POST['totag'])); + $redirect = $delete ? './do=changetag' : 'searchtags='. urlencode(escape($_POST['totag'])); $alert = $delete ? sprintf(t('The tag was removed from %d link.', 'The tag was removed from %d bookmarks.', $count), $count) : sprintf(t('The tag was renamed in %d link.', 'The tag was renamed in %d bookmarks.', $count), $count); @@ -1519,7 +1519,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM ), get_max_upload_size(ini_get('post_max_size'), ini_get('upload_max_filesize')) ); - echo ''; + echo ''; exit; } if (! $sessionManager->checkToken($_POST['token'])) { @@ -1532,7 +1532,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM $conf, $history ); - echo ''; exit; } @@ -1587,12 +1587,12 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // TODO: do not handle exceptions/errors in JS. echo ''; exit; } - header('Location: ?do='. Router::$PAGE_PLUGINSADMIN); + header('Location: ./?do='. Router::$PAGE_PLUGINSADMIN); exit; } -- cgit v1.2.3 From 485b168a9677d160b0c0426e4f282b9bd0c632c1 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sun, 26 Jan 2020 11:15:15 +0100 Subject: Process picwall rendering through Slim controller + UT --- index.php | 33 ++------------------------------- 1 file changed, 2 insertions(+), 31 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index d3cb33d3..c639a3bc 100644 --- a/index.php +++ b/index.php @@ -610,37 +610,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // -------- Picture wall if ($targetPage == Router::$PAGE_PICWALL) { - $PAGE->assign('pagetitle', t('Picture wall') .' - '. $conf->get('general.title', 'Shaarli')); - if (! $conf->get('thumbnails.mode', Thumbnailer::MODE_NONE) === Thumbnailer::MODE_NONE) { - $PAGE->assign('linksToDisplay', []); - $PAGE->renderPage('picwall'); - exit; - } - - // Optionally filter the results: - $links = $bookmarkService->search($_GET); - $linksToDisplay = []; - - // Get only bookmarks which have a thumbnail. - // Note: we do not retrieve thumbnails here, the request is too heavy. - $factory = new FormatterFactory($conf, $loginManager->isLoggedIn()); - $formatter = $factory->getFormatter(); - foreach ($links as $key => $link) { - if ($link->getThumbnail() !== false) { - $linksToDisplay[] = $formatter->format($link); - } - } - - $data = [ - 'linksToDisplay' => $linksToDisplay, - ]; - $pluginManager->executeHooks('render_picwall', $data, ['loggedin' => $loginManager->isLoggedIn()]); - - foreach ($data as $key => $value) { - $PAGE->assign($key, $value); - } - - $PAGE->renderPage('picwall'); + header('Location: ./picture-wall'); exit; } @@ -1944,6 +1914,7 @@ $app->group('/api/v1', function () { $app->group('', function () { $this->get('/login', '\Shaarli\Front\Controller\LoginController:index')->setName('login'); + $this->get('/picture-wall', '\Shaarli\Front\Controller\PictureWallController:index')->setName('picwall'); })->add('\Shaarli\Front\ShaarliMiddleware'); $response = $app->run(true); -- cgit v1.2.3 From b0428aa9b02b058b72c40b6e8dc2298d55bf692f Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Thu, 23 Jan 2020 21:13:41 +0100 Subject: Migrate cache purge function to a proper class And update dependencies and tests. Note that SESSION['tags'] has been removed a log ago --- index.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index c639a3bc..73d9e022 100644 --- a/index.php +++ b/index.php @@ -53,7 +53,6 @@ require_once __DIR__ . '/vendor/autoload.php'; // Shaarli library require_once 'application/bookmark/LinkUtils.php'; require_once 'application/config/ConfigPlugin.php'; -require_once 'application/feed/Cache.php'; require_once 'application/http/HttpUtils.php'; require_once 'application/http/UrlUtils.php'; require_once 'application/updater/UpdaterUtils.php'; @@ -78,6 +77,7 @@ use Shaarli\Languages; use Shaarli\Netscape\NetscapeBookmarkUtils; use Shaarli\Plugin\PluginManager; use Shaarli\Render\PageBuilder; +use Shaarli\Render\PageCacheManager; use Shaarli\Render\ThemeUtils; use Shaarli\Router; use Shaarli\Security\LoginManager; @@ -530,6 +530,7 @@ function showLinkList($PAGE, $linkDb, $conf, $pluginManager, $loginManager) */ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionManager, $loginManager) { + $pageCacheManager = new PageCacheManager($conf->get('resource.page_cache')); $updater = new Updater( UpdaterUtils::read_updates_file($conf->get('resource.updates')), $bookmarkService, @@ -543,6 +544,8 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM $conf->get('resource.updates'), $updater->getDoneUpdates() ); + + $pageCacheManager->invalidateCaches(); } } catch (Exception $e) { die($e->getMessage()); @@ -1029,7 +1032,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM try { $conf->write($loginManager->isLoggedIn()); $history->updateSettings(); - invalidateCaches($conf->get('resource.page_cache')); + $pageCacheManager->invalidateCaches(); } catch (Exception $e) { error_log( 'ERROR while writing config file after configuration update.' . PHP_EOL . @@ -1914,6 +1917,7 @@ $app->group('/api/v1', function () { $app->group('', function () { $this->get('/login', '\Shaarli\Front\Controller\LoginController:index')->setName('login'); + $this->get('/logout', '\Shaarli\Front\Controller\LogoutController:index')->setName('logout'); $this->get('/picture-wall', '\Shaarli\Front\Controller\PictureWallController:index')->setName('picwall'); })->add('\Shaarli\Front\ShaarliMiddleware'); -- cgit v1.2.3 From 8e47af2b3620c920116ec056173277c039163ec1 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Thu, 23 Jan 2020 21:52:03 +0100 Subject: Process logout through Slim controller --- index.php | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index 73d9e022..57e13d4e 100644 --- a/index.php +++ b/index.php @@ -604,10 +604,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM } // -------- User wants to logout. if (isset($_SERVER['QUERY_STRING']) && startsWith($_SERVER['QUERY_STRING'], 'do=logout')) { - invalidateCaches($conf->get('resource.page_cache')); - $sessionManager->logout(); - setcookie(LoginManager::$STAY_SIGNED_IN_COOKIE, 'false', 0, WEB_PATH); - header('Location: ?'); + header('Location: ./logout'); exit; } @@ -1894,7 +1891,7 @@ if (isset($_SERVER['QUERY_STRING']) && startsWith($_SERVER['QUERY_STRING'], 'do= exit; } -$containerBuilder = new ContainerBuilder($conf, $sessionManager, $loginManager); +$containerBuilder = new ContainerBuilder($conf, $sessionManager, $loginManager, WEB_PATH); $container = $containerBuilder->build(); $app = new App($container); -- cgit v1.2.3 From 03340c18ead651ef9e11f883745695f2edafbae3 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Tue, 12 May 2020 12:44:48 +0200 Subject: Slim router: handle add tag route --- index.php | 1 + 1 file changed, 1 insertion(+) (limited to 'index.php') diff --git a/index.php b/index.php index 57e13d4e..a42c844a 100644 --- a/index.php +++ b/index.php @@ -1916,6 +1916,7 @@ $app->group('', function () { $this->get('/login', '\Shaarli\Front\Controller\LoginController:index')->setName('login'); $this->get('/logout', '\Shaarli\Front\Controller\LogoutController:index')->setName('logout'); $this->get('/picture-wall', '\Shaarli\Front\Controller\PictureWallController:index')->setName('picwall'); + $this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\TagController:addTag')->setName('add-tag'); })->add('\Shaarli\Front\ShaarliMiddleware'); $response = $app->run(true); -- cgit v1.2.3 From c266a89d0fbb0d60d2d7df0ec171b7cb022224f6 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sun, 26 Jan 2020 14:35:25 +0100 Subject: Process tag cloud page through Slim controller --- index.php | 45 ++------------------------------------------- 1 file changed, 2 insertions(+), 43 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index a42c844a..83f1264f 100644 --- a/index.php +++ b/index.php @@ -616,49 +616,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // -------- Tag cloud if ($targetPage == Router::$PAGE_TAGCLOUD) { - $visibility = ! empty($_SESSION['visibility']) ? $_SESSION['visibility'] : ''; - $filteringTags = isset($_GET['searchtags']) ? explode(' ', $_GET['searchtags']) : []; - $tags = $bookmarkService->bookmarksCountPerTag($filteringTags, $visibility); - - // We sort tags alphabetically, then choose a font size according to count. - // First, find max value. - $maxcount = 0; - foreach ($tags as $value) { - $maxcount = max($maxcount, $value); - } - - alphabetical_sort($tags, false, true); - - $logMaxCount = $maxcount > 1 ? log($maxcount, 30) : 1; - $tagList = array(); - foreach ($tags as $key => $value) { - if (in_array($key, $filteringTags)) { - continue; - } - // Tag font size scaling: - // default 15 and 30 logarithm bases affect scaling, - // 2.2 and 0.8 are arbitrary font sizes in em. - $size = log($value, 15) / $logMaxCount * 2.2 + 0.8; - $tagList[$key] = array( - 'count' => $value, - 'size' => number_format($size, 2, '.', ''), - ); - } - - $searchTags = implode(' ', escape($filteringTags)); - $data = array( - 'search_tags' => $searchTags, - 'tags' => $tagList, - ); - $pluginManager->executeHooks('render_tagcloud', $data, array('loggedin' => $loginManager->isLoggedIn())); - - foreach ($data as $key => $value) { - $PAGE->assign($key, $value); - } - - $searchTags = ! empty($searchTags) ? $searchTags .' - ' : ''; - $PAGE->assign('pagetitle', $searchTags. t('Tag cloud') .' - '. $conf->get('general.title', 'Shaarli')); - $PAGE->renderPage('tag.cloud'); + header('Location: ./tag-cloud'); exit; } @@ -1916,6 +1874,7 @@ $app->group('', function () { $this->get('/login', '\Shaarli\Front\Controller\LoginController:index')->setName('login'); $this->get('/logout', '\Shaarli\Front\Controller\LogoutController:index')->setName('logout'); $this->get('/picture-wall', '\Shaarli\Front\Controller\PictureWallController:index')->setName('picwall'); + $this->get('/tag-cloud', '\Shaarli\Front\Controller\TagCloudController:index')->setName('tagcloud'); $this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\TagController:addTag')->setName('add-tag'); })->add('\Shaarli\Front\ShaarliMiddleware'); -- cgit v1.2.3 From 72caf4e84c412ab6a4181b83a96dbef8ebb3c65a Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 16 May 2020 12:55:29 +0200 Subject: Working version before optimization --- index.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index 83f1264f..423a68f4 100644 --- a/index.php +++ b/index.php @@ -852,7 +852,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // Show login screen, then redirect to ?post=... if (isset($_GET['post'])) { header( // Redirect to login page, then back to post link. - 'Location: /login?post='.urlencode($_GET['post']). + 'Location: ./login?post='.urlencode($_GET['post']). (!empty($_GET['title'])?'&title='.urlencode($_GET['title']):''). (!empty($_GET['description'])?'&description='.urlencode($_GET['description']):''). (!empty($_GET['tags'])?'&tags='.urlencode($_GET['tags']):''). @@ -863,7 +863,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM showLinkList($PAGE, $bookmarkService, $conf, $pluginManager, $loginManager); if (isset($_GET['edit_link'])) { - header('Location: /login?edit_link='. escape($_GET['edit_link'])); + header('Location: ./login?edit_link='. escape($_GET['edit_link'])); exit; } -- cgit v1.2.3 From c79473bd84ab5aba7836d2caaf61847cabaf1e53 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 16 May 2020 13:13:00 +0200 Subject: Handle tag filtering in the Bookmark service --- index.php | 5 ----- 1 file changed, 5 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index 423a68f4..bf7090e3 100644 --- a/index.php +++ b/index.php @@ -625,11 +625,6 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM $visibility = ! empty($_SESSION['visibility']) ? $_SESSION['visibility'] : ''; $filteringTags = isset($_GET['searchtags']) ? explode(' ', $_GET['searchtags']) : []; $tags = $bookmarkService->bookmarksCountPerTag($filteringTags, $visibility); - foreach ($filteringTags as $tag) { - if (array_key_exists($tag, $tags)) { - unset($tags[$tag]); - } - } if (! empty($_GET['sort']) && $_GET['sort'] === 'alpha') { alphabetical_sort($tags, false, true); -- cgit v1.2.3 From 3772298ee7d8d0708f4e72798600accafa17740b Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 16 May 2020 13:33:39 +0200 Subject: Few optimizations and code readability for tag cloud controller --- index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'index.php') diff --git a/index.php b/index.php index bf7090e3..6ecb9a67 100644 --- a/index.php +++ b/index.php @@ -1869,7 +1869,7 @@ $app->group('', function () { $this->get('/login', '\Shaarli\Front\Controller\LoginController:index')->setName('login'); $this->get('/logout', '\Shaarli\Front\Controller\LogoutController:index')->setName('logout'); $this->get('/picture-wall', '\Shaarli\Front\Controller\PictureWallController:index')->setName('picwall'); - $this->get('/tag-cloud', '\Shaarli\Front\Controller\TagCloudController:index')->setName('tagcloud'); + $this->get('/tag-cloud', '\Shaarli\Front\Controller\TagCloudController:cloud')->setName('tagcloud'); $this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\TagController:addTag')->setName('add-tag'); })->add('\Shaarli\Front\ShaarliMiddleware'); -- cgit v1.2.3 From 60ae241251b753fc052e50ebd95277dfcb074cb0 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 16 May 2020 14:56:22 +0200 Subject: Process tag list page through Slim controller --- index.php | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index 6ecb9a67..89a1e581 100644 --- a/index.php +++ b/index.php @@ -622,28 +622,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // -------- Tag list if ($targetPage == Router::$PAGE_TAGLIST) { - $visibility = ! empty($_SESSION['visibility']) ? $_SESSION['visibility'] : ''; - $filteringTags = isset($_GET['searchtags']) ? explode(' ', $_GET['searchtags']) : []; - $tags = $bookmarkService->bookmarksCountPerTag($filteringTags, $visibility); - - if (! empty($_GET['sort']) && $_GET['sort'] === 'alpha') { - alphabetical_sort($tags, false, true); - } - - $searchTags = implode(' ', escape($filteringTags)); - $data = [ - 'search_tags' => $searchTags, - 'tags' => $tags, - ]; - $pluginManager->executeHooks('render_taglist', $data, ['loggedin' => $loginManager->isLoggedIn()]); - - foreach ($data as $key => $value) { - $PAGE->assign($key, $value); - } - - $searchTags = ! empty($searchTags) ? $searchTags .' - ' : ''; - $PAGE->assign('pagetitle', $searchTags . t('Tag list') .' - '. $conf->get('general.title', 'Shaarli')); - $PAGE->renderPage('tag.list'); + header('Location: ./tag-list'); exit; } @@ -1870,6 +1849,7 @@ $app->group('', function () { $this->get('/logout', '\Shaarli\Front\Controller\LogoutController:index')->setName('logout'); $this->get('/picture-wall', '\Shaarli\Front\Controller\PictureWallController:index')->setName('picwall'); $this->get('/tag-cloud', '\Shaarli\Front\Controller\TagCloudController:cloud')->setName('tagcloud'); + $this->get('/tag-list', '\Shaarli\Front\Controller\TagCloudController:list')->setName('taglist'); $this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\TagController:addTag')->setName('add-tag'); })->add('\Shaarli\Front\ShaarliMiddleware'); -- cgit v1.2.3 From 69e29ff65ef56b886748c58ba5b037cf217c4a1d Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sun, 17 May 2020 11:06:39 +0200 Subject: Process daily page through Slim controller --- index.php | 111 +++----------------------------------------------------------- 1 file changed, 4 insertions(+), 107 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index 89a1e581..f8337d79 100644 --- a/index.php +++ b/index.php @@ -398,112 +398,6 @@ function showDailyRSS($bookmarkService, $conf, $loginManager) exit; } -/** - * Show the 'Daily' page. - * - * @param PageBuilder $pageBuilder Template engine wrapper. - * @param BookmarkServiceInterface $bookmarkService instance. - * @param ConfigManager $conf Configuration Manager instance. - * @param PluginManager $pluginManager Plugin Manager instance. - * @param LoginManager $loginManager Login Manager instance - */ -function showDaily($pageBuilder, $bookmarkService, $conf, $pluginManager, $loginManager) -{ - if (isset($_GET['day'])) { - $day = $_GET['day']; - if ($day === date('Ymd', strtotime('now'))) { - $pageBuilder->assign('dayDesc', t('Today')); - } elseif ($day === date('Ymd', strtotime('-1 days'))) { - $pageBuilder->assign('dayDesc', t('Yesterday')); - } - } else { - $day = date('Ymd', strtotime('now')); // Today, in format YYYYMMDD. - $pageBuilder->assign('dayDesc', t('Today')); - } - - $days = $bookmarkService->days(); - $i = array_search($day, $days); - if ($i === false && count($days)) { - // no bookmarks for day, but at least one day with bookmarks - $i = count($days) - 1; - $day = $days[$i]; - } - $previousday = ''; - $nextday = ''; - - if ($i !== false) { - if ($i >= 1) { - $previousday = $days[$i - 1]; - } - if ($i < count($days) - 1) { - $nextday = $days[$i + 1]; - } - } - try { - $linksToDisplay = $bookmarkService->filterDay($day); - } catch (Exception $exc) { - error_log($exc); - $linksToDisplay = []; - } - - $factory = new FormatterFactory($conf, $loginManager->isLoggedIn()); - $formatter = $factory->getFormatter(); - // We pre-format some fields for proper output. - foreach ($linksToDisplay as $key => $bookmark) { - $linksToDisplay[$key] = $formatter->format($bookmark); - // This page is a bit specific, we need raw description to calculate the length - $linksToDisplay[$key]['formatedDescription'] = $linksToDisplay[$key]['description']; - $linksToDisplay[$key]['description'] = $bookmark->getDescription(); - } - - $dayDate = DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, $day.'_000000'); - $data = array( - 'pagetitle' => $conf->get('general.title') .' - '. format_date($dayDate, false), - 'linksToDisplay' => $linksToDisplay, - 'day' => $dayDate->getTimestamp(), - 'dayDate' => $dayDate, - 'previousday' => $previousday, - 'nextday' => $nextday, - ); - - /* Hook is called before column construction so that plugins don't have - to deal with columns. */ - $pluginManager->executeHooks('render_daily', $data, array('loggedin' => $loginManager->isLoggedIn())); - - /* We need to spread the articles on 3 columns. - I did not want to use a JavaScript lib like http://masonry.desandro.com/ - so I manually spread entries with a simple method: I roughly evaluate the - height of a div according to title and description length. - */ - $columns = array(array(), array(), array()); // Entries to display, for each column. - $fill = array(0, 0, 0); // Rough estimate of columns fill. - foreach ($data['linksToDisplay'] as $key => $bookmark) { - // Roughly estimate length of entry (by counting characters) - // Title: 30 chars = 1 line. 1 line is 30 pixels height. - // Description: 836 characters gives roughly 342 pixel height. - // This is not perfect, but it's usually OK. - $length = strlen($bookmark['title']) + (342 * strlen($bookmark['description'])) / 836; - if (! empty($bookmark['thumbnail'])) { - $length += 100; // 1 thumbnails roughly takes 100 pixels height. - } - // Then put in column which is the less filled: - $smallest = min($fill); // find smallest value in array. - $index = array_search($smallest, $fill); // find index of this smallest value. - array_push($columns[$index], $bookmark); // Put entry in this column. - $fill[$index] += $length; - } - - $data['cols'] = $columns; - - foreach ($data as $key => $value) { - $pageBuilder->assign($key, $value); - } - - $pageBuilder->assign('pagetitle', t('Daily') .' - '. $conf->get('general.title', 'Shaarli')); - $pageBuilder->renderPage('daily'); - exit; -} - /** * Renders the linklist * @@ -628,7 +522,8 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // Daily page. if ($targetPage == Router::$PAGE_DAILY) { - showDaily($PAGE, $bookmarkService, $conf, $pluginManager, $loginManager); + header('Location: ./daily'); + exit; } // ATOM and RSS feed. @@ -1850,6 +1745,8 @@ $app->group('', function () { $this->get('/picture-wall', '\Shaarli\Front\Controller\PictureWallController:index')->setName('picwall'); $this->get('/tag-cloud', '\Shaarli\Front\Controller\TagCloudController:cloud')->setName('tagcloud'); $this->get('/tag-list', '\Shaarli\Front\Controller\TagCloudController:list')->setName('taglist'); + $this->get('/daily', '\Shaarli\Front\Controller\DailyController:index')->setName('daily'); + $this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\TagController:addTag')->setName('add-tag'); })->add('\Shaarli\Front\ShaarliMiddleware'); -- cgit v1.2.3 From 07f99432b7b0c75935b758b20a30c3e0007bac13 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sun, 17 May 2020 11:11:57 +0200 Subject: Slim daily: support legacy query parameter --- index.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'index.php') diff --git a/index.php b/index.php index f8337d79..dbb76d3f 100644 --- a/index.php +++ b/index.php @@ -522,7 +522,8 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // Daily page. if ($targetPage == Router::$PAGE_DAILY) { - header('Location: ./daily'); + $dayParam = !empty($_GET['day']) ? '?day=' . escape($_GET['day']) : ''; + header('Location: ./daily'. $dayParam); exit; } -- cgit v1.2.3 From c4d5be53c2ae503c00da3cfe6b28d0ce9d2ca7f5 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sun, 17 May 2020 14:16:32 +0200 Subject: Process Daily RSS feed through Slim controller The daily RSS template has been entirely rewritten to handle the whole feed through the template engine. --- index.php | 103 ++------------------------------------------------------------ 1 file changed, 3 insertions(+), 100 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index dbb76d3f..9dc67c4b 100644 --- a/index.php +++ b/index.php @@ -300,104 +300,6 @@ if (!isset($_SESSION['tokens'])) { $_SESSION['tokens']=array(); // Token are attached to the session. } -/** - * Daily RSS feed: 1 RSS entry per day giving all the bookmarks on that day. - * Gives the last 7 days (which have bookmarks). - * This RSS feed cannot be filtered. - * - * @param BookmarkServiceInterface $bookmarkService - * @param ConfigManager $conf Configuration Manager instance - * @param LoginManager $loginManager LoginManager instance - */ -function showDailyRSS($bookmarkService, $conf, $loginManager) -{ - // Cache system - $query = $_SERVER['QUERY_STRING']; - $cache = new CachedPage( - $conf->get('config.PAGE_CACHE'), - page_url($_SERVER), - startsWith($query, 'do=dailyrss') && !$loginManager->isLoggedIn() - ); - $cached = $cache->cachedVersion(); - if (!empty($cached)) { - echo $cached; - exit; - } - - /* Some Shaarlies may have very few bookmarks, so we need to look - back in time until we have enough days ($nb_of_days). - */ - $nb_of_days = 7; // We take 7 days. - $today = date('Ymd'); - $days = array(); - - foreach ($bookmarkService->search() as $bookmark) { - $day = $bookmark->getCreated()->format('Ymd'); // Extract day (without time) - if (strcmp($day, $today) < 0) { - if (empty($days[$day])) { - $days[$day] = array(); - } - $days[$day][] = $bookmark; - } - - if (count($days) > $nb_of_days) { - break; // Have we collected enough days? - } - } - - // Build the RSS feed. - header('Content-Type: application/rss+xml; charset=utf-8'); - $pageaddr = escape(index_url($_SERVER)); - echo ''; - echo ''; - echo 'Daily - '. $conf->get('general.title') . ''; - echo ''. $pageaddr .''; - echo 'Daily shared bookmarks'; - echo 'en-en'; - echo ''. $pageaddr .''. PHP_EOL; - - $factory = new FormatterFactory($conf, $loginManager->isLoggedIn()); - $formatter = $factory->getFormatter(); - $formatter->addContextData('index_url', index_url($_SERVER)); - // For each day. - /** @var Bookmark[] $bookmarks */ - foreach ($days as $day => $bookmarks) { - $formattedBookmarks = []; - $dayDate = DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, $day.'_000000'); - $absurl = escape(index_url($_SERVER).'?do=daily&day='.$day); // Absolute URL of the corresponding "Daily" page. - - // We pre-format some fields for proper output. - foreach ($bookmarks as $key => $bookmark) { - $formattedBookmarks[$key] = $formatter->format($bookmark); - // This page is a bit specific, we need raw description to calculate the length - $formattedBookmarks[$key]['formatedDescription'] = $formattedBookmarks[$key]['description']; - $formattedBookmarks[$key]['description'] = $bookmark->getDescription(); - - if ($bookmark->isNote()) { - $link['url'] = index_url($_SERVER) . $bookmark->getUrl(); // make permalink URL absolute - } - } - - // Then build the HTML for this day: - $tpl = new RainTPL(); - $tpl->assign('title', $conf->get('general.title')); - $tpl->assign('daydate', $dayDate->getTimestamp()); - $tpl->assign('absurl', $absurl); - $tpl->assign('links', $formattedBookmarks); - $tpl->assign('rssdate', escape($dayDate->format(DateTime::RSS))); - $tpl->assign('hide_timestamps', $conf->get('privacy.hide_timestamps', false)); - $tpl->assign('index_url', $pageaddr); - $html = $tpl->draw('dailyrss', true); - - echo $html . PHP_EOL; - } - echo ''; - - $cache->cache(ob_get_contents()); - ob_end_flush(); - exit; -} - /** * Renders the linklist * @@ -424,7 +326,7 @@ function showLinkList($PAGE, $linkDb, $conf, $pluginManager, $loginManager) */ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionManager, $loginManager) { - $pageCacheManager = new PageCacheManager($conf->get('resource.page_cache')); + $pageCacheManager = new PageCacheManager($conf->get('resource.page_cache'), $loginManager->isLoggedIn()); $updater = new Updater( UpdaterUtils::read_updates_file($conf->get('resource.updates')), $bookmarkService, @@ -1715,7 +1617,7 @@ try { $linkDb = new BookmarkFileService($conf, $history, $loginManager->isLoggedIn()); if (isset($_SERVER['QUERY_STRING']) && startsWith($_SERVER['QUERY_STRING'], 'do=dailyrss')) { - showDailyRSS($linkDb, $conf, $loginManager); + header('Location: ./daily-rss'); exit; } @@ -1747,6 +1649,7 @@ $app->group('', function () { $this->get('/tag-cloud', '\Shaarli\Front\Controller\TagCloudController:cloud')->setName('tagcloud'); $this->get('/tag-list', '\Shaarli\Front\Controller\TagCloudController:list')->setName('taglist'); $this->get('/daily', '\Shaarli\Front\Controller\DailyController:index')->setName('daily'); + $this->get('/daily-rss', '\Shaarli\Front\Controller\DailyController:rss')->setName('dailyrss'); $this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\TagController:addTag')->setName('add-tag'); })->add('\Shaarli\Front\ShaarliMiddleware'); -- cgit v1.2.3 From c56a540c6ef211cd9cb0189ba09911bb77696f28 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Mon, 18 May 2020 12:21:43 +0200 Subject: Remove legacy handling of /add-tag route --- index.php | 40 +--------------------------------------- 1 file changed, 1 insertion(+), 39 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index 9dc67c4b..5d689ccb 100644 --- a/index.php +++ b/index.php @@ -486,45 +486,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // -------- User clicks on a tag in a link: The tag is added to the list of searched tags (searchtags=...) if (isset($_GET['addtag'])) { - // Get previous URL (http_referer) and add the tag to the searchtags parameters in query. - if (empty($_SERVER['HTTP_REFERER'])) { - // In case browser does not send HTTP_REFERER - header('Location: ?searchtags='.urlencode($_GET['addtag'])); - exit; - } - parse_str(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_QUERY), $params); - - // Prevent redirection loop - if (isset($params['addtag'])) { - unset($params['addtag']); - } - - // Check if this tag is already in the search query and ignore it if it is. - // Each tag is always separated by a space - if (isset($params['searchtags'])) { - $current_tags = explode(' ', $params['searchtags']); - } else { - $current_tags = array(); - } - $addtag = true; - foreach ($current_tags as $value) { - if ($value === $_GET['addtag']) { - $addtag = false; - break; - } - } - // Append the tag if necessary - if (empty($params['searchtags'])) { - $params['searchtags'] = trim($_GET['addtag']); - } elseif ($addtag) { - $params['searchtags'] = trim($params['searchtags']).' '.trim($_GET['addtag']); - } - - // We also remove page (keeping the same page has no sense, since the - // results are different) - unset($params['page']); - - header('Location: ?'.http_build_query($params)); + header('Location: ./add-tag/'. $_GET['addtag']); exit; } -- cgit v1.2.3 From f4929b1188b4bc5e92b925ebc44f5ad40bb1a4ed Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Mon, 18 May 2020 13:03:13 +0200 Subject: Make FeedBuilder instance creation independant of the request stack --- index.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index 5d689ccb..980e7704 100644 --- a/index.php +++ b/index.php @@ -452,15 +452,13 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM $feedGenerator = new FeedBuilder( $bookmarkService, $factory->getFormatter(), - $feedType, $_SERVER, - $_GET, $loginManager->isLoggedIn() ); $feedGenerator->setLocale(strtolower(setlocale(LC_COLLATE, 0))); $feedGenerator->setHideDates($conf->get('privacy.hide_timestamps') && !$loginManager->isLoggedIn()); $feedGenerator->setUsePermalinks(isset($_GET['permalinks']) || !$conf->get('feed.rss_permalinks')); - $data = $feedGenerator->buildData(); + $data = $feedGenerator->buildData($feedType, $_GET); // Process plugin hook. $pluginManager->executeHooks('render_feed', $data, array( -- cgit v1.2.3 From 7b2ba6ef820335df682fbe3dcfaceef3a62cf4a5 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Mon, 18 May 2020 17:17:36 +0200 Subject: RSS/ATOM feeds: process through Slim controller --- index.php | 41 +++-------------------------------------- 1 file changed, 3 insertions(+), 38 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index 980e7704..c3e0a5bf 100644 --- a/index.php +++ b/index.php @@ -432,45 +432,8 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // ATOM and RSS feed. if ($targetPage == Router::$PAGE_FEED_ATOM || $targetPage == Router::$PAGE_FEED_RSS) { $feedType = $targetPage == Router::$PAGE_FEED_RSS ? FeedBuilder::$FEED_RSS : FeedBuilder::$FEED_ATOM; - header('Content-Type: application/'. $feedType .'+xml; charset=utf-8'); - - // Cache system - $query = $_SERVER['QUERY_STRING']; - $cache = new CachedPage( - $conf->get('resource.page_cache'), - page_url($_SERVER), - startsWith($query, 'do='. $targetPage) && !$loginManager->isLoggedIn() - ); - $cached = $cache->cachedVersion(); - if (!empty($cached)) { - echo $cached; - exit; - } - $factory = new FormatterFactory($conf, $loginManager->isLoggedIn()); - // Generate data. - $feedGenerator = new FeedBuilder( - $bookmarkService, - $factory->getFormatter(), - $_SERVER, - $loginManager->isLoggedIn() - ); - $feedGenerator->setLocale(strtolower(setlocale(LC_COLLATE, 0))); - $feedGenerator->setHideDates($conf->get('privacy.hide_timestamps') && !$loginManager->isLoggedIn()); - $feedGenerator->setUsePermalinks(isset($_GET['permalinks']) || !$conf->get('feed.rss_permalinks')); - $data = $feedGenerator->buildData($feedType, $_GET); - - // Process plugin hook. - $pluginManager->executeHooks('render_feed', $data, array( - 'loggedin' => $loginManager->isLoggedIn(), - 'target' => $targetPage, - )); - - // Render the template. - $PAGE->assignAll($data); - $PAGE->renderPage('feed.'. $feedType); - $cache->cache(ob_get_contents()); - ob_end_flush(); + header('Location: ./feed-'. $feedType .'?'. http_build_query($_GET)); exit; } @@ -1610,6 +1573,8 @@ $app->group('', function () { $this->get('/tag-list', '\Shaarli\Front\Controller\TagCloudController:list')->setName('taglist'); $this->get('/daily', '\Shaarli\Front\Controller\DailyController:index')->setName('daily'); $this->get('/daily-rss', '\Shaarli\Front\Controller\DailyController:rss')->setName('dailyrss'); + $this->get('/feed-atom', '\Shaarli\Front\Controller\FeedController:atom')->setName('feedatom'); + $this->get('/feed-rss', '\Shaarli\Front\Controller\FeedController:rss')->setName('feedrss'); $this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\TagController:addTag')->setName('add-tag'); })->add('\Shaarli\Front\ShaarliMiddleware'); -- cgit v1.2.3 From 5ec4708ced1cdca01eddd7e52377ab5e5f8b3290 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Wed, 20 May 2020 10:47:20 +0200 Subject: Process OpenSearch controller through Slim Also it was missing on the default template feeds --- index.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index c3e0a5bf..04ec0d73 100644 --- a/index.php +++ b/index.php @@ -439,9 +439,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // Display opensearch plugin (XML) if ($targetPage == Router::$PAGE_OPENSEARCH) { - header('Content-Type: application/xml; charset=utf-8'); - $PAGE->assign('serverurl', index_url($_SERVER)); - $PAGE->renderPage('opensearch'); + header('Location: ./open-search'); exit; } @@ -1575,6 +1573,7 @@ $app->group('', function () { $this->get('/daily-rss', '\Shaarli\Front\Controller\DailyController:rss')->setName('dailyrss'); $this->get('/feed-atom', '\Shaarli\Front\Controller\FeedController:atom')->setName('feedatom'); $this->get('/feed-rss', '\Shaarli\Front\Controller\FeedController:rss')->setName('feedrss'); + $this->get('/open-search', '\Shaarli\Front\Controller\OpenSearchController:index')->setName('opensearch'); $this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\TagController:addTag')->setName('add-tag'); })->add('\Shaarli\Front\ShaarliMiddleware'); -- cgit v1.2.3 From 893f5159c64e5bcff505c8367e6dc22cc2a7b14d Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Wed, 20 May 2020 14:38:31 +0200 Subject: Process remove tag endpoint through Slim controller --- index.php | 31 ++----------------------------- 1 file changed, 2 insertions(+), 29 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index 04ec0d73..c0e0c66d 100644 --- a/index.php +++ b/index.php @@ -451,35 +451,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // -------- User clicks on a tag in result count: Remove the tag from the list of searched tags (searchtags=...) if (isset($_GET['removetag'])) { - // Get previous URL (http_referer) and remove the tag from the searchtags parameters in query. - if (empty($_SERVER['HTTP_REFERER'])) { - header('Location: ?'); - exit; - } - - // In case browser does not send HTTP_REFERER - parse_str(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_QUERY), $params); - - // Prevent redirection loop - if (isset($params['removetag'])) { - unset($params['removetag']); - } - - if (isset($params['searchtags'])) { - $tags = explode(' ', $params['searchtags']); - // Remove value from array $tags. - $tags = array_diff($tags, array($_GET['removetag'])); - $params['searchtags'] = implode(' ', $tags); - - if (empty($params['searchtags'])) { - unset($params['searchtags']); - } - - // We also remove page (keeping the same page has no sense, since - // the results are different) - unset($params['page']); - } - header('Location: ?'.http_build_query($params)); + header('Location: ./remove-tag/'. $_GET['removetag']); exit; } @@ -1576,6 +1548,7 @@ $app->group('', function () { $this->get('/open-search', '\Shaarli\Front\Controller\OpenSearchController:index')->setName('opensearch'); $this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\TagController:addTag')->setName('add-tag'); + $this->get('/remove-tag/{tag}', '\Shaarli\Front\Controller\TagController:removeTag')->setName('remove-tag'); })->add('\Shaarli\Front\ShaarliMiddleware'); $response = $app->run(true); -- cgit v1.2.3 From af290059d10319e76d1e7d78b592cab99c26d91a Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Fri, 22 May 2020 11:02:56 +0200 Subject: Process session filters through Slim controllers Including: - visibility - links per page - untagged only --- index.php | 57 ++++++++++++++++----------------------------------------- 1 file changed, 16 insertions(+), 41 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index c0e0c66d..a31cbeab 100644 --- a/index.php +++ b/index.php @@ -457,57 +457,19 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // -------- User wants to change the number of bookmarks per page (linksperpage=...) if (isset($_GET['linksperpage'])) { - if (is_numeric($_GET['linksperpage'])) { - $_SESSION['LINKS_PER_PAGE']=abs(intval($_GET['linksperpage'])); - } - - if (! empty($_SERVER['HTTP_REFERER'])) { - $location = generateLocation($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST'], array('linksperpage')); - } else { - $location = '?'; - } - header('Location: '. $location); + header('Location: ./links-per-page?nb='. $_GET['linksperpage']); exit; } // -------- User wants to see only private bookmarks (toggle) if (isset($_GET['visibility'])) { - if ($_GET['visibility'] === 'private') { - // Visibility not set or not already private, set private, otherwise reset it - if (empty($_SESSION['visibility']) || $_SESSION['visibility'] !== 'private') { - // See only private bookmarks - $_SESSION['visibility'] = 'private'; - } else { - unset($_SESSION['visibility']); - } - } elseif ($_GET['visibility'] === 'public') { - if (empty($_SESSION['visibility']) || $_SESSION['visibility'] !== 'public') { - // See only public bookmarks - $_SESSION['visibility'] = 'public'; - } else { - unset($_SESSION['visibility']); - } - } - - if (! empty($_SERVER['HTTP_REFERER'])) { - $location = generateLocation($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST'], array('visibility')); - } else { - $location = '?'; - } - header('Location: '. $location); + header('Location: ./visibility/'. $_GET['visibility']); exit; } // -------- User wants to see only untagged bookmarks (toggle) if (isset($_GET['untaggedonly'])) { - $_SESSION['untaggedonly'] = empty($_SESSION['untaggedonly']); - - if (! empty($_SERVER['HTTP_REFERER'])) { - $location = generateLocation($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST'], array('untaggedonly')); - } else { - $location = '?'; - } - header('Location: '. $location); + header('Location: ./untagged-only'); exit; } @@ -1549,6 +1511,19 @@ $app->group('', function () { $this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\TagController:addTag')->setName('add-tag'); $this->get('/remove-tag/{tag}', '\Shaarli\Front\Controller\TagController:removeTag')->setName('remove-tag'); + + $this + ->get('/links-per-page', '\Shaarli\Front\Controller\SessionFilterController:linksPerPage') + ->setName('filter-links-per-page') + ; + $this + ->get('/visibility/{visibility}', '\Shaarli\Front\Controller\SessionFilterController:visibility') + ->setName('visibility') + ; + $this + ->get('/untagged-only', '\Shaarli\Front\Controller\SessionFilterController:untaggedOnly') + ->setName('untagged-only') + ; })->add('\Shaarli\Front\ShaarliMiddleware'); $response = $app->run(true); -- cgit v1.2.3 From 2899ebb5b5e82890c877151f5c02045266ac9973 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Fri, 22 May 2020 13:20:31 +0200 Subject: Initialize admin Slim controllers - Reorganize visitor controllers - Fix redirection with Slim's requests base path - Fix daily links --- index.php | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index a31cbeab..4cd6d5f4 100644 --- a/index.php +++ b/index.php @@ -1498,30 +1498,33 @@ $app->group('/api/v1', function () { })->add('\Shaarli\Api\ApiMiddleware'); $app->group('', function () { - $this->get('/login', '\Shaarli\Front\Controller\LoginController:index')->setName('login'); - $this->get('/logout', '\Shaarli\Front\Controller\LogoutController:index')->setName('logout'); - $this->get('/picture-wall', '\Shaarli\Front\Controller\PictureWallController:index')->setName('picwall'); - $this->get('/tag-cloud', '\Shaarli\Front\Controller\TagCloudController:cloud')->setName('tagcloud'); - $this->get('/tag-list', '\Shaarli\Front\Controller\TagCloudController:list')->setName('taglist'); - $this->get('/daily', '\Shaarli\Front\Controller\DailyController:index')->setName('daily'); - $this->get('/daily-rss', '\Shaarli\Front\Controller\DailyController:rss')->setName('dailyrss'); - $this->get('/feed-atom', '\Shaarli\Front\Controller\FeedController:atom')->setName('feedatom'); - $this->get('/feed-rss', '\Shaarli\Front\Controller\FeedController:rss')->setName('feedrss'); - $this->get('/open-search', '\Shaarli\Front\Controller\OpenSearchController:index')->setName('opensearch'); - - $this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\TagController:addTag')->setName('add-tag'); - $this->get('/remove-tag/{tag}', '\Shaarli\Front\Controller\TagController:removeTag')->setName('remove-tag'); + /* -- PUBLIC --*/ + $this->get('/login', '\Shaarli\Front\Controller\Visitor\LoginController:index')->setName('login'); + $this->get('/picture-wall', '\Shaarli\Front\Controller\Visitor\PictureWallController:index')->setName('picwall'); + $this->get('/tag-cloud', '\Shaarli\Front\Controller\Visitor\TagCloudController:cloud')->setName('tagcloud'); + $this->get('/tag-list', '\Shaarli\Front\Controller\Visitor\TagCloudController:list')->setName('taglist'); + $this->get('/daily', '\Shaarli\Front\Controller\Visitor\DailyController:index')->setName('daily'); + $this->get('/daily-rss', '\Shaarli\Front\Controller\Visitor\DailyController:rss')->setName('dailyrss'); + $this->get('/feed-atom', '\Shaarli\Front\Controller\Visitor\FeedController:atom')->setName('feedatom'); + $this->get('/feed-rss', '\Shaarli\Front\Controller\Visitor\FeedController:rss')->setName('feedrss'); + $this->get('/open-search', '\Shaarli\Front\Controller\Visitor\OpenSearchController:index')->setName('opensearch'); + + $this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\Visitor\TagController:addTag')->setName('add-tag'); + $this->get('/remove-tag/{tag}', '\Shaarli\Front\Controller\Visitor\TagController:removeTag')->setName('remove-tag'); + + /* -- LOGGED IN -- */ + $this->get('/logout', '\Shaarli\Front\Controller\Admin\LogoutController:index')->setName('logout'); $this - ->get('/links-per-page', '\Shaarli\Front\Controller\SessionFilterController:linksPerPage') + ->get('/links-per-page', '\Shaarli\Front\Controller\Admin\SessionFilterController:linksPerPage') ->setName('filter-links-per-page') ; $this - ->get('/visibility/{visibility}', '\Shaarli\Front\Controller\SessionFilterController:visibility') + ->get('/visibility/{visibility}', '\Shaarli\Front\Controller\Admin\SessionFilterController:visibility') ->setName('visibility') ; $this - ->get('/untagged-only', '\Shaarli\Front\Controller\SessionFilterController:untaggedOnly') + ->get('/untagged-only', '\Shaarli\Front\Controller\Admin\SessionFilterController:untaggedOnly') ->setName('untagged-only') ; })->add('\Shaarli\Front\ShaarliMiddleware'); -- cgit v1.2.3 From ba43064ddb7771fc97df135a32f9b0d5e373dd36 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Fri, 22 May 2020 13:47:02 +0200 Subject: Process tools page through Slim controller --- index.php | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index 4cd6d5f4..f4c8b391 100644 --- a/index.php +++ b/index.php @@ -501,18 +501,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // -------- Display the Tools menu if requested (import/export/bookmarklet...) if ($targetPage == Router::$PAGE_TOOLS) { - $data = [ - 'pageabsaddr' => index_url($_SERVER), - 'sslenabled' => is_https($_SERVER), - ]; - $pluginManager->executeHooks('render_tools', $data); - - foreach ($data as $key => $value) { - $PAGE->assign($key, $value); - } - - $PAGE->assign('pagetitle', t('Tools') .' - '. $conf->get('general.title', 'Shaarli')); - $PAGE->renderPage('tools'); + header('Location: ./tools'); exit; } @@ -557,10 +546,10 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM ); // TODO: do not handle exceptions/errors in JS. - echo ''; + echo ''; exit; } - echo ''; + echo ''; exit; } else { // show the change password form. @@ -1514,6 +1503,7 @@ $app->group('', function () { /* -- LOGGED IN -- */ $this->get('/logout', '\Shaarli\Front\Controller\Admin\LogoutController:index')->setName('logout'); + $this->get('/tools', '\Shaarli\Front\Controller\Admin\ToolsController:index')->setName('tools'); $this ->get('/links-per-page', '\Shaarli\Front\Controller\Admin\SessionFilterController:linksPerPage') -- cgit v1.2.3 From ef00f9d2033f6de11e71bf3a909399cae6f73a9f Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Wed, 27 May 2020 13:35:48 +0200 Subject: Process password change controller through Slim --- index.php | 54 ++++-------------------------------------------------- 1 file changed, 4 insertions(+), 50 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index f4c8b391..ae56b800 100644 --- a/index.php +++ b/index.php @@ -507,56 +507,8 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // -------- User wants to change his/her password. if ($targetPage == Router::$PAGE_CHANGEPASSWORD) { - if ($conf->get('security.open_shaarli')) { - die(t('You are not supposed to change a password on an Open Shaarli.')); - } - - if (!empty($_POST['setpassword']) && !empty($_POST['oldpassword'])) { - if (!$sessionManager->checkToken($_POST['token'])) { - die(t('Wrong token.')); // Go away! - } - - // Make sure old password is correct. - $oldhash = sha1( - $_POST['oldpassword'].$conf->get('credentials.login').$conf->get('credentials.salt') - ); - if ($oldhash != $conf->get('credentials.hash')) { - echo ''; - exit; - } - // Save new password - // Salt renders rainbow-tables attacks useless. - $conf->set('credentials.salt', sha1(uniqid('', true) .'_'. mt_rand())); - $conf->set( - 'credentials.hash', - sha1( - $_POST['setpassword'] - . $conf->get('credentials.login') - . $conf->get('credentials.salt') - ) - ); - try { - $conf->write($loginManager->isLoggedIn()); - } catch (Exception $e) { - error_log( - 'ERROR while writing config file after changing password.' . PHP_EOL . - $e->getMessage() - ); - - // TODO: do not handle exceptions/errors in JS. - echo ''; - exit; - } - echo ''; - exit; - } else { - // show the change password form. - $PAGE->assign('pagetitle', t('Change password') .' - '. $conf->get('general.title', 'Shaarli')); - $PAGE->renderPage('changepassword'); - exit; - } + header('Location: ./password'); + exit; } // -------- User wants to change configuration @@ -1504,6 +1456,8 @@ $app->group('', function () { /* -- LOGGED IN -- */ $this->get('/logout', '\Shaarli\Front\Controller\Admin\LogoutController:index')->setName('logout'); $this->get('/tools', '\Shaarli\Front\Controller\Admin\ToolsController:index')->setName('tools'); + $this->get('/password', '\Shaarli\Front\Controller\Admin\PasswordController:index')->setName('password'); + $this->post('/password', '\Shaarli\Front\Controller\Admin\PasswordController:change')->setName('changePassword'); $this ->get('/links-per-page', '\Shaarli\Front\Controller\Admin\SessionFilterController:linksPerPage') -- cgit v1.2.3 From 66063ed1a18d739b1a60bfb163d8656417a4c529 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 30 May 2020 14:00:06 +0200 Subject: Process configure page through Slim controller --- index.php | 86 +++------------------------------------------------------------ 1 file changed, 4 insertions(+), 82 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index ae56b800..50c0634a 100644 --- a/index.php +++ b/index.php @@ -513,88 +513,8 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // -------- User wants to change configuration if ($targetPage == Router::$PAGE_CONFIGURE) { - if (!empty($_POST['title'])) { - if (!$sessionManager->checkToken($_POST['token'])) { - die(t('Wrong token.')); // Go away! - } - $tz = 'UTC'; - if (!empty($_POST['continent']) && !empty($_POST['city']) - && isTimeZoneValid($_POST['continent'], $_POST['city']) - ) { - $tz = $_POST['continent'] . '/' . $_POST['city']; - } - $conf->set('general.timezone', $tz); - $conf->set('general.title', escape($_POST['title'])); - $conf->set('general.header_link', escape($_POST['titleLink'])); - $conf->set('general.retrieve_description', !empty($_POST['retrieveDescription'])); - $conf->set('resource.theme', escape($_POST['theme'])); - $conf->set('security.session_protection_disabled', !empty($_POST['disablesessionprotection'])); - $conf->set('privacy.default_private_links', !empty($_POST['privateLinkByDefault'])); - $conf->set('feed.rss_permalinks', !empty($_POST['enableRssPermalinks'])); - $conf->set('updates.check_updates', !empty($_POST['updateCheck'])); - $conf->set('privacy.hide_public_links', !empty($_POST['hidePublicLinks'])); - $conf->set('api.enabled', !empty($_POST['enableApi'])); - $conf->set('api.secret', escape($_POST['apiSecret'])); - $conf->set('formatter', escape($_POST['formatter'])); - - if (! empty($_POST['language'])) { - $conf->set('translation.language', escape($_POST['language'])); - } - - $thumbnailsMode = extension_loaded('gd') ? $_POST['enableThumbnails'] : Thumbnailer::MODE_NONE; - if ($thumbnailsMode !== Thumbnailer::MODE_NONE - && $thumbnailsMode !== $conf->get('thumbnails.mode', Thumbnailer::MODE_NONE) - ) { - $_SESSION['warnings'][] = t( - 'You have enabled or changed thumbnails mode. ' - .'Please synchronize them.' - ); - } - $conf->set('thumbnails.mode', $thumbnailsMode); - - try { - $conf->write($loginManager->isLoggedIn()); - $history->updateSettings(); - $pageCacheManager->invalidateCaches(); - } catch (Exception $e) { - error_log( - 'ERROR while writing config file after configuration update.' . PHP_EOL . - $e->getMessage() - ); - - // TODO: do not handle exceptions/errors in JS. - echo ''; - exit; - } - echo ''; - exit; - } else { - // Show the configuration form. - $PAGE->assign('title', $conf->get('general.title')); - $PAGE->assign('theme', $conf->get('resource.theme')); - $PAGE->assign('theme_available', ThemeUtils::getThemes($conf->get('resource.raintpl_tpl'))); - $PAGE->assign('formatter_available', ['default', 'markdown']); - list($continents, $cities) = generateTimeZoneData( - timezone_identifiers_list(), - $conf->get('general.timezone') - ); - $PAGE->assign('continents', $continents); - $PAGE->assign('cities', $cities); - $PAGE->assign('retrieve_description', $conf->get('general.retrieve_description')); - $PAGE->assign('private_links_default', $conf->get('privacy.default_private_links', false)); - $PAGE->assign('session_protection_disabled', $conf->get('security.session_protection_disabled', false)); - $PAGE->assign('enable_rss_permalinks', $conf->get('feed.rss_permalinks', false)); - $PAGE->assign('enable_update_check', $conf->get('updates.check_updates', true)); - $PAGE->assign('hide_public_links', $conf->get('privacy.hide_public_links', false)); - $PAGE->assign('api_enabled', $conf->get('api.enabled', true)); - $PAGE->assign('api_secret', $conf->get('api.secret')); - $PAGE->assign('languages', Languages::getAvailableLanguages()); - $PAGE->assign('gd_enabled', extension_loaded('gd')); - $PAGE->assign('thumbnails_mode', $conf->get('thumbnails.mode', Thumbnailer::MODE_NONE)); - $PAGE->assign('pagetitle', t('Configure') .' - '. $conf->get('general.title', 'Shaarli')); - $PAGE->renderPage('configure'); - exit; - } + header('Location: ./configure'); + exit; } // -------- User wants to rename a tag or delete it @@ -1458,6 +1378,8 @@ $app->group('', function () { $this->get('/tools', '\Shaarli\Front\Controller\Admin\ToolsController:index')->setName('tools'); $this->get('/password', '\Shaarli\Front\Controller\Admin\PasswordController:index')->setName('password'); $this->post('/password', '\Shaarli\Front\Controller\Admin\PasswordController:change')->setName('changePassword'); + $this->get('/configure', '\Shaarli\Front\Controller\Admin\ConfigureController:index')->setName('configure'); + $this->post('/configure', '\Shaarli\Front\Controller\Admin\ConfigureController:save')->setName('saveConfigure'); $this ->get('/links-per-page', '\Shaarli\Front\Controller\Admin\SessionFilterController:linksPerPage') -- cgit v1.2.3 From 8eac2e54882d8adae8cbb45386dca1b465242632 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 30 May 2020 15:51:14 +0200 Subject: Process manage tags page through Slim controller --- index.php | 35 +++-------------------------------- 1 file changed, 3 insertions(+), 32 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index 50c0634a..00e4a40b 100644 --- a/index.php +++ b/index.php @@ -519,38 +519,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // -------- User wants to rename a tag or delete it if ($targetPage == Router::$PAGE_CHANGETAG) { - if (empty($_POST['fromtag']) || (empty($_POST['totag']) && isset($_POST['renametag']))) { - $PAGE->assign('fromtag', ! empty($_GET['fromtag']) ? escape($_GET['fromtag']) : ''); - $PAGE->assign('pagetitle', t('Manage tags') .' - '. $conf->get('general.title', 'Shaarli')); - $PAGE->renderPage('changetag'); - exit; - } - - if (!$sessionManager->checkToken($_POST['token'])) { - die(t('Wrong token.')); - } - - $toTag = isset($_POST['totag']) ? escape($_POST['totag']) : null; - $fromTag = escape($_POST['fromtag']); - $count = 0; - $bookmarks = $bookmarkService->search(['searchtags' => $fromTag], BookmarkFilter::$ALL, true); - foreach ($bookmarks as $bookmark) { - if ($toTag) { - $bookmark->renameTag($fromTag, $toTag); - } else { - $bookmark->deleteTag($fromTag); - } - $bookmarkService->set($bookmark, false); - $history->updateLink($bookmark); - $count++; - } - $bookmarkService->save(); - $delete = empty($_POST['totag']); - $redirect = $delete ? './do=changetag' : 'searchtags='. urlencode(escape($_POST['totag'])); - $alert = $delete - ? sprintf(t('The tag was removed from %d link.', 'The tag was removed from %d bookmarks.', $count), $count) - : sprintf(t('The tag was renamed in %d link.', 'The tag was renamed in %d bookmarks.', $count), $count); - echo ''; + header('./manage-tags'); exit; } @@ -1380,6 +1349,8 @@ $app->group('', function () { $this->post('/password', '\Shaarli\Front\Controller\Admin\PasswordController:change')->setName('changePassword'); $this->get('/configure', '\Shaarli\Front\Controller\Admin\ConfigureController:index')->setName('configure'); $this->post('/configure', '\Shaarli\Front\Controller\Admin\ConfigureController:save')->setName('saveConfigure'); + $this->get('/manage-tags', '\Shaarli\Front\Controller\Admin\ManageTagController:index')->setName('manageTag'); + $this->post('/manage-tags', '\Shaarli\Front\Controller\Admin\ManageTagController:save')->setName('saveManageTag'); $this ->get('/links-per-page', '\Shaarli\Front\Controller\Admin\SessionFilterController:linksPerPage') -- cgit v1.2.3 From c22fa57a5505fe95fd01860e3d3dfbb089f869cd Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 6 Jun 2020 14:01:03 +0200 Subject: Handle shaare creation/edition/deletion through Slim controllers --- index.php | 180 ++++++++------------------------------------------------------ 1 file changed, 22 insertions(+), 158 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index 00e4a40b..fb528eeb 100644 --- a/index.php +++ b/index.php @@ -519,69 +519,20 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // -------- User wants to rename a tag or delete it if ($targetPage == Router::$PAGE_CHANGETAG) { - header('./manage-tags'); + header('Location: ./manage-tags'); exit; } // -------- User wants to add a link without using the bookmarklet: Show form. if ($targetPage == Router::$PAGE_ADDLINK) { - $PAGE->assign('pagetitle', t('Shaare a new link') .' - '. $conf->get('general.title', 'Shaarli')); - $PAGE->renderPage('addlink'); + header('Location: ./shaare'); exit; } // -------- User clicked the "Save" button when editing a link: Save link to database. if (isset($_POST['save_edit'])) { - // Go away! - if (! $sessionManager->checkToken($_POST['token'])) { - die(t('Wrong token.')); - } - - // lf_id should only be present if the link exists. - $id = isset($_POST['lf_id']) ? intval(escape($_POST['lf_id'])) : null; - if ($id && $bookmarkService->exists($id)) { - // Edit - $bookmark = $bookmarkService->get($id); - } else { - // New link - $bookmark = new Bookmark(); - } - - $bookmark->setTitle($_POST['lf_title']); - $bookmark->setDescription($_POST['lf_description']); - $bookmark->setUrl($_POST['lf_url'], $conf->get('security.allowed_protocols')); - $bookmark->setPrivate(isset($_POST['lf_private'])); - $bookmark->setTagsString($_POST['lf_tags']); - - if ($conf->get('thumbnails.mode', Thumbnailer::MODE_NONE) !== Thumbnailer::MODE_NONE - && ! $bookmark->isNote() - ) { - $thumbnailer = new Thumbnailer($conf); - $bookmark->setThumbnail($thumbnailer->get($bookmark->getUrl())); - } - $bookmarkService->addOrSet($bookmark, false); - - // To preserve backward compatibility with 3rd parties, plugins still use arrays - $factory = new FormatterFactory($conf, $loginManager->isLoggedIn()); - $formatter = $factory->getFormatter('raw'); - $data = $formatter->format($bookmark); - $pluginManager->executeHooks('save_link', $data); - - $bookmark->fromArray($data); - $bookmarkService->set($bookmark); - - // If we are called from the bookmarklet, we must close the popup: - if (isset($_GET['source']) && ($_GET['source']=='bookmarklet' || $_GET['source']=='firefoxsocialapi')) { - echo ''; - exit; - } - - $returnurl = !empty($_POST['returnurl']) ? $_POST['returnurl'] : '?'; - $location = generateLocation($returnurl, $_SERVER['HTTP_HOST'], array('addlink', 'post', 'edit_link')); - // Scroll to the link which has been edited. - $location .= '#' . $bookmark->getShortUrl(); - // After saving the link, redirect to the page the user was on. - header('Location: '. $location); + // This route is no longer supported in legacy mode + header('Location: ./'); exit; } @@ -695,110 +646,13 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // -------- User clicked the "EDIT" button on a link: Display link edit form. if (isset($_GET['edit_link'])) { $id = (int) escape($_GET['edit_link']); - try { - $link = $bookmarkService->get($id); // Read database - } catch (BookmarkNotFoundException $e) { - // Link not found in database. - header('Location: ?'); - exit; - } - - $factory = new FormatterFactory($conf, $loginManager->isLoggedIn()); - $formatter = $factory->getFormatter('raw'); - $formattedLink = $formatter->format($link); - $tags = $bookmarkService->bookmarksCountPerTag(); - if ($conf->get('formatter') === 'markdown') { - $tags[BookmarkMarkdownFormatter::NO_MD_TAG] = 1; - } - $data = array( - 'link' => $formattedLink, - 'link_is_new' => false, - 'http_referer' => (isset($_SERVER['HTTP_REFERER']) ? escape($_SERVER['HTTP_REFERER']) : ''), - 'tags' => $tags, - ); - $pluginManager->executeHooks('render_editlink', $data); - - foreach ($data as $key => $value) { - $PAGE->assign($key, $value); - } - - $PAGE->assign('pagetitle', t('Edit') .' '. t('Shaare') .' - '. $conf->get('general.title', 'Shaarli')); - $PAGE->renderPage('editlink'); + header('Location: ./shaare-' . $id); exit; } // -------- User want to post a new link: Display link edit form. if (isset($_GET['post'])) { - $url = cleanup_url($_GET['post']); - - $link_is_new = false; - // Check if URL is not already in database (in this case, we will edit the existing link) - $bookmark = $bookmarkService->findByUrl($url); - if (! $bookmark) { - $link_is_new = true; - // Get title if it was provided in URL (by the bookmarklet). - $title = empty($_GET['title']) ? '' : escape($_GET['title']); - // Get description if it was provided in URL (by the bookmarklet). [Bronco added that] - $description = empty($_GET['description']) ? '' : escape($_GET['description']); - $tags = empty($_GET['tags']) ? '' : escape($_GET['tags']); - $private = !empty($_GET['private']) && $_GET['private'] === "1" ? 1 : 0; - - // If this is an HTTP(S) link, we try go get the page to extract - // the title (otherwise we will to straight to the edit form.) - if (empty($title) && strpos(get_url_scheme($url), 'http') !== false) { - $retrieveDescription = $conf->get('general.retrieve_description'); - // Short timeout to keep the application responsive - // The callback will fill $charset and $title with data from the downloaded page. - get_http_response( - $url, - $conf->get('general.download_timeout', 30), - $conf->get('general.download_max_size', 4194304), - get_curl_download_callback($charset, $title, $description, $tags, $retrieveDescription) - ); - if (! empty($title) && strtolower($charset) != 'utf-8') { - $title = mb_convert_encoding($title, 'utf-8', $charset); - } - } - - if ($url == '') { - $title = $conf->get('general.default_note_title', t('Note: ')); - } - $url = escape($url); - $title = escape($title); - - $link = [ - 'title' => $title, - 'url' => $url, - 'description' => $description, - 'tags' => $tags, - 'private' => $private, - ]; - } else { - $factory = new FormatterFactory($conf, $loginManager->isLoggedIn()); - $formatter = $factory->getFormatter('raw'); - $link = $formatter->format($bookmark); - } - - $tags = $bookmarkService->bookmarksCountPerTag(); - if ($conf->get('formatter') === 'markdown') { - $tags[BookmarkMarkdownFormatter::NO_MD_TAG] = 1; - } - $data = [ - 'link' => $link, - 'link_is_new' => $link_is_new, - 'http_referer' => (isset($_SERVER['HTTP_REFERER']) ? escape($_SERVER['HTTP_REFERER']) : ''), - 'source' => (isset($_GET['source']) ? $_GET['source'] : ''), - 'tags' => $tags, - 'default_private_links' => $conf->get('privacy.default_private_links', false), - ]; - $pluginManager->executeHooks('render_editlink', $data); - - foreach ($data as $key => $value) { - $PAGE->assign($key, $value); - } - - $PAGE->assign('pagetitle', t('Shaare') .' - '. $conf->get('general.title', 'Shaarli')); - $PAGE->renderPage('editlink'); + header('Location: ./shaare?' . http_build_query($_GET)); exit; } @@ -1351,19 +1205,29 @@ $app->group('', function () { $this->post('/configure', '\Shaarli\Front\Controller\Admin\ConfigureController:save')->setName('saveConfigure'); $this->get('/manage-tags', '\Shaarli\Front\Controller\Admin\ManageTagController:index')->setName('manageTag'); $this->post('/manage-tags', '\Shaarli\Front\Controller\Admin\ManageTagController:save')->setName('saveManageTag'); + $this->get('/add-shaare', '\Shaarli\Front\Controller\Admin\PostBookmarkController:addShaare')->setName('addShaare'); + $this + ->get('/shaare', '\Shaarli\Front\Controller\Admin\PostBookmarkController:displayCreateForm') + ->setName('newShaare'); + $this + ->get('/shaare-{id}', '\Shaarli\Front\Controller\Admin\PostBookmarkController:displayEditForm') + ->setName('editShaare'); + $this + ->post('/shaare', '\Shaarli\Front\Controller\Admin\PostBookmarkController:save') + ->setName('saveShaare'); + $this + ->get('/delete-shaare', '\Shaarli\Front\Controller\Admin\PostBookmarkController:deleteBookmark') + ->setName('deleteShaare'); $this ->get('/links-per-page', '\Shaarli\Front\Controller\Admin\SessionFilterController:linksPerPage') - ->setName('filter-links-per-page') - ; + ->setName('filter-links-per-page'); $this ->get('/visibility/{visibility}', '\Shaarli\Front\Controller\Admin\SessionFilterController:visibility') - ->setName('visibility') - ; + ->setName('visibility'); $this ->get('/untagged-only', '\Shaarli\Front\Controller\Admin\SessionFilterController:untaggedOnly') - ->setName('untagged-only') - ; + ->setName('untagged-only'); })->add('\Shaarli\Front\ShaarliMiddleware'); $response = $app->run(true); -- cgit v1.2.3 From 9c75f877935fa6adec951a4d8d32b328aaab314f Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 13 Jun 2020 13:08:01 +0200 Subject: Use multi-level routes for existing controllers instead of 1 level everywhere Also prefix most admin routes with /admin/ --- index.php | 146 ++++++++++++++++++-------------------------------------------- 1 file changed, 43 insertions(+), 103 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index fb528eeb..aa358da0 100644 --- a/index.php +++ b/index.php @@ -412,13 +412,13 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // -------- Tag cloud if ($targetPage == Router::$PAGE_TAGCLOUD) { - header('Location: ./tag-cloud'); + header('Location: ./tags/cloud'); exit; } // -------- Tag list if ($targetPage == Router::$PAGE_TAGLIST) { - header('Location: ./tag-list'); + header('Location: ./tags/list'); exit; } @@ -433,7 +433,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM if ($targetPage == Router::$PAGE_FEED_ATOM || $targetPage == Router::$PAGE_FEED_RSS) { $feedType = $targetPage == Router::$PAGE_FEED_RSS ? FeedBuilder::$FEED_RSS : FeedBuilder::$FEED_ATOM; - header('Location: ./feed-'. $feedType .'?'. http_build_query($_GET)); + header('Location: ./feed/'. $feedType .'?'. http_build_query($_GET)); exit; } @@ -501,31 +501,31 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // -------- Display the Tools menu if requested (import/export/bookmarklet...) if ($targetPage == Router::$PAGE_TOOLS) { - header('Location: ./tools'); + header('Location: ./admin/tools'); exit; } // -------- User wants to change his/her password. if ($targetPage == Router::$PAGE_CHANGEPASSWORD) { - header('Location: ./password'); + header('Location: ./admin/password'); exit; } // -------- User wants to change configuration if ($targetPage == Router::$PAGE_CONFIGURE) { - header('Location: ./configure'); + header('Location: ./admin/configure'); exit; } // -------- User wants to rename a tag or delete it if ($targetPage == Router::$PAGE_CHANGETAG) { - header('Location: ./manage-tags'); + header('Location: ./admin/tags'); exit; } // -------- User wants to add a link without using the bookmarklet: Show form. if ($targetPage == Router::$PAGE_ADDLINK) { - header('Location: ./shaare'); + header('Location: ./admin/shaare'); exit; } @@ -538,56 +538,10 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // -------- User clicked the "Delete" button when editing a link: Delete link from database. if ($targetPage == Router::$PAGE_DELETELINK) { - if (! $sessionManager->checkToken($_GET['token'])) { - die(t('Wrong token.')); - } - - $ids = trim($_GET['lf_linkdate']); - if (strpos($ids, ' ') !== false) { - // multiple, space-separated ids provided - $ids = array_values(array_filter( - preg_split('/\s+/', escape($ids)), - function ($item) { - return $item !== ''; - } - )); - } else { - // only a single id provided - $shortUrl = $bookmarkService->get($ids)->getShortUrl(); - $ids = [$ids]; - } - // assert at least one id is given - if (!count($ids)) { - die('no id provided'); - } - $factory = new FormatterFactory($conf, $loginManager->isLoggedIn()); - $formatter = $factory->getFormatter('raw'); - foreach ($ids as $id) { - $id = (int) escape($id); - $bookmark = $bookmarkService->get($id); - $data = $formatter->format($bookmark); - $pluginManager->executeHooks('delete_link', $data); - $bookmarkService->remove($bookmark, false); - } - $bookmarkService->save(); - - // If we are called from the bookmarklet, we must close the popup: - if (isset($_GET['source']) && ($_GET['source']=='bookmarklet' || $_GET['source']=='firefoxsocialapi')) { - echo ''; - exit; - } + $ids = $_GET['lf_linkdate'] ?? ''; + $token = $_GET['token'] ?? ''; - $location = '?'; - if (isset($_SERVER['HTTP_REFERER'])) { - // Don't redirect to where we were previously if it was a permalink or an edit_link, because it would 404. - $location = generateLocation( - $_SERVER['HTTP_REFERER'], - $_SERVER['HTTP_HOST'], - ['delete_link', 'edit_link', ! empty($shortUrl) ? $shortUrl : null] - ); - } - - header('Location: ' . $location); // After deleting the link, redirect to appropriate location + header('Location: ./admin/shaare/delete?id=' . $ids . '&token=' . $token); exit; } @@ -646,13 +600,13 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // -------- User clicked the "EDIT" button on a link: Display link edit form. if (isset($_GET['edit_link'])) { $id = (int) escape($_GET['edit_link']); - header('Location: ./shaare-' . $id); + header('Location: ./admin/shaare/' . $id); exit; } // -------- User want to post a new link: Display link edit form. if (isset($_GET['post'])) { - header('Location: ./shaare?' . http_build_query($_GET)); + header('Location: ./admin/shaare?' . http_build_query($_GET)); exit; } @@ -1160,7 +1114,7 @@ if (isset($_SERVER['QUERY_STRING']) && startsWith($_SERVER['QUERY_STRING'], 'do= exit; } -$containerBuilder = new ContainerBuilder($conf, $sessionManager, $loginManager, WEB_PATH); +$containerBuilder = new ContainerBuilder($conf, $sessionManager, $loginManager); $container = $containerBuilder->build(); $app = new App($container); @@ -1183,51 +1137,37 @@ $app->group('/api/v1', function () { $app->group('', function () { /* -- PUBLIC --*/ - $this->get('/login', '\Shaarli\Front\Controller\Visitor\LoginController:index')->setName('login'); - $this->get('/picture-wall', '\Shaarli\Front\Controller\Visitor\PictureWallController:index')->setName('picwall'); - $this->get('/tag-cloud', '\Shaarli\Front\Controller\Visitor\TagCloudController:cloud')->setName('tagcloud'); - $this->get('/tag-list', '\Shaarli\Front\Controller\Visitor\TagCloudController:list')->setName('taglist'); - $this->get('/daily', '\Shaarli\Front\Controller\Visitor\DailyController:index')->setName('daily'); - $this->get('/daily-rss', '\Shaarli\Front\Controller\Visitor\DailyController:rss')->setName('dailyrss'); - $this->get('/feed-atom', '\Shaarli\Front\Controller\Visitor\FeedController:atom')->setName('feedatom'); - $this->get('/feed-rss', '\Shaarli\Front\Controller\Visitor\FeedController:rss')->setName('feedrss'); - $this->get('/open-search', '\Shaarli\Front\Controller\Visitor\OpenSearchController:index')->setName('opensearch'); - - $this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\Visitor\TagController:addTag')->setName('add-tag'); - $this->get('/remove-tag/{tag}', '\Shaarli\Front\Controller\Visitor\TagController:removeTag')->setName('remove-tag'); + $this->get('/login', '\Shaarli\Front\Controller\Visitor\LoginController:index'); + $this->get('/picture-wall', '\Shaarli\Front\Controller\Visitor\PictureWallController:index'); + $this->get('/tags/cloud', '\Shaarli\Front\Controller\Visitor\TagCloudController:cloud'); + $this->get('/tags/list', '\Shaarli\Front\Controller\Visitor\TagCloudController:list'); + $this->get('/daily', '\Shaarli\Front\Controller\Visitor\DailyController:index'); + $this->get('/daily-rss', '\Shaarli\Front\Controller\Visitor\DailyController:rss'); + $this->get('/feed/atom', '\Shaarli\Front\Controller\Visitor\FeedController:atom'); + $this->get('/feed/rss', '\Shaarli\Front\Controller\Visitor\FeedController:rss'); + $this->get('/open-search', '\Shaarli\Front\Controller\Visitor\OpenSearchController:index'); + + $this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\Visitor\TagController:addTag'); + $this->get('/remove-tag/{tag}', '\Shaarli\Front\Controller\Visitor\TagController:removeTag'); /* -- LOGGED IN -- */ - $this->get('/logout', '\Shaarli\Front\Controller\Admin\LogoutController:index')->setName('logout'); - $this->get('/tools', '\Shaarli\Front\Controller\Admin\ToolsController:index')->setName('tools'); - $this->get('/password', '\Shaarli\Front\Controller\Admin\PasswordController:index')->setName('password'); - $this->post('/password', '\Shaarli\Front\Controller\Admin\PasswordController:change')->setName('changePassword'); - $this->get('/configure', '\Shaarli\Front\Controller\Admin\ConfigureController:index')->setName('configure'); - $this->post('/configure', '\Shaarli\Front\Controller\Admin\ConfigureController:save')->setName('saveConfigure'); - $this->get('/manage-tags', '\Shaarli\Front\Controller\Admin\ManageTagController:index')->setName('manageTag'); - $this->post('/manage-tags', '\Shaarli\Front\Controller\Admin\ManageTagController:save')->setName('saveManageTag'); - $this->get('/add-shaare', '\Shaarli\Front\Controller\Admin\PostBookmarkController:addShaare')->setName('addShaare'); - $this - ->get('/shaare', '\Shaarli\Front\Controller\Admin\PostBookmarkController:displayCreateForm') - ->setName('newShaare'); - $this - ->get('/shaare-{id}', '\Shaarli\Front\Controller\Admin\PostBookmarkController:displayEditForm') - ->setName('editShaare'); - $this - ->post('/shaare', '\Shaarli\Front\Controller\Admin\PostBookmarkController:save') - ->setName('saveShaare'); - $this - ->get('/delete-shaare', '\Shaarli\Front\Controller\Admin\PostBookmarkController:deleteBookmark') - ->setName('deleteShaare'); - - $this - ->get('/links-per-page', '\Shaarli\Front\Controller\Admin\SessionFilterController:linksPerPage') - ->setName('filter-links-per-page'); - $this - ->get('/visibility/{visibility}', '\Shaarli\Front\Controller\Admin\SessionFilterController:visibility') - ->setName('visibility'); - $this - ->get('/untagged-only', '\Shaarli\Front\Controller\Admin\SessionFilterController:untaggedOnly') - ->setName('untagged-only'); + $this->get('/logout', '\Shaarli\Front\Controller\Admin\LogoutController:index'); + $this->get('/admin/tools', '\Shaarli\Front\Controller\Admin\ToolsController:index'); + $this->get('/admin/password', '\Shaarli\Front\Controller\Admin\PasswordController:index'); + $this->post('/admin/password', '\Shaarli\Front\Controller\Admin\PasswordController:change'); + $this->get('/admin/configure', '\Shaarli\Front\Controller\Admin\ConfigureController:index'); + $this->post('/admin/configure', '\Shaarli\Front\Controller\Admin\ConfigureController:save'); + $this->get('/admin/tags', '\Shaarli\Front\Controller\Admin\ManageTagController:index'); + $this->post('/admin/tags', '\Shaarli\Front\Controller\Admin\ManageTagController:save'); + $this->get('/admin/add-shaare', '\Shaarli\Front\Controller\Admin\PostBookmarkController:addShaare'); + $this->get('/admin/shaare', '\Shaarli\Front\Controller\Admin\PostBookmarkController:displayCreateForm'); + $this->get('/admin/shaare/{id:[0-9]+}', '\Shaarli\Front\Controller\Admin\PostBookmarkController:displayEditForm'); + $this->post('/admin/shaare', '\Shaarli\Front\Controller\Admin\PostBookmarkController:save'); + $this->get('/admin/shaare/delete', '\Shaarli\Front\Controller\Admin\PostBookmarkController:deleteBookmark'); + + $this->get('/links-per-page', '\Shaarli\Front\Controller\Admin\SessionFilterController:linksPerPage'); + $this->get('/visibility/{visibility}', '\Shaarli\Front\Controller\Admin\SessionFilterController:visibility'); + $this->get('/untagged-only', '\Shaarli\Front\Controller\Admin\SessionFilterController:untaggedOnly'); })->add('\Shaarli\Front\ShaarliMiddleware'); $response = $app->run(true); -- cgit v1.2.3 From baa6979194573855b260593094983c33ec338dc7 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 13 Jun 2020 15:37:02 +0200 Subject: Improve ManageTagController coverage and error handling --- index.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index aa358da0..12c7a8f1 100644 --- a/index.php +++ b/index.php @@ -1159,11 +1159,11 @@ $app->group('', function () { $this->post('/admin/configure', '\Shaarli\Front\Controller\Admin\ConfigureController:save'); $this->get('/admin/tags', '\Shaarli\Front\Controller\Admin\ManageTagController:index'); $this->post('/admin/tags', '\Shaarli\Front\Controller\Admin\ManageTagController:save'); - $this->get('/admin/add-shaare', '\Shaarli\Front\Controller\Admin\PostBookmarkController:addShaare'); - $this->get('/admin/shaare', '\Shaarli\Front\Controller\Admin\PostBookmarkController:displayCreateForm'); - $this->get('/admin/shaare/{id:[0-9]+}', '\Shaarli\Front\Controller\Admin\PostBookmarkController:displayEditForm'); - $this->post('/admin/shaare', '\Shaarli\Front\Controller\Admin\PostBookmarkController:save'); - $this->get('/admin/shaare/delete', '\Shaarli\Front\Controller\Admin\PostBookmarkController:deleteBookmark'); + $this->get('/admin/add-shaare', '\Shaarli\Front\Controller\Admin\ManageShaareController:addShaare'); + $this->get('/admin/shaare', '\Shaarli\Front\Controller\Admin\ManageShaareController:displayCreateForm'); + $this->get('/admin/shaare/{id:[0-9]+}', '\Shaarli\Front\Controller\Admin\ManageShaareController:displayEditForm'); + $this->post('/admin/shaare', '\Shaarli\Front\Controller\Admin\ManageShaareController:save'); + $this->get('/admin/shaare/delete', '\Shaarli\Front\Controller\Admin\ManageShaareController:deleteBookmark'); $this->get('/links-per-page', '\Shaarli\Front\Controller\Admin\SessionFilterController:linksPerPage'); $this->get('/visibility/{visibility}', '\Shaarli\Front\Controller\Admin\SessionFilterController:visibility'); -- cgit v1.2.3 From 7b8a6f2858248601d43c1b8247deb91b74392d2e Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 13 Jun 2020 19:40:32 +0200 Subject: Process change visibility action through Slim controller --- index.php | 51 ++++----------------------------------------------- 1 file changed, 4 insertions(+), 47 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index 12c7a8f1..93e5590b 100644 --- a/index.php +++ b/index.php @@ -499,6 +499,8 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // -------- All other functions are reserved for the registered user: + // TODO: Remove legacy admin route redirections. We'll only keep public URL. + // -------- Display the Tools menu if requested (import/export/bookmarklet...) if ($targetPage == Router::$PAGE_TOOLS) { header('Location: ./admin/tools'); @@ -547,53 +549,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // -------- User clicked either "Set public" or "Set private" bulk operation if ($targetPage == Router::$PAGE_CHANGE_VISIBILITY) { - if (! $sessionManager->checkToken($_GET['token'])) { - die(t('Wrong token.')); - } - - $ids = trim($_GET['ids']); - if (strpos($ids, ' ') !== false) { - // multiple, space-separated ids provided - $ids = array_values(array_filter(preg_split('/\s+/', escape($ids)))); - } else { - // only a single id provided - $ids = [$ids]; - } - - // assert at least one id is given - if (!count($ids)) { - die('no id provided'); - } - // assert that the visibility is valid - if (!isset($_GET['newVisibility']) || !in_array($_GET['newVisibility'], ['public', 'private'])) { - die('invalid visibility'); - } else { - $private = $_GET['newVisibility'] === 'private'; - } - $factory = new FormatterFactory($conf, $loginManager->isLoggedIn()); - $formatter = $factory->getFormatter('raw'); - foreach ($ids as $id) { - $id = (int) escape($id); - $bookmark = $bookmarkService->get($id); - $bookmark->setPrivate($private); - - // To preserve backward compatibility with 3rd parties, plugins still use arrays - $data = $formatter->format($bookmark); - $pluginManager->executeHooks('save_link', $data); - $bookmark->fromArray($data); - - $bookmarkService->set($bookmark); - } - $bookmarkService->save(); - - $location = '?'; - if (isset($_SERVER['HTTP_REFERER'])) { - $location = generateLocation( - $_SERVER['HTTP_REFERER'], - $_SERVER['HTTP_HOST'] - ); - } - header('Location: ' . $location); // After deleting the link, redirect to appropriate location + header('Location: ./admin/shaare/visibility?id=' . $_GET['token']); exit; } @@ -1164,6 +1120,7 @@ $app->group('', function () { $this->get('/admin/shaare/{id:[0-9]+}', '\Shaarli\Front\Controller\Admin\ManageShaareController:displayEditForm'); $this->post('/admin/shaare', '\Shaarli\Front\Controller\Admin\ManageShaareController:save'); $this->get('/admin/shaare/delete', '\Shaarli\Front\Controller\Admin\ManageShaareController:deleteBookmark'); + $this->get('/admin/shaare/visibility', '\Shaarli\Front\Controller\Admin\ManageShaareController:changeVisibility'); $this->get('/links-per-page', '\Shaarli\Front\Controller\Admin\SessionFilterController:linksPerPage'); $this->get('/visibility/{visibility}', '\Shaarli\Front\Controller\Admin\SessionFilterController:visibility'); -- cgit v1.2.3 From 3447d888d7881eed437117a6de2450abb96f6a76 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Mon, 15 Jun 2020 08:15:40 +0200 Subject: Pin bookmarks through Slim controller --- index.php | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index 93e5590b..c8660658 100644 --- a/index.php +++ b/index.php @@ -567,20 +567,8 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM } if ($targetPage == Router::$PAGE_PINLINK) { - if (! isset($_GET['id']) || !$bookmarkService->exists($_GET['id'])) { - // FIXME! Use a proper error system. - $msg = t('Invalid link ID provided'); - echo ''; - exit; - } - if (! $sessionManager->checkToken($_GET['token'])) { - die('Wrong token.'); - } - - $link = $bookmarkService->get($_GET['id']); - $link->setSticky(! $link->isSticky()); - $bookmarkService->set($link); - header('Location: '.index_url($_SERVER)); + // This route is no longer supported in legacy mode + header('Location: ./'); exit; } @@ -1121,6 +1109,7 @@ $app->group('', function () { $this->post('/admin/shaare', '\Shaarli\Front\Controller\Admin\ManageShaareController:save'); $this->get('/admin/shaare/delete', '\Shaarli\Front\Controller\Admin\ManageShaareController:deleteBookmark'); $this->get('/admin/shaare/visibility', '\Shaarli\Front\Controller\Admin\ManageShaareController:changeVisibility'); + $this->get('/admin/shaare/{id:[0-9]+}/pin', '\Shaarli\Front\Controller\Admin\ManageShaareController:pinBookmark'); $this->get('/links-per-page', '\Shaarli\Front\Controller\Admin\SessionFilterController:linksPerPage'); $this->get('/visibility/{visibility}', '\Shaarli\Front\Controller\Admin\SessionFilterController:visibility'); -- cgit v1.2.3 From e8a10f312a5c44314292402bb44e6ee2e71f3d5d Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Wed, 17 Jun 2020 15:55:31 +0200 Subject: Use NetscapeBookmarkUtils object instance instead of static calls --- index.php | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index c8660658..7c49bc8d 100644 --- a/index.php +++ b/index.php @@ -662,13 +662,8 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM if (! $sessionManager->checkToken($_POST['token'])) { die('Wrong token.'); } - $status = NetscapeBookmarkUtils::import( - $_POST, - $_FILES, - $bookmarkService, - $conf, - $history - ); + $netscapeBookmarkUtils = new NetscapeBookmarkUtils($bookmarkService, $conf, $history); + $status = $netscapeBookmarkUtils->import($_POST, $_FILES); echo ''; exit; -- cgit v1.2.3 From c70ff64a61d62cc8d35a62f30596ecc2a3c578a3 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Wed, 17 Jun 2020 16:04:18 +0200 Subject: Process bookmark exports through Slim controllers --- index.php | 47 +++-------------------------------------------- 1 file changed, 3 insertions(+), 44 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index 7c49bc8d..030fdfa3 100644 --- a/index.php +++ b/index.php @@ -573,50 +573,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM } if ($targetPage == Router::$PAGE_EXPORT) { - // Export bookmarks as a Netscape Bookmarks file - - if (empty($_GET['selection'])) { - $PAGE->assign('pagetitle', t('Export') .' - '. $conf->get('general.title', 'Shaarli')); - $PAGE->renderPage('export'); - exit; - } - - // export as bookmarks_(all|private|public)_YYYYmmdd_HHMMSS.html - $selection = $_GET['selection']; - if (isset($_GET['prepend_note_url'])) { - $prependNoteUrl = $_GET['prepend_note_url']; - } else { - $prependNoteUrl = false; - } - - try { - $factory = new FormatterFactory($conf, $loginManager->isLoggedIn()); - $formatter = $factory->getFormatter('raw'); - $PAGE->assign( - 'links', - NetscapeBookmarkUtils::filterAndFormat( - $bookmarkService, - $formatter, - $selection, - $prependNoteUrl, - index_url($_SERVER) - ) - ); - } catch (Exception $exc) { - header('Content-Type: text/plain; charset=utf-8'); - echo $exc->getMessage(); - exit; - } - $now = new DateTime(); - header('Content-Type: text/html; charset=utf-8'); - header( - 'Content-disposition: attachment; filename=bookmarks_' - .$selection.'_'.$now->format(Bookmark::LINK_DATE_FORMAT).'.html' - ); - $PAGE->assign('date', $now->format(DateTime::RFC822)); - $PAGE->assign('eol', PHP_EOL); - $PAGE->assign('selection', $selection); - $PAGE->renderPage('export.bookmarks'); + header('Location: ./admin/export'); exit; } @@ -1105,6 +1062,8 @@ $app->group('', function () { $this->get('/admin/shaare/delete', '\Shaarli\Front\Controller\Admin\ManageShaareController:deleteBookmark'); $this->get('/admin/shaare/visibility', '\Shaarli\Front\Controller\Admin\ManageShaareController:changeVisibility'); $this->get('/admin/shaare/{id:[0-9]+}/pin', '\Shaarli\Front\Controller\Admin\ManageShaareController:pinBookmark'); + $this->get('/admin/export', '\Shaarli\Front\Controller\Admin\ExportController:index'); + $this->post('/admin/export', '\Shaarli\Front\Controller\Admin\ExportController:export'); $this->get('/links-per-page', '\Shaarli\Front\Controller\Admin\SessionFilterController:linksPerPage'); $this->get('/visibility/{visibility}', '\Shaarli\Front\Controller\Admin\SessionFilterController:visibility'); -- cgit v1.2.3 From 78657347c5b463d7c22bfc8c87b7db39fe058833 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Wed, 17 Jun 2020 19:08:02 +0200 Subject: Process bookmarks import through Slim controller --- index.php | 48 +++--------------------------------------------- 1 file changed, 3 insertions(+), 45 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index 030fdfa3..47fef3ed 100644 --- a/index.php +++ b/index.php @@ -578,51 +578,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM } if ($targetPage == Router::$PAGE_IMPORT) { - // Upload a Netscape bookmark dump to import its contents - - if (! isset($_POST['token']) || ! isset($_FILES['filetoupload'])) { - // Show import dialog - $PAGE->assign( - 'maxfilesize', - get_max_upload_size( - ini_get('post_max_size'), - ini_get('upload_max_filesize'), - false - ) - ); - $PAGE->assign( - 'maxfilesizeHuman', - get_max_upload_size( - ini_get('post_max_size'), - ini_get('upload_max_filesize'), - true - ) - ); - $PAGE->assign('pagetitle', t('Import') .' - '. $conf->get('general.title', 'Shaarli')); - $PAGE->renderPage('import'); - exit; - } - - // Import bookmarks from an uploaded file - if (isset($_FILES['filetoupload']['size']) && $_FILES['filetoupload']['size'] == 0) { - // The file is too big or some form field may be missing. - $msg = sprintf( - t( - 'The file you are trying to upload is probably bigger than what this webserver can accept' - .' (%s). Please upload in smaller chunks.' - ), - get_max_upload_size(ini_get('post_max_size'), ini_get('upload_max_filesize')) - ); - echo ''; - exit; - } - if (! $sessionManager->checkToken($_POST['token'])) { - die('Wrong token.'); - } - $netscapeBookmarkUtils = new NetscapeBookmarkUtils($bookmarkService, $conf, $history); - $status = $netscapeBookmarkUtils->import($_POST, $_FILES); - echo ''; + header('Location: ./admin/import'); exit; } @@ -1064,6 +1020,8 @@ $app->group('', function () { $this->get('/admin/shaare/{id:[0-9]+}/pin', '\Shaarli\Front\Controller\Admin\ManageShaareController:pinBookmark'); $this->get('/admin/export', '\Shaarli\Front\Controller\Admin\ExportController:index'); $this->post('/admin/export', '\Shaarli\Front\Controller\Admin\ExportController:export'); + $this->get('/admin/import', '\Shaarli\Front\Controller\Admin\ImportController:index'); + $this->post('/admin/import', '\Shaarli\Front\Controller\Admin\ImportController:import'); $this->get('/links-per-page', '\Shaarli\Front\Controller\Admin\SessionFilterController:linksPerPage'); $this->get('/visibility/{visibility}', '\Shaarli\Front\Controller\Admin\SessionFilterController:visibility'); -- cgit v1.2.3 From 1b8620b1ad4e2c647ff2d032c8e7c6687b6647a1 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 20 Jun 2020 15:14:24 +0200 Subject: Process plugins administration page through Slim controllers --- index.php | 54 +++++------------------------------------------------- 1 file changed, 5 insertions(+), 49 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index 47fef3ed..1571df60 100644 --- a/index.php +++ b/index.php @@ -584,60 +584,14 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // 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, $conf->get('plugins', array())); - 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->assign('pagetitle', t('Plugin administration') .' - '. $conf->get('general.title', 'Shaarli')); - $PAGE->renderPage('pluginsadmin'); + header('Location: ./admin/plugins'); exit; } // Plugin administration form action if ($targetPage == Router::$PAGE_SAVE_PLUGINSADMIN) { - try { - if (isset($_POST['parameters_form'])) { - $pluginManager->executeHooks('save_plugin_parameters', $_POST); - unset($_POST['parameters_form']); - foreach ($_POST as $param => $value) { - $conf->set('plugins.'. $param, escape($value)); - } - } else { - $conf->set('general.enabled_plugins', save_plugin_config($_POST)); - } - $conf->write($loginManager->isLoggedIn()); - $history->updateSettings(); - } catch (Exception $e) { - error_log( - 'ERROR while saving plugin configuration:.' . PHP_EOL . - $e->getMessage() - ); - - // TODO: do not handle exceptions/errors in JS. - echo ''; - exit; - } - header('Location: ./?do='. Router::$PAGE_PLUGINSADMIN); + // This route is no longer supported in legacy mode + header('Location: ./admin/plugins'); exit; } @@ -1022,6 +976,8 @@ $app->group('', function () { $this->post('/admin/export', '\Shaarli\Front\Controller\Admin\ExportController:export'); $this->get('/admin/import', '\Shaarli\Front\Controller\Admin\ImportController:index'); $this->post('/admin/import', '\Shaarli\Front\Controller\Admin\ImportController:import'); + $this->get('/admin/plugins', '\Shaarli\Front\Controller\Admin\PluginsController:index'); + $this->post('/admin/plugins', '\Shaarli\Front\Controller\Admin\PluginsController:save'); $this->get('/links-per-page', '\Shaarli\Front\Controller\Admin\SessionFilterController:linksPerPage'); $this->get('/visibility/{visibility}', '\Shaarli\Front\Controller\Admin\SessionFilterController:visibility'); -- cgit v1.2.3 From 764d34a7d347d653414e5f5c632e02499edaef04 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sun, 21 Jun 2020 12:21:31 +0200 Subject: Process token retrieve through Slim controller --- index.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index 1571df60..9202cb84 100644 --- a/index.php +++ b/index.php @@ -597,8 +597,7 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // Get a fresh token if ($targetPage == Router::$GET_TOKEN) { - header('Content-Type:text/plain'); - echo $sessionManager->generateToken(); + header('Location: ./admin/token'); exit; } @@ -978,6 +977,7 @@ $app->group('', function () { $this->post('/admin/import', '\Shaarli\Front\Controller\Admin\ImportController:import'); $this->get('/admin/plugins', '\Shaarli\Front\Controller\Admin\PluginsController:index'); $this->post('/admin/plugins', '\Shaarli\Front\Controller\Admin\PluginsController:save'); + $this->get('/admin/token', '\Shaarli\Front\Controller\Admin\TokenController:getToken'); $this->get('/links-per-page', '\Shaarli\Front\Controller\Admin\SessionFilterController:linksPerPage'); $this->get('/visibility/{visibility}', '\Shaarli\Front\Controller\Admin\SessionFilterController:visibility'); -- cgit v1.2.3 From 6132d64748dfc6806ed25f71d2e078a5ed29d071 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 27 Jun 2020 12:08:26 +0200 Subject: Process thumbnail synchronize page through Slim controllers --- index.php | 35 ++++++++--------------------------- 1 file changed, 8 insertions(+), 27 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index 9202cb84..a07de74d 100644 --- a/index.php +++ b/index.php @@ -603,38 +603,14 @@ function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionM // -------- Thumbnails Update if ($targetPage == Router::$PAGE_THUMBS_UPDATE) { - $ids = []; - foreach ($bookmarkService->search() as $bookmark) { - // A note or not HTTP(S) - if ($bookmark->isNote() || ! startsWith(strtolower($bookmark->getUrl()), 'http')) { - continue; - } - $ids[] = $bookmark->getId(); - } - $PAGE->assign('ids', $ids); - $PAGE->assign('pagetitle', t('Thumbnails update') .' - '. $conf->get('general.title', 'Shaarli')); - $PAGE->renderPage('thumbnails'); + header('Location: ./admin/thumbnails'); exit; } // -------- Single Thumbnail Update if ($targetPage == Router::$AJAX_THUMB_UPDATE) { - if (! isset($_POST['id']) || ! ctype_digit($_POST['id'])) { - http_response_code(400); - exit; - } - $id = (int) $_POST['id']; - if (! $bookmarkService->exists($id)) { - http_response_code(404); - exit; - } - $thumbnailer = new Thumbnailer($conf); - $bookmark = $bookmarkService->get($id); - $bookmark->setThumbnail($thumbnailer->get($bookmark->getUrl())); - $bookmarkService->set($bookmark); - - $factory = new FormatterFactory($conf, $loginManager->isLoggedIn()); - echo json_encode($factory->getFormatter('raw')->format($bookmark)); + // This route is no longer supported in legacy mode + http_response_code(404); exit; } @@ -971,6 +947,10 @@ $app->group('', function () { $this->get('/admin/shaare/delete', '\Shaarli\Front\Controller\Admin\ManageShaareController:deleteBookmark'); $this->get('/admin/shaare/visibility', '\Shaarli\Front\Controller\Admin\ManageShaareController:changeVisibility'); $this->get('/admin/shaare/{id:[0-9]+}/pin', '\Shaarli\Front\Controller\Admin\ManageShaareController:pinBookmark'); + $this->patch( + '/admin/shaare/{id:[0-9]+}/update-thumbnail', + '\Shaarli\Front\Controller\Admin\ThumbnailsController:ajaxUpdate' + ); $this->get('/admin/export', '\Shaarli\Front\Controller\Admin\ExportController:index'); $this->post('/admin/export', '\Shaarli\Front\Controller\Admin\ExportController:export'); $this->get('/admin/import', '\Shaarli\Front\Controller\Admin\ImportController:index'); @@ -978,6 +958,7 @@ $app->group('', function () { $this->get('/admin/plugins', '\Shaarli\Front\Controller\Admin\PluginsController:index'); $this->post('/admin/plugins', '\Shaarli\Front\Controller\Admin\PluginsController:save'); $this->get('/admin/token', '\Shaarli\Front\Controller\Admin\TokenController:getToken'); + $this->get('/admin/thumbnails', '\Shaarli\Front\Controller\Admin\ThumbnailsController:index'); $this->get('/links-per-page', '\Shaarli\Front\Controller\Admin\SessionFilterController:linksPerPage'); $this->get('/visibility/{visibility}', '\Shaarli\Front\Controller\Admin\SessionFilterController:visibility'); -- cgit v1.2.3 From 1a8ac737e52cb25a5c346232ee398f5908cee7d7 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Mon, 6 Jul 2020 08:04:35 +0200 Subject: Process main page (linklist) through Slim controller Including a bunch of improvements on the container, and helper used across new controllers. --- index.php | 534 +------------------------------------------------------------- 1 file changed, 6 insertions(+), 528 deletions(-) (limited to 'index.php') diff --git a/index.php b/index.php index a07de74d..2737c22c 100644 --- a/index.php +++ b/index.php @@ -61,30 +61,15 @@ require_once 'application/TimeZone.php'; require_once 'application/Utils.php'; use Shaarli\ApplicationUtils; -use Shaarli\Bookmark\Bookmark; use Shaarli\Bookmark\BookmarkFileService; -use Shaarli\Bookmark\BookmarkFilter; -use Shaarli\Bookmark\BookmarkServiceInterface; -use Shaarli\Bookmark\Exception\BookmarkNotFoundException; use Shaarli\Config\ConfigManager; use Shaarli\Container\ContainerBuilder; -use Shaarli\Feed\CachedPage; -use Shaarli\Feed\FeedBuilder; -use Shaarli\Formatter\BookmarkMarkdownFormatter; -use Shaarli\Formatter\FormatterFactory; use Shaarli\History; use Shaarli\Languages; -use Shaarli\Netscape\NetscapeBookmarkUtils; use Shaarli\Plugin\PluginManager; use Shaarli\Render\PageBuilder; -use Shaarli\Render\PageCacheManager; -use Shaarli\Render\ThemeUtils; -use Shaarli\Router; use Shaarli\Security\LoginManager; use Shaarli\Security\SessionManager; -use Shaarli\Thumbnailer; -use Shaarli\Updater\Updater; -use Shaarli\Updater\UpdaterUtils; use Slim\App; // Ensure the PHP version is supported @@ -196,20 +181,6 @@ if (! is_file($conf->getConfigFileExt())) { $loginManager->checkLoginState($_COOKIE, $clientIpId); -/** - * Adapter function to ensure compatibility with third-party templates - * - * @see https://github.com/shaarli/Shaarli/pull/1086 - * - * @return bool true when the user is logged in, false otherwise - */ -function isLoggedIn() -{ - global $loginManager; - return $loginManager->isLoggedIn(); -} - - // ------------------------------------------------------------------------------------------ // Process login form: Check if login/password is correct. if (isset($_POST['login'])) { @@ -300,473 +271,6 @@ if (!isset($_SESSION['tokens'])) { $_SESSION['tokens']=array(); // Token are attached to the session. } -/** - * Renders the linklist - * - * @param pageBuilder $PAGE pageBuilder instance. - * @param BookmarkServiceInterface $linkDb instance. - * @param ConfigManager $conf Configuration Manager instance. - * @param PluginManager $pluginManager Plugin Manager instance. - */ -function showLinkList($PAGE, $linkDb, $conf, $pluginManager, $loginManager) -{ - buildLinkList($PAGE, $linkDb, $conf, $pluginManager, $loginManager); - $PAGE->renderPage('linklist'); -} - -/** - * Render HTML page (according to URL parameters and user rights) - * - * @param ConfigManager $conf Configuration Manager instance. - * @param PluginManager $pluginManager Plugin Manager instance, - * @param BookmarkServiceInterface $bookmarkService - * @param History $history instance - * @param SessionManager $sessionManager SessionManager instance - * @param LoginManager $loginManager LoginManager instance - */ -function renderPage($conf, $pluginManager, $bookmarkService, $history, $sessionManager, $loginManager) -{ - $pageCacheManager = new PageCacheManager($conf->get('resource.page_cache'), $loginManager->isLoggedIn()); - $updater = new Updater( - UpdaterUtils::read_updates_file($conf->get('resource.updates')), - $bookmarkService, - $conf, - $loginManager->isLoggedIn() - ); - try { - $newUpdates = $updater->update(); - if (! empty($newUpdates)) { - UpdaterUtils::write_updates_file( - $conf->get('resource.updates'), - $updater->getDoneUpdates() - ); - - $pageCacheManager->invalidateCaches(); - } - } catch (Exception $e) { - die($e->getMessage()); - } - - $PAGE = new PageBuilder($conf, $_SESSION, $bookmarkService, $sessionManager->generateToken(), $loginManager->isLoggedIn()); - $PAGE->assign('linkcount', $bookmarkService->count(BookmarkFilter::$ALL)); - $PAGE->assign('privateLinkcount', $bookmarkService->count(BookmarkFilter::$PRIVATE)); - $PAGE->assign('plugin_errors', $pluginManager->getErrors()); - - // Determine which page will be rendered. - $query = (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : ''; - $targetPage = Router::findPage($query, $_GET, $loginManager->isLoggedIn()); - - if (// if the user isn't logged in - !$loginManager->isLoggedIn() && - // and Shaarli doesn't have public content... - $conf->get('privacy.hide_public_links') && - // and is configured to enforce the login - $conf->get('privacy.force_login') && - // and the current page isn't already the login page - $targetPage !== Router::$PAGE_LOGIN && - // and the user is not requesting a feed (which would lead to a different content-type as expected) - $targetPage !== Router::$PAGE_FEED_ATOM && - $targetPage !== Router::$PAGE_FEED_RSS - ) { - // force current page to be the login page - $targetPage = Router::$PAGE_LOGIN; - } - - // 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', - ); - - foreach ($common_hooks as $name) { - $plugin_data = array(); - $pluginManager->executeHooks( - 'render_' . $name, - $plugin_data, - array( - 'target' => $targetPage, - 'loggedin' => $loginManager->isLoggedIn() - ) - ); - $PAGE->assign('plugins_' . $name, $plugin_data); - } - - // -------- Display login form. - if ($targetPage == Router::$PAGE_LOGIN) { - header('Location: ./login'); - exit; - } - // -------- User wants to logout. - if (isset($_SERVER['QUERY_STRING']) && startsWith($_SERVER['QUERY_STRING'], 'do=logout')) { - header('Location: ./logout'); - exit; - } - - // -------- Picture wall - if ($targetPage == Router::$PAGE_PICWALL) { - header('Location: ./picture-wall'); - exit; - } - - // -------- Tag cloud - if ($targetPage == Router::$PAGE_TAGCLOUD) { - header('Location: ./tags/cloud'); - exit; - } - - // -------- Tag list - if ($targetPage == Router::$PAGE_TAGLIST) { - header('Location: ./tags/list'); - exit; - } - - // Daily page. - if ($targetPage == Router::$PAGE_DAILY) { - $dayParam = !empty($_GET['day']) ? '?day=' . escape($_GET['day']) : ''; - header('Location: ./daily'. $dayParam); - exit; - } - - // ATOM and RSS feed. - if ($targetPage == Router::$PAGE_FEED_ATOM || $targetPage == Router::$PAGE_FEED_RSS) { - $feedType = $targetPage == Router::$PAGE_FEED_RSS ? FeedBuilder::$FEED_RSS : FeedBuilder::$FEED_ATOM; - - header('Location: ./feed/'. $feedType .'?'. http_build_query($_GET)); - exit; - } - - // Display opensearch plugin (XML) - if ($targetPage == Router::$PAGE_OPENSEARCH) { - header('Location: ./open-search'); - exit; - } - - // -------- User clicks on a tag in a link: The tag is added to the list of searched tags (searchtags=...) - if (isset($_GET['addtag'])) { - header('Location: ./add-tag/'. $_GET['addtag']); - exit; - } - - // -------- User clicks on a tag in result count: Remove the tag from the list of searched tags (searchtags=...) - if (isset($_GET['removetag'])) { - header('Location: ./remove-tag/'. $_GET['removetag']); - exit; - } - - // -------- User wants to change the number of bookmarks per page (linksperpage=...) - if (isset($_GET['linksperpage'])) { - header('Location: ./links-per-page?nb='. $_GET['linksperpage']); - exit; - } - - // -------- User wants to see only private bookmarks (toggle) - if (isset($_GET['visibility'])) { - header('Location: ./visibility/'. $_GET['visibility']); - exit; - } - - // -------- User wants to see only untagged bookmarks (toggle) - if (isset($_GET['untaggedonly'])) { - header('Location: ./untagged-only'); - exit; - } - - // -------- Handle other actions allowed for non-logged in users: - if (!$loginManager->isLoggedIn()) { - // User tries to post new link but is not logged in: - // Show login screen, then redirect to ?post=... - if (isset($_GET['post'])) { - header( // Redirect to login page, then back to post link. - 'Location: ./login?post='.urlencode($_GET['post']). - (!empty($_GET['title'])?'&title='.urlencode($_GET['title']):''). - (!empty($_GET['description'])?'&description='.urlencode($_GET['description']):''). - (!empty($_GET['tags'])?'&tags='.urlencode($_GET['tags']):''). - (!empty($_GET['source'])?'&source='.urlencode($_GET['source']):'') - ); - exit; - } - - showLinkList($PAGE, $bookmarkService, $conf, $pluginManager, $loginManager); - if (isset($_GET['edit_link'])) { - header('Location: ./login?edit_link='. escape($_GET['edit_link'])); - exit; - } - - exit; // Never remove this one! All operations below are reserved for logged in user. - } - - // -------- All other functions are reserved for the registered user: - - // TODO: Remove legacy admin route redirections. We'll only keep public URL. - - // -------- Display the Tools menu if requested (import/export/bookmarklet...) - if ($targetPage == Router::$PAGE_TOOLS) { - header('Location: ./admin/tools'); - exit; - } - - // -------- User wants to change his/her password. - if ($targetPage == Router::$PAGE_CHANGEPASSWORD) { - header('Location: ./admin/password'); - exit; - } - - // -------- User wants to change configuration - if ($targetPage == Router::$PAGE_CONFIGURE) { - header('Location: ./admin/configure'); - exit; - } - - // -------- User wants to rename a tag or delete it - if ($targetPage == Router::$PAGE_CHANGETAG) { - header('Location: ./admin/tags'); - exit; - } - - // -------- User wants to add a link without using the bookmarklet: Show form. - if ($targetPage == Router::$PAGE_ADDLINK) { - header('Location: ./admin/shaare'); - exit; - } - - // -------- User clicked the "Save" button when editing a link: Save link to database. - if (isset($_POST['save_edit'])) { - // This route is no longer supported in legacy mode - header('Location: ./'); - exit; - } - - // -------- User clicked the "Delete" button when editing a link: Delete link from database. - if ($targetPage == Router::$PAGE_DELETELINK) { - $ids = $_GET['lf_linkdate'] ?? ''; - $token = $_GET['token'] ?? ''; - - header('Location: ./admin/shaare/delete?id=' . $ids . '&token=' . $token); - exit; - } - - // -------- User clicked either "Set public" or "Set private" bulk operation - if ($targetPage == Router::$PAGE_CHANGE_VISIBILITY) { - header('Location: ./admin/shaare/visibility?id=' . $_GET['token']); - exit; - } - - // -------- User clicked the "EDIT" button on a link: Display link edit form. - if (isset($_GET['edit_link'])) { - $id = (int) escape($_GET['edit_link']); - header('Location: ./admin/shaare/' . $id); - exit; - } - - // -------- User want to post a new link: Display link edit form. - if (isset($_GET['post'])) { - header('Location: ./admin/shaare?' . http_build_query($_GET)); - exit; - } - - if ($targetPage == Router::$PAGE_PINLINK) { - // This route is no longer supported in legacy mode - header('Location: ./'); - exit; - } - - if ($targetPage == Router::$PAGE_EXPORT) { - header('Location: ./admin/export'); - exit; - } - - if ($targetPage == Router::$PAGE_IMPORT) { - header('Location: ./admin/import'); - exit; - } - - // Plugin administration page - if ($targetPage == Router::$PAGE_PLUGINSADMIN) { - header('Location: ./admin/plugins'); - exit; - } - - // Plugin administration form action - if ($targetPage == Router::$PAGE_SAVE_PLUGINSADMIN) { - // This route is no longer supported in legacy mode - header('Location: ./admin/plugins'); - exit; - } - - // Get a fresh token - if ($targetPage == Router::$GET_TOKEN) { - header('Location: ./admin/token'); - exit; - } - - // -------- Thumbnails Update - if ($targetPage == Router::$PAGE_THUMBS_UPDATE) { - header('Location: ./admin/thumbnails'); - exit; - } - - // -------- Single Thumbnail Update - if ($targetPage == Router::$AJAX_THUMB_UPDATE) { - // This route is no longer supported in legacy mode - http_response_code(404); - exit; - } - - // -------- Otherwise, simply display search form and bookmarks: - showLinkList($PAGE, $bookmarkService, $conf, $pluginManager, $loginManager); - exit; -} - -/** - * Template for the list of bookmarks (