From 79aa5beaf44af13a1828bfa5fc824a08c62054dc Mon Sep 17 00:00:00 2001
From: Marien Fressinaud
Date: Mon, 6 Oct 2014 23:29:20 +0200
Subject: Refactor authentication system.
Big work, not finished. A lot of features have been removed.
See https://github.com/marienfressinaud/FreshRSS/issues/655
---
app/views/helpers/view/normal_view.phtml | 6 +++---
app/views/index/index.phtml | 2 +-
app/views/index/login.phtml | 1 -
app/views/index/logout.phtml | 1 -
app/views/index/resetAuth.phtml | 33 --------------------------------
5 files changed, 4 insertions(+), 39 deletions(-)
delete mode 100644 app/views/index/login.phtml
delete mode 100644 app/views/index/logout.phtml
delete mode 100644 app/views/index/resetAuth.phtml
(limited to 'app/views')
diff --git a/app/views/helpers/view/normal_view.phtml b/app/views/helpers/view/normal_view.phtml
index 109fad0eb..db25714bb 100644
--- a/app/views/helpers/view/normal_view.phtml
+++ b/app/views/helpers/view/normal_view.phtml
@@ -7,7 +7,7 @@ if (!empty($this->entries)) {
$display_today = true;
$display_yesterday = true;
$display_others = true;
- if ($this->loginOk) {
+ if (FreshRSS_Auth::hasAccess()) {
$sharing = $this->conf->sharing;
} else {
$sharing = array();
@@ -58,7 +58,7 @@ if (!empty($this->entries)) {
}
?>
loginOk) {
+ if (FreshRSS_Auth::hasAccess()) {
if ($bottomline_read) {
?>- 'entry', 'a' => 'read', 'params' => array('id' => $item->id()));
diff --git a/app/views/index/index.phtml b/app/views/index/index.phtml
index 584792e29..a59063557 100644
--- a/app/views/index/index.phtml
+++ b/app/views/index/index.phtml
@@ -2,7 +2,7 @@
$output = Minz_Request::param('output', 'normal');
-if ($this->loginOk || Minz_Configuration::allowAnonymous()) {
+if (FreshRSS_Auth::hasAccess() || Minz_Configuration::allowAnonymous()) {
if ($output === 'normal') {
$this->renderHelper('view/normal_view');
} elseif ($output === 'reader') {
diff --git a/app/views/index/login.phtml b/app/views/index/login.phtml
deleted file mode 100644
index 79fbe9d21..000000000
--- a/app/views/index/login.phtml
+++ /dev/null
@@ -1 +0,0 @@
-res); ?>
diff --git a/app/views/index/logout.phtml b/app/views/index/logout.phtml
deleted file mode 100644
index a0aba9318..000000000
--- a/app/views/index/logout.phtml
+++ /dev/null
@@ -1 +0,0 @@
-OK
\ No newline at end of file
diff --git a/app/views/index/resetAuth.phtml b/app/views/index/resetAuth.phtml
deleted file mode 100644
index 6d4282c14..000000000
--- a/app/views/index/resetAuth.phtml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
- message)) { ?>
-
- message['title']; ?>
- message['body']; ?>
-
-
-
- no_form) { ?>
-
-
-
--
cgit v1.2.3
From 6009990935a2d06c252073f6b51ea5378536ef52 Mon Sep 17 00:00:00 2001
From: Marien Fressinaud
Date: Tue, 7 Oct 2014 10:16:38 +0200
Subject: Introduce FreshRSS_Auth::hasAccess('admin')
Replace Minz_Configuration::isAdmin($user). FreshRSS_Auth::hasAccess() could
be extended to others scopes later.
See https://github.com/marienfressinaud/FreshRSS/issues/655
---
app/Controllers/configureController.php | 2 +-
app/Controllers/updateController.php | 2 +-
app/Controllers/usersController.php | 8 ++++----
app/Models/Auth.php | 19 +++++++++++++++----
app/layout/aside_configure.phtml | 5 +----
app/layout/header.phtml | 5 +----
app/views/configure/archiving.phtml | 2 +-
app/views/users/index.phtml | 6 +++---
lib/Minz/Configuration.php | 3 ---
9 files changed, 27 insertions(+), 25 deletions(-)
(limited to 'app/views')
diff --git a/app/Controllers/configureController.php b/app/Controllers/configureController.php
index 7e77a757a..fb8c1466e 100755
--- a/app/Controllers/configureController.php
+++ b/app/Controllers/configureController.php
@@ -229,7 +229,7 @@ class FreshRSS_configure_Controller extends Minz_ActionController {
$this->view->nb_total = $entryDAO->count();
$this->view->size_user = $entryDAO->size();
- if (Minz_Configuration::isAdmin(Minz_Session::param('currentUser', '_'))) {
+ if (FreshRSS_Auth::hasAccess('admin')) {
$this->view->size_total = $entryDAO->size(true);
}
}
diff --git a/app/Controllers/updateController.php b/app/Controllers/updateController.php
index 9da1e8657..9d1e1ddf5 100644
--- a/app/Controllers/updateController.php
+++ b/app/Controllers/updateController.php
@@ -3,7 +3,7 @@
class FreshRSS_update_Controller extends Minz_ActionController {
public function firstAction() {
$current_user = Minz_Session::param('currentUser', '');
- if (!FreshRSS_Auth::hasAccess() && Minz_Configuration::isAdmin($current_user)) {
+ if (!FreshRSS_Auth::hasAccess('admin')) {
Minz_Error::error(
403,
array('error' => array(_t('access_denied')))
diff --git a/app/Controllers/usersController.php b/app/Controllers/usersController.php
index c2b1d163f..11862ce27 100644
--- a/app/Controllers/usersController.php
+++ b/app/Controllers/usersController.php
@@ -51,7 +51,7 @@ class FreshRSS_users_Controller extends Minz_ActionController {
$this->view->conf->_apiPasswordHash($passwordHash);
}
- if (Minz_Configuration::isAdmin(Minz_Session::param('currentUser', '_'))) {
+ if (FreshRSS_Auth::hasAccess('admin')) {
$this->view->conf->_mail_login(Minz_Request::param('mail_login', '', true));
}
$email = $this->view->conf->mail_login;
@@ -65,7 +65,7 @@ class FreshRSS_users_Controller extends Minz_ActionController {
$ok &= (file_put_contents($personaFile, Minz_Session::param('currentUser', '_')) !== false);
}
- if (Minz_Configuration::isAdmin(Minz_Session::param('currentUser', '_'))) {
+ if (FreshRSS_Auth::hasAccess('admin')) {
$current_token = $this->view->conf->token;
$token = Minz_Request::param('token', $current_token);
$this->view->conf->_token($token);
@@ -105,7 +105,7 @@ class FreshRSS_users_Controller extends Minz_ActionController {
}
public function createAction() {
- if (Minz_Request::isPost() && Minz_Configuration::isAdmin(Minz_Session::param('currentUser', '_'))) {
+ if (Minz_Request::isPost() && FreshRSS_Auth::hasAccess('admin')) {
$db = Minz_Configuration::dataBase();
require_once(APP_PATH . '/SQL/install.sql.' . $db['type'] . '.php');
@@ -177,7 +177,7 @@ class FreshRSS_users_Controller extends Minz_ActionController {
}
public function deleteAction() {
- if (Minz_Request::isPost() && Minz_Configuration::isAdmin(Minz_Session::param('currentUser', '_'))) {
+ if (Minz_Request::isPost() && FreshRSS_Auth::hasAccess('admin')) {
$db = Minz_Configuration::dataBase();
require_once(APP_PATH . '/SQL/install.sql.' . $db['type'] . '.php');
diff --git a/app/Models/Auth.php b/app/Models/Auth.php
index c4a3abd98..992b444a5 100644
--- a/app/Models/Auth.php
+++ b/app/Models/Auth.php
@@ -99,12 +99,23 @@ class FreshRSS_Auth {
}
/**
- * Returns if current user is connected.
+ * Returns if current user has access to the given scope.
*
- * @return boolean true if user is connected, false else.
+ * @param string $scope general (default) or admin
+ * @return boolean true if user has corresponding access, false else.
*/
- public static function hasAccess() {
- return self::$login_ok;
+ public static function hasAccess($scope = 'general') {
+ $ok = self::$login_ok;
+ switch ($scope) {
+ case 'general':
+ break;
+ case 'admin':
+ $ok &= Minz_Session::param('currentUser') === Minz_Configuration::defaultUser();
+ break;
+ default:
+ $ok = false;
+ }
+ return $ok;
}
/**
diff --git a/app/layout/aside_configure.phtml b/app/layout/aside_configure.phtml
index e17bcb254..59846a7c8 100644
--- a/app/layout/aside_configure.phtml
+++ b/app/layout/aside_configure.phtml
@@ -22,10 +22,7 @@
-
-
+
-
diff --git a/app/layout/header.phtml b/app/layout/header.phtml
index fadfd13d7..12c86d61d 100644
--- a/app/layout/header.phtml
+++ b/app/layout/header.phtml
@@ -64,10 +64,7 @@ if (Minz_Configuration::canLogIn()) {
-
+
diff --git a/app/views/configure/archiving.phtml b/app/views/configure/archiving.phtml
index a883571aa..adbfdb77e 100644
--- a/app/views/configure/archiving.phtml
+++ b/app/views/configure/archiving.phtml
@@ -67,7 +67,7 @@
-
+
-
+
diff --git a/lib/Minz/Configuration.php b/lib/Minz/Configuration.php
index 4e9da58b4..554bc8c96 100644
--- a/lib/Minz/Configuration.php
+++ b/lib/Minz/Configuration.php
@@ -100,9 +100,6 @@ class Minz_Configuration {
public static function defaultUser () {
return self::$default_user;
}
- public static function isAdmin($currentUser) {
- return $currentUser === self::$default_user;
- }
public static function allowAnonymous() {
return self::$allow_anonymous;
}
--
cgit v1.2.3
From 1252b3dd867e59917cf303f0c39c7da938b8ce32 Mon Sep 17 00:00:00 2001
From: Marien Fressinaud
Date: Tue, 7 Oct 2014 16:37:10 +0200
Subject: Authentication system moved + Persona comes back!
AuthController is dedicated to auhentication.
Persona is back, greater than ever!
See https://github.com/marienfressinaud/FreshRSS/issues/655
---
app/Controllers/authController.php | 182 ++++++++++++++++++++++++++++++++
app/Controllers/indexController.php | 90 +---------------
app/FreshRSS.php | 8 ++
app/Models/Auth.php | 21 +++-
app/layout/header.phtml | 23 ++--
app/views/auth/formLogin.phtml | 28 +++++
app/views/auth/logout.phtml | 0
app/views/auth/personaLogin.phtml | 24 +++++
app/views/helpers/javascript_vars.phtml | 13 ++-
app/views/index/formLogin.phtml | 46 --------
p/scripts/main.js | 65 ------------
p/scripts/persona.js | 76 +++++++++++++
12 files changed, 356 insertions(+), 220 deletions(-)
create mode 100644 app/Controllers/authController.php
create mode 100644 app/views/auth/formLogin.phtml
create mode 100644 app/views/auth/logout.phtml
create mode 100644 app/views/auth/personaLogin.phtml
delete mode 100644 app/views/index/formLogin.phtml
create mode 100644 p/scripts/persona.js
(limited to 'app/views')
diff --git a/app/Controllers/authController.php b/app/Controllers/authController.php
new file mode 100644
index 000000000..2b67e34b8
--- /dev/null
+++ b/app/Controllers/authController.php
@@ -0,0 +1,182 @@
+ 'index', 'a' => 'index'), true);
+ }
+
+ $auth_type = Minz_Configuration::authType();
+ switch ($auth_type) {
+ case 'form':
+ Minz_Request::forward(array('c' => 'auth', 'a' => 'formLogin'));
+ break;
+ case 'persona':
+ Minz_Request::forward(array('c' => 'auth', 'a' => 'personaLogin'));
+ break;
+ case 'http_auth':
+ case 'none':
+ // It should not happened!
+ Minz_Error::error(404);
+ default:
+ // TODO load plugin instead
+ Minz_Error::error(404);
+ }
+ }
+
+ /**
+ * This action handles form login page.
+ *
+ * If this action is reached through a POST request, username and password
+ * are compared to login the current user.
+ *
+ * Parameters are:
+ * - nonce (default: false)
+ * - username (default: '')
+ * - challenge (default: '')
+ * - keep_logged_in (default: false)
+ */
+ public function formLoginAction() {
+ invalidateHttpCache();
+
+ $file_mtime = @filemtime(PUBLIC_PATH . '/scripts/bcrypt.min.js');
+ Minz_View::appendScript(Minz_Url::display('/scripts/bcrypt.min.js?' . $file_mtime));
+
+ if (Minz_Request::isPost()) {
+ $nonce = Minz_Session::param('nonce');
+ $username = Minz_Request::param('username', '');
+ $challenge = Minz_Request::param('challenge', '');
+ try {
+ $conf = new FreshRSS_Configuration($username);
+ } catch(Minz_Exception $e) {
+ // $username is not a valid user, nor the configuration file!
+ Minz_Log::warning('Login failure: ' . $e->getMessage());
+ Minz_Request::bad(_t('invalid_login'),
+ array('c' => 'auth', 'a' => 'login'));
+ }
+
+ $ok = FreshRSS_FormAuth::checkCredentials(
+ $username, $conf->passwordHash, $nonce, $challenge
+ );
+ if ($ok) {
+ // Set session parameter to give access to the user.
+ Minz_Session::_param('currentUser', $username);
+ Minz_Session::_param('passwordHash', $conf->passwordHash);
+ FreshRSS_Auth::giveAccess();
+
+ // Set cookie parameter if nedded.
+ if (Minz_Request::param('keep_logged_in')) {
+ FreshRSS_FormAuth::makeCookie($username, $conf->passwordHash);
+ } else {
+ FreshRSS_FormAuth::deleteCookie();
+ }
+
+ // All is good, go back to the index.
+ Minz_Request::good(_t('login'),
+ array('c' => 'index', 'a' => 'index'));
+ } else {
+ Minz_Log::warning('Password mismatch for' .
+ ' user=' . $username .
+ ', nonce=' . $nonce .
+ ', c=' . $challenge);
+ Minz_Request::bad(_t('invalid_login'),
+ array('c' => 'auth', 'a' => 'login'));
+ }
+ }
+ }
+
+ /**
+ * This action handles Persona login page.
+ *
+ * If this action is reached through a POST request, assertion from Persona
+ * is verificated and user connected if all is ok.
+ *
+ * Parameter is:
+ * - assertion (default: false)
+ *
+ * @todo: Persona system should be moved to a plugin
+ */
+ public function personaLoginAction() {
+ $this->view->res = false;
+
+ if (Minz_Request::isPost()) {
+ $this->view->_useLayout(false);
+
+ $assert = Minz_Request::param('assertion');
+ $url = 'https://verifier.login.persona.org/verify';
+ $params = 'assertion=' . $assert . '&audience=' .
+ urlencode(Minz_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);
+
+ $login_ok = false;
+ $reason = '';
+ if ($res['status'] === 'okay') {
+ $email = filter_var($res['email'], FILTER_VALIDATE_EMAIL);
+ if ($email != '') {
+ $persona_file = DATA_PATH . '/persona/' . $email . '.txt';
+ if (($current_user = @file_get_contents($persona_file)) !== false) {
+ $current_user = trim($current_user);
+ try {
+ $conf = new FreshRSS_Configuration($current_user);
+ $login_ok = strcasecmp($email, $conf->mail_login) === 0;
+ } catch (Minz_Exception $e) {
+ //Permission denied or conf file does not exist
+ $reason = 'Invalid configuration for user ' .
+ '[' . $current_user . '] ' . $e->getMessage();
+ }
+ }
+ } else {
+ $reason = 'Invalid email format [' . $res['email'] . ']';
+ }
+ } else {
+ $reason = $res['reason'];
+ }
+
+ if ($login_ok) {
+ Minz_Session::_param('currentUser', $current_user);
+ Minz_Session::_param('mail', $email);
+ FreshRSS_Auth::giveAccess();
+ invalidateHttpCache();
+ } else {
+ Minz_Log::error($reason);
+
+ $res = array();
+ $res['status'] = 'failure';
+ $res['reason'] = _t('invalid_login');
+ }
+
+ header('Content-Type: application/json; charset=UTF-8');
+ $this->view->res = $res;
+ }
+ }
+
+ /**
+ * This action removes all accesses of the current user.
+ */
+ public function logoutAction() {
+ invalidateHttpCache();
+ FreshRSS_Auth::removeAccess();
+ Minz_Request::good(_t('disconnected'),
+ array('c' => 'index', 'a' => 'index'));
+ }
+}
diff --git a/app/Controllers/indexController.php b/app/Controllers/indexController.php
index 3006480f9..5b490e672 100755
--- a/app/Controllers/indexController.php
+++ b/app/Controllers/indexController.php
@@ -20,7 +20,7 @@ class FreshRSS_index_Controller extends Minz_ActionController {
} elseif ($output !== 'rss') {
// "hard" redirection is not required, just ask dispatcher to
// forward to the login form without 302 redirection
- Minz_Request::forward(array('c' => 'index', 'a' => 'login'));
+ Minz_Request::forward(array('c' => 'auth', 'a' => 'login'));
return;
}
}
@@ -228,92 +228,4 @@ class FreshRSS_index_Controller extends Minz_ActionController {
$this->view->logsPaginator->_nbItemsPerPage(50);
$this->view->logsPaginator->_currentPage($page);
}
-
- /**
- * This action handles the login page.
- */
- public function loginAction() {
- if (FreshRSS_Auth::hasAccess()) {
- Minz_Request::forward(array('c' => 'index', 'a' => 'index'), true);
- }
-
- invalidateHttpCache();
-
- $auth_type = Minz_Configuration::authType();
- switch ($auth_type) {
- case 'form':
- Minz_Request::forward(array('c' => 'index', 'a' => 'formLogin'));
- break;
- case 'http_auth':
- case 'none':
- // It should not happened!
- Minz_Error::error(404);
- default:
- // TODO load plugin instead
- Minz_Error::error(404);
- }
- }
-
- /**
- *
- */
- public function formLoginAction() {
- if (FreshRSS_Auth::hasAccess()) {
- Minz_Request::forward(array('c' => 'index', 'a' => 'index'), true);
- }
-
- invalidateHttpCache();
-
- $file_mtime = @filemtime(PUBLIC_PATH . '/scripts/bcrypt.min.js');
- Minz_View::appendScript(Minz_Url::display('/scripts/bcrypt.min.js?' . $file_mtime));
-
- if (Minz_Request::isPost()) {
- $nonce = Minz_Session::param('nonce');
- $username = Minz_Request::param('username', '');
- $challenge = Minz_Request::param('challenge', '');
- try {
- $conf = new FreshRSS_Configuration($username);
- } catch(Minz_Exception $e) {
- // $username is not a valid user, nor the configuration file!
- Minz_Log::warning('Login failure: ' . $e->getMessage());
- Minz_Request::bad(_t('invalid_login'),
- array('c' => 'index', 'a' => 'login'));
- }
-
- $ok = FreshRSS_FormAuth::checkCredentials(
- $username, $conf->passwordHash, $nonce, $challenge
- );
- if ($ok) {
- // Set session parameter to give access to the user.
- Minz_Session::_param('currentUser', $username);
- Minz_Session::_param('passwordHash', $conf->passwordHash);
- FreshRSS_Auth::giveAccess();
-
- // Set cookie parameter if nedded.
- if (Minz_Request::param('keep_logged_in', false)) {
- FreshRSS_FormAuth::makeCookie($username, $conf->passwordHash);
- } else {
- FreshRSS_FormAuth::deleteCookie();
- }
-
- // All is good, go back to the index.
- Minz_Request::good(_t('login'),
- array('c' => 'index', 'a' => 'index'));
- } else {
- Minz_Log::warning('Password mismatch for' .
- ' user=' . $username .
- ', nonce=' . $nonce .
- ', c=' . $challenge);
- Minz_Request::bad(_t('invalid_login'),
- array('c' => 'index', 'a' => 'login'));
- }
- }
- }
-
- public function logoutAction() {
- invalidateHttpCache();
- FreshRSS_Auth::removeAccess();
- Minz_Request::good(_t('disconnected'),
- array('c' => 'index', 'a' => 'index'));
- }
}
diff --git a/app/FreshRSS.php b/app/FreshRSS.php
index 35a37b887..6b7a813bf 100644
--- a/app/FreshRSS.php
+++ b/app/FreshRSS.php
@@ -64,6 +64,14 @@ class FreshRSS extends Minz_FrontController {
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 (Minz_Configuration::authType() === '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));
+ }
}
private function loadNotifications() {
diff --git a/app/Models/Auth.php b/app/Models/Auth.php
index 992b444a5..cc23d7974 100644
--- a/app/Models/Auth.php
+++ b/app/Models/Auth.php
@@ -20,7 +20,7 @@ class FreshRSS_Auth {
Minz_Session::_param('currentUser', $current_user);
}
- $access_ok = self::accessControl($current_user);
+ $access_ok = self::accessControl();
if ($access_ok) {
self::giveAccess();
@@ -36,10 +36,9 @@ class FreshRSS_Auth {
* Required session parameters are also set in this method (such as
* currentUser).
*
- * @param string $username username of the user to check access.
* @return boolean true if user can be connected, false else.
*/
- public static function accessControl($username) {
+ public static function accessControl() {
if (self::$login_ok) {
return true;
}
@@ -61,6 +60,16 @@ class FreshRSS_Auth {
Minz_Session::_param('currentUser', $current_user);
}
return $login_ok;
+ case 'persona':
+ $email = filter_var(Minz_Session::param('mail'), FILTER_VALIDATE_EMAIL);
+ $persona_file = DATA_PATH . '/persona/' . $email . '.txt';
+ if (($current_user = @file_get_contents($persona_file)) !== false) {
+ $current_user = trim($current_user);
+ Minz_Session::_param('currentUser', $current_user);
+ Minz_Session::_param('mail', $email);
+ return true;
+ }
+ return false;
case 'none':
return true;
default:
@@ -87,6 +96,9 @@ class FreshRSS_Auth {
case 'http_auth':
self::$login_ok = strcasecmp($current_user, httpAuthUser()) === 0;
break;
+ case 'persona':
+ self::$login_ok = strcasecmp(Minz_Session::param('mail'), $conf->mail_login) === 0;
+ break;
case 'none':
self::$login_ok = true;
break;
@@ -131,6 +143,9 @@ class FreshRSS_Auth {
Minz_Session::_param('passwordHash');
FreshRSS_FormAuth::deleteCookie();
break;
+ case 'persona':
+ Minz_Session::_param('mail');
+ break;
case 'http_auth':
case 'none':
// Nothing to do...
diff --git a/app/layout/header.phtml b/app/layout/header.phtml
index 12c86d61d..deb21edc9 100644
--- a/app/layout/header.phtml
+++ b/app/layout/header.phtml
@@ -2,9 +2,9 @@
if (Minz_Configuration::canLogIn()) {
?>
-
-
+
+
+
diff --git a/app/views/auth/formLogin.phtml b/app/views/auth/formLogin.phtml
new file mode 100644
index 000000000..0194a11a5
--- /dev/null
+++ b/app/views/auth/formLogin.phtml
@@ -0,0 +1,28 @@
+
diff --git a/app/views/auth/logout.phtml b/app/views/auth/logout.phtml
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/views/auth/personaLogin.phtml b/app/views/auth/personaLogin.phtml
new file mode 100644
index 000000000..d62fe5818
--- /dev/null
+++ b/app/views/auth/personaLogin.phtml
@@ -0,0 +1,24 @@
+res === false) { ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+res);
+}
+?>
diff --git a/app/views/helpers/javascript_vars.phtml b/app/views/helpers/javascript_vars.phtml
index 8f615ed87..3bbcc3848 100644
--- a/app/views/helpers/javascript_vars.phtml
+++ b/app/views/helpers/javascript_vars.phtml
@@ -8,6 +8,15 @@ $hide_posts = ($this->conf->display_posts ||
Minz_Request::param('output') === 'reader');
$s = $this->conf->shortcuts;
+$url_login = Minz_Url::display(array(
+ 'c' => 'auth',
+ 'a' => 'login'
+), 'php');
+$url_logout = Minz_Url::display(array(
+ 'c' => 'auth',
+ 'a' => 'logout'
+), 'php');
+
echo 'var context={',
'hide_posts:', $hide_posts ? 'false' : 'true', ',',
'display_order:"', Minz_Request::param('order', $this->conf->sort_order), '",',
@@ -43,8 +52,8 @@ echo 'shortcuts={',
echo 'url={',
'index:"', _url('index', 'index'), '",',
- 'login:"', _url('index', 'login'), '",',
- 'logout:"', _url('index', 'logout'), '",',
+ 'login:"', $url_login, '",',
+ 'logout:"', $url_logout, '",',
'help:"', FRESHRSS_WIKI, '"',
"},\n";
diff --git a/app/views/index/formLogin.phtml b/app/views/index/formLogin.phtml
deleted file mode 100644
index b05cdced4..000000000
--- a/app/views/index/formLogin.phtml
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/p/scripts/main.js b/p/scripts/main.js
index b01a3a34d..77e1e3f77 100644
--- a/p/scripts/main.js
+++ b/p/scripts/main.js
@@ -1034,67 +1034,7 @@ function init_crypto_form() {
}
//
-//
-function init_persona() {
- if (!(navigator.id)) {
- if (window.console) {
- console.log('FreshRSS waiting for Persona…');
- }
- window.setTimeout(init_persona, 100);
- return;
- }
- $('a.signin').click(function() {
- navigator.id.request();
- return false;
- });
-
- $('a.signout').click(function() {
- navigator.id.logout();
- return false;
- });
- navigator.id.watch({
- loggedInUser: context['current_user_mail'],
-
- onlogin: function(assertion) {
- // A user has logged in! Here you need to:
- // 1. Send the assertion to your backend for verification and to create a session.
- // 2. Update your UI.
- $.ajax ({
- type: 'POST',
- url: url['login'],
- data: {assertion: assertion},
- success: function(res, status, xhr) {
- /*if (res.status === 'failure') {
- alert (res_obj.reason);
- } else*/ if (res.status === 'okay') {
- location.href = url['index'];
- }
- },
- error: function(res, status, xhr) {
- alert("Login failure: " + res);
- }
- });
- },
- onlogout: function() {
- // A user has logged out! Here you need to:
- // Tear down the user's session by redirecting the user or making a call to your backend.
- // Also, make sure loggedInUser will get set to null on the next page load.
- // (That's a literal JavaScript null. Not false, 0, or undefined. null.)
- $.ajax ({
- type: 'POST',
- url: url['logout'],
- success: function(res, status, xhr) {
- location.href = url['index'];
- },
- error: function(res, status, xhr) {
- //alert("logout failure" + res);
- }
- });
- }
- });
-}
-//
function init_confirm_action() {
$('body').on('click', '.confirm', function () {
@@ -1274,11 +1214,6 @@ function init_all() {
return;
}
init_notifications();
- switch (context['auth_type']) {
- case 'persona':
- init_persona();
- break;
- }
init_confirm_action();
$stream = $('#stream');
if ($stream.length > 0) {
diff --git a/p/scripts/persona.js b/p/scripts/persona.js
new file mode 100644
index 000000000..36aeeaf56
--- /dev/null
+++ b/p/scripts/persona.js
@@ -0,0 +1,76 @@
+"use strict";
+
+function init_persona() {
+ if (!(navigator.id && window.$)) {
+ if (window.console) {
+ console.log('FreshRSS (Persona) waiting for JS…');
+ }
+ window.setTimeout(init_persona, 100);
+ return;
+ }
+
+ $('a.signin').click(function() {
+ navigator.id.request();
+ return false;
+ });
+
+ $('a.signout').click(function() {
+ navigator.id.logout();
+ return false;
+ });
+
+ navigator.id.watch({
+ loggedInUser: context['current_user_mail'],
+
+ onlogin: function(assertion) {
+ // A user has logged in! Here you need to:
+ // 1. Send the assertion to your backend for verification and to create a session.
+ // 2. Update your UI.
+ $.ajax ({
+ type: 'POST',
+ url: url['login'],
+ data: {assertion: assertion},
+ success: function(res, status, xhr) {
+ if (res.status === 'failure') {
+ openNotification(res.reason, 'bad');
+ } else if (res.status === 'okay') {
+ location.href = url['index'];
+ }
+ },
+ error: function(res, status, xhr) {
+ // alert(res);
+ }
+ });
+ },
+ onlogout: function() {
+ // A user has logged out! Here you need to:
+ // Tear down the user's session by redirecting the user or making a call to your backend.
+ // Also, make sure loggedInUser will get set to null on the next page load.
+ // (That's a literal JavaScript null. Not false, 0, or undefined. null.)
+ $.ajax ({
+ type: 'POST',
+ url: url['logout'],
+ success: function(res, status, xhr) {
+ location.href = url['index'];
+ },
+ error: function(res, status, xhr) {
+ // alert(res);
+ }
+ });
+ }
+ });
+}
+
+if (document.readyState && document.readyState !== 'loading') {
+ if (window.console) {
+ console.log('FreshRSS (Persona) immediate init…');
+ }
+ init_persona();
+} else if (document.addEventListener) {
+ document.addEventListener('DOMContentLoaded', function () {
+ if (window.console) {
+ console.log('FreshRSS (Persona) waiting for DOMContentLoaded…');
+ }
+ init_persona();
+ }, false);
+}
--
cgit v1.2.3
From dbf57266b297c3f831602ec4f451c27a5ad71e6b Mon Sep 17 00:00:00 2001
From: Marien Fressinaud
Date: Tue, 7 Oct 2014 16:58:11 +0200
Subject: Reset auth system comes back!
It has moved to authController.
---
app/Controllers/authController.php | 68 ++++++++++++++++++++++++++++++++++++++
app/views/auth/personaLogin.phtml | 2 +-
app/views/auth/reset.phtml | 33 ++++++++++++++++++
3 files changed, 102 insertions(+), 1 deletion(-)
create mode 100644 app/views/auth/reset.phtml
(limited to 'app/views')
diff --git a/app/Controllers/authController.php b/app/Controllers/authController.php
index 2b67e34b8..e30fa4b72 100644
--- a/app/Controllers/authController.php
+++ b/app/Controllers/authController.php
@@ -179,4 +179,72 @@ class FreshRSS_auth_Controller extends Minz_ActionController {
Minz_Request::good(_t('disconnected'),
array('c' => 'index', 'a' => 'index'));
}
+
+ /**
+ * This action resets the authentication system.
+ *
+ * After reseting, form auth is set by default.
+ */
+ public function resetAction() {
+ Minz_View::prependTitle(_t('auth_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 (Minz_Configuration::authType() != 'persona') {
+ $this->view->message = array(
+ 'status' => 'bad',
+ 'title' => _t('damn'),
+ 'body' => _t('auth_not_persona')
+ );
+ $this->view->no_form = true;
+ return;
+ }
+
+ $conf = new FreshRSS_Configuration(Minz_Configuration::defaultUser());
+ // Admin user must have set its master password.
+ if (!$conf->passwordHash) {
+ $this->view->message = array(
+ 'status' => 'bad',
+ 'title' => _t('damn'),
+ 'body' => _t('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) {
+ Minz_Configuration::_authType('form');
+ $ok = Minz_Configuration::writeFile();
+
+ if ($ok) {
+ Minz_Request::good(_t('auth_form_set'));
+ } else {
+ Minz_Request::bad(_t('auth_form_not_set'),
+ array('c' => 'auth', 'a' => 'reset'));
+ }
+ } else {
+ Minz_Log::warning('Password mismatch for' .
+ ' user=' . $username .
+ ', nonce=' . $nonce .
+ ', c=' . $challenge);
+ Minz_Request::bad(_t('invalid_login'),
+ array('c' => 'auth', 'a' => 'reset'));
+ }
+ }
+ }
}
diff --git a/app/views/auth/personaLogin.phtml b/app/views/auth/personaLogin.phtml
index d62fe5818..dd3e22b52 100644
--- a/app/views/auth/personaLogin.phtml
+++ b/app/views/auth/personaLogin.phtml
@@ -11,7 +11,7 @@
-
+
diff --git a/app/views/auth/reset.phtml b/app/views/auth/reset.phtml
new file mode 100644
index 000000000..e501555c4
--- /dev/null
+++ b/app/views/auth/reset.phtml
@@ -0,0 +1,33 @@
+
+
+
+ message)) { ?>
+
+ message['title']; ?>
+ message['body']; ?>
+
+
+
+ no_form) { ?>
+
+
+
--
cgit v1.2.3