+ /**
+ * This is run before ->insert, so our task in this function is just to
+ * delete if it is the delete verb.
+ */
+ public function onStartNoticeSave(Notice $stored)
+ {
+ // DELETE is a bit special, we have to remove the existing entry and then
+ // add a new one with the same URI in order to trigger the distribution.
+ // (that's why we don't use $this->isMyNotice(...))
+ if (!ActivityUtils::compareVerbs($stored->verb, array(ActivityVerb::DELETE))) {
+ return true;
+ }
+
+ try {
+ $target = Notice::getByUri($stored->uri);
+ } catch (NoResultException $e) {
+ throw new AlreadyFulfilledException('Notice URI not found, so we have nothing to delete.');
+ }
+
+ $actor = $stored->getProfile();
+ $owner = $target->getProfile();
+
+ if ($owner->hasRole(Profile_role::DELETED)) {
+ // Don't bother with replacing notices if its author is being deleted.
+ // The later "StoreActivityObject" will pick this up and execute
+ // the deletion then.
+ // (the "delete verb notice" is too new to ever pass through Notice::saveNew
+ // which otherwise wouldn't execute the StoreActivityObject event)
+ return true;
+ }
+
+ // Since the user deleting may not be the same as the notice's owner,
+ // double-check this and also set the "re-stored" notice profile_id.
+ if (!$actor->sameAs($owner) && !$actor->hasRight(Right::DELETEOTHERSNOTICE)) {
+ throw new AuthorizationException(_('You are not allowed to delete another user\'s notice.'));
+ }