move signing to take a local actor profile and use local keys
This commit is contained in:
parent
3a7eef1074
commit
223ebc765c
|
@ -415,7 +415,7 @@ class OStatusPlugin extends Plugin
|
||||||
$act->actor = ActivityObject::fromProfile($subscriber);
|
$act->actor = ActivityObject::fromProfile($subscriber);
|
||||||
$act->object = ActivityObject::fromProfile($other);
|
$act->object = ActivityObject::fromProfile($other);
|
||||||
|
|
||||||
$oprofile->notifyActivity($act);
|
$oprofile->notifyActivity($act, $subscriber);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -463,7 +463,7 @@ class OStatusPlugin extends Plugin
|
||||||
$act->actor = ActivityObject::fromProfile($profile);
|
$act->actor = ActivityObject::fromProfile($profile);
|
||||||
$act->object = ActivityObject::fromProfile($other);
|
$act->object = ActivityObject::fromProfile($other);
|
||||||
|
|
||||||
$oprofile->notifyActivity($act);
|
$oprofile->notifyActivity($act, $profile);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -505,7 +505,7 @@ class OStatusPlugin extends Plugin
|
||||||
$member->getBestName(),
|
$member->getBestName(),
|
||||||
$oprofile->getBestName());
|
$oprofile->getBestName());
|
||||||
|
|
||||||
if ($oprofile->notifyActivity($act)) {
|
if ($oprofile->notifyActivity($act, $member)) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
$oprofile->garbageCollect();
|
$oprofile->garbageCollect();
|
||||||
|
@ -555,7 +555,7 @@ class OStatusPlugin extends Plugin
|
||||||
$member->getBestName(),
|
$member->getBestName(),
|
||||||
$oprofile->getBestName());
|
$oprofile->getBestName());
|
||||||
|
|
||||||
$oprofile->notifyActivity($act);
|
$oprofile->notifyActivity($act, $member);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -598,7 +598,7 @@ class OStatusPlugin extends Plugin
|
||||||
$act->actor = ActivityObject::fromProfile($profile);
|
$act->actor = ActivityObject::fromProfile($profile);
|
||||||
$act->object = ActivityObject::fromNotice($notice);
|
$act->object = ActivityObject::fromNotice($notice);
|
||||||
|
|
||||||
$oprofile->notifyActivity($act);
|
$oprofile->notifyActivity($act, $profile);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -642,7 +642,7 @@ class OStatusPlugin extends Plugin
|
||||||
$act->actor = ActivityObject::fromProfile($profile);
|
$act->actor = ActivityObject::fromProfile($profile);
|
||||||
$act->object = ActivityObject::fromNotice($notice);
|
$act->object = ActivityObject::fromNotice($notice);
|
||||||
|
|
||||||
$oprofile->notifyActivity($act);
|
$oprofile->notifyActivity($act, $profile);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -731,7 +731,7 @@ class OStatusPlugin extends Plugin
|
||||||
$act->object = $act->actor;
|
$act->object = $act->actor;
|
||||||
|
|
||||||
while ($oprofile->fetch()) {
|
while ($oprofile->fetch()) {
|
||||||
$oprofile->notifyDeferred($act);
|
$oprofile->notifyDeferred($act, $profile);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -49,7 +49,8 @@ class Magicsig extends Memcached_DataObject
|
||||||
|
|
||||||
public /*static*/ function staticGet($k, $v=null)
|
public /*static*/ function staticGet($k, $v=null)
|
||||||
{
|
{
|
||||||
return parent::staticGet(__CLASS__, $k, $v);
|
$obj = parent::staticGet(__CLASS__, $k, $v);
|
||||||
|
return Magicsig::fromString($obj->keypair);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -357,7 +357,7 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
common_log(LOG_INFO, "Posting to Salmon endpoint $this->salmonuri: $xml");
|
common_log(LOG_INFO, "Posting to Salmon endpoint $this->salmonuri: $xml");
|
||||||
|
|
||||||
$salmon = new Salmon(); // ?
|
$salmon = new Salmon(); // ?
|
||||||
return $salmon->post($this->salmonuri, $xml);
|
return $salmon->post($this->salmonuri, $xml, $actor);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -369,11 +369,11 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
* @param mixed $entry XML string, Notice, or Activity
|
* @param mixed $entry XML string, Notice, or Activity
|
||||||
* @return boolean success
|
* @return boolean success
|
||||||
*/
|
*/
|
||||||
public function notifyActivity($entry)
|
public function notifyActivity($entry, $actor)
|
||||||
{
|
{
|
||||||
if ($this->salmonuri) {
|
if ($this->salmonuri) {
|
||||||
$salmon = new Salmon();
|
$salmon = new Salmon();
|
||||||
return $salmon->post($this->salmonuri, $this->notifyPrepXml($entry));
|
return $salmon->post($this->salmonuri, $this->notifyPrepXml($entry), $actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -386,11 +386,12 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
* @param mixed $entry XML string, Notice, or Activity
|
* @param mixed $entry XML string, Notice, or Activity
|
||||||
* @return boolean success
|
* @return boolean success
|
||||||
*/
|
*/
|
||||||
public function notifyDeferred($entry)
|
public function notifyDeferred($entry, $actor)
|
||||||
{
|
{
|
||||||
if ($this->salmonuri) {
|
if ($this->salmonuri) {
|
||||||
$data = array('salmonuri' => $this->salmonuri,
|
$data = array('salmonuri' => $this->salmonuri,
|
||||||
'entry' => $this->notifyPrepXml($entry));
|
'entry' => $this->notifyPrepXml($entry),
|
||||||
|
'actor' => $actor->id);
|
||||||
|
|
||||||
$qm = QueueManager::get();
|
$qm = QueueManager::get();
|
||||||
return $qm->enqueue($data, 'salmon');
|
return $qm->enqueue($data, 'salmon');
|
||||||
|
|
|
@ -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);
|
$signature_alg = Magicsig::fromString($keypair);
|
||||||
$armored_text = base64_encode($text);
|
$armored_text = base64_encode($text);
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,7 @@ class OStatusQueueHandler extends QueueHandler
|
||||||
// remote user or group.
|
// remote user or group.
|
||||||
// @fixme as an optimization we can skip this if the
|
// @fixme as an optimization we can skip this if the
|
||||||
// remote profile is subscribed to the author.
|
// remote profile is subscribed to the author.
|
||||||
$oprofile->notifyDeferred($this->notice);
|
$oprofile->notifyDeferred($this->notice, $this->user);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,14 +42,14 @@ class Salmon
|
||||||
* @param string $xml
|
* @param string $xml
|
||||||
* @return boolean success
|
* @return boolean success
|
||||||
*/
|
*/
|
||||||
public function post($endpoint_uri, $xml)
|
public function post($endpoint_uri, $xml, $actor)
|
||||||
{
|
{
|
||||||
if (empty($endpoint_uri)) {
|
if (empty($endpoint_uri)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!common_config('ostatus', 'skip_signatures')) {
|
if (!common_config('ostatus', 'skip_signatures')) {
|
||||||
$xml = $this->createMagicEnv($xml);
|
$xml = $this->createMagicEnv($xml, $actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
$headers = array('Content-Type: application/atom+xml');
|
$headers = array('Content-Type: application/atom+xml');
|
||||||
|
@ -70,15 +70,27 @@ class Salmon
|
||||||
return true;
|
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();
|
$magic_env = new MagicEnvelope();
|
||||||
|
|
||||||
// TODO: Should probably be getting the signer uri as an argument?
|
$user = User::staticGet('id', $actor->id);
|
||||||
$signer_uri = $magic_env->getAuthor($text);
|
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 {
|
try {
|
||||||
$env = $magic_env->signMessage($text, 'application/atom+xml', $signer_uri);
|
$env = $magic_env->signMessage($text, 'application/atom+xml', $magickey->toString());
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
common_log(LOG_ERR, "Salmon signing failed: ". $e->getMessage());
|
common_log(LOG_ERR, "Salmon signing failed: ". $e->getMessage());
|
||||||
return $text;
|
return $text;
|
||||||
|
|
|
@ -35,8 +35,10 @@ class SalmonQueueHandler extends QueueHandler
|
||||||
assert(is_string($data['salmonuri']));
|
assert(is_string($data['salmonuri']));
|
||||||
assert(is_string($data['entry']));
|
assert(is_string($data['entry']));
|
||||||
|
|
||||||
|
$actor = Profile::staticGet($data['actor']);
|
||||||
|
|
||||||
$salmon = new Salmon();
|
$salmon = new Salmon();
|
||||||
$salmon->post($data['salmonuri'], $data['entry']);
|
$salmon->post($data['salmonuri'], $data['entry'], $actor);
|
||||||
|
|
||||||
// @fixme detect failure and attempt to resend
|
// @fixme detect failure and attempt to resend
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user