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
);
if (is_string($message)) {
$this->serverError($message);
return;
}
$message->notify();
if ($this->format == 'xml') {

View File

@ -45,15 +45,8 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
* @link http://status.net/
*/
class NewmessageAction extends Action
class NewmessageAction extends FormAction
{
/**
* Error message, if any
*/
var $msg = null;
var $content = null;
var $to = null;
var $other = null;
@ -80,33 +73,16 @@ class NewmessageAction extends Action
* @return void
*/
function handle($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)
protected function prepare($args)
{
parent::prepare($args);
$user = common_current_user();
if (!$user) {
/* Go log in, and then come back. */
common_set_returnto($_SERVER['REQUEST_URI']);
common_redirect(common_local_url('login'));
return false;
if (!common_logged_in()) {
$this->needLogin();
}
$user = $this->scoped->getUser();
$this->content = $this->trimmed('content');
$this->to = $this->trimmed('to');
@ -117,76 +93,55 @@ class NewmessageAction extends Action
if (!$this->other) {
// TRANS: Client error displayed trying to send a direct message to a non-existing user.
$this->clientError(_('No such user.'), 404);
return false;
}
if (!$user->mutuallySubscribed($this->other)) {
// TRANS: Client error displayed trying to send a direct message to a user while sender and
// TRANS: receiver are not subscribed to each other.
$this->clientError(_('You cannot send a message to this user.'), 404);
return false;
}
}
return true;
}
function saveNewMessage()
protected function handlePost()
{
// CSRF protection
parent::handlePost();
$token = $this->trimmed('token');
if (!$token || $token != common_session_token()) {
// 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...
assert($this->scoped); // XXX: maybe an error instead...
$user = $this->scoped->getUser();
if (!$this->content) {
// TRANS: Form validator error displayed trying to send a direct message without content.
$this->showForm(_('No content!'));
return;
$this->clientError(_('No content!'));
} else {
$content_shortened = $user->shortenLinks($this->content);
if (Message::contentTooLong($content_shortened)) {
// TRANS: Form validation error displayed when message content is too long.
// 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.',
Message::maxContent()),
Message::maxContent()));
return;
}
}
if (!$this->other) {
// TRANS: Form validation error displayed trying to send a direct message without specifying a recipient.
$this->showForm(_('No recipient specified.'));
return;
$this->clientError(_('No recipient specified.'));
} else if (!$user->mutuallySubscribed($this->other)) {
// TRANS: Client error displayed trying to send a direct message to a user while sender and
// TRANS: receiver are not subscribed to each other.
$this->clientError(_('You cannot send a message to this user.'), 404);
return;
} else if ($user->id == $this->other->id) {
// TRANS: Client error displayed trying to send a direct message to self.
$this->clientError(_('Do not send a message to yourself; ' .
'just say it to yourself quietly instead.'), 403);
return;
}
$message = Message::saveNew($user->id, $this->other->id, $this->content, 'web');
if (is_string($message)) {
$this->showForm($message);
return;
}
$message->notify();
if ($this->boolean('ajax')) {

View File

@ -96,7 +96,7 @@ class Message extends Managed_DataObject
if (!$result) {
common_log_db_error($msg, 'INSERT', __FILE__);
// 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);
@ -107,7 +107,7 @@ class Message extends Managed_DataObject
if (!$result) {
common_log_db_error($msg, 'UPDATE', __FILE__);
// 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;

View File

@ -1376,6 +1376,18 @@ class Action extends HTMLOutputter // lawsuit
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
*

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.'));
return;
}
$message = Message::saveNew($this->user->id, $other->id, $this->text, $channel->source());
if ($message) {
try {
$message = Message::saveNew($this->user->id, $other->id, $this->text, $channel->source());
$message->notify();
// TRANS: Message given have sent a direct message to another user.
// TRANS: %s is the name of the other user.
$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.
$channel->error($this->user, _('Error sending direct message.'));
$channel->error($this->user, $e->getMessage());
}
}
}