/**
  * This action handles the main subscription page
  *
  * It displays categories and associated feeds.
  */
 public function indexAction()
 {
     Minz_View::appendScript(Minz_Url::display('/scripts/category.js?' . @filemtime(PUBLIC_PATH . '/scripts/category.js')));
     Minz_View::prependTitle(_t('sub.title') . ' · ');
     $id = Minz_Request::param('id');
     if ($id !== false) {
         $feedDAO = FreshRSS_Factory::createFeedDao();
         $this->view->feed = $feedDAO->searchById($id);
     }
 }
Exemplo n.º 2
0
 /**
  * This action displays the user profile page.
  */
 public function profileAction()
 {
     Minz_View::prependTitle(_t('conf.profile.title') . ' · ');
     Minz_View::appendScript(Minz_Url::display('/scripts/bcrypt.min.js?' . @filemtime(PUBLIC_PATH . '/scripts/bcrypt.min.js')));
     if (Minz_Request::isPost()) {
         $ok = true;
         $passwordPlain = Minz_Request::param('newPasswordPlain', '', true);
         if ($passwordPlain != '') {
             Minz_Request::_param('newPasswordPlain');
             //Discard plain-text password ASAP
             $_POST['newPasswordPlain'] = '';
             if (!function_exists('password_hash')) {
                 include_once LIB_PATH . '/password_compat.php';
             }
             $passwordHash = password_hash($passwordPlain, PASSWORD_BCRYPT, array('cost' => self::BCRYPT_COST));
             $passwordPlain = '';
             $passwordHash = preg_replace('/^\\$2[xy]\\$/', '\\$2a\\$', $passwordHash);
             //Compatibility with bcrypt.js
             $ok &= $passwordHash != '';
             FreshRSS_Context::$user_conf->passwordHash = $passwordHash;
         }
         Minz_Session::_param('passwordHash', FreshRSS_Context::$user_conf->passwordHash);
         $passwordPlain = Minz_Request::param('apiPasswordPlain', '', true);
         if ($passwordPlain != '') {
             if (!function_exists('password_hash')) {
                 include_once LIB_PATH . '/password_compat.php';
             }
             $passwordHash = password_hash($passwordPlain, PASSWORD_BCRYPT, array('cost' => self::BCRYPT_COST));
             $passwordPlain = '';
             $passwordHash = preg_replace('/^\\$2[xy]\\$/', '\\$2a\\$', $passwordHash);
             //Compatibility with bcrypt.js
             $ok &= $passwordHash != '';
             FreshRSS_Context::$user_conf->apiPasswordHash = $passwordHash;
         }
         // TODO: why do we need of hasAccess here?
         if (FreshRSS_Auth::hasAccess('admin')) {
             FreshRSS_Context::$user_conf->mail_login = Minz_Request::param('mail_login', '', true);
         }
         $email = FreshRSS_Context::$user_conf->mail_login;
         Minz_Session::_param('mail', $email);
         $ok &= FreshRSS_Context::$user_conf->save();
         if ($email != '') {
             $personaFile = DATA_PATH . '/persona/' . $email . '.txt';
             @unlink($personaFile);
             $ok &= file_put_contents($personaFile, Minz_Session::param('currentUser', '_')) !== false;
         }
         if ($ok) {
             Minz_Request::good(_t('feedback.profile.updated'), array('c' => 'user', 'a' => 'profile'));
         } else {
             Minz_Request::bad(_t('feedback.profile.error'), array('c' => 'user', 'a' => 'profile'));
         }
     }
 }
Exemplo n.º 3
0
 /**
  * This action displays the global view of FreshRSS.
  */
 public function globalAction()
 {
     $allow_anonymous = FreshRSS_Context::$system_conf->allow_anonymous;
     if (!FreshRSS_Auth::hasAccess() && !$allow_anonymous) {
         Minz_Request::forward(array('c' => 'auth', 'a' => 'login'));
         return;
     }
     Minz_View::appendScript(Minz_Url::display('/scripts/global_view.js?' . @filemtime(PUBLIC_PATH . '/scripts/global_view.js')));
     try {
         $this->updateContext();
     } catch (FreshRSS_Context_Exception $e) {
         Minz_Error::error(404);
     }
     $this->view->categories = FreshRSS_Context::$categories;
     $this->view->rss_title = FreshRSS_Context::$name . ' | ' . Minz_View::title();
     $title = _t('index.feed.title_global');
     if (FreshRSS_Context::$get_unread > 0) {
         $title = '(' . FreshRSS_Context::$get_unread . ') ' . $title;
     }
     Minz_View::prependTitle($title . ' · ');
 }
