A free, self-hostable aggregator…
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

291 lines
8.3 KiB

12 years ago
<?php
class indexController extends ActionController {
private $get = false;
private $nb_not_read_cat = 0;
12 years ago
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')));
}
}
12 years ago
$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')))
);
12 years ago
}
} else {
Error::error (
404,
array ('error' => array (Translate::t ('page_not_found')))
);
}
12 years ago
}
/*
* 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
);
12 years ago
}
return $type;
12 years ago
}
/*
* 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 () {
12 years ago
$this->view->_useLayout (false);
12 years ago
$url = 'https://verifier.login.persona.org/verify';
$assert = Request::param ('assertion');
$params = 'assertion=' . $assert . '&audience=' .
urlencode (Url::display (null, 'php', true));
12 years ago
$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);
12 years ago
$res = json_decode ($result, true);
if ($res['status'] == 'okay' && $res['email'] == $this->view->conf->mailLogin ()) {
Session::_param ('mail', $res['email']);
touch(DATA_PATH . '/touch.txt');
12 years ago
} else {
$res = array ();
$res['status'] = 'failure';
$res['reason'] = Translate::t ('invalid_login');
12 years ago
}
12 years ago
$this->view->res = json_encode ($res);
}
public function logoutAction () {
$this->view->_useLayout (false);
Session::_param ('mail');
touch(DATA_PATH . '/touch.txt');
}
12 years ago
}