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.");
'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;
}
{
$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) {
$dom->documentElement->appendChild($prov);
break;
default:
- throw new ServerException('Unknown Salmon payload data type');
+ throw new ClientException('Unknown Salmon payload data type');
}
return $dom;
}
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!
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
{
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))) {