LoginAction somewhat converted to FormAction

This commit is contained in:
Mikael Nordfeldth 2013-10-30 12:21:34 +01:00
parent f7c6dd4f6e
commit 8dafce34c3
5 changed files with 67 additions and 104 deletions

View File

@ -20,44 +20,21 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
* *
* @category Login * @category Login
* @package StatusNet * @package GNUsocial
* @author Evan Prodromou <evan@status.net> * @author Evan Prodromou <evan@status.net>
* @author Sarven Capadisli <csarven@status.net> * @author Sarven Capadisli <csarven@status.net>
* @author Mikael Nordfeldth <mmn@hethane.se>
* @copyright 2008-2009 StatusNet, Inc. * @copyright 2008-2009 StatusNet, Inc.
* @copyright 2013 Free Software Foundation, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://www.gnu.org/software/social/
*/ */
if (!defined('STATUSNET') && !defined('LACONICA')) { if (!defined('GNUSOCIAL')) { exit(1); }
exit(1);
}
/** class LoginAction extends FormAction
* Login form
*
* @category Personal
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @author Sarven Capadisli <csarven@status.net>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class LoginAction extends Action
{ {
/** protected $needLogin = false;
* Has there been an error?
*/
var $error = null;
/**
* Is this a read-only action?
*
* @return boolean false
*/
function isReadOnly($args)
{
return false;
}
/** /**
* Prepare page to run * Prepare page to run
@ -66,18 +43,15 @@ class LoginAction extends Action
* @param $args * @param $args
* @return string title * @return string title
*/ */
function prepare($args) protected function prepare(array $args=array())
{ {
parent::prepare($args);
// @todo this check should really be in index.php for all sensitive actions // @todo this check should really be in index.php for all sensitive actions
$ssl = common_config('site', 'ssl'); $ssl = common_config('site', 'ssl');
if (empty($_SERVER['HTTPS']) && ($ssl == 'always' || $ssl == 'sometimes')) { if (empty($_SERVER['HTTPS']) && ($ssl == 'always' || $ssl == 'sometimes')) {
common_redirect(common_local_url('login')); common_redirect(common_local_url('login'));
// exit
} }
return true; return parent::prepare($args);
} }
/** /**
@ -85,23 +59,15 @@ class LoginAction extends Action
* *
* Switches on request method; either shows the form or handles its input. * Switches on request method; either shows the form or handles its input.
* *
* @param array $args $_REQUEST data
*
* @return void * @return void
*/ */
function handle($args) protected function handle()
{ {
parent::handle($args);
if (common_is_real_login()) { if (common_is_real_login()) {
$user = common_current_user(); common_redirect(common_local_url('all', array('nickname' => $this->scoped->nickname)), 307);
common_redirect(common_local_url('all', array('nickname' => $user->nickname)), 307);
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$this->checkLogin();
} else {
common_ensure_session();
$this->showForm();
} }
return parent::handle();
} }
/** /**
@ -113,8 +79,10 @@ class LoginAction extends Action
* *
* @return void * @return void
*/ */
function checkLogin($user_id=null, $token=null) protected function handlePost()
{ {
parent::handlePost();
// XXX: login throttle // XXX: login throttle
$nickname = $this->trimmed('nickname'); $nickname = $this->trimmed('nickname');
@ -122,20 +90,19 @@ class LoginAction extends Action
$user = common_check_user($nickname, $password); $user = common_check_user($nickname, $password);
if (!$user) { if (!$user instanceof User) {
// TRANS: Form validation error displayed when trying to log in with incorrect credentials. // TRANS: Form validation error displayed when trying to log in with incorrect credentials.
$this->showForm(_('Incorrect username or password.')); throw new ServerException(_('Incorrect username or password.'));
return;
} }
// success! // success!
if (!common_set_user($user)) { if (!common_set_user($user)) {
// TRANS: Server error displayed when during login a server error occurs. // TRANS: Server error displayed when during login a server error occurs.
$this->serverError(_('Error setting user. You are probably not authorized.')); throw new ServerException(_('Error setting user. You are probably not authorized.'));
return;
} }
common_real_login(true); common_real_login(true);
$this->updateScopedProfile();
if ($this->boolean('rememberme')) { if ($this->boolean('rememberme')) {
common_rememberme($user); common_rememberme($user);
@ -146,11 +113,10 @@ class LoginAction extends Action
if ($url) { if ($url) {
// We don't have to return to it again // We don't have to return to it again
common_set_returnto(null); common_set_returnto(null);
$url = common_inject_session($url); $url = common_inject_session($url);
} else { } else {
$url = common_local_url('all', $url = common_local_url('all',
array('nickname' => array('nickname' => $this->scoped->nickname));
$user->nickname));
} }
common_redirect($url, 303); common_redirect($url, 303);
@ -166,10 +132,10 @@ class LoginAction extends Action
* *
* @return void * @return void
*/ */
function showForm($error=null) public function showForm($msg=null, $success=false)
{ {
$this->error = $error; common_ensure_session();
$this->showPage(); return parent::showForm($msg, $success);
} }
function showScripts() function showScripts()
@ -189,26 +155,6 @@ class LoginAction extends Action
return _('Login'); return _('Login');
} }
/**
* Show page notice
*
* Display a notice for how to use the page, or the
* error if it exists.
*
* @return void
*/
function showPageNotice()
{
if ($this->error) {
$this->element('p', 'error', $this->error);
} else {
$instr = $this->getInstructions();
$output = common_markup_to_html($instr);
$this->raw($output);
}
}
/** /**
* Core of the display code * Core of the display code
* *
@ -244,6 +190,7 @@ class LoginAction extends Action
$this->elementEnd('ul'); $this->elementEnd('ul');
// TRANS: Button text for log in on login page. // TRANS: Button text for log in on login page.
$this->submit('submit', _m('BUTTON','Login')); $this->submit('submit', _m('BUTTON','Login'));
$this->hidden('token', common_session_token());
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');
$this->elementStart('p'); $this->elementStart('p');

View File

@ -1331,7 +1331,7 @@ var SN = { // StatusNet
*/ */
Get: function () { Get: function () {
var cookieValue = $.cookie(SN.C.S.StatusNetInstance); var cookieValue = $.cookie(SN.C.S.StatusNetInstance);
if (cookieValue !== null) { if (cookieValue !== undefined) {
return JSON.parse(cookieValue); return JSON.parse(cookieValue);
} }
return null; return null;

View File

@ -152,11 +152,16 @@ class Action extends HTMLOutputter // lawsuit
$this->checkLogin(); // if not logged in, this redirs/excepts $this->checkLogin(); // if not logged in, this redirs/excepts
} }
$this->scoped = Profile::current(); $this->updateScopedProfile();
return true; return true;
} }
function updateScopedProfile() {
$this->scoped = Profile::current();
return $this->scoped;
}
/** /**
* Show page, a template method. * Show page, a template method.
* *

View File

@ -102,6 +102,15 @@ class FormAction extends Action
public function showInstructions() public function showInstructions()
{ {
// instructions are nice, so users know what to do // instructions are nice, so users know what to do
$this->raw(common_markup_to_html($this->getInstructions()));
}
/**
* @return string with instructions to pass into common_markup_to_html()
*/
public function getInstructions()
{
return null;
} }
public function showForm($msg=null, $success=false) public function showForm($msg=null, $success=false)

