X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=index.php;h=f4c8b391a44aee1572b57df299421c723e682405;hb=ba43064ddb7771fc97df135a32f9b0d5e373dd36;hp=f8337d79a6bc6f700ee1bd63afcf2014c0188ce4;hpb=69e29ff65ef56b886748c58ba5b037cf217c4a1d;p=github%2Fshaarli%2FShaarli.git diff --git a/index.php b/index.php index f8337d79..f4c8b391 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, @@ -522,196 +424,52 @@ 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; } // 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(), - $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(); - - // 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; } // 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; } // -------- 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; } // -------- 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; } // -------- 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; } @@ -743,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; } @@ -799,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. @@ -1714,7 +1461,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; } @@ -1740,14 +1487,36 @@ $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('/add-tag/{newTag}', '\Shaarli\Front\Controller\TagController:addTag')->setName('add-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('/tools', '\Shaarli\Front\Controller\Admin\ToolsController:index')->setName('tools'); + + $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') + ; })->add('\Shaarli\Front\ShaarliMiddleware'); $response = $app->run(true);