diff --git a/actions/tagrss.php b/actions/tagrss.php index 75cbfa274b..467a64abed 100644 --- a/actions/tagrss.php +++ b/actions/tagrss.php @@ -35,6 +35,7 @@ class TagrssAction extends Rss10Action $this->clientError(_('No such tag.')); return false; } else { + $this->notices = $this->getNotices($this->limit); return true; } } diff --git a/actions/userrss.php b/actions/userrss.php index 19e610551d..e03eb93566 100644 --- a/actions/userrss.php +++ b/actions/userrss.php @@ -29,6 +29,8 @@ class UserrssAction extends Rss10Action function prepare($args) { + common_debug("UserrssAction"); + parent::prepare($args); $nickname = $this->trimmed('nickname'); $this->user = User::staticGet('nickname', $nickname); @@ -38,20 +40,24 @@ class UserrssAction extends Rss10Action $this->clientError(_('No such user.')); return false; } else { - $this->notices = $this->getNotices($this->limit); + if (!empty($this->tag)) { + $this->notices = $this->getTaggedNotices(); + } else { + $this->notices = $this->getNotices(); + } return true; } } - function getTaggedNotices($tag = null, $limit=0) + function getTaggedNotices() { - $user = $this->user; - - if (is_null($user)) { - return null; - } - - $notice = $user->getTaggedNotices(0, ($limit == 0) ? NOTICES_PER_PAGE : $limit, 0, 0, null, $tag); + $notice = $this->user->getTaggedNotices( + $this->tag, + 0, + ($this->limit == 0) ? NOTICES_PER_PAGE : $this->limit, + 0, + 0 + ); $notices = array(); while ($notice->fetch()) { @@ -62,15 +68,12 @@ class UserrssAction extends Rss10Action } - function getNotices($limit=0) + function getNotices() { - $user = $this->user; - - if (is_null($user)) { - return null; - } - - $notice = $user->getNotices(0, ($limit == 0) ? NOTICES_PER_PAGE : $limit); + $notice = $this->user->getNotices( + 0, + ($limit == 0) ? NOTICES_PER_PAGE : $limit + ); $notices = array(); while ($notice->fetch()) { diff --git a/classes/Foreign_link.php b/classes/Foreign_link.php index ae8c22fd84..e47b2e3096 100644 --- a/classes/Foreign_link.php +++ b/classes/Foreign_link.php @@ -113,4 +113,21 @@ class Foreign_link extends Memcached_DataObject return User::staticGet($this->user_id); } + // Make sure we only ever delete one record at a time + function safeDelete() + { + if (!empty($this->user_id) + && !empty($this->foreign_id) + && !empty($this->service)) + { + return $this->delete(); + } else { + common_debug(LOG_WARNING, + 'Foreign_link::safeDelete() tried to delete a ' + . 'Foreign_link without a fully specified compound key: ' + . var_export($this, true)); + return false; + } + } + } diff --git a/config.php.sample b/config.php.sample index b8852dc672..33ac94a6d0 100644 --- a/config.php.sample +++ b/config.php.sample @@ -124,6 +124,8 @@ $config['sphinx']['port'] = 3312; // Email info, used for all outbound email // $config['mail']['notifyfrom'] = 'microblog@example.net'; +// Domain for generating no-reply and incoming email addresses, if enabled. +// Defaults to site server name. // $config['mail']['domain'] = 'microblog.example.net'; // See http://pear.php.net/manual/en/package.mail.mail.factory.php for options // $config['mail']['backend'] = 'smtp'; @@ -131,8 +133,6 @@ $config['sphinx']['port'] = 3312; // 'host' => 'localhost', // 'port' => 25, // ); -// For incoming email, if enabled. Defaults to site server name. -// $config['mail']['domain'] = 'incoming.example.net'; // exponential decay factor for tags, default 10 days // raise this if traffic is slow, lower it if it's fast diff --git a/install.php b/install.php index 8c9b6138b8..7fece8999f 100644 --- a/install.php +++ b/install.php @@ -301,6 +301,19 @@ function checkPrereqs() $pass = false; } + // Look for known library bugs + $str = "abcdefghijklmnopqrstuvwxyz"; + $replaced = preg_replace('/[\p{Cc}\p{Cs}]/u', '*', $str); + if ($str != $replaced) { + printf('

PHP is linked to a version of the PCRE library ' . + 'that does not support Unicode properties. ' . + 'If you are running Red Hat Enterprise Linux / ' . + 'CentOS 5.3 or earlier, see our documentation page on fixing this.

'); + $pass = false; + } + $reqs = array('gd', 'curl', 'xmlwriter', 'mbstring', 'xml', 'dom', 'simplexml'); diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index fcca1a2521..abc8100cee 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -428,10 +428,18 @@ class Ostatus_profile extends Memcached_DataObject * Currently assumes that all items in the feed are new, * coming from a PuSH hub. * - * @param DOMDocument $feed + * @param DOMDocument $doc + * @param string $source identifier ("push") */ - public function processFeed($feed, $source) + public function processFeed(DOMDocument $doc, $source) { + $feed = $doc->documentElement; + + if ($feed->localName != 'feed' || $feed->namespaceURI != Activity::ATOM) { + common_log(LOG_ERR, __METHOD__ . ": not an Atom feed, ignoring"); + return; + } + $entries = $feed->getElementsByTagNameNS(Activity::ATOM, 'entry'); if ($entries->length == 0) { common_log(LOG_ERR, __METHOD__ . ": no entries in feed update, ignoring"); @@ -449,6 +457,7 @@ class Ostatus_profile extends Memcached_DataObject * * @param DOMElement $entry * @param DOMElement $feed for context + * @param string $source identifier ("push" or "salmon") */ public function processEntry($entry, $feed, $source) { diff --git a/plugins/OpenID/User_openid.php b/plugins/OpenID/User_openid.php index 801b49eccd..5ef05b4c77 100644 --- a/plugins/OpenID/User_openid.php +++ b/plugins/OpenID/User_openid.php @@ -39,9 +39,21 @@ class User_openid extends Memcached_DataObject ); } + /** + * List primary and unique keys in this table. + * Unique keys used for lookup *MUST* be listed to ensure proper caching. + */ function keys() { - return array('canonical' => 'K', 'display' => 'U'); + return array('canonical' => 'K', 'display' => 'U', 'user_id' => 'U'); + } + + /** + * No sequence keys in this table. + */ + function sequenceKey() + { + return array(false, false, false); } Static function hasOpenID($user_id) diff --git a/plugins/TwitterBridge/twitter.php b/plugins/TwitterBridge/twitter.php index ceb83b037f..5086999394 100644 --- a/plugins/TwitterBridge/twitter.php +++ b/plugins/TwitterBridge/twitter.php @@ -264,7 +264,7 @@ function remove_twitter_link($flink) common_log(LOG_INFO, 'Removing Twitter bridge Foreign link for ' . "user $user->nickname (user id: $user->id)."); - $result = $flink->delete(); + $result = $flink->safeDelete(); if (empty($result)) { common_log(LOG_ERR, 'Could not remove Twitter bridge ' . diff --git a/plugins/TwitterBridge/twitterauthorization.php b/plugins/TwitterBridge/twitterauthorization.php index c93f6666bc..bc004cb955 100644 --- a/plugins/TwitterBridge/twitterauthorization.php +++ b/plugins/TwitterBridge/twitterauthorization.php @@ -273,7 +273,13 @@ class TwitterauthorizationAction extends Action $flink->user_id = $user_id; $flink->service = TWITTER_SERVICE; - $flink->delete(); // delete stale flink, if any + + // delete stale flink, if any + $result = $flink->find(true); + + if (!empty($result)) { + $flink->safeDelete(); + } $flink->user_id = $user_id; $flink->foreign_id = $twuid; @@ -455,6 +461,11 @@ class TwitterauthorizationAction extends Action $user = User::register($args); + if (empty($user)) { + $this->serverError(_('Error registering user.')); + return; + } + $result = $this->saveForeignLink($user->id, $this->twuid, $this->access_token); diff --git a/plugins/TwitterBridge/twittersettings.php b/plugins/TwitterBridge/twittersettings.php index 0137060e9c..631b29f52a 100644 --- a/plugins/TwitterBridge/twittersettings.php +++ b/plugins/TwitterBridge/twittersettings.php @@ -250,7 +250,7 @@ class TwittersettingsAction extends ConnectSettingsAction $user = common_current_user(); $flink = Foreign_link::getByUserID($user->id, TWITTER_SERVICE); - $result = $flink->delete(); + $result = $flink->safeDelete(); if (empty($result)) { common_log_db_error($flink, 'DELETE', __FILE__);