Merge branch 'testing' of gitorious.org:statusnet/mainline into 0.9.x

This commit is contained in:
Brion Vibber
2010-02-26 12:33:50 -08:00
17 changed files with 576 additions and 78 deletions

View File

@@ -149,7 +149,8 @@ class OStatusPlugin extends Plugin
// Also, we'll add in the salmon link
$salmon = common_local_url($salmonAction, array('id' => $id));
$feed->addLink($salmon, array('rel' => 'salmon'));
$feed->addLink($salmon, array('rel' => Salmon::NS_REPLIES));
$feed->addLink($salmon, array('rel' => Salmon::NS_MENTIONS));
}
return true;
@@ -414,7 +415,7 @@ class OStatusPlugin extends Plugin
$act->actor = ActivityObject::fromProfile($subscriber);
$act->object = ActivityObject::fromProfile($other);
$oprofile->notifyActivity($act);
$oprofile->notifyActivity($act, $subscriber);
return true;
}
@@ -462,7 +463,7 @@ class OStatusPlugin extends Plugin
$act->actor = ActivityObject::fromProfile($profile);
$act->object = ActivityObject::fromProfile($other);
$oprofile->notifyActivity($act);
$oprofile->notifyActivity($act, $profile);
return true;
}
@@ -504,7 +505,7 @@ class OStatusPlugin extends Plugin
$member->getBestName(),
$oprofile->getBestName());
if ($oprofile->notifyActivity($act)) {
if ($oprofile->notifyActivity($act, $member)) {
return true;
} else {
$oprofile->garbageCollect();
@@ -554,7 +555,7 @@ class OStatusPlugin extends Plugin
$member->getBestName(),
$oprofile->getBestName());
$oprofile->notifyActivity($act);
$oprofile->notifyActivity($act, $member);
}
}
@@ -597,7 +598,7 @@ class OStatusPlugin extends Plugin
$act->actor = ActivityObject::fromProfile($profile);
$act->object = ActivityObject::fromNotice($notice);
$oprofile->notifyActivity($act);
$oprofile->notifyActivity($act, $profile);
return true;
}
@@ -641,7 +642,7 @@ class OStatusPlugin extends Plugin
$act->actor = ActivityObject::fromProfile($profile);
$act->object = ActivityObject::fromNotice($notice);
$oprofile->notifyActivity($act);
$oprofile->notifyActivity($act, $profile);
return true;
}
@@ -730,7 +731,7 @@ class OStatusPlugin extends Plugin
$act->object = $act->actor;
while ($oprofile->fetch()) {
$oprofile->notifyDeferred($act);
$oprofile->notifyDeferred($act, $profile);
}
return true;

View File

@@ -80,10 +80,14 @@ class XrdAction extends Action
'href' => common_local_url('foaf',
array('nickname' => $nick)));
$salmon_url = common_local_url('salmon',
// Salmon
$salmon_url = common_local_url('usersalmon',
array('id' => $this->user->id));
$xrd->links[] = array('rel' => 'salmon',
$xrd->links[] = array('rel' => Salmon::NS_REPLIES,
'href' => $salmon_url);
$xrd->links[] = array('rel' => Salmon::NS_MENTIONS,
'href' => $salmon_url);
// Get this user's keypair
@@ -95,7 +99,7 @@ class XrdAction extends Action
}
$xrd->links[] = array('rel' => Magicsig::PUBLICKEYREL,
'href' => 'data:application/magic-public-key;'. $magickey->keypair);
'href' => 'data:application/magic-public-key;'. $magickey->toString(false));
// TODO - finalize where the redirect should go on the publisher
$url = common_local_url('ostatussub') . '?profile={uri}';

View File

@@ -49,7 +49,8 @@ class Magicsig extends Memcached_DataObject
public /*static*/ function staticGet($k, $v=null)
{
return parent::staticGet(__CLASS__, $k, $v);
$obj = parent::staticGet(__CLASS__, $k, $v);
return Magicsig::fromString($obj->keypair);
}

View File