Exemplo n.º 4
0
 /**
  * This action resets the authentication system.
  *
  * After reseting, form auth is set by default.
  */
 public function resetAction()
 {
     Minz_View::prependTitle(_t('admin.auth.title_reset') . ' · ');
     Minz_View::appendScript(Minz_Url::display('/scripts/bcrypt.min.js?' . @filemtime(PUBLIC_PATH . '/scripts/bcrypt.min.js')));
     $this->view->no_form = false;
     // Enable changement of auth only if Persona!
     if (FreshRSS_Context::$system_conf->auth_type != 'persona') {
         $this->view->message = array('status' => 'bad', 'title' => _t('gen.short.damn'), 'body' => _t('feedback.auth.not_persona'));
         $this->view->no_form = true;
         return;
     }
     $conf = get_user_configuration(FreshRSS_Context::$system_conf->default_user);
     if (is_null($conf)) {
         return;
     }
     // Admin user must have set its master password.
     if (!$conf->passwordHash) {
         $this->view->message = array('status' => 'bad', 'title' => _t('gen.short.damn'), 'body' => _t('feedback.auth.no_password_set'));
         $this->view->no_form = true;
         return;
     }
     invalidateHttpCache();
     if (Minz_Request::isPost()) {
         $nonce = Minz_Session::param('nonce');
         $username = Minz_Request::param('username', '');
         $challenge = Minz_Request::param('challenge', '');
         $ok = FreshRSS_FormAuth::checkCredentials($username, $conf->passwordHash, $nonce, $challenge);
         if ($ok) {
             FreshRSS_Context::$system_conf->auth_type = 'form';
             $ok = FreshRSS_Context::$system_conf->save();
             if ($ok) {
                 Minz_Request::good(_t('feedback.auth.form.set'));
             } else {
                 Minz_Request::bad(_t('feedback.auth.form.not_set'), array('c' => 'auth', 'a' => 'reset'));
             }
         } else {
             Minz_Log::warning('Password mismatch for' . ' user='******', nonce=' . $nonce . ', c=' . $challenge);
             Minz_Request::bad(_t('feedback.auth.login.invalid'), array('c' => 'auth', 'a' => 'reset'));
         }
     }
 }
Exemplo n.º 5
0
 /**
  * This action handles the article repartition statistic page.
  *
  * It displays the number of article and the average of article for the
  * following periods:
  *   - hour of the day
  *   - day of the week
  *   - month
  *
  * @todo verify that the metrics used here make some sense. Especially
  *       for the average.
  */
 public function repartitionAction()
 {
     $statsDAO = FreshRSS_Factory::createStatsDAO();
     $categoryDAO = new FreshRSS_CategoryDAO();
     $feedDAO = FreshRSS_Factory::createFeedDao();
     Minz_View::appendScript(Minz_Url::display('/scripts/flotr2.min.js?' . @filemtime(PUBLIC_PATH . '/scripts/flotr2.min.js')));
     $id = Minz_Request::param('id', null);
     $this->view->categories = $categoryDAO->listCategories();
     $this->view->feed = $feedDAO->searchById($id);
     $this->view->days = $statsDAO->getDays();
     $this->view->months = $statsDAO->getMonths();
     $this->view->repartition = $statsDAO->calculateEntryRepartitionPerFeed($id);
     $this->view->repartitionHour = $statsDAO->calculateEntryRepartitionPerFeedPerHour($id);
     $this->view->averageHour = $statsDAO->calculateEntryAveragePerFeedPerHour($id);
     $this->view->repartitionDayOfWeek = $statsDAO->calculateEntryRepartitionPerFeedPerDayOfWeek($id);
     $this->view->averageDayOfWeek = $statsDAO->calculateEntryAveragePerFeedPerDayOfWeek($id);
     $this->view->repartitionMonth = $statsDAO->calculateEntryRepartitionPerFeedPerMonth($id);
     $this->view->averageMonth = $statsDAO->calculateEntryAveragePerFeedPerMonth($id);
 }
