diff --git a/src/applications/policy/filter/PhabricatorPolicyFilter.php b/src/applications/policy/filter/PhabricatorPolicyFilter.php --- a/src/applications/policy/filter/PhabricatorPolicyFilter.php +++ b/src/applications/policy/filter/PhabricatorPolicyFilter.php @@ -90,6 +90,29 @@ PhabricatorUser $user, PhabricatorPolicyInterface $object) { + $capabilities = self::getRequiredInteractCapabilities($object); + + foreach ($capabilities as $capability) { + if (!self::hasCapability($user, $object, $capability)) { + return false; + } + } + + return true; + } + + public static function requireCanInteract( + PhabricatorUser $user, + PhabricatorPolicyInterface $object) { + + $capabilities = self::getRequiredInteractCapabilities($object); + foreach ($capabilities as $capability) { + self::requireCapability($user, $object, $capability); + } + } + + private static function getRequiredInteractCapabilities( + PhabricatorPolicyInterface $object) { $capabilities = $object->getCapabilities(); $capabilities = array_fuse($capabilities); @@ -107,13 +130,7 @@ $require[] = $can_interact; } - foreach ($require as $capability) { - if (!self::hasCapability($user, $object, $capability)) { - return false; - } - } - - return true; + return $require; } public function setViewer(PhabricatorUser $user) { diff --git a/src/applications/transactions/controller/PhabricatorApplicationTransactionCommentEditController.php b/src/applications/transactions/controller/PhabricatorApplicationTransactionCommentEditController.php --- a/src/applications/transactions/controller/PhabricatorApplicationTransactionCommentEditController.php +++ b/src/applications/transactions/controller/PhabricatorApplicationTransactionCommentEditController.php @@ -36,10 +36,9 @@ // auditing, and editing comments serves neither goal. $object = $xaction->getObject(); - $can_interact = PhabricatorPolicyFilter::hasCapability( + $can_interact = PhabricatorPolicyFilter::canInteract( $viewer, - $object, - PhabricatorPolicyCapability::CAN_INTERACT); + $object); if (!$can_interact) { return $this->newDialog() ->setTitle(pht('Conversation Locked')) diff --git a/src/applications/transactions/editor/PhabricatorApplicationTransactionCommentEditor.php b/src/applications/transactions/editor/PhabricatorApplicationTransactionCommentEditor.php --- a/src/applications/transactions/editor/PhabricatorApplicationTransactionCommentEditor.php +++ b/src/applications/transactions/editor/PhabricatorApplicationTransactionCommentEditor.php @@ -189,10 +189,10 @@ $actor, $xaction, PhabricatorPolicyCapability::CAN_EDIT); - PhabricatorPolicyFilter::requireCapability( + + PhabricatorPolicyFilter::requireCanInteract( $actor, - $xaction->getObject(), - PhabricatorPolicyCapability::CAN_INTERACT); + $xaction->getObject()); } } diff --git a/src/applications/transactions/view/PhabricatorApplicationTransactionView.php b/src/applications/transactions/view/PhabricatorApplicationTransactionView.php --- a/src/applications/transactions/view/PhabricatorApplicationTransactionView.php +++ b/src/applications/transactions/view/PhabricatorApplicationTransactionView.php @@ -513,10 +513,9 @@ } } - $can_interact = PhabricatorPolicyFilter::hasCapability( + $can_interact = PhabricatorPolicyFilter::canInteract( $viewer, - $xaction->getObject(), - PhabricatorPolicyCapability::CAN_INTERACT); + $xaction->getObject()); $event->setCanInteract($can_interact); }