View File

@ -244,13 +244,11 @@ function common_check_user($nickname, $password)
$user = User::getKV('nickname', Nickname::normalize($nickname)); $user = User::getKV('nickname', Nickname::normalize($nickname));
} }
if (!empty($user)) { if ($user instanceof User && !empty($password)) {
if (!empty($password)) { // never allow login with blank password if (0 == strcmp(common_munge_password($password, $user->id),
if (0 == strcmp(common_munge_password($password, $user->id), $user->password)) {
$user->password)) { //internal checking passed
//internal checking passed $authenticatedUser = $user;
$authenticatedUser = $user;
}
} }
} }
Event::handle('EndCheckPassword', array($nickname, $password, $authenticatedUser)); Event::handle('EndCheckPassword', array($nickname, $password, $authenticatedUser));
@ -1302,26 +1300,26 @@ function common_path($relative, $ssl=false, $addSession=true)
function common_inject_session($url, $serverpart = null) function common_inject_session($url, $serverpart = null)
{ {
if (common_have_session()) { if (!common_have_session()) {
return $url;
}
if (empty($serverpart)) { if (empty($serverpart)) {
$serverpart = parse_url($url, PHP_URL_HOST); $serverpart = parse_url($url, PHP_URL_HOST);
} }
$currentServer = (array_key_exists('HTTP_HOST', $_SERVER)) ? $_SERVER['HTTP_HOST'] : null; $currentServer = (array_key_exists('HTTP_HOST', $_SERVER)) ? $_SERVER['HTTP_HOST'] : null;
// Are we pointing to another server (like an SSL server?) // Are we pointing to another server (like an SSL server?)
if (!empty($currentServer) && if (!empty($currentServer) && 0 != strcasecmp($currentServer, $serverpart)) {
0 != strcasecmp($currentServer, $serverpart)) { // Pass the session ID as a GET parameter
// Pass the session ID as a GET parameter $sesspart = session_name() . '=' . session_id();
$sesspart = session_name() . '=' . session_id(); $i = strpos($url, '?');
$i = strpos($url, '?'); if ($i === false) { // no GET params, just append
if ($i === false) { // no GET params, just append $url .= '?' . $sesspart;
$url .= '?' . $sesspart; } else {
} else { $url = substr($url, 0, $i + 1).$sesspart.'&'.substr($url, $i + 1);
$url = substr($url, 0, $i + 1).$sesspart.'&'.substr($url, $i + 1);
}
} }
} }
@ -1954,6 +1952,10 @@ function common_confirmation_code($bits)
function common_markup_to_html($c, $args=null) function common_markup_to_html($c, $args=null)
{ {
if ($c === null) {
return '';
}
if (is_null($args)) { if (is_null($args)) {
$args = array(); $args = array();
} }