diff --git a/resources/celerity/map.php b/resources/celerity/map.php --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -9,7 +9,7 @@ 'names' => array( 'conpherence.pkg.css' => 'cea72e09', 'conpherence.pkg.js' => '6249a1cf', - 'core.pkg.css' => 'c99a9eb4', + 'core.pkg.css' => 'd2126ffb', 'core.pkg.js' => '1a77dddf', 'darkconsole.pkg.js' => 'e7393ebb', 'differential.pkg.css' => 'a4ba74b5', @@ -21,7 +21,7 @@ 'maniphest.pkg.js' => '949a7498', 'rsrc/css/aphront/aphront-bars.css' => '231ac33c', 'rsrc/css/aphront/dark-console.css' => 'f54bf286', - 'rsrc/css/aphront/dialog-view.css' => '84f1e6a6', + 'rsrc/css/aphront/dialog-view.css' => '1e6b8603', 'rsrc/css/aphront/lightbox-attachment.css' => '7acac05d', 'rsrc/css/aphront/list-filter-view.css' => '5d6f0526', 'rsrc/css/aphront/multi-column.css' => '84cc6640', @@ -143,7 +143,7 @@ 'rsrc/css/phui/phui-form-view.css' => 'b5bfd17a', 'rsrc/css/phui/phui-form.css' => 'aac1d51d', 'rsrc/css/phui/phui-head-thing.css' => 'fd311e5f', - 'rsrc/css/phui/phui-header-view.css' => '06385974', + 'rsrc/css/phui/phui-header-view.css' => '6ec8f155', 'rsrc/css/phui/phui-hovercard.css' => 'de1a2119', 'rsrc/css/phui/phui-icon-set-selector.css' => '1ab67aad', 'rsrc/css/phui/phui-icon.css' => '417f80fb', @@ -553,7 +553,7 @@ 'almanac-css' => 'dbb9b3af', 'aphront-bars' => '231ac33c', 'aphront-dark-console-css' => 'f54bf286', - 'aphront-dialog-view-css' => '84f1e6a6', + 'aphront-dialog-view-css' => '1e6b8603', 'aphront-list-filter-view-css' => '5d6f0526', 'aphront-multi-column-view-css' => '84cc6640', 'aphront-panel-view-css' => '8427b78d', @@ -867,7 +867,7 @@ 'phui-form-css' => 'aac1d51d', 'phui-form-view-css' => 'b5bfd17a', 'phui-head-thing-view-css' => 'fd311e5f', - 'phui-header-view-css' => '06385974', + 'phui-header-view-css' => '6ec8f155', 'phui-hovercard' => '1bd28176', 'phui-hovercard-view-css' => 'de1a2119', 'phui-icon-set-selector-css' => '1ab67aad', diff --git a/src/applications/almanac/storage/AlmanacDevice.php b/src/applications/almanac/storage/AlmanacDevice.php --- a/src/applications/almanac/storage/AlmanacDevice.php +++ b/src/applications/almanac/storage/AlmanacDevice.php @@ -167,10 +167,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorExtendedPolicyInterface )--------------------------------- */ diff --git a/src/applications/almanac/storage/AlmanacNamespace.php b/src/applications/almanac/storage/AlmanacNamespace.php --- a/src/applications/almanac/storage/AlmanacNamespace.php +++ b/src/applications/almanac/storage/AlmanacNamespace.php @@ -174,10 +174,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorApplicationTransactionInterface )------------------------- */ diff --git a/src/applications/almanac/storage/AlmanacNetwork.php b/src/applications/almanac/storage/AlmanacNetwork.php --- a/src/applications/almanac/storage/AlmanacNetwork.php +++ b/src/applications/almanac/storage/AlmanacNetwork.php @@ -92,10 +92,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorDestructibleInterface )----------------------------------- */ diff --git a/src/applications/almanac/storage/AlmanacService.php b/src/applications/almanac/storage/AlmanacService.php --- a/src/applications/almanac/storage/AlmanacService.php +++ b/src/applications/almanac/storage/AlmanacService.php @@ -184,10 +184,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorExtendedPolicyInterface )--------------------------------- */ diff --git a/src/applications/auth/storage/PhabricatorAuthProviderConfig.php b/src/applications/auth/storage/PhabricatorAuthProviderConfig.php --- a/src/applications/auth/storage/PhabricatorAuthProviderConfig.php +++ b/src/applications/auth/storage/PhabricatorAuthProviderConfig.php @@ -130,8 +130,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/auth/storage/PhabricatorAuthTemporaryToken.php b/src/applications/auth/storage/PhabricatorAuthTemporaryToken.php --- a/src/applications/auth/storage/PhabricatorAuthTemporaryToken.php +++ b/src/applications/auth/storage/PhabricatorAuthTemporaryToken.php @@ -125,8 +125,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/badges/storage/PhabricatorBadgesAward.php b/src/applications/badges/storage/PhabricatorBadgesAward.php --- a/src/applications/badges/storage/PhabricatorBadgesAward.php +++ b/src/applications/badges/storage/PhabricatorBadgesAward.php @@ -76,8 +76,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/badges/storage/PhabricatorBadgesBadge.php b/src/applications/badges/storage/PhabricatorBadgesBadge.php --- a/src/applications/badges/storage/PhabricatorBadgesBadge.php +++ b/src/applications/badges/storage/PhabricatorBadgesBadge.php @@ -129,10 +129,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorApplicationTransactionInterface )------------------------- */ diff --git a/src/applications/base/PhabricatorApplication.php b/src/applications/base/PhabricatorApplication.php --- a/src/applications/base/PhabricatorApplication.php +++ b/src/applications/base/PhabricatorApplication.php @@ -483,10 +483,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( Policies )----------------------------------------------------------- */ diff --git a/src/applications/calendar/storage/PhabricatorCalendarEventInvitee.php b/src/applications/calendar/storage/PhabricatorCalendarEventInvitee.php --- a/src/applications/calendar/storage/PhabricatorCalendarEventInvitee.php +++ b/src/applications/calendar/storage/PhabricatorCalendarEventInvitee.php @@ -121,7 +121,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } } diff --git a/src/applications/calendar/storage/PhabricatorCalendarExport.php b/src/applications/calendar/storage/PhabricatorCalendarExport.php --- a/src/applications/calendar/storage/PhabricatorCalendarExport.php +++ b/src/applications/calendar/storage/PhabricatorCalendarExport.php @@ -159,11 +159,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - - /* -( PhabricatorApplicationTransactionInterface )------------------------- */ diff --git a/src/applications/calendar/storage/PhabricatorCalendarExternalInvitee.php b/src/applications/calendar/storage/PhabricatorCalendarExternalInvitee.php --- a/src/applications/calendar/storage/PhabricatorCalendarExternalInvitee.php +++ b/src/applications/calendar/storage/PhabricatorCalendarExternalInvitee.php @@ -68,7 +68,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } } diff --git a/src/applications/calendar/storage/PhabricatorCalendarImport.php b/src/applications/calendar/storage/PhabricatorCalendarImport.php --- a/src/applications/calendar/storage/PhabricatorCalendarImport.php +++ b/src/applications/calendar/storage/PhabricatorCalendarImport.php @@ -132,10 +132,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorApplicationTransactionInterface )------------------------- */ diff --git a/src/applications/calendar/storage/PhabricatorCalendarImportLog.php b/src/applications/calendar/storage/PhabricatorCalendarImportLog.php --- a/src/applications/calendar/storage/PhabricatorCalendarImportLog.php +++ b/src/applications/calendar/storage/PhabricatorCalendarImportLog.php @@ -86,10 +86,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorDestructibleInterface )----------------------------------- */ diff --git a/src/applications/chatlog/storage/PhabricatorChatLogChannel.php b/src/applications/chatlog/storage/PhabricatorChatLogChannel.php --- a/src/applications/chatlog/storage/PhabricatorChatLogChannel.php +++ b/src/applications/chatlog/storage/PhabricatorChatLogChannel.php @@ -48,8 +48,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/chatlog/storage/PhabricatorChatLogEvent.php b/src/applications/chatlog/storage/PhabricatorChatLogEvent.php --- a/src/applications/chatlog/storage/PhabricatorChatLogEvent.php +++ b/src/applications/chatlog/storage/PhabricatorChatLogEvent.php @@ -56,8 +56,4 @@ return $this->getChannel()->hasAutomaticCapability($capability, $viewer); } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/conduit/method/ConduitAPIMethod.php b/src/applications/conduit/method/ConduitAPIMethod.php --- a/src/applications/conduit/method/ConduitAPIMethod.php +++ b/src/applications/conduit/method/ConduitAPIMethod.php @@ -372,10 +372,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - protected function hasApplicationCapability( $capability, PhabricatorUser $viewer) { diff --git a/src/applications/conduit/storage/PhabricatorConduitMethodCallLog.php b/src/applications/conduit/storage/PhabricatorConduitMethodCallLog.php --- a/src/applications/conduit/storage/PhabricatorConduitMethodCallLog.php +++ b/src/applications/conduit/storage/PhabricatorConduitMethodCallLog.php @@ -52,8 +52,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/config/storage/PhabricatorConfigEntry.php b/src/applications/config/storage/PhabricatorConfigEntry.php --- a/src/applications/config/storage/PhabricatorConfigEntry.php +++ b/src/applications/config/storage/PhabricatorConfigEntry.php @@ -95,8 +95,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/countdown/storage/PhabricatorCountdown.php b/src/applications/countdown/storage/PhabricatorCountdown.php --- a/src/applications/countdown/storage/PhabricatorCountdown.php +++ b/src/applications/countdown/storage/PhabricatorCountdown.php @@ -139,10 +139,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return false; - } - /* -( PhabricatorSpacesInterface )------------------------------------------- */ public function getSpacePHID() { diff --git a/src/applications/daemon/storage/PhabricatorDaemonLog.php b/src/applications/daemon/storage/PhabricatorDaemonLog.php --- a/src/applications/daemon/storage/PhabricatorDaemonLog.php +++ b/src/applications/daemon/storage/PhabricatorDaemonLog.php @@ -77,8 +77,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/dashboard/storage/PhabricatorDashboard.php b/src/applications/dashboard/storage/PhabricatorDashboard.php --- a/src/applications/dashboard/storage/PhabricatorDashboard.php +++ b/src/applications/dashboard/storage/PhabricatorDashboard.php @@ -160,10 +160,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorDestructibleInterface )----------------------------------- */ diff --git a/src/applications/dashboard/storage/PhabricatorDashboardPanel.php b/src/applications/dashboard/storage/PhabricatorDashboardPanel.php --- a/src/applications/dashboard/storage/PhabricatorDashboardPanel.php +++ b/src/applications/dashboard/storage/PhabricatorDashboardPanel.php @@ -159,10 +159,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorCustomFieldInterface )------------------------------------ */ diff --git a/src/applications/differential/storage/DifferentialChangeset.php b/src/applications/differential/storage/DifferentialChangeset.php --- a/src/applications/differential/storage/DifferentialChangeset.php +++ b/src/applications/differential/storage/DifferentialChangeset.php @@ -226,8 +226,4 @@ return $this->getDiff()->hasAutomaticCapability($capability, $viewer); } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/differential/storage/DifferentialHunk.php b/src/applications/differential/storage/DifferentialHunk.php --- a/src/applications/differential/storage/DifferentialHunk.php +++ b/src/applications/differential/storage/DifferentialHunk.php @@ -228,8 +228,4 @@ return $this->getChangeset()->hasAutomaticCapability($capability, $viewer); } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/diviner/storage/DivinerLiveBook.php b/src/applications/diviner/storage/DivinerLiveBook.php --- a/src/applications/diviner/storage/DivinerLiveBook.php +++ b/src/applications/diviner/storage/DivinerLiveBook.php @@ -114,10 +114,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorDestructibleInterface )----------------------------------- */ diff --git a/src/applications/doorkeeper/storage/DoorkeeperExternalObject.php b/src/applications/doorkeeper/storage/DoorkeeperExternalObject.php --- a/src/applications/doorkeeper/storage/DoorkeeperExternalObject.php +++ b/src/applications/doorkeeper/storage/DoorkeeperExternalObject.php @@ -121,8 +121,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/drydock/storage/DrydockBlueprint.php b/src/applications/drydock/storage/DrydockBlueprint.php --- a/src/applications/drydock/storage/DrydockBlueprint.php +++ b/src/applications/drydock/storage/DrydockBlueprint.php @@ -325,10 +325,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorCustomFieldInterface )------------------------------------ */ diff --git a/src/applications/feed/story/PhabricatorFeedStory.php b/src/applications/feed/story/PhabricatorFeedStory.php --- a/src/applications/feed/story/PhabricatorFeedStory.php +++ b/src/applications/feed/story/PhabricatorFeedStory.php @@ -454,11 +454,6 @@ } - public function describeAutomaticCapability($capability) { - return null; - } - - /* -( PhabricatorMarkupInterface Implementation )--------------------------- */ diff --git a/src/applications/files/storage/PhabricatorFileChunk.php b/src/applications/files/storage/PhabricatorFileChunk.php --- a/src/applications/files/storage/PhabricatorFileChunk.php +++ b/src/applications/files/storage/PhabricatorFileChunk.php @@ -77,11 +77,6 @@ } - public function describeAutomaticCapability($capability) { - return null; - } - - /* -( PhabricatorDestructibleInterface )----------------------------------- */ diff --git a/src/applications/legalpad/storage/LegalpadDocumentSignature.php b/src/applications/legalpad/storage/LegalpadDocumentSignature.php --- a/src/applications/legalpad/storage/LegalpadDocumentSignature.php +++ b/src/applications/legalpad/storage/LegalpadDocumentSignature.php @@ -93,8 +93,4 @@ return ($viewer->getPHID() == $this->getSignerPHID()); } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/macro/storage/PhabricatorFileImageMacro.php b/src/applications/macro/storage/PhabricatorFileImageMacro.php --- a/src/applications/macro/storage/PhabricatorFileImageMacro.php +++ b/src/applications/macro/storage/PhabricatorFileImageMacro.php @@ -139,8 +139,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/nuance/storage/NuanceImportCursorData.php b/src/applications/nuance/storage/NuanceImportCursorData.php --- a/src/applications/nuance/storage/NuanceImportCursorData.php +++ b/src/applications/nuance/storage/NuanceImportCursorData.php @@ -63,8 +63,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/nuance/storage/NuanceItemCommand.php b/src/applications/nuance/storage/NuanceItemCommand.php --- a/src/applications/nuance/storage/NuanceItemCommand.php +++ b/src/applications/nuance/storage/NuanceItemCommand.php @@ -48,8 +48,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/nuance/storage/NuanceQueue.php b/src/applications/nuance/storage/NuanceQueue.php --- a/src/applications/nuance/storage/NuanceQueue.php +++ b/src/applications/nuance/storage/NuanceQueue.php @@ -67,10 +67,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorApplicationTransactionInterface )------------------------- */ diff --git a/src/applications/nuance/storage/NuanceSource.php b/src/applications/nuance/storage/NuanceSource.php --- a/src/applications/nuance/storage/NuanceSource.php +++ b/src/applications/nuance/storage/NuanceSource.php @@ -138,10 +138,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorNgramsInterface )----------------------------------------- */ diff --git a/src/applications/oauthserver/storage/PhabricatorOAuthServerClient.php b/src/applications/oauthserver/storage/PhabricatorOAuthServerClient.php --- a/src/applications/oauthserver/storage/PhabricatorOAuthServerClient.php +++ b/src/applications/oauthserver/storage/PhabricatorOAuthServerClient.php @@ -83,10 +83,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorApplicationTransactionInterface )------------------------- */ diff --git a/src/applications/packages/storage/PhabricatorPackagesPackage.php b/src/applications/packages/storage/PhabricatorPackagesPackage.php --- a/src/applications/packages/storage/PhabricatorPackagesPackage.php +++ b/src/applications/packages/storage/PhabricatorPackagesPackage.php @@ -158,10 +158,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorDestructibleInterface )----------------------------------- */ diff --git a/src/applications/packages/storage/PhabricatorPackagesPublisher.php b/src/applications/packages/storage/PhabricatorPackagesPublisher.php --- a/src/applications/packages/storage/PhabricatorPackagesPublisher.php +++ b/src/applications/packages/storage/PhabricatorPackagesPublisher.php @@ -134,10 +134,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorDestructibleInterface )----------------------------------- */ diff --git a/src/applications/packages/storage/PhabricatorPackagesVersion.php b/src/applications/packages/storage/PhabricatorPackagesVersion.php --- a/src/applications/packages/storage/PhabricatorPackagesVersion.php +++ b/src/applications/packages/storage/PhabricatorPackagesVersion.php @@ -126,10 +126,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorExtendedPolicyInterface )--------------------------------- */ diff --git a/src/applications/passphrase/storage/PassphraseCredential.php b/src/applications/passphrase/storage/PassphraseCredential.php --- a/src/applications/passphrase/storage/PassphraseCredential.php +++ b/src/applications/passphrase/storage/PassphraseCredential.php @@ -155,10 +155,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorSubscribableInterface )----------------------------------- */ diff --git a/src/applications/phlux/storage/PhluxVariable.php b/src/applications/phlux/storage/PhluxVariable.php --- a/src/applications/phlux/storage/PhluxVariable.php +++ b/src/applications/phlux/storage/PhluxVariable.php @@ -80,8 +80,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/pholio/storage/PholioImage.php b/src/applications/pholio/storage/PholioImage.php --- a/src/applications/pholio/storage/PholioImage.php +++ b/src/applications/pholio/storage/PholioImage.php @@ -119,8 +119,4 @@ return $this->getMock()->hasAutomaticCapability($capability, $viewer); } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/phortune/storage/PhortuneProduct.php b/src/applications/phortune/storage/PhortuneProduct.php --- a/src/applications/phortune/storage/PhortuneProduct.php +++ b/src/applications/phortune/storage/PhortuneProduct.php @@ -110,8 +110,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/phragment/storage/PhragmentFragment.php b/src/applications/phragment/storage/PhragmentFragment.php --- a/src/applications/phragment/storage/PhragmentFragment.php +++ b/src/applications/phragment/storage/PhragmentFragment.php @@ -345,8 +345,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/policy/__tests__/PhabricatorPolicyTestObject.php b/src/applications/policy/__tests__/PhabricatorPolicyTestObject.php --- a/src/applications/policy/__tests__/PhabricatorPolicyTestObject.php +++ b/src/applications/policy/__tests__/PhabricatorPolicyTestObject.php @@ -52,10 +52,6 @@ return $this; } - public function describeAutomaticCapability($capability) { - return null; - } - public function setExtendedPolicies(array $extended_policies) { $this->extendedPolicies = $extended_policies; return $this; diff --git a/src/applications/policy/controller/PhabricatorPolicyExplainController.php b/src/applications/policy/controller/PhabricatorPolicyExplainController.php --- a/src/applications/policy/controller/PhabricatorPolicyExplainController.php +++ b/src/applications/policy/controller/PhabricatorPolicyExplainController.php @@ -262,47 +262,16 @@ $capability) { $viewer = $this->getViewer(); - if ($object instanceof PhabricatorPolicyCodexInterface) { - $codex = PhabricatorPolicyCodex::newFromObject($object, $viewer); - $rules = $codex->getPolicySpecialRuleDescriptions(); - - $exceptions = array(); - foreach ($rules as $rule) { - $is_active = $rule->getIsActive(); - if ($is_active) { - $rule_capabilities = $rule->getCapabilities(); - if ($rule_capabilities) { - if (!in_array($capability, $rule_capabilities)) { - $is_active = false; - } - } - } - - $description = $rule->getDescription(); - - if (!$is_active) { - $description = phutil_tag( - 'span', - array( - 'class' => 'phui-policy-section-view-inactive-rule', - ), - $description); - } - - $exceptions[] = $description; - } - } else if (method_exists($object, 'describeAutomaticCapability')) { - $exceptions = (array)$object->describeAutomaticCapability($capability); - $exceptions = array_filter($exceptions); - } else { - $exceptions = array(); - } + $exceptions = PhabricatorPolicy::getSpecialRules( + $object, + $viewer, + $capability, + false); if (!$exceptions) { return null; } - return id(new PHUIPolicySectionView()) ->setViewer($viewer) ->setIcon('fa-unlock-alt red') 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 @@ -581,9 +581,16 @@ } $more = PhabricatorPolicy::getPolicyExplanation($this->viewer, $policy); - $exceptions = $object->describeAutomaticCapability($capability); + $more = (array)$more; + $more = array_filter($more); - $details = array_filter(array_merge(array($more), (array)$exceptions)); + $exceptions = PhabricatorPolicy::getSpecialRules( + $object, + $this->viewer, + $capability, + true); + + $details = array_filter(array_merge($more, $exceptions)); $access_denied = $this->renderAccessDenied($object); diff --git a/src/applications/policy/storage/PhabricatorPolicy.php b/src/applications/policy/storage/PhabricatorPolicy.php --- a/src/applications/policy/storage/PhabricatorPolicy.php +++ b/src/applications/policy/storage/PhabricatorPolicy.php @@ -422,6 +422,54 @@ return ($this_strength > $other_strength); } + public static function getSpecialRules( + PhabricatorPolicyInterface $object, + PhabricatorUser $viewer, + $capability, + $active_only) { + + if ($object instanceof PhabricatorPolicyCodexInterface) { + $codex = PhabricatorPolicyCodex::newFromObject($object, $viewer); + $rules = $codex->getPolicySpecialRuleDescriptions(); + + $exceptions = array(); + foreach ($rules as $rule) { + $is_active = $rule->getIsActive(); + if ($is_active) { + $rule_capabilities = $rule->getCapabilities(); + if ($rule_capabilities) { + if (!in_array($capability, $rule_capabilities)) { + $is_active = false; + } + } + } + + if (!$is_active && $active_only) { + continue; + } + + $description = $rule->getDescription(); + + if (!$is_active) { + $description = phutil_tag( + 'span', + array( + 'class' => 'phui-policy-section-view-inactive-rule', + ), + $description); + } + + $exceptions[] = $description; + } + } else if (method_exists($object, 'describeAutomaticCapability')) { + $exceptions = (array)$object->describeAutomaticCapability($capability); + $exceptions = array_filter($exceptions); + } else { + $exceptions = array(); + } + + return $exceptions; + } /* -( PhabricatorPolicyInterface )----------------------------------------- */ @@ -444,10 +492,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorDestructibleInterface )----------------------------------- */ diff --git a/src/applications/project/storage/PhabricatorProjectColumnPosition.php b/src/applications/project/storage/PhabricatorProjectColumnPosition.php --- a/src/applications/project/storage/PhabricatorProjectColumnPosition.php +++ b/src/applications/project/storage/PhabricatorProjectColumnPosition.php @@ -87,8 +87,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/releeph/storage/ReleephProject.php b/src/applications/releeph/storage/ReleephProject.php --- a/src/applications/releeph/storage/ReleephProject.php +++ b/src/applications/releeph/storage/ReleephProject.php @@ -153,9 +153,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - - } diff --git a/src/applications/repository/storage/PhabricatorRepository.php b/src/applications/repository/storage/PhabricatorRepository.php --- a/src/applications/repository/storage/PhabricatorRepository.php +++ b/src/applications/repository/storage/PhabricatorRepository.php @@ -2330,11 +2330,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - - /* -( PhabricatorMarkupInterface )----------------------------------------- */ diff --git a/src/applications/repository/storage/PhabricatorRepositoryCommitHint.php b/src/applications/repository/storage/PhabricatorRepositoryCommitHint.php --- a/src/applications/repository/storage/PhabricatorRepositoryCommitHint.php +++ b/src/applications/repository/storage/PhabricatorRepositoryCommitHint.php @@ -130,8 +130,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/repository/storage/PhabricatorRepositoryGitLFSRef.php b/src/applications/repository/storage/PhabricatorRepositoryGitLFSRef.php --- a/src/applications/repository/storage/PhabricatorRepositoryGitLFSRef.php +++ b/src/applications/repository/storage/PhabricatorRepositoryGitLFSRef.php @@ -45,10 +45,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorDestructibleInterface )----------------------------------- */ diff --git a/src/applications/repository/storage/PhabricatorRepositoryOldRef.php b/src/applications/repository/storage/PhabricatorRepositoryOldRef.php --- a/src/applications/repository/storage/PhabricatorRepositoryOldRef.php +++ b/src/applications/repository/storage/PhabricatorRepositoryOldRef.php @@ -45,8 +45,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/repository/storage/PhabricatorRepositoryURI.php b/src/applications/repository/storage/PhabricatorRepositoryURI.php --- a/src/applications/repository/storage/PhabricatorRepositoryURI.php +++ b/src/applications/repository/storage/PhabricatorRepositoryURI.php @@ -642,10 +642,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - /* -( PhabricatorExtendedPolicyInterface )--------------------------------- */ diff --git a/src/applications/search/storage/PhabricatorProfilePanelConfiguration.php b/src/applications/search/storage/PhabricatorProfilePanelConfiguration.php --- a/src/applications/search/storage/PhabricatorProfilePanelConfiguration.php +++ b/src/applications/search/storage/PhabricatorProfilePanelConfiguration.php @@ -162,11 +162,6 @@ } - public function describeAutomaticCapability($capability) { - return null; - } - - /* -( PhabricatorExtendedPolicyInterface )--------------------------------- */ diff --git a/src/applications/search/storage/PhabricatorSavedQuery.php b/src/applications/search/storage/PhabricatorSavedQuery.php --- a/src/applications/search/storage/PhabricatorSavedQuery.php +++ b/src/applications/search/storage/PhabricatorSavedQuery.php @@ -81,8 +81,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - } diff --git a/src/applications/settings/storage/PhabricatorUserPreferences.php b/src/applications/settings/storage/PhabricatorUserPreferences.php --- a/src/applications/settings/storage/PhabricatorUserPreferences.php +++ b/src/applications/settings/storage/PhabricatorUserPreferences.php @@ -222,11 +222,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - - /* -( PhabricatorDestructibleInterface )----------------------------------- */ diff --git a/src/applications/spaces/storage/PhabricatorSpacesNamespace.php b/src/applications/spaces/storage/PhabricatorSpacesNamespace.php --- a/src/applications/spaces/storage/PhabricatorSpacesNamespace.php +++ b/src/applications/spaces/storage/PhabricatorSpacesNamespace.php @@ -84,11 +84,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - - /* -( PhabricatorApplicationTransactionInterface )------------------------- */ diff --git a/src/applications/tokens/storage/PhabricatorToken.php b/src/applications/tokens/storage/PhabricatorToken.php --- a/src/applications/tokens/storage/PhabricatorToken.php +++ b/src/applications/tokens/storage/PhabricatorToken.php @@ -28,10 +28,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - public function renderIcon() { // TODO: Maybe move to a View class? diff --git a/src/applications/transactions/editengine/PhabricatorEditEngine.php b/src/applications/transactions/editengine/PhabricatorEditEngine.php --- a/src/applications/transactions/editengine/PhabricatorEditEngine.php +++ b/src/applications/transactions/editengine/PhabricatorEditEngine.php @@ -2275,7 +2275,4 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } } diff --git a/src/applications/transactions/storage/PhabricatorEditEngineConfiguration.php b/src/applications/transactions/storage/PhabricatorEditEngineConfiguration.php --- a/src/applications/transactions/storage/PhabricatorEditEngineConfiguration.php +++ b/src/applications/transactions/storage/PhabricatorEditEngineConfiguration.php @@ -302,11 +302,6 @@ return false; } - public function describeAutomaticCapability($capability) { - return null; - } - - /* -( PhabricatorApplicationTransactionInterface )------------------------- */ diff --git a/src/infrastructure/daemon/workers/storage/PhabricatorWorkerTrigger.php b/src/infrastructure/daemon/workers/storage/PhabricatorWorkerTrigger.php --- a/src/infrastructure/daemon/workers/storage/PhabricatorWorkerTrigger.php +++ b/src/infrastructure/daemon/workers/storage/PhabricatorWorkerTrigger.php @@ -190,8 +190,4 @@ return true; } - public function describeAutomaticCapability($capability) { - return null; - } - }