@@ -357,7 +357,7 @@ class Ostatus_profile extends Memcached_DataObject
common_log(LOG_INFO, "Posting to Salmon endpoint $this->salmonuri: $xml");
$salmon = new Salmon(); // ?
return $salmon->post($this->salmonuri, $xml);
return $salmon->post($this->salmonuri, $xml, $actor);
}
return false;
}
@@ -369,11 +369,11 @@ class Ostatus_profile extends Memcached_DataObject
* @param mixed $entry XML string, Notice, or Activity
* @return boolean success
*/
public function notifyActivity($entry)
public function notifyActivity($entry, $actor)
{
if ($this->salmonuri) {
$salmon = new Salmon();
return $salmon->post($this->salmonuri, $this->notifyPrepXml($entry));
return $salmon->post($this->salmonuri, $this->notifyPrepXml($entry), $actor);
}
return false;
@@ -386,11 +386,12 @@ class Ostatus_profile extends Memcached_DataObject
* @param mixed $entry XML string, Notice, or Activity
* @return boolean success
*/
public function notifyDeferred($entry)
public function notifyDeferred($entry, $actor)
{
if ($this->salmonuri) {
$data = array('salmonuri' => $this->salmonuri,
'entry' => $this->notifyPrepXml($entry));
'entry' => $this->notifyPrepXml($entry),
'actor' => $actor->id);
$qm = QueueManager::get();
return $qm->enqueue($data, 'salmon');
@@ -707,7 +708,7 @@ class Ostatus_profile extends Memcached_DataObject
$huburi = $discover->getAtomLink('hub');
$hints['hub'] = $huburi;
$salmonuri = $discover->getAtomLink('salmon');
$salmonuri = $discover->getAtomLink(Salmon::NS_REPLIES);
$hints['salmon'] = $salmonuri;
if (!$huburi) {
@@ -991,7 +992,7 @@ class Ostatus_profile extends Memcached_DataObject
$discover = new FeedDiscovery();
$discover->discoverFromFeedURL($hints['feedurl']);
}
$salmonuri = $discover->getAtomLink('salmon');
$salmonuri = $discover->getAtomLink(Salmon::NS_REPLIES);
}
if (array_key_exists('hub', $hints)) {
@@ -1299,7 +1300,7 @@ class Ostatus_profile extends Memcached_DataObject
case Discovery::PROFILEPAGE:
$profileUrl = $link['href'];
break;
case 'salmon':
case Salmon::NS_REPLIES:
$salmonEndpoint = $link['href'];
break;
case Discovery::UPDATESFROM:

View File

@@ -67,18 +67,8 @@ class MagicEnvelope
}
public function signMessage($text, $mimetype, $signer_uri)
public function signMessage($text, $mimetype, $keypair)
{
$signer_uri = $this->normalizeUser($signer_uri);
if (!$this->checkAuthor($text, $signer_uri)) {
throw new Exception("Unable to determine entry author.");
}
$keypair = $this->getKeyPair($signer_uri);
if (!$keypair) {
throw new Exception("Unable to retrive keypair for ". $signer_uri);
}
$signature_alg = Magicsig::fromString($keypair);
$armored_text = base64_encode($text);

View File

@@ -87,7 +87,7 @@ class OStatusQueueHandler extends QueueHandler
// remote user or group.
// @fixme as an optimization we can skip this if the
// remote profile is subscribed to the author.
$oprofile->notifyDeferred($this->notice);
$oprofile->notifyDeferred($this->notice, $this->user);
}
}

View File

@@ -28,6 +28,11 @@
*/
class Salmon
{
const NS_REPLIES = "http://salmon-protocol.org/ns/salmon-replies";
const NS_MENTIONS = "http://salmon-protocol.org/ns/salmon-mention";
/**
* Sign and post the given Atom entry as a Salmon message.
*
@@ -37,14 +42,14 @@ class Salmon
* @param string $xml
* @return boolean success
*/
public function post($endpoint_uri, $xml)
public function post($endpoint_uri, $xml, $actor)
{
if (empty($endpoint_uri)) {
return false;
}
if (!common_config('ostatus', 'skip_signatures')) {
$xml = $this->createMagicEnv($xml);
$xml = $this->createMagicEnv($xml, $actor);
}
$headers = array('Content-Type: application/atom+xml');
@@ -65,15 +70,27 @@ class Salmon
return true;
}
public function createMagicEnv($text)
public function createMagicEnv($text, $actor)
{
common_log(LOG_DEBUG, "Got actor as : ". print_r($actor, true));
$magic_env = new MagicEnvelope();
// TODO: Should probably be getting the signer uri as an argument?
$signer_uri = $magic_env->getAuthor($text);
$user = User::staticGet('id', $actor->id);
if ($user->id) {
// Use local key
$magickey = Magicsig::staticGet('user_id', $user->id);
if (!$magickey) {
// No keypair yet, let's generate one.
$magickey = new Magicsig();
$magickey->generate($user->id);
}
common_log(LOG_DEBUG, "Salmon: Loaded key for ". $user->id);
} else {
throw new Exception("Salmon invalid actor for signing");
}
try {
$env = $magic_env->signMessage($text, 'application/atom+xml', $signer_uri);
$env = $magic_env->signMessage($text, 'application/atom+xml', $magickey->toString());
} catch (Exception $e) {
common_log(LOG_ERR, "Salmon signing failed: ". $e->getMessage());
return $text;

View File

@@ -35,8 +35,10 @@ class SalmonQueueHandler extends QueueHandler
assert(is_string($data['salmonuri']));
assert(is_string($data['entry']));
$actor = Profile::staticGet($data['actor']);
$salmon = new Salmon();
$salmon->post($data['salmonuri'], $data['entry']);
$salmon->post($data['salmonuri'], $data['entry'], $actor);
// @fixme detect failure and attempt to resend
return true;