newmessage (and Message class) fixed for FormAction

Also added a needLogin function to the Action class, which will do
redirect to login page with proper returnto setting.
This commit is contained in:
Mikael Nordfeldth 2013-09-02 10:59:02 +02:00
parent 89b10666bb
commit e5e3aeb4e6
5 changed files with 31 additions and 69 deletions

View File

@ -163,11 +163,6 @@ class ApiDirectMessageNewAction extends ApiAuthAction
$this->source $this->source
); );
if (is_string($message)) {
$this->serverError($message);
return;
}
$message->notify(); $message->notify();
if ($this->format == 'xml') { if ($this->format == 'xml') {

View File

@ -45,15 +45,8 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
* @link http://status.net/ * @link http://status.net/
*/ */
class NewmessageAction extends Action class NewmessageAction extends FormAction
{ {
/**
* Error message, if any
*/
var $msg = null;
var $content = null; var $content = null;
var $to = null; var $to = null;
var $other = null; var $other = null;
@ -80,33 +73,16 @@ class NewmessageAction extends Action
* @return void * @return void
*/ */
function handle($args) protected function prepare($args)
{
parent::handle($args);
if (!common_logged_in()) {
// TRANS: Error message displayed when trying to perform an action that requires a logged in user.
$this->clientError(_('Not logged in.'), 403);
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$this->saveNewMessage();
} else {
$this->showForm();
}
}
function prepare($args)
{ {
parent::prepare($args); parent::prepare($args);
$user = common_current_user(); if (!common_logged_in()) {
$this->needLogin();
if (!$user) {
/* Go log in, and then come back. */
common_set_returnto($_SERVER['REQUEST_URI']);
common_redirect(common_local_url('login'));
return false;
} }
$user = $this->scoped->getUser();
$this->content = $this->trimmed('content'); $this->content = $this->trimmed('content');
$this->to = $this->trimmed('to'); $this->to = $this->trimmed('to');
@ -117,76 +93,55 @@ class NewmessageAction extends Action
if (!$this->other) { if (!$this->other) {
// TRANS: Client error displayed trying to send a direct message to a non-existing user. // TRANS: Client error displayed trying to send a direct message to a non-existing user.
$this->clientError(_('No such user.'), 404); $this->clientError(_('No such user.'), 404);
return false;
} }
if (!$user->mutuallySubscribed($this->other)) { if (!$user->mutuallySubscribed($this->other)) {
// TRANS: Client error displayed trying to send a direct message to a user while sender and // TRANS: Client error displayed trying to send a direct message to a user while sender and
// TRANS: receiver are not subscribed to each other. // TRANS: receiver are not subscribed to each other.
$this->clientError(_('You cannot send a message to this user.'), 404); $this->clientError(_('You cannot send a message to this user.'), 404);
return false;
} }
} }
return true; return true;
} }
function saveNewMessage() protected function handlePost()
{ {
// CSRF protection parent::handlePost();
$token = $this->trimmed('token'); assert($this->scoped); // XXX: maybe an error instead...
if (!$token || $token != common_session_token()) { $user = $this->scoped->getUser();
// TRANS: Client error displayed when the session token does not match or is not given.
$this->showForm(_('There was a problem with your session token. ' .
'Try again, please.'));
return;
}
$user = common_current_user();
assert($user); // XXX: maybe an error instead...
if (!$this->content) { if (!$this->content) {
// TRANS: Form validator error displayed trying to send a direct message without content. // TRANS: Form validator error displayed trying to send a direct message without content.
$this->showForm(_('No content!')); $this->clientError(_('No content!'));
return;
} else { } else {
$content_shortened = $user->shortenLinks($this->content); $content_shortened = $user->shortenLinks($this->content);
if (Message::contentTooLong($content_shortened)) { if (Message::contentTooLong($content_shortened)) {
// TRANS: Form validation error displayed when message content is too long. // TRANS: Form validation error displayed when message content is too long.
// TRANS: %d is the maximum number of characters for a message. // TRANS: %d is the maximum number of characters for a message.
$this->showForm(sprintf(_m('That\'s too long. Maximum message size is %d character.', $this->clientError(sprintf(_m('That\'s too long. Maximum message size is %d character.',
'That\'s too long. Maximum message size is %d characters.', 'That\'s too long. Maximum message size is %d characters.',
Message::maxContent()), Message::maxContent()),
Message::maxContent())); Message::maxContent()));
return;
} }
} }
if (!$this->other) { if (!$this->other) {
// TRANS: Form validation error displayed trying to send a direct message without specifying a recipient. // TRANS: Form validation error displayed trying to send a direct message without specifying a recipient.
$this->showForm(_('No recipient specified.')); $this->clientError(_('No recipient specified.'));
return;
} else if (!$user->mutuallySubscribed($this->other)) { } else if (!$user->mutuallySubscribed($this->other)) {
// TRANS: Client error displayed trying to send a direct message to a user while sender and // TRANS: Client error displayed trying to send a direct message to a user while sender and
// TRANS: receiver are not subscribed to each other. // TRANS: receiver are not subscribed to each other.
$this->clientError(_('You cannot send a message to this user.'), 404); $this->clientError(_('You cannot send a message to this user.'), 404);
return;
} else if ($user->id == $this->other->id) { } else if ($user->id == $this->other->id) {
// TRANS: Client error displayed trying to send a direct message to self. // TRANS: Client error displayed trying to send a direct message to self.
$this->clientError(_('Do not send a message to yourself; ' . $this->clientError(_('Do not send a message to yourself; ' .
'just say it to yourself quietly instead.'), 403); 'just say it to yourself quietly instead.'), 403);
return;
} }
$message = Message::saveNew($user->id, $this->other->id, $this->content, 'web'); $message = Message::saveNew($user->id, $this->other->id, $this->content, 'web');
if (is_string($message)) {
$this->showForm($message);
return;
}
$message->notify(); $message->notify();
if ($this->boolean('ajax')) { if ($this->boolean('ajax')) {

View File

@ -96,7 +96,7 @@ class Message extends Managed_DataObject
if (!$result) { if (!$result) {
common_log_db_error($msg, 'INSERT', __FILE__); common_log_db_error($msg, 'INSERT', __FILE__);
// TRANS: Message given when a message could not be stored on the server. // TRANS: Message given when a message could not be stored on the server.
return _('Could not insert message.'); throw new ServerException(_('Could not insert message.'));
} }
$orig = clone($msg); $orig = clone($msg);
@ -107,7 +107,7 @@ class Message extends Managed_DataObject
if (!$result) { if (!$result) {
common_log_db_error($msg, 'UPDATE', __FILE__); common_log_db_error($msg, 'UPDATE', __FILE__);
// TRANS: Message given when a message could not be updated on the server. // TRANS: Message given when a message could not be updated on the server.
return _('Could not update message with new URI.'); throw new ServerException(_('Could not update message with new URI.'));
} }
return $msg; return $msg;

View File

@ -1376,6 +1376,18 @@ class Action extends HTMLOutputter // lawsuit
throw new ClientException($msg, $code); throw new ClientException($msg, $code);
} }
/**
* Redirect to login page (with returnto)
*
* @return nothing
*/
function needLogin()
{
// this might be updated with a login check before redirecting
common_set_returnto($_SERVER['REQUEST_URI']);
common_redirect(common_local_url('login'));
}
/** /**
* Returns the current URL * Returns the current URL
* *

View File

@ -632,15 +632,15 @@ class MessageCommand extends Command
$channel->error($this->user, _('Do not send a message to yourself; just say it to yourself quietly instead.')); $channel->error($this->user, _('Do not send a message to yourself; just say it to yourself quietly instead.'));
return; return;
} }
$message = Message::saveNew($this->user->id, $other->id, $this->text, $channel->source()); try {
if ($message) { $message = Message::saveNew($this->user->id, $other->id, $this->text, $channel->source());
$message->notify(); $message->notify();
// TRANS: Message given have sent a direct message to another user. // TRANS: Message given have sent a direct message to another user.
// TRANS: %s is the name of the other user. // TRANS: %s is the name of the other user.
$channel->output($this->user, sprintf(_('Direct message to %s sent.'), $this->other)); $channel->output($this->user, sprintf(_('Direct message to %s sent.'), $this->other));
} else { } catch (Exception $e) {
// TRANS: Error text shown sending a direct message fails with an unknown reason. // TRANS: Error text shown sending a direct message fails with an unknown reason.
$channel->error($this->user, _('Error sending direct message.')); $channel->error($this->user, $e->getMessage());
} }
} }
} }