Files
FreshRSS/app/controllers/indexController.php
Alexandre Alapetite 7cdc477c45 touch en microsecondes
Passage en microsecondes pour le touch (gestion du cache) pour éviter
les problèmes en particulier dans le cas de requêtes de moins d'une
seconde.
Nouvelle fonction invalidateHttpCache() pour plus facilement changer de
méthode de contrôle de fraîcheur de cache.
Devrait résoudre https://github.com/marienfressinaud/FreshRSS/issues/296
2013-11-28 20:59:31 +01:00

291 lines
8.2 KiB
PHP
Executable File

<?php
class indexController extends ActionController {
private $get = false;
private $nb_not_read_cat = 0;
public function indexAction () {
$output = Request::param ('output');
$token = $this->view->conf->token();
$token_param = Request::param ('token', '');
$token_is_ok = ($token != '' && $token == $token_param);
// check if user is log in
if(login_is_conf ($this->view->conf) &&
!is_logged() &&
$this->view->conf->anonAccess() == 'no' &&
!($output == 'rss' && $token_is_ok)) {
return;
}
// construction of RSS url of this feed
$params = Request::params ();
$params['output'] = 'rss';
if (isset ($params['search'])) {
$params['search'] = urlencode ($params['search']);
}
if (login_is_conf($this->view->conf) &&
$this->view->conf->anonAccess() == 'no' &&
$token != '') {
$params['token'] = $token;
}
$this->view->rss_url = array (
'c' => 'index',
'a' => 'index',
'params' => $params
);
$this->view->rss_title = View::title();
if ($output == 'rss') {
// no layout for RSS output
$this->view->_useLayout (false);
header('Content-Type: application/rss+xml; charset=utf-8');
} else {
View::appendScript (Url::display ('/scripts/shortcut.js?' . @filemtime(PUBLIC_PATH . '/scripts/shortcut.js')));
if ($output == 'global') {
View::appendScript (Url::display ('/scripts/global_view.js?' . @filemtime(PUBLIC_PATH . '/scripts/global_view.js')));
}
}
$entryDAO = new EntryDAO ();
$feedDAO = new FeedDAO ();
$catDAO = new CategoryDAO ();
$this->view->cat_aside = $catDAO->listCategories ();
$this->view->nb_favorites = $entryDAO->countUnreadReadFavorites ();
$this->view->currentName = '';
$this->view->get_c = '';
$this->view->get_f = '';
$type = $this->getType ();
$error = $this->checkAndProcessType ($type);
// mise à jour des titres
$this->view->nb_not_read = HelperCategory::CountUnreads($this->view->cat_aside, 1);
if ($this->view->nb_not_read > 0) {
View::appendTitle (' (' . $this->view->nb_not_read . ')');
}
View::prependTitle (' - ');
$this->view->rss_title = $this->view->currentName . ' - ' . $this->view->rss_title;
View::prependTitle (
$this->view->currentName .
($this->nb_not_read_cat > 0 ? ' (' . $this->nb_not_read_cat . ')' : '')
);
if (!$error) {
// On récupère les différents éléments de filtrage
$this->view->state = $state = Request::param ('state', $this->view->conf->defaultView ());
$filter = Request::param ('search', '');
$this->view->order = $order = Request::param ('order', $this->view->conf->sortOrder ());
$nb = Request::param ('nb', $this->view->conf->postsPerPage ());
$first = Request::param ('next', '');
if ($state === 'not_read') { //Any unread article in this category at all?
switch ($type['type']) {
case 'all':
$hasUnread = $this->view->nb_not_read > 0;
break;
case 'favoris':
$hasUnread = $this->view->nb_favorites['unread'] > 0;
break;
case 'c':
$hasUnread = (!isset($this->view->cat_aside[$type['id']])) || ($this->view->cat_aside[$type['id']]->nbNotRead() > 0);
break;
case 'f':
$myFeed = HelperCategory::findFeed($this->view->cat_aside, $type['id']);
$hasUnread = ($myFeed === null) || ($myFeed->nbNotRead() > 0);
break;
default:
$hasUnread = true;
break;
}
if (!$hasUnread) {
$this->view->state = $state = 'all';
}
}
try {
// EntriesGetter permet de déporter la complexité du filtrage
$getter = new EntriesGetter ($type, $state, $filter, $order, $nb, $first);
$getter->execute ();
$entries = $getter->getPaginator ();
// Si on a récupéré aucun article "non lus"
// on essaye de récupérer tous les articles
if ($state === 'not_read' && $entries->isEmpty ()) { //TODO: Remove in v0.8
Minz_Log::record ('Conflicting information about nbNotRead!', Minz_Log::DEBUG);
$this->view->state = 'all';
$getter->_state ('all');
$getter->execute ();
$entries = $getter->getPaginator ();
}
$this->view->entryPaginator = $entries;
} catch (EntriesGetterException $e) {
Minz_Log::record ($e->getMessage (), Minz_Log::NOTICE);
Error::error (
404,
array ('error' => array (Translate::t ('page_not_found')))
);
}
} else {
Error::error (
404,
array ('error' => array (Translate::t ('page_not_found')))
);
}
}
/*
* Détermine le type d'article à récupérer :
* "tous", "favoris", "public", "catégorie" ou "flux"
*/
private function getType () {
$get = Request::param ('get', 'all');
$typeGet = $get[0];
$id = substr ($get, 2);
$type = null;
if ($get == 'all' || $get == 'favoris' || $get == 'public') {
$type = array (
'type' => $get,
'id' => $get
);
} elseif ($typeGet == 'f' || $typeGet == 'c') {
$type = array (
'type' => $typeGet,
'id' => $id
);
}
return $type;
}
/*
* Vérifie que la catégorie / flux sélectionné existe
* + Initialise correctement les variables de vue get_c et get_f
* + Met à jour la variable $this->nb_not_read_cat
*/
private function checkAndProcessType ($type) {
if ($type['type'] == 'all') {
$this->view->currentName = Translate::t ('your_rss_feeds');
$this->view->get_c = $type['type'];
return false;
} elseif ($type['type'] == 'favoris') {
$this->view->currentName = Translate::t ('your_favorites');
$this->view->get_c = $type['type'];
return false;
} elseif ($type['type'] == 'public') {
$this->view->currentName = Translate::t ('public');
$this->view->get_c = $type['type'];
return false;
} elseif ($type['type'] == 'c') {
$cat = isset($this->view->cat_aside[$type['id']]) ? $this->view->cat_aside[$type['id']] : null;
if ($cat === null) {
$catDAO = new CategoryDAO ();
$cat = $catDAO->searchById ($type['id']);
}
if ($cat) {
$this->view->currentName = $cat->name ();
$this->nb_not_read_cat = $cat->nbNotRead ();
$this->view->get_c = $type['id'];
return false;
} else {
return true;
}
} elseif ($type['type'] == 'f') {
$feed = HelperCategory::findFeed($this->view->cat_aside, $type['id']);
if (empty($feed)) {
$feedDAO = new FeedDAO ();
$feed = $feedDAO->searchById ($type['id']);
}
if ($feed) {
$this->view->currentName = $feed->name ();
$this->nb_not_read_cat = $feed->nbNotRead ();
$this->view->get_f = $type['id'];
$this->view->get_c = $feed->category ();
return false;
} else {
return true;
}
} else {
return true;
}
}
public function aboutAction () {
View::prependTitle (Translate::t ('about') . ' - ');
}
public function logsAction () {
if (login_is_conf ($this->view->conf) && !is_logged ()) {
Error::error (
403,
array ('error' => array (Translate::t ('access_denied')))
);
}
View::prependTitle (Translate::t ('logs') . ' - ');
if (Request::isPost ()) {
file_put_contents(LOG_PATH . '/application.log', '');
}
$logs = array();
try {
$logDAO = new LogDAO ();
$logs = $logDAO->lister ();
$logs = array_reverse ($logs);
} catch(FileNotExistException $e) {
}
//gestion pagination
$page = Request::param ('page', 1);
$this->view->logsPaginator = new Paginator ($logs);
$this->view->logsPaginator->_nbItemsPerPage (50);
$this->view->logsPaginator->_currentPage ($page);
}
public function loginAction () {
$this->view->_useLayout (false);
$url = 'https://verifier.login.persona.org/verify';
$assert = Request::param ('assertion');
$params = 'assertion=' . $assert . '&audience=' .
urlencode (Url::display (null, 'php', true));
$ch = curl_init ();
$options = array (
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_POST => 2,
CURLOPT_POSTFIELDS => $params
);
curl_setopt_array ($ch, $options);
$result = curl_exec ($ch);
curl_close ($ch);
$res = json_decode ($result, true);
if ($res['status'] == 'okay' && $res['email'] == $this->view->conf->mailLogin ()) {
Session::_param ('mail', $res['email']);
invalidateHttpCache();
} else {
$res = array ();
$res['status'] = 'failure';
$res['reason'] = Translate::t ('invalid_login');
}
$this->view->res = json_encode ($res);
}
public function logoutAction () {
$this->view->_useLayout (false);
Session::_param ('mail');
invalidateHttpCache();
}
}