Exemplo n.º 6
0
 private function loadStylesAndScripts()
 {
     $theme = FreshRSS_Themes::load(FreshRSS_Context::$user_conf->theme);
     if ($theme) {
         foreach ($theme['files'] as $file) {
             if ($file[0] === '_') {
                 $theme_id = 'base-theme';
                 $filename = substr($file, 1);
             } else {
                 $theme_id = $theme['id'];
                 $filename = $file;
             }
             $filetime = @filemtime(PUBLIC_PATH . '/themes/' . $theme_id . '/' . $filename);
             Minz_View::appendStyle(Minz_Url::display('/themes/' . $theme_id . '/' . $filename . '?' . $filetime));
         }
     }
     Minz_View::appendScript(Minz_Url::display('/scripts/jquery.min.js?' . @filemtime(PUBLIC_PATH . '/scripts/jquery.min.js')));
     Minz_View::appendScript(Minz_Url::display('/scripts/shortcut.js?' . @filemtime(PUBLIC_PATH . '/scripts/shortcut.js')));
     Minz_View::appendScript(Minz_Url::display('/scripts/main.js?' . @filemtime(PUBLIC_PATH . '/scripts/main.js')));
     if (FreshRSS_Context::$system_conf->auth_type === 'persona') {
         // TODO move it in a plugin
         // Needed for login AND logout with Persona.
         Minz_View::appendScript('https://login.persona.org/include.js');
         $file_mtime = @filemtime(PUBLIC_PATH . '/scripts/persona.js');
         Minz_View::appendScript(Minz_Url::display('/scripts/persona.js?' . $file_mtime));
     }
 }
Exemplo n.º 7
0
 private function loadStylesAndScripts($loginOk)
 {
     $theme = FreshRSS_Themes::load($this->conf->theme);
     if ($theme) {
         foreach ($theme['files'] as $file) {
             Minz_View::appendStyle(Minz_Url::display('/themes/' . $theme['id'] . '/' . $file . '?' . @filemtime(PUBLIC_PATH . '/themes/' . $theme['id'] . '/' . $file)));
         }
     }
     switch (Minz_Configuration::authType()) {
         case 'form':
             if (!$loginOk) {
                 Minz_View::appendScript(Minz_Url::display('/scripts/bcrypt.min.js?' . @filemtime(PUBLIC_PATH . '/scripts/bcrypt.min.js')));
             }
             break;
         case 'persona':
             Minz_View::appendScript('https://login.persona.org/include.js');
             break;
     }
     $includeLazyLoad = $this->conf->lazyload && ($this->conf->display_posts || Minz_Request::param('output') === 'reader');
     Minz_View::appendScript(Minz_Url::display('/scripts/jquery.min.js?' . @filemtime(PUBLIC_PATH . '/scripts/jquery.min.js')), false, !$includeLazyLoad, !$includeLazyLoad);
     if ($includeLazyLoad) {
         Minz_View::appendScript(Minz_Url::display('/scripts/jquery.lazyload.min.js?' . @filemtime(PUBLIC_PATH . '/scripts/jquery.lazyload.min.js')));
     }
     Minz_View::appendScript(Minz_Url::display('/scripts/shortcut.js?' . @filemtime(PUBLIC_PATH . '/scripts/shortcut.js')));
     Minz_View::appendScript(Minz_Url::display('/scripts/main.js?' . @filemtime(PUBLIC_PATH . '/scripts/main.js')));
 }
Exemplo n.º 8
0
 public function statsAction()
 {
     if (!$this->view->loginOk) {
         Minz_Error::error(403, array('error' => array(Minz_Translate::t('access_denied'))));
     }
     Minz_View::prependTitle(Minz_Translate::t('stats') . ' · ');
     $statsDAO = new FreshRSS_StatsDAO();
     Minz_View::appendScript(Minz_Url::display('/scripts/flotr2.min.js?' . @filemtime(PUBLIC_PATH . '/scripts/flotr2.min.js')));
     $this->view->repartition = $statsDAO->calculateEntryRepartition();
     $this->view->count = $statsDAO->calculateEntryCount();
     $this->view->feedByCategory = $statsDAO->calculateFeedByCategory();
     $this->view->entryByCategory = $statsDAO->calculateEntryByCategory();
     $this->view->topFeed = $statsDAO->calculateTopFeed();
 }
Exemplo n.º 9
0
 public function init()
 {
     Minz_View::appendStyle($this->getFileUrl('style.css', 'css'));
     Minz_View::appendScript($this->getFileUrl('script.js', 'js'));
 }