summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--actions/emailsettings.php22
-rw-r--r--actions/register.php23
-rw-r--r--index.php25
-rw-r--r--lib/action.php31
-rw-r--r--lib/channel.php (renamed from classes/Channel.php)1
-rw-r--r--lib/command.php (renamed from classes/Command.php)74
-rw-r--r--lib/commandinterpreter.php (renamed from classes/CommandInterpreter.php)3
-rw-r--r--lib/dberroraction.php73
-rw-r--r--lib/htmloutputter.php19
9 files changed, 220 insertions, 51 deletions
diff --git a/actions/emailsettings.php b/actions/emailsettings.php
index b84acb214..0a86aa66d 100644
--- a/actions/emailsettings.php
+++ b/actions/emailsettings.php
@@ -487,4 +487,26 @@ class EmailsettingsAction extends AccountSettingsAction
return $other->id != $user->id;
}
}
+
+ /**
+ * Handle old fashioned PEAR_Error msgs coming from DB_DataObject
+ *
+ * In this case email don't exist in the DB yet, so DB_DataObject
+ * throws an error. Overrided from Action.
+ *
+ * @param PEAR_Error
+ *
+ * @return nothing
+ */
+
+ function handleError($error) {
+ if ($error->getCode() == DB_DATAOBJECT_ERROR_NODATA) {
+
+ // Do nothing.
+
+ } else {
+ parent::handleError($error);
+ }
+ }
+
}
diff --git a/actions/register.php b/actions/register.php
index 5d7a8ce69..aafb54ebb 100644
--- a/actions/register.php
+++ b/actions/register.php
@@ -223,10 +223,31 @@ class RegisterAction extends Action
*/
function nicknameExists($nickname)
- {
+ {
$user = User::staticGet('nickname', $nickname);
return ($user !== false);
}
+
+ /**
+ * Handle old fashioned PEAR_Error msgs coming from DB_DataObject
+ *
+ * In this case nickname and email don't exist in the DB yet,
+ * so DB_DataObject throws an error. Overrided from Action.
+ *
+ * @param PEAR_Error
+ *
+ * @return nothing
+ */
+
+ function handleError($error) {
+ if ($error->getCode() == DB_DATAOBJECT_ERROR_NODATA) {
+
+ // Do nothing.
+
+ } else {
+ parent::handleError($error);
+ }
+ }
/**
* Does the given email address already exist?
diff --git a/index.php b/index.php
index 717b17361..4db0e7555 100644
--- a/index.php
+++ b/index.php
@@ -25,7 +25,8 @@ require_once INSTALLDIR . '/lib/common.php';
$user = null;
$action = null;
-function getPath($req) {
+function getPath($req)
+{
if (common_config('site', 'fancy')) {
return $req['p'];
} else if ($_SERVER['PATH_INFO']) {
@@ -35,10 +36,30 @@ function getPath($req) {
}
}
-function main() {
+function handleError($error)
+{
+ common_log(LOG_ERR, "PEAR error: " . $error->getMessage());
+ $msg = sprintf(_('The database for %s isn\'t responding correctly, '.
+ 'so the site won\'t work properly. '.
+ 'The site admins probably know about the problem, '.
+ 'but you can contact them at %s to make sure. '.
+ 'Otherwise, wait a few minutes and try again.'),
+ common_config('site', 'name'),
+ common_config('site', 'email'));
+
+ $dac = new DBErrorAction($msg, 500);
+ $dac->showPage();
+ exit(-1);
+}
+function main()
+{
global $user, $action;
+ // For database errors
+
+ PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'handleError');
+
// XXX: we need a little more structure in this script
// get and cache current user
diff --git a/lib/action.php b/lib/action.php
index bd38bf79c..926fe93fb 100644
--- a/lib/action.php
+++ b/lib/action.php
@@ -82,6 +82,11 @@ class Action extends HTMLOutputter // lawsuit
*/
function prepare($argarray)
{
+
+ // For PEAR_Errors comming from DB_DataObject
+ PEAR::setErrorHandling(PEAR_ERROR_CALLBACK,
+ array($this, "handleError"));
+
$this->args =& common_copy_args($argarray);
return true;
}
@@ -845,6 +850,32 @@ class Action extends HTMLOutputter // lawsuit
}
/**
+ * Handle old fashioned PEAR_Error msgs coming from DB_DataObject
+ *
+ * Logs the DB_DataObject error. Override to do something else.
+ *
+ * @param PEAR_Error
+ *
+ * @return nothing
+ */
+
+ function handleError($error) {
+
+ common_log(LOG_ERR, "PEAR error: " . $error->getMessage());
+ $msg = sprintf(_('The database for %s isn\'t responding correctly, '.
+ 'so the site won\'t work properly. '.
+ 'The site admins probably know about the problem, '.
+ 'but you can contact them at %s to make sure. '.
+ 'Otherwise, wait a few minutes and try again.'),
+ common_config('site', 'name'),
+ common_config('site', 'email'));
+
+ $dac = new DBErrorAction($msg, 500);
+ $dac->showPage();
+ exit(-1);
+ }
+
+ /**
* Returns the current URL
*
* @return string current URL
diff --git a/classes/Channel.php b/lib/channel.php
index fdeff21fc..f1e205546 100644
--- a/classes/Channel.php
+++ b/lib/channel.php
@@ -21,7 +21,6 @@ if (!defined('LACONICA')) { exit(1); }
class Channel
{
-
function on($user)
{
return false;
diff --git a/classes/Command.php b/lib/command.php
index eacbdacb3..507990a0b 100644
--- a/classes/Command.php
+++ b/lib/command.php
@@ -19,18 +19,18 @@
if (!defined('LACONICA')) { exit(1); }
-require_once(INSTALLDIR.'/classes/Channel.php');
+require_once(INSTALLDIR.'/lib/channel.php');
class Command
{
-
+
var $user = null;
-
+
function __construct($user=null)
{
$this->user = $user;
}
-
+
function execute($channel)
{
return false;
@@ -109,7 +109,7 @@ class StatsCommand extends Command
$notices = new Notice();
$notices->profile_id = $this->user->id;
$notice_count = (int) $notices->count();
-
+
$channel->output($this->user, sprintf(_("Subscriptions: %1\$s\n".
"Subscribers: %2\$s\n".
"Notices: %3\$s"),
@@ -121,21 +121,21 @@ class StatsCommand extends Command
class FavCommand extends Command
{
-
+
var $other = null;
-
+
function __construct($user, $other)
{
parent::__construct($user);
$this->other = $other;
}
-
+
function execute($channel)
{
-
- $recipient =
+
+ $recipient =
common_relative_profile($this->user, common_canonical_nickname($this->other));
-
+
if (!$recipient) {
$channel->error($this->user, _('No such user.'));
return;
@@ -145,7 +145,7 @@ class FavCommand extends Command
$channel->error($this->user, _('User has no last notice'));
return;
}
-
+
$fave = Fave::addNew($this->user, $notice);
if (!$fave) {
@@ -154,15 +154,15 @@ class FavCommand extends Command
}
$other = User::staticGet('id', $recipient->id);
-
+
if ($other && $other->id != $user->id) {
if ($other->email && $other->emailnotifyfav) {
mail_notify_fave($other, $this->user, $notice);
}
}
-
+
$this->user->blowFavesCache();
-
+
$channel->output($this->user, _('Notice marked as fave.'));
}
}
@@ -175,17 +175,17 @@ class WhoisCommand extends Command
parent::__construct($user);
$this->other = $other;
}
-
+
function execute($channel)
{
- $recipient =
+ $recipient =
common_relative_profile($this->user, common_canonical_nickname($this->other));
-
+
if (!$recipient) {
$channel->error($this->user, _('No such user.'));
return;
}
-
+
$whois = sprintf(_("%1\$s (%2\$s)"), $recipient->nickname,
$recipient->profileurl);
if ($recipient->fullname) {
@@ -214,7 +214,7 @@ class MessageCommand extends Command
$this->other = $other;
$this->text = $text;
}
-
+
function execute($channel)
{
$other = User::staticGet('nickname', common_canonical_nickname($this->other));
@@ -229,7 +229,7 @@ class MessageCommand extends Command
return;
}
}
-
+
if (!$other) {
$channel->error($this->user, _('No such user.'));
return;
@@ -251,19 +251,19 @@ class MessageCommand extends Command
class GetCommand extends Command
{
-
+
var $other = null;
-
+
function __construct($user, $other)
{
parent::__construct($user);
$this->other = $other;
}
-
+
function execute($channel)
{
$target_nickname = common_canonical_nickname($this->other);
-
+
$target =
common_relative_profile($this->user, $target_nickname);
@@ -277,32 +277,32 @@ class GetCommand extends Command
return;
}
$notice_content = $notice->content;
-
+
$channel->output($this->user, $target_nickname . ": " . $notice_content);
}
}
class SubCommand extends Command
{
-
+
var $other = null;
-
+
function __construct($user, $other)
{
parent::__construct($user);
$this->other = $other;
}
-
+
function execute($channel)
{
-
+
if (!$this->other) {
$channel->error($this->user, _('Specify the name of the user to subscribe to'));
return;
}
-
+
$result = subs_subscribe_user($this->user, $this->other);
-
+
if ($result == 'true') {
$channel->output($this->user, sprintf(_('Subscribed to %s'), $this->other));
} else {
@@ -315,7 +315,7 @@ class UnsubCommand extends Command
{
var $other = null;
-
+
function __construct($user, $other)
{
parent::__construct($user);
@@ -328,9 +328,9 @@ class UnsubCommand extends Command
$channel->error($this->user, _('Specify the name of the user to unsubscribe from'));
return;
}
-
+
$result=subs_unsubscribe_user($this->user, $this->other);
-
+
if ($result) {
$channel->output($this->user, sprintf(_('Unsubscribed from %s'), $this->other));
} else {
@@ -369,7 +369,7 @@ class OnCommand extends Command
parent::__construct($user);
$this->other = $other;
}
-
+
function execute($channel)
{
if ($other) {
@@ -406,7 +406,7 @@ class HelpCommand extends Command
"unsub <nickname> - same as 'leave'\n".
"last <nickname> - same as 'get'\n".
"on <nickname> - not yet implemented.\n".
- "off <nickname> - not yet implemented.\n".
+ "off <nickname> - not yet implemented.\n".
"nudge <nickname> - not yet implemented.\n".
"invite <phone number> - not yet implemented.\n".
"track <word> - not yet implemented.\n".
diff --git a/classes/CommandInterpreter.php b/lib/commandinterpreter.php
index 0679f5462..49c733c03 100644
--- a/classes/CommandInterpreter.php
+++ b/lib/commandinterpreter.php
@@ -19,11 +19,10 @@
if (!defined('LACONICA')) { exit(1); }
-require_once(INSTALLDIR.'/classes/Command.php');
+require_once INSTALLDIR.'/lib/command.php';
class CommandInterpreter
{
-
function handle_command($user, $text)
{
# XXX: localise
diff --git a/lib/dberroraction.php b/lib/dberroraction.php
new file mode 100644
index 000000000..0dc92490c
--- /dev/null
+++ b/lib/dberroraction.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * DB error action.
+ *
+ * PHP version 5
+ *
+ * @category Action
+ * @package Laconica
+ * @author Evan Prodromou <evan@controlyourself.ca>
+ * @author Zach Copley <zach@controlyourself.ca>
+ * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link http://laconi.ca/
+ *
+ * Laconica - a distributed open-source microblogging tool
+ * Copyright (C) 2008, Controlez-Vous, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+if (!defined('LACONICA')) {
+ exit(1);
+}
+
+require_once INSTALLDIR.'/lib/servererroraction.php';
+
+/**
+ * Class for displaying DB Errors
+ *
+ * This only occurs if there's been a DB_DataObject_Error that's
+ * reported through PEAR, so we try to avoid doing anything that connects
+ * to the DB, so we don't trigger it again.
+ *
+ * @category Action
+ * @package Laconica
+ * @author Evan Prodromou <evan@controlyourself.ca>
+ * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link http://laconi.ca/
+ */
+
+class DBErrorAction extends ServerErrorAction
+{
+ function __construct($message='Error', $code=500)
+ {
+ parent::__construct($message, $code);
+ }
+
+ function title()
+ {
+ return _('Database error');
+ }
+
+ function getLanguage()
+ {
+ // Don't try to figure out user's language; just show the page
+ return common_config('site', 'language');
+ }
+
+ function showPrimaryNav()
+ {
+ // don't show primary nav
+ }
+}
diff --git a/lib/htmloutputter.php b/lib/htmloutputter.php
index e2319b1fd..06603ac05 100644
--- a/lib/htmloutputter.php
+++ b/lib/htmloutputter.php
@@ -101,29 +101,32 @@ class HTMLOutputter extends XMLOutputter
$type = common_negotiate_type($cp, $sp);
if (!$type) {
- common_user_error(_('This page is not available in a '.
- 'media type you accept'), 406);
- exit(0);
+ throw new ClientException(_('This page is not available in a '.
+ 'media type you accept'), 406);
}
}
header('Content-Type: '.$type);
-
+
$this->extraHeaders();
$this->startXML('html',
'-//W3C//DTD XHTML 1.0 Strict//EN',
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd');
- // FIXME: correct language for interface
-
- $language = common_language();
+ $language = $this->getLanguage();
$this->elementStart('html', array('xmlns' => 'http://www.w3.org/1999/xhtml',
'xml:lang' => $language,
'lang' => $language));
}
+ function getLanguage()
+ {
+ // FIXME: correct language for interface
+ return common_language();
+ }
+
/**
* Ends an HTML document
*
@@ -134,7 +137,7 @@ class HTMLOutputter extends XMLOutputter
$this->elementEnd('html');
$this->endXML();
}
-
+
/**
* To specify additional HTTP headers for the action
*