Merge branch 'testing' of git@gitorious.org:statusnet/mainline into testing

This commit is contained in:
Evan Prodromou 2010-03-18 15:21:43 -05:00
commit dbd44e51a2
11 changed files with 199 additions and 34 deletions

4
README
View File

@ -137,7 +137,9 @@ run correctly.
- PHP 5.2.3+. It may be possible to run this software on earlier - PHP 5.2.3+. It may be possible to run this software on earlier
versions of PHP, but many of the functions used are only available versions of PHP, but many of the functions used are only available
in PHP 5.2 or above. in PHP 5.2 or above. 5.2.6 or later is needed for XMPP background
daemons on 64-bit platforms. PHP 5.3.x should work but is known
to cause some failures for OpenID.
- MySQL 5.x. The StatusNet database is stored, by default, in a MySQL - MySQL 5.x. The StatusNet database is stored, by default, in a MySQL
server. It has been primarily tested on 5.x servers, although it may server. It has been primarily tested on 5.x servers, although it may
be possible to install on earlier (or later!) versions. The server be possible to install on earlier (or later!) versions. The server

View File

@ -41,6 +41,7 @@ class Foreign_user extends Memcached_DataObject
function updateKeys(&$orig) function updateKeys(&$orig)
{ {
$this->_connect();
$parts = array(); $parts = array();
foreach (array('id', 'service', 'uri', 'nickname') as $k) { foreach (array('id', 'service', 'uri', 'nickname') as $k) {
if (strcmp($this->$k, $orig->$k) != 0) { if (strcmp($this->$k, $orig->$k) != 0) {

View File

@ -105,8 +105,8 @@ class Subscription extends Memcached_DataObject
$auto = new Subscription(); $auto = new Subscription();
$auto->subscriber = $subscriber->id; $auto->subscriber = $other->id;
$auto->subscribed = $other->id; $auto->subscribed = $subscriber->id;
$auto->created = common_sql_now(); $auto->created = common_sql_now();
$result = $auto->insert(); $result = $auto->insert();

View File

@ -75,7 +75,11 @@ class User extends Memcached_DataObject
function getProfile() function getProfile()
{ {
return Profile::staticGet('id', $this->id); $profile = Profile::staticGet('id', $this->id);
if (empty($profile)) {
throw new UserNoProfileException($this);
}
return $profile;
} }
function isSubscribed($other) function isSubscribed($other)
@ -87,6 +91,7 @@ class User extends Memcached_DataObject
function updateKeys(&$orig) function updateKeys(&$orig)
{ {
$this->_connect();
$parts = array(); $parts = array();
foreach (array('nickname', 'email', 'jabber', 'incomingemail', 'sms', 'carrier', 'smsemail', 'language', 'timezone') as $k) { foreach (array('nickname', 'email', 'jabber', 'incomingemail', 'sms', 'carrier', 'smsemail', 'language', 'timezone') as $k) {
if (strcmp($this->$k, $orig->$k) != 0) { if (strcmp($this->$k, $orig->$k) != 0) {
@ -140,9 +145,6 @@ class User extends Memcached_DataObject
function getCurrentNotice() function getCurrentNotice()
{ {
$profile = $this->getProfile(); $profile = $this->getProfile();
if (!$profile) {
return null;
}
return $profile->getCurrentNotice(); return $profile->getCurrentNotice();
} }
@ -470,22 +472,14 @@ class User extends Memcached_DataObject
function getTaggedNotices($tag, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) { function getTaggedNotices($tag, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) {
$profile = $this->getProfile(); $profile = $this->getProfile();
if (!$profile) {
return null;
} else {
return $profile->getTaggedNotices($tag, $offset, $limit, $since_id, $before_id); return $profile->getTaggedNotices($tag, $offset, $limit, $since_id, $before_id);
} }
}
function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0)
{ {
$profile = $this->getProfile(); $profile = $this->getProfile();
if (!$profile) {
return null;
} else {
return $profile->getNotices($offset, $limit, $since_id, $before_id); return $profile->getNotices($offset, $limit, $since_id, $before_id);
} }
}
function favoriteNotices($offset=0, $limit=NOTICES_PER_PAGE, $own=false) function favoriteNotices($offset=0, $limit=NOTICES_PER_PAGE, $own=false)
{ {
@ -625,14 +619,12 @@ class User extends Memcached_DataObject
function getSubscriptions($offset=0, $limit=null) function getSubscriptions($offset=0, $limit=null)
{ {
$profile = $this->getProfile(); $profile = $this->getProfile();
assert(!empty($profile));
return $profile->getSubscriptions($offset, $limit); return $profile->getSubscriptions($offset, $limit);
} }
function getSubscribers($offset=0, $limit=null) function getSubscribers($offset=0, $limit=null)
{ {
$profile = $this->getProfile(); $profile = $this->getProfile();
assert(!empty($profile));
return $profile->getSubscribers($offset, $limit); return $profile->getSubscribers($offset, $limit);
} }
@ -696,9 +688,7 @@ class User extends Memcached_DataObject
function delete() function delete()
{ {
$profile = $this->getProfile(); $profile = $this->getProfile();
if ($profile) {
$profile->delete(); $profile->delete();
}
$related = array('Fave', $related = array('Fave',
'Confirm_address', 'Confirm_address',

View File

@ -5,6 +5,11 @@
RewriteBase /mublog/ RewriteBase /mublog/
## Uncomment these if having trouble with API authentication
## when PHP is running in CGI or FastCGI mode.
#RewriteCond %{HTTP:Authorization} ^(.*)
#RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?p=$1 [L,QSA] RewriteRule (.*) index.php?p=$1 [L,QSA]

View File

@ -294,11 +294,15 @@ class ApiAuthAction extends ApiAction
function basicAuthProcessHeader() function basicAuthProcessHeader()
{ {
if (isset($_SERVER['AUTHORIZATION']) $authHeaders = array('AUTHORIZATION',
|| isset($_SERVER['HTTP_AUTHORIZATION']) 'HTTP_AUTHORIZATION',
) { 'REDIRECT_HTTP_AUTHORIZATION'); // rewrite for CGI
$authorization_header = isset($_SERVER['HTTP_AUTHORIZATION']) $authorization_header = null;
? $_SERVER['HTTP_AUTHORIZATION'] : $_SERVER['AUTHORIZATION']; foreach ($authHeaders as $header) {
if (isset($_SERVER[$header])) {
$authorization_header = $_SERVER[$header];
break;
}
} }
if (isset($_SERVER['PHP_AUTH_USER'])) { if (isset($_SERVER['PHP_AUTH_USER'])) {

View File

@ -0,0 +1,74 @@
<?php
/**
* StatusNet, the distributed open-source microblogging tool
*
* class for an exception when the user profile is missing
*
* PHP version 5
*
* LICENCE: 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/>.
*
* @category Exception
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @copyright 2010 StatusNet, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
exit(1);
}
/**
* Class for an exception when the user profile is missing
*
* @category Exception
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
* @link http://status.net/
*/
class UserNoProfileException extends ServerException
{
var $user = null;
/**
* constructor
*
* @param User $user User that's missing a profile
*/
public function __construct($user)
{
$this->user = $user;
$message = sprintf(_("User %s (%d) has no profile record."),
$user->nickname, $user->id);
parent::__construct($message);
}
/**
* Accessor for user
*
* @return User the user that triggered this exception
*/
public function getUser()
{
return $this->user;
}
}

View File

@ -1464,7 +1464,7 @@ class Ostatus_profile extends Memcached_DataObject
if (array_key_exists('profileurl', $hints)) { if (array_key_exists('profileurl', $hints)) {
try { try {
common_log(LOG_INFO, "Discovery on acct:$addr with profile URL $profileUrl"); common_log(LOG_INFO, "Discovery on acct:$addr with profile URL $profileUrl");
$oprofile = self::ensureProfile($hints['profileurl'], $hints); $oprofile = self::ensureProfileURL($hints['profileurl'], $hints);
self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri); self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri);
return $oprofile; return $oprofile;
} catch (Exception $e) { } catch (Exception $e) {

View File

@ -56,7 +56,12 @@ try {
$user = new User(); $user = new User();
if ($user->find()) { if ($user->find()) {
while ($user->fetch()) { while ($user->fetch()) {
try {
updateOStatus($user); updateOStatus($user);
} catch (Exception $e) {
common_log(LOG_NOTICE, "Couldn't convert OMB subscriptions ".
"for {$user->nickname} to OStatus: " . $e->getMessage());
}
} }
} }
} else { } else {
@ -98,7 +103,7 @@ function updateOStatus($user)
echo "Checking {$rp->nickname}..."; echo "Checking {$rp->nickname}...";
} }
$op = Ostatus_profile::ensureProfile($rp->profileurl); $op = Ostatus_profile::ensureProfileURL($rp->profileurl);
if (empty($op)) { if (empty($op)) {
echo "can't convert.\n"; echo "can't convert.\n";
@ -107,8 +112,8 @@ function updateOStatus($user)
if (!have_option('q', 'quiet')) { if (!have_option('q', 'quiet')) {
echo "Converting..."; echo "Converting...";
} }
Subscription::cancel($up, $rp);
Subscription::start($up, $op->localProfile()); Subscription::start($up, $op->localProfile());
Subscription::cancel($up, $rp);
if (!have_option('q', 'quiet')) { if (!have_option('q', 'quiet')) {
echo "done.\n"; echo "done.\n";
} }
@ -118,8 +123,7 @@ function updateOStatus($user)
if (!have_option('q', 'quiet')) { if (!have_option('q', 'quiet')) {
echo "fail.\n"; echo "fail.\n";
} }
continue; common_log(LOG_NOTICE, "Couldn't convert OMB subscription (" . $up->nickname . ", " . $rp->nickname .
common_log(LOG_WARNING, "Couldn't convert OMB subscription (" . $up->nickname . ", " . $rp->nickname .
") to OStatus: " . $e->getMessage()); ") to OStatus: " . $e->getMessage());
continue; continue;
} }

77
scripts/fixup_files.php Executable file
View File

@ -0,0 +1,77 @@
#!/usr/bin/env php
<?php
/*
* StatusNet - a distributed open-source microblogging tool
* Copyright (C) 2010 StatusNet, 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/>.
*/
define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
$longoptions = array('dry-run');
$helptext = <<<END_OF_USERROLE_HELP
fixup_files.php [options]
Patches up file entries with corrupted types and titles (the "h bug").
--dry-run look but don't touch
END_OF_USERROLE_HELP;
require_once INSTALLDIR.'/scripts/commandline.inc';
$dry = have_option('dry-run');
$f = new File();
$f->title = 'h';
$f->mimetype = 'h';
$f->size = 0;
$f->protected = 0;
$f->find();
echo "Found $f->N bad items:\n";
while ($f->fetch()) {
echo "$f->id $f->url";
$data = File_redirection::lookupWhere($f->url);
if ($dry) {
if (is_array($data)) {
echo " (unchanged)\n";
} else {
echo " (unchanged, but embedding lookup failed)\n";
}
} else {
// NULL out the mime/title/size/protected fields
$sql = sprintf("UPDATE file " .
"SET mimetype=null,title=null,size=null,protected=null " .
"WHERE id=%d",
$f->id);
$f->query($sql);
$f->decache();
if (is_array($data)) {
if ($f->saveOembed($data, $f->url)) {
echo " (ok)\n";
} else {
echo " (ok, no embedding data)\n";
}
} else {
echo " (ok, but embedding lookup failed)\n";
}
}
}
echo "done.\n";

View File

@ -98,7 +98,15 @@ class XmppMaster extends IoMaster
// don't have to find an XMPP site to start up when using --all mode. // don't have to find an XMPP site to start up when using --all mode.
if (common_config('xmpp','enabled')==false) { if (common_config('xmpp','enabled')==false) {
print "Aborting daemon - xmpp is disabled\n"; print "Aborting daemon - xmpp is disabled\n";
exit(); exit(1);
}
if (version_compare(PHP_VERSION, '5.2.6', '<')) {
$arch = php_uname('m');
if ($arch == 'x86_64' || $arch == 'amd64') {
print "Aborting daemon - 64-bit PHP prior to 5.2.6 has known bugs in stream_select; you are running " . PHP_VERSION . " on $arch.\n";
exit(1);
}
} }
if (have_option('i', 'id')) { if (have_option('i', 'id')) {