forked from GNUsocial/gnu-social
I think all the notice deletion calls are event-compatible now
This means we can handle DeleteNoticeAsProfile in plugins, such as the ActivityModeration plugin.
This commit is contained in:
parent
88f7bb1ed5
commit
dac617d95a
@ -124,7 +124,7 @@ class ApiStatusesDestroyAction extends ApiAuthAction
|
|||||||
|
|
||||||
if ($this->user->id == $this->notice->profile_id) {
|
if ($this->user->id == $this->notice->profile_id) {
|
||||||
if (Event::handle('StartDeleteOwnNotice', array($this->user, $this->notice))) {
|
if (Event::handle('StartDeleteOwnNotice', array($this->user, $this->notice))) {
|
||||||
$this->notice->delete();
|
$this->notice->deleteAs($this->scoped);
|
||||||
Event::handle('EndDeleteOwnNotice', array($this->user, $this->notice));
|
Event::handle('EndDeleteOwnNotice', array($this->user, $this->notice));
|
||||||
}
|
}
|
||||||
$this->showNotice();
|
$this->showNotice();
|
||||||
|
@ -236,7 +236,7 @@ class ApiStatusesShowAction extends ApiPrivateAuthAction
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (Event::handle('StartDeleteOwnNotice', array($this->auth_user, $this->notice))) {
|
if (Event::handle('StartDeleteOwnNotice', array($this->auth_user, $this->notice))) {
|
||||||
$this->notice->delete();
|
$this->notice->deleteAs($this->scoped);
|
||||||
Event::handle('EndDeleteOwnNotice', array($this->auth_user, $this->notice));
|
Event::handle('EndDeleteOwnNotice', array($this->auth_user, $this->notice));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ class DeletenoticeAction extends FormAction
|
|||||||
{
|
{
|
||||||
if ($this->arg('yes')) {
|
if ($this->arg('yes')) {
|
||||||
if (Event::handle('StartDeleteOwnNotice', array($this->scoped->getUser(), $this->notice))) {
|
if (Event::handle('StartDeleteOwnNotice', array($this->scoped->getUser(), $this->notice))) {
|
||||||
$this->notice->delete();
|
$this->notice->deleteAs($this->scoped);
|
||||||
Event::handle('EndDeleteOwnNotice', array($this->scoped->getUser(), $this->notice));
|
Event::handle('EndDeleteOwnNotice', array($this->scoped->getUser(), $this->notice));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -158,20 +158,14 @@ class Notice extends Managed_DataObject
|
|||||||
$this->_profile[$this->profile_id] = $profile;
|
$this->_profile[$this->profile_id] = $profile;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function deleteAs(Profile $actor)
|
public function deleteAs(Profile $actor, $delete_event=true)
|
||||||
{
|
{
|
||||||
if ($this->getProfile()->sameAs($actor) || $actor->hasRight(Right::DELETEOTHERSNOTICE)) {
|
if (!$this->getProfile()->sameAs($actor) && !$actor->hasRight(Right::DELETEOTHERSNOTICE)) {
|
||||||
return $this->delete();
|
throw new AuthorizationException(_('You are not allowed to delete another user\'s notice.'));
|
||||||
}
|
}
|
||||||
throw new AuthorizationException(_('You are not allowed to delete other user\'s notices'));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function delete($useWhere=false)
|
|
||||||
{
|
|
||||||
if (Event::handle('NoticeDeleteRelated', array($this))) {
|
if (Event::handle('NoticeDeleteRelated', array($this))) {
|
||||||
|
|
||||||
// Clear related records
|
// Clear related records
|
||||||
|
|
||||||
$this->clearReplies();
|
$this->clearReplies();
|
||||||
$this->clearLocation();
|
$this->clearLocation();
|
||||||
$this->clearRepeats();
|
$this->clearRepeats();
|
||||||
@ -179,10 +173,21 @@ class Notice extends Managed_DataObject
|
|||||||
$this->clearGroupInboxes();
|
$this->clearGroupInboxes();
|
||||||
$this->clearFiles();
|
$this->clearFiles();
|
||||||
$this->clearAttentions();
|
$this->clearAttentions();
|
||||||
|
|
||||||
// NOTE: we don't clear queue items
|
// NOTE: we don't clear queue items
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$result = null;
|
||||||
|
if (!$delete_event || Event::handle('DeleteNoticeAsProfile', array($this, $actor, &$result))) {
|
||||||
|
// If $delete_event is true, we run the event. If the Event then
|
||||||
|
// returns false it is assumed everything was handled properly
|
||||||
|
// and the notice was deleted.
|
||||||
|
$result = $this->delete();
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function delete($useWhere=false)
|
||||||
|
{
|
||||||
$result = parent::delete($useWhere);
|
$result = parent::delete($useWhere);
|
||||||
|
|
||||||
$this->blowOnDelete();
|
$this->blowOnDelete();
|
||||||
|
@ -114,7 +114,7 @@ class ActivityMover extends QueueHandler
|
|||||||
$sink->postActivity($act);
|
$sink->postActivity($act);
|
||||||
$notice = Notice::getKV('uri', $act->objects[0]->id);
|
$notice = Notice::getKV('uri', $act->objects[0]->id);
|
||||||
if (!empty($notice)) {
|
if (!empty($notice)) {
|
||||||
$notice->delete();
|
$notice->deleteAs($user->getProfile(), false);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ActivityVerb::JOIN:
|
case ActivityVerb::JOIN:
|
||||||
|
@ -59,13 +59,21 @@ class ActivityModerationPlugin extends ActivityVerbHandlerPlugin
|
|||||||
|
|
||||||
public function deleteRelated(Notice $notice)
|
public function deleteRelated(Notice $notice)
|
||||||
{
|
{
|
||||||
if ($notice->getProfile()->hasRole(Profile_role::DELETED)) {
|
// pass
|
||||||
// Don't save a new Deleted_notice entry if the profile is being deleted
|
}
|
||||||
|
|
||||||
|
public function onDeleteNoticeAsProfile(Notice $stored, Profile $actor, &$result) {
|
||||||
|
// By adding a new 'delete' verb we will eventually trigger $this->saveObjectFromActivity
|
||||||
|
if (false === Deleted_notice::addNew($stored, $actor)) {
|
||||||
|
// false is returned if we did not have an error, but did not create the object
|
||||||
|
// (i.e. the author is currently being deleted)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// For auditing purposes, save a record that the notice was deleted.
|
// We return false (to stop the event) if the deleted_notice entry was
|
||||||
return Deleted_notice::addNew($notice);
|
// added, which means we have run $this->saveObjectFromActivity which
|
||||||
|
// in turn has called the delete function of the notice.
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -54,13 +54,15 @@ class Deleted_notice extends Managed_DataObject
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function addNew(Notice $notice)
|
public static function addNew(Notice $notice, Profile $actor=null)
|
||||||
{
|
{
|
||||||
$actor = $notice->getProfile();
|
if (is_null($actor)) {
|
||||||
|
$actor = $notice->getProfile();
|
||||||
|
}
|
||||||
|
|
||||||
if ($actor->hasRole(Profile_role::DELETED)) {
|
if ($notice->getProfile()->hasRole(Profile_role::DELETED)) {
|
||||||
// Don't emit notices if the user is deleted
|
// Don't emit notices if the notice author is (being) deleted
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$act = new Activity();
|
$act = new Activity();
|
||||||
@ -80,7 +82,7 @@ class Deleted_notice extends Managed_DataObject
|
|||||||
);
|
);
|
||||||
|
|
||||||
$act->actor = $actor->asActivityObject();
|
$act->actor = $actor->asActivityObject();
|
||||||
$act->target = new ActivityObject();
|
$act->target = new ActivityObject(); // We don't save the notice object, as it's supposed to be removed!
|
||||||
$act->target->id = $notice->getUri();
|
$act->target->id = $notice->getUri();
|
||||||
$act->objects = array(clone($act->target));
|
$act->objects = array(clone($act->target));
|
||||||
|
|
||||||
|
@ -138,7 +138,7 @@ class CancelrsvpAction extends Action
|
|||||||
// NB: this will delete the rsvp, too
|
// NB: this will delete the rsvp, too
|
||||||
if (!empty($notice)) {
|
if (!empty($notice)) {
|
||||||
common_log(LOG_DEBUG, "Deleting notice...");
|
common_log(LOG_DEBUG, "Deleting notice...");
|
||||||
$notice->delete();
|
$notice->deleteAs($this->scoped);
|
||||||
} else {
|
} else {
|
||||||
common_log(LOG_DEBUG, "Deleting RSVP alone...");
|
common_log(LOG_DEBUG, "Deleting RSVP alone...");
|
||||||
$this->rsvp->delete();
|
$this->rsvp->delete();
|
||||||
|
@ -192,7 +192,7 @@ class EditphotoAction extends Action
|
|||||||
$this->photo->delete();
|
$this->photo->delete();
|
||||||
|
|
||||||
if (Event::handle('StartDeleteOwnNotice', array($this->user, $notice))) {
|
if (Event::handle('StartDeleteOwnNotice', array($this->user, $notice))) {
|
||||||
$notice->delete();
|
$notice->deleteAs($this->scoped);
|
||||||
Event::handle('EndDeleteOwnNotice', array($this->user, $notice));
|
Event::handle('EndDeleteOwnNotice', array($this->user, $notice));
|
||||||
}
|
}
|
||||||
$this->showForm(_('Success!'));
|
$this->showForm(_('Success!'));
|
||||||
|
Loading…
Reference in New Issue
Block a user