diff --git a/lib/activityhandlerplugin.php b/lib/activityhandlerplugin.php index 988a6c30a3..cb8a6b9bc9 100644 --- a/lib/activityhandlerplugin.php +++ b/lib/activityhandlerplugin.php @@ -380,6 +380,11 @@ abstract class ActivityHandlerPlugin extends Plugin if (!$this->isMyActivity($activity)) { return true; } + if (!isset($this->oldSaveNew)) { + // Handle saveActivity in OStatus class for incoming salmon, remove this event + // handler when all plugins have gotten rid of "oldSaveNew". + return true; + } $this->log(LOG_INFO, get_called_class()." checking {$activity->id} as a valid Salmon slap."); @@ -428,11 +433,7 @@ abstract class ActivityHandlerPlugin extends Plugin 'is_local' => Notice::REMOTE, 'source' => 'ostatus'); - if (!isset($this->oldSaveNew)) { - $notice = Notice::saveActivity($activity, $actor, $options); - } else { - $notice = $this->saveNoticeFromActivity($activity, $actor, $options); - } + $notice = $this->saveNoticeFromActivity($activity, $actor, $options); return false; } diff --git a/plugins/OStatus/lib/magicenvelope.php b/plugins/OStatus/lib/magicenvelope.php index a60880dd7e..35171895ab 100644 --- a/plugins/OStatus/lib/magicenvelope.php +++ b/plugins/OStatus/lib/magicenvelope.php @@ -250,7 +250,7 @@ class MagicEnvelope { $dom = new DOMDocument(); if (!$dom->loadXML(Magicsig::base64_url_decode($this->data))) { - throw new ServerException('Malformed XML in Salmon payload'); + throw new ClientException('Malformed XML in Salmon payload'); } switch ($this->data_type) { @@ -274,7 +274,7 @@ class MagicEnvelope $dom->documentElement->appendChild($prov); break; default: - throw new ServerException('Unknown Salmon payload data type'); + throw new ClientException('Unknown Salmon payload data type'); } return $dom; } diff --git a/plugins/OStatus/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php index a2703f1647..6855fd1b18 100644 --- a/plugins/OStatus/lib/salmonaction.php +++ b/plugins/OStatus/lib/salmonaction.php @@ -55,13 +55,13 @@ class SalmonAction extends Action break; default: // TRANS: Client error. Do not translate the quoted "application/[type]" strings. - $this->clientError(_m('Salmon requires "application/magic-envelope+xml". For Diaspora we also accept "application/x-www-form-urlencoded" with an "xml" parameter.', 415)); + throw new ClientException(_m('Salmon requires "application/magic-envelope+xml". For Diaspora we also accept "application/x-www-form-urlencoded" with an "xml" parameter.', 415)); } + if (empty($envxml)) { + throw new ClientException('No magic envelope supplied in POST.'); + } try { - if (empty($envxml)) { - throw new ClientException('No magic envelope supplied in POST.'); - } $magic_env = new MagicEnvelope($envxml); // parse incoming XML as a MagicEnvelope $entry = $magic_env->getPayload(); // Not cryptographically verified yet! @@ -70,13 +70,14 @@ class SalmonAction extends Action common_log(LOG_ERR, "broken actor: " . var_export($this->activity->actor->id, true)); common_log(LOG_ERR, "activity with no actor: " . var_export($this->activity, true)); // TRANS: Exception. - throw new Exception(_m('Received a salmon slap from unidentified actor.')); + throw new ClientException(_m('Activity in salmon slap has no actor id.')); } // ensureProfiles sets $this->actor and $this->oprofile $this->ensureProfiles(); } catch (Exception $e) { common_debug('Salmon envelope parsing failed with: '.$e->getMessage()); - $this->clientError($e->getMessage()); + // convert exception to ClientException + throw new ClientException($e->getMessage()); } // Cryptographic verification test, throws exception on failure @@ -93,7 +94,23 @@ class SalmonAction extends Action { parent::handle(); + assert($this->activity instanceof Activity); + assert($this->target instanceof Profile); + common_log(LOG_DEBUG, "Got a " . $this->activity->verb); + try { + $options = [ 'source' => 'ostatus' ]; + common_debug('Save salmon slap directly with Notice::saveActivity for actor=='.$this->actor->getID()); + $stored = Notice::saveActivity($this->activity, $this->actor, $options); + common_debug('Save salmon slap finished, notice id=='.$stored->getID()); + return true; + } catch (AlreadyFulfilledException $e) { + // The action's results are already fulfilled. Maybe it was a + // duplicate? Maybe someone's database is out of sync? + // Let's just accept it and move on. + common_log(LOG_INFO, 'Salmon slap carried an event which had already been fulfilled.'); + } + try { if (Event::handle('StartHandleSalmonTarget', array($this->activity, $this->target)) && Event::handle('StartHandleSalmon', array($this->activity))) {