Index: src/applications/auth/query/PhabricatorAuthProviderConfigQuery.php =================================================================== --- src/applications/auth/query/PhabricatorAuthProviderConfigQuery.php +++ src/applications/auth/query/PhabricatorAuthProviderConfigQuery.php @@ -96,4 +96,8 @@ return $this->formatWhereClause($where); } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationAuth'; + } + } Index: src/applications/auth/query/PhabricatorExternalAccountQuery.php =================================================================== --- src/applications/auth/query/PhabricatorExternalAccountQuery.php +++ src/applications/auth/query/PhabricatorExternalAccountQuery.php @@ -163,4 +163,8 @@ return $this->formatWhereClause($where); } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationPeople'; + } + } Index: src/applications/chatlog/PhabricatorChatLogChannelQuery.php =================================================================== --- src/applications/chatlog/PhabricatorChatLogChannelQuery.php +++ src/applications/chatlog/PhabricatorChatLogChannelQuery.php @@ -55,4 +55,9 @@ return $this->formatWhereClause($where); } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationChatlog'; + } + } Index: src/applications/chatlog/PhabricatorChatLogQuery.php =================================================================== --- src/applications/chatlog/PhabricatorChatLogQuery.php +++ src/applications/chatlog/PhabricatorChatLogQuery.php @@ -54,4 +54,9 @@ return $this->formatWhereClause($where); } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationChatlog'; + } + } Index: src/applications/conduit/query/PhabricatorConduitLogQuery.php =================================================================== --- src/applications/conduit/query/PhabricatorConduitLogQuery.php +++ src/applications/conduit/query/PhabricatorConduitLogQuery.php @@ -40,4 +40,8 @@ return $this->formatWhereClause($where); } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationConduit'; + } + } Index: src/applications/conduit/query/PhabricatorConduitMethodQuery.php =================================================================== --- src/applications/conduit/query/PhabricatorConduitMethodQuery.php +++ src/applications/conduit/query/PhabricatorConduitMethodQuery.php @@ -121,4 +121,8 @@ return $methods; } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationConduit'; + } + } Index: src/applications/config/phid/PhabricatorConfigPHIDTypeConfig.php =================================================================== --- src/applications/config/phid/PhabricatorConfigPHIDTypeConfig.php +++ src/applications/config/phid/PhabricatorConfigPHIDTypeConfig.php @@ -16,15 +16,12 @@ return new PhabricatorConfigEntry(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhabricatorConfigEntryQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/config/query/PhabricatorConfigEntryQuery.php =================================================================== --- src/applications/config/query/PhabricatorConfigEntryQuery.php +++ src/applications/config/query/PhabricatorConfigEntryQuery.php @@ -53,4 +53,8 @@ return $this->formatWhereClause($where); } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationConfig'; + } + } Index: src/applications/conpherence/phid/PhabricatorConpherencePHIDTypeThread.php =================================================================== --- src/applications/conpherence/phid/PhabricatorConpherencePHIDTypeThread.php +++ src/applications/conpherence/phid/PhabricatorConpherencePHIDTypeThread.php @@ -19,15 +19,12 @@ return new ConpherenceThread(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new ConpherenceThreadQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/conpherence/query/ConpherenceThreadQuery.php =================================================================== --- src/applications/conpherence/query/ConpherenceThreadQuery.php +++ src/applications/conpherence/query/ConpherenceThreadQuery.php @@ -282,4 +282,8 @@ return $this; } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationConpherence'; + } + } Index: src/applications/countdown/phid/PhabricatorCountdownPHIDTypeCountdown.php =================================================================== --- src/applications/countdown/phid/PhabricatorCountdownPHIDTypeCountdown.php +++ src/applications/countdown/phid/PhabricatorCountdownPHIDTypeCountdown.php @@ -16,15 +16,12 @@ return new PhabricatorCountdown(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhabricatorCountdownQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/countdown/query/PhabricatorCountdownQuery.php =================================================================== --- src/applications/countdown/query/PhabricatorCountdownQuery.php +++ src/applications/countdown/query/PhabricatorCountdownQuery.php @@ -85,4 +85,8 @@ return $this->formatWhereClause($where); } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationCountdown'; + } + } Index: src/applications/daemon/query/PhabricatorDaemonLogQuery.php =================================================================== --- src/applications/daemon/query/PhabricatorDaemonLogQuery.php +++ src/applications/daemon/query/PhabricatorDaemonLogQuery.php @@ -142,4 +142,8 @@ } } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationDaemons'; + } + } Index: src/applications/differential/phid/DifferentialPHIDTypeRevision.php =================================================================== --- src/applications/differential/phid/DifferentialPHIDTypeRevision.php +++ src/applications/differential/phid/DifferentialPHIDTypeRevision.php @@ -16,15 +16,12 @@ return new DifferentialRevision(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new DifferentialRevisionQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/differential/query/DifferentialDiffQuery.php =================================================================== --- src/applications/differential/query/DifferentialDiffQuery.php +++ src/applications/differential/query/DifferentialDiffQuery.php @@ -137,4 +137,8 @@ return $this->formatWhereClause($where); } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationDifferential'; + } + } Index: src/applications/differential/query/DifferentialRevisionQuery.php =================================================================== --- src/applications/differential/query/DifferentialRevisionQuery.php +++ src/applications/differential/query/DifferentialRevisionQuery.php @@ -1189,7 +1189,8 @@ ) + array_fuse($project_authority); } - - + public function getQueryApplicationClass() { + return 'PhabricatorApplicationDifferential'; + } } Index: src/applications/diffusion/query/DiffusionCommitQuery.php =================================================================== --- src/applications/diffusion/query/DiffusionCommitQuery.php +++ src/applications/diffusion/query/DiffusionCommitQuery.php @@ -250,4 +250,8 @@ } } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationDiffusion'; + } + } Index: src/applications/diviner/phid/DivinerPHIDTypeAtom.php =================================================================== --- src/applications/diviner/phid/DivinerPHIDTypeAtom.php +++ src/applications/diviner/phid/DivinerPHIDTypeAtom.php @@ -16,15 +16,12 @@ return new DivinerLiveSymbol(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new DivinerAtomQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/diviner/phid/DivinerPHIDTypeBook.php =================================================================== --- src/applications/diviner/phid/DivinerPHIDTypeBook.php +++ src/applications/diviner/phid/DivinerPHIDTypeBook.php @@ -16,15 +16,12 @@ return new DivinerLiveBook(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new DivinerBookQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/diviner/query/DivinerAtomQuery.php =================================================================== --- src/applications/diviner/query/DivinerAtomQuery.php +++ src/applications/diviner/query/DivinerAtomQuery.php @@ -405,4 +405,8 @@ } } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationDiviner'; + } + } Index: src/applications/diviner/query/DivinerBookQuery.php =================================================================== --- src/applications/diviner/query/DivinerBookQuery.php +++ src/applications/diviner/query/DivinerBookQuery.php @@ -66,4 +66,9 @@ return $this->formatWhereClause($where); } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationDiviner'; + } + } Index: src/applications/doorkeeper/query/DoorkeeperExternalObjectQuery.php =================================================================== --- src/applications/doorkeeper/query/DoorkeeperExternalObjectQuery.php +++ src/applications/doorkeeper/query/DoorkeeperExternalObjectQuery.php @@ -52,4 +52,8 @@ return $this->formatWhereClause($where); } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationDoorkeeper'; + } + } Index: src/applications/feed/query/PhabricatorFeedQuery.php =================================================================== --- src/applications/feed/query/PhabricatorFeedQuery.php +++ src/applications/feed/query/PhabricatorFeedQuery.php @@ -104,4 +104,9 @@ return $item['chronologicalKey']; } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationFeed'; + } + } Index: src/applications/files/phid/PhabricatorFilePHIDTypeFile.php =================================================================== --- src/applications/files/phid/PhabricatorFilePHIDTypeFile.php +++ src/applications/files/phid/PhabricatorFilePHIDTypeFile.php @@ -16,15 +16,12 @@ return new PhabricatorFile(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhabricatorFileQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/files/query/PhabricatorFileQuery.php =================================================================== --- src/applications/files/query/PhabricatorFileQuery.php +++ src/applications/files/query/PhabricatorFileQuery.php @@ -235,4 +235,9 @@ return 'f.id'; } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationFiles'; + } + } Index: src/applications/flag/query/PhabricatorFlagQuery.php =================================================================== --- src/applications/flag/query/PhabricatorFlagQuery.php +++ src/applications/flag/query/PhabricatorFlagQuery.php @@ -160,4 +160,9 @@ return $this->formatWhereClause($where); } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationFlags'; + } + } Index: src/applications/herald/phid/HeraldPHIDTypeRule.php =================================================================== --- src/applications/herald/phid/HeraldPHIDTypeRule.php +++ src/applications/herald/phid/HeraldPHIDTypeRule.php @@ -16,15 +16,12 @@ return new HeraldRule(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new HeraldRuleQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/herald/query/HeraldRuleQuery.php =================================================================== --- src/applications/herald/query/HeraldRuleQuery.php +++ src/applications/herald/query/HeraldRuleQuery.php @@ -229,4 +229,9 @@ } } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationHerald'; + } + } Index: src/applications/herald/query/HeraldTranscriptQuery.php =================================================================== --- src/applications/herald/query/HeraldTranscriptQuery.php +++ src/applications/herald/query/HeraldTranscriptQuery.php @@ -94,5 +94,8 @@ return $this->formatWhereClause($where); } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationHerald'; + } } Index: src/applications/legalpad/phid/PhabricatorLegalpadPHIDTypeDocument.php =================================================================== --- src/applications/legalpad/phid/PhabricatorLegalpadPHIDTypeDocument.php +++ src/applications/legalpad/phid/PhabricatorLegalpadPHIDTypeDocument.php @@ -19,16 +19,13 @@ return new LegalpadDocument(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new LegalpadDocumentQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) ->withPHIDs($phids) - ->needDocumentBodies(true) - ->execute(); + ->needDocumentBodies(true); } public function loadHandles( Index: src/applications/legalpad/query/LegalpadDocumentQuery.php =================================================================== --- src/applications/legalpad/query/LegalpadDocumentQuery.php +++ src/applications/legalpad/query/LegalpadDocumentQuery.php @@ -181,5 +181,8 @@ return $documents; } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationLegalpad'; + } } Index: src/applications/macro/phid/PhabricatorMacroPHIDTypeMacro.php =================================================================== --- src/applications/macro/phid/PhabricatorMacroPHIDTypeMacro.php +++ src/applications/macro/phid/PhabricatorMacroPHIDTypeMacro.php @@ -16,15 +16,12 @@ return new PhabricatorFileImageMacro(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhabricatorMacroQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/macro/query/PhabricatorMacroQuery.php =================================================================== --- src/applications/macro/query/PhabricatorMacroQuery.php +++ src/applications/macro/query/PhabricatorMacroQuery.php @@ -216,4 +216,8 @@ return 'm.id'; } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationMacro'; + } + } Index: src/applications/mailinglists/phid/PhabricatorMailingListPHIDTypeList.php =================================================================== --- src/applications/mailinglists/phid/PhabricatorMailingListPHIDTypeList.php +++ src/applications/mailinglists/phid/PhabricatorMailingListPHIDTypeList.php @@ -16,15 +16,12 @@ return new PhabricatorMetaMTAMailingList(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhabricatorMailingListQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/mailinglists/query/PhabricatorMailingListQuery.php =================================================================== --- src/applications/mailinglists/query/PhabricatorMailingListQuery.php +++ src/applications/mailinglists/query/PhabricatorMailingListQuery.php @@ -53,4 +53,8 @@ return $this->formatWhereClause($where); } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationMailingLists'; + } + } Index: src/applications/maniphest/phid/ManiphestPHIDTypeTask.php =================================================================== --- src/applications/maniphest/phid/ManiphestPHIDTypeTask.php +++ src/applications/maniphest/phid/ManiphestPHIDTypeTask.php @@ -16,15 +16,12 @@ return new ManiphestTask(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new ManiphestTaskQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/maniphest/query/ManiphestTaskQuery.php =================================================================== --- src/applications/maniphest/query/ManiphestTaskQuery.php +++ src/applications/maniphest/query/ManiphestTaskQuery.php @@ -886,4 +886,9 @@ return 'task.phid'; } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationManiphest'; + } + } Index: src/applications/meta/phid/PhabricatorApplicationPHIDTypeApplication.php =================================================================== --- src/applications/meta/phid/PhabricatorApplicationPHIDTypeApplication.php +++ src/applications/meta/phid/PhabricatorApplicationPHIDTypeApplication.php @@ -17,15 +17,12 @@ return null; } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhabricatorApplicationQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/meta/query/PhabricatorApplicationQuery.php =================================================================== --- src/applications/meta/query/PhabricatorApplicationQuery.php +++ src/applications/meta/query/PhabricatorApplicationQuery.php @@ -132,4 +132,13 @@ return $apps; } + + public function getQueryApplicationClass() { + // NOTE: Although this belongs to the "Applications" application, trying + // to filter its results just leaves us recursing indefinitely. Users + // always have access to applications regardless of other policy settings + // anyway. + return null; + } + } Index: src/applications/notification/PhabricatorNotificationQuery.php =================================================================== --- src/applications/notification/PhabricatorNotificationQuery.php +++ src/applications/notification/PhabricatorNotificationQuery.php @@ -111,4 +111,10 @@ return $item->getChronologicalKey(); } + + public function getQueryApplicationClass() { + // TODO: No actual "Notification" app yet, but there probably should be. + return null; + } + } Index: src/applications/owners/phid/PhabricatorOwnersPHIDTypePackage.php =================================================================== --- src/applications/owners/phid/PhabricatorOwnersPHIDTypePackage.php +++ src/applications/owners/phid/PhabricatorOwnersPHIDTypePackage.php @@ -16,15 +16,12 @@ return new PhabricatorOwnersPackage(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhabricatorOwnersPackageQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/owners/query/PhabricatorOwnersPackageQuery.php =================================================================== --- src/applications/owners/query/PhabricatorOwnersPackageQuery.php +++ src/applications/owners/query/PhabricatorOwnersPackageQuery.php @@ -79,4 +79,9 @@ return $this->formatWhereClause($where); } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationOwners'; + } + } Index: src/applications/paste/phid/PhabricatorPastePHIDTypePaste.php =================================================================== --- src/applications/paste/phid/PhabricatorPastePHIDTypePaste.php +++ src/applications/paste/phid/PhabricatorPastePHIDTypePaste.php @@ -16,15 +16,12 @@ return new PhabricatorPaste(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhabricatorPasteQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/paste/query/PhabricatorPasteQuery.php =================================================================== --- src/applications/paste/query/PhabricatorPasteQuery.php +++ src/applications/paste/query/PhabricatorPasteQuery.php @@ -249,4 +249,9 @@ } } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationPaste'; + } + } Index: src/applications/people/phid/PhabricatorPeoplePHIDTypeExternal.php =================================================================== --- src/applications/people/phid/PhabricatorPeoplePHIDTypeExternal.php +++ src/applications/people/phid/PhabricatorPeoplePHIDTypeExternal.php @@ -16,15 +16,12 @@ return new PhabricatorExternalAccount(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhabricatorExternalAccountQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/people/phid/PhabricatorPeoplePHIDTypeUser.php =================================================================== --- src/applications/people/phid/PhabricatorPeoplePHIDTypeUser.php +++ src/applications/people/phid/PhabricatorPeoplePHIDTypeUser.php @@ -16,17 +16,14 @@ return new PhabricatorUser(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhabricatorPeopleQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) ->withPHIDs($phids) ->needProfileImage(true) - ->needStatus(true) - ->execute(); + ->needStatus(true); } public function loadHandles( Index: src/applications/people/query/PhabricatorPeopleQuery.php =================================================================== --- src/applications/people/query/PhabricatorPeopleQuery.php +++ src/applications/people/query/PhabricatorPeopleQuery.php @@ -282,4 +282,8 @@ return 'user.phid'; } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationPeople'; + } + } Index: src/applications/phame/phid/PhabricatorPhamePHIDTypeBlog.php =================================================================== --- src/applications/phame/phid/PhabricatorPhamePHIDTypeBlog.php +++ src/applications/phame/phid/PhabricatorPhamePHIDTypeBlog.php @@ -19,15 +19,12 @@ return new PhameBlog(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhameBlogQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/phame/phid/PhabricatorPhamePHIDTypePost.php =================================================================== --- src/applications/phame/phid/PhabricatorPhamePHIDTypePost.php +++ src/applications/phame/phid/PhabricatorPhamePHIDTypePost.php @@ -19,15 +19,12 @@ return new PhamePost(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhamePostQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/phame/query/PhameBlogQuery.php =================================================================== --- src/applications/phame/query/PhameBlogQuery.php +++ src/applications/phame/query/PhameBlogQuery.php @@ -75,4 +75,9 @@ return $this->formatWhereClause($where); } + public function getQueryApplicationClass() { + // TODO: Can we set this without breaking public blogs? + return null; + } + } Index: src/applications/phame/query/PhamePostQuery.php =================================================================== --- src/applications/phame/query/PhamePostQuery.php +++ src/applications/phame/query/PhamePostQuery.php @@ -141,4 +141,9 @@ return $this->formatWhereClause($where); } + public function getQueryApplicationClass() { + // TODO: Does setting this break public blogs? + return null; + } + } Index: src/applications/phid/query/PhabricatorHandleQuery.php =================================================================== --- src/applications/phid/query/PhabricatorHandleQuery.php +++ src/applications/phid/query/PhabricatorHandleQuery.php @@ -67,4 +67,8 @@ return $results; } + public function getQueryApplicationClass() { + return null; + } + } Index: src/applications/phid/query/PhabricatorObjectQuery.php =================================================================== --- src/applications/phid/query/PhabricatorObjectQuery.php +++ src/applications/phid/query/PhabricatorObjectQuery.php @@ -152,4 +152,8 @@ return true; } + public function getQueryApplicationClass() { + return null; + } + } Index: src/applications/phid/type/PhabricatorPHIDType.php =================================================================== --- src/applications/phid/type/PhabricatorPHIDType.php +++ src/applications/phid/type/PhabricatorPHIDType.php @@ -9,12 +9,55 @@ return null; } - abstract public function loadObjects( + /** + * Build a @{class:PhabricatorPolicyAwareQuery} to load objects of this type + * by PHID. + * + * If you can not build a single query which satisfies this requirement, you + * can provide a dummy implementation for this method and overload + * @{method:loadObjects} instead. + * + * @param PhabricatorObjectQuery Query being executed. + * @param list PHIDs to load. + * @return PhabricatorPolicyAwareQuery Query object which loads the + * specified PHIDs when executed. + */ + abstract protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids); /** + * Load objects of this type, by PHID. For most PHID types, it is only + * necessary to implement @{method:buildQueryForObjects} to get object + * loading to work. + * + * @param PhabricatorObjectQuery Query being executed. + * @param list PHIDs to load. + * @return list Corresponding objects. + */ + public function loadObjects( + PhabricatorObjectQuery $query, + array $phids) { + + $object_query = $this->buildQueryForObjects($query, $phids) + ->setViewer($query->getViewer()) + ->setParentQuery($query); + + // If the user doesn't have permission to use the application at all, + // just mark all the PHIDs as filtered. This primarily makes these + // objects show up as "Restricted" instead of "Unknown" when loaded as + // handles, which is technically true. + if (!$object_query->canViewerUseQueryApplication()) { + $object_query->addPolicyFilteredPHIDs(array_fuse($phids)); + return array(); + } + + return $object_query->execute(); + } + + + /** * Populate provided handles with application-specific data, like titles and * URIs. * @@ -38,7 +81,7 @@ * @param PhabricatorHandleQuery Issuing query object. * @param list Handles to populate with data. * @param list Objects for these PHIDs loaded by - * @{method:loadObjects()}. + * @{method:buildQueryForObjects()}. * @return void */ abstract public function loadHandles( Index: src/applications/phlux/phid/PhluxPHIDTypeVariable.php =================================================================== --- src/applications/phlux/phid/PhluxPHIDTypeVariable.php +++ src/applications/phlux/phid/PhluxPHIDTypeVariable.php @@ -16,15 +16,12 @@ return new PhluxVariable(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhluxVariableQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/phlux/query/PhluxVariableQuery.php =================================================================== --- src/applications/phlux/query/PhluxVariableQuery.php +++ src/applications/phlux/query/PhluxVariableQuery.php @@ -65,4 +65,8 @@ return true; } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationPhlux'; + } + } Index: src/applications/pholio/phid/PholioPHIDTypeImage.php =================================================================== --- src/applications/pholio/phid/PholioPHIDTypeImage.php +++ src/applications/pholio/phid/PholioPHIDTypeImage.php @@ -16,15 +16,12 @@ return new PholioImage(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PholioImageQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/pholio/phid/PholioPHIDTypeMock.php =================================================================== --- src/applications/pholio/phid/PholioPHIDTypeMock.php +++ src/applications/pholio/phid/PholioPHIDTypeMock.php @@ -16,15 +16,12 @@ return new PholioMock(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PholioMockQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/pholio/query/PholioImageQuery.php =================================================================== --- src/applications/pholio/query/PholioImageQuery.php +++ src/applications/pholio/query/PholioImageQuery.php @@ -161,4 +161,8 @@ return $images; } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationPholio'; + } + } Index: src/applications/pholio/query/PholioMockQuery.php =================================================================== --- src/applications/pholio/query/PholioMockQuery.php +++ src/applications/pholio/query/PholioMockQuery.php @@ -161,4 +161,8 @@ } } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationPholio'; + } + } Index: src/applications/phortune/query/PhortuneAccountQuery.php =================================================================== --- src/applications/phortune/query/PhortuneAccountQuery.php +++ src/applications/phortune/query/PhortuneAccountQuery.php @@ -95,4 +95,9 @@ return implode(' ', $joins); } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationPhortune'; + } + } Index: src/applications/phortune/query/PhortunePaymentMethodQuery.php =================================================================== --- src/applications/phortune/query/PhortunePaymentMethodQuery.php +++ src/applications/phortune/query/PhortunePaymentMethodQuery.php @@ -110,4 +110,9 @@ return $this->formatWhereClause($where); } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationPhortune'; + } + } Index: src/applications/phortune/query/PhortuneProductQuery.php =================================================================== --- src/applications/phortune/query/PhortuneProductQuery.php +++ src/applications/phortune/query/PhortuneProductQuery.php @@ -53,4 +53,8 @@ return $this->formatWhereClause($where); } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationPhortune'; + } + } Index: src/applications/phrequent/query/PhrequentUserTimeQuery.php =================================================================== --- src/applications/phrequent/query/PhrequentUserTimeQuery.php +++ src/applications/phrequent/query/PhrequentUserTimeQuery.php @@ -302,4 +302,9 @@ return $sum_ended['N'] + $sum_not_ended['N']; } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationPhrequent'; + } + } Index: src/applications/phriction/phid/PhrictionPHIDTypeDocument.php =================================================================== --- src/applications/phriction/phid/PhrictionPHIDTypeDocument.php +++ src/applications/phriction/phid/PhrictionPHIDTypeDocument.php @@ -16,15 +16,12 @@ return new PhrictionDocument(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhrictionDocumentQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/phriction/query/PhrictionDocumentQuery.php =================================================================== --- src/applications/phriction/query/PhrictionDocumentQuery.php +++ src/applications/phriction/query/PhrictionDocumentQuery.php @@ -185,4 +185,9 @@ } } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationPhriction'; + } + } Index: src/applications/policy/__tests__/PhabricatorPolicyAwareTestQuery.php =================================================================== --- src/applications/policy/__tests__/PhabricatorPolicyAwareTestQuery.php +++ src/applications/policy/__tests__/PhabricatorPolicyAwareTestQuery.php @@ -33,4 +33,8 @@ $this->offset += count($page); } + public function getQueryApplicationClass() { + return null; + } + } Index: src/applications/policy/__tests__/PhabricatorPolicyTestCase.php =================================================================== --- src/applications/policy/__tests__/PhabricatorPolicyTestCase.php +++ src/applications/policy/__tests__/PhabricatorPolicyTestCase.php @@ -210,6 +210,22 @@ count($query->execute())); } + public function testAllQueriesBelongToActualApplications() { + $queries = id(new PhutilSymbolLoader()) + ->setAncestorClass('PhabricatorPolicyAwareQuery') + ->loadObjects(); + + foreach ($queries as $qclass => $query) { + $class = $query->getQueryApplicationClass(); + if (!$class) { + continue; + } + $this->assertEqual( + true, + class_exists($class), + "Application class '{$class}' for query '{$qclass}'"); + } + } /** * Test an object for visibility across multiple user specifications. Index: src/applications/policy/phid/PhabricatorPolicyPHIDTypePolicy.php =================================================================== --- src/applications/policy/phid/PhabricatorPolicyPHIDTypePolicy.php +++ src/applications/policy/phid/PhabricatorPolicyPHIDTypePolicy.php @@ -17,15 +17,12 @@ return new PhabricatorPolicy(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhabricatorPolicyQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/policy/query/PhabricatorPolicyQuery.php =================================================================== --- src/applications/policy/query/PhabricatorPolicyQuery.php +++ src/applications/policy/query/PhabricatorPolicyQuery.php @@ -223,5 +223,10 @@ return true; } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationPolicy'; + } + } Index: src/applications/ponder/phid/PonderPHIDTypeAnswer.php =================================================================== --- src/applications/ponder/phid/PonderPHIDTypeAnswer.php +++ src/applications/ponder/phid/PonderPHIDTypeAnswer.php @@ -16,15 +16,12 @@ return new PonderAnswer(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PonderAnswerQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/ponder/phid/PonderPHIDTypeQuestion.php =================================================================== --- src/applications/ponder/phid/PonderPHIDTypeQuestion.php +++ src/applications/ponder/phid/PonderPHIDTypeQuestion.php @@ -16,15 +16,12 @@ return new PonderQuestion(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PonderQuestionQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/ponder/query/PonderAnswerQuery.php =================================================================== --- src/applications/ponder/query/PonderAnswerQuery.php +++ src/applications/ponder/query/PonderAnswerQuery.php @@ -123,4 +123,9 @@ return true; } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationPonder'; + } + } Index: src/applications/ponder/query/PonderQuestionQuery.php =================================================================== --- src/applications/ponder/query/PonderQuestionQuery.php +++ src/applications/ponder/query/PonderQuestionQuery.php @@ -194,4 +194,9 @@ return implode(' ', $joins); } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationPonder'; + } + } Index: src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php =================================================================== --- src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php +++ src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php @@ -16,15 +16,12 @@ return new PhabricatorProject(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhabricatorProjectQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/project/query/PhabricatorProjectQuery.php =================================================================== --- src/applications/project/query/PhabricatorProjectQuery.php +++ src/applications/project/query/PhabricatorProjectQuery.php @@ -260,4 +260,9 @@ return implode(' ', $joins); } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationProject'; + } + } Index: src/applications/releeph/phid/ReleephPHIDTypeBranch.php =================================================================== --- src/applications/releeph/phid/ReleephPHIDTypeBranch.php +++ src/applications/releeph/phid/ReleephPHIDTypeBranch.php @@ -16,15 +16,12 @@ return new ReleephBranch(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new ReleephBranchQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/releeph/phid/ReleephPHIDTypeProject.php =================================================================== --- src/applications/releeph/phid/ReleephPHIDTypeProject.php +++ src/applications/releeph/phid/ReleephPHIDTypeProject.php @@ -16,15 +16,12 @@ return new ReleephProject(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new ReleephProjectQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/releeph/phid/ReleephPHIDTypeRequest.php =================================================================== --- src/applications/releeph/phid/ReleephPHIDTypeRequest.php +++ src/applications/releeph/phid/ReleephPHIDTypeRequest.php @@ -16,15 +16,12 @@ return new ReleephRequest(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new ReleephRequestQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/releeph/query/ReleephBranchQuery.php =================================================================== --- src/applications/releeph/query/ReleephBranchQuery.php +++ src/applications/releeph/query/ReleephBranchQuery.php @@ -129,4 +129,9 @@ return $this->formatWhereClause($where); } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationReleeph'; + } + } Index: src/applications/releeph/query/ReleephProjectQuery.php =================================================================== --- src/applications/releeph/query/ReleephProjectQuery.php +++ src/applications/releeph/query/ReleephProjectQuery.php @@ -127,4 +127,8 @@ } } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationReleeph'; + } + } Index: src/applications/releeph/query/ReleephRequestQuery.php =================================================================== --- src/applications/releeph/query/ReleephRequestQuery.php +++ src/applications/releeph/query/ReleephRequestQuery.php @@ -232,4 +232,9 @@ } } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationReleeph'; + } + } Index: src/applications/repository/phid/PhabricatorRepositoryPHIDTypeArcanistProject.php =================================================================== --- src/applications/repository/phid/PhabricatorRepositoryPHIDTypeArcanistProject.php +++ src/applications/repository/phid/PhabricatorRepositoryPHIDTypeArcanistProject.php @@ -20,15 +20,12 @@ return new PhabricatorRepositoryArcanistProject(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhabricatorRepositoryArcanistProjectQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/repository/phid/PhabricatorRepositoryPHIDTypeCommit.php =================================================================== --- src/applications/repository/phid/PhabricatorRepositoryPHIDTypeCommit.php +++ src/applications/repository/phid/PhabricatorRepositoryPHIDTypeCommit.php @@ -16,15 +16,12 @@ return new PhabricatorRepositoryCommit(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new DiffusionCommitQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/repository/phid/PhabricatorRepositoryPHIDTypeRepository.php =================================================================== --- src/applications/repository/phid/PhabricatorRepositoryPHIDTypeRepository.php +++ src/applications/repository/phid/PhabricatorRepositoryPHIDTypeRepository.php @@ -17,15 +17,12 @@ return new PhabricatorRepository(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhabricatorRepositoryQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/repository/query/PhabricatorRepositoryArcanistProjectQuery.php =================================================================== --- src/applications/repository/query/PhabricatorRepositoryArcanistProjectQuery.php +++ src/applications/repository/query/PhabricatorRepositoryArcanistProjectQuery.php @@ -81,4 +81,10 @@ return $this->formatWhereClause($where); } + + public function getQueryApplicationClass() { + // TODO: Diffusion? Differential? + return null; + } + } Index: src/applications/repository/query/PhabricatorRepositoryQuery.php =================================================================== --- src/applications/repository/query/PhabricatorRepositoryQuery.php +++ src/applications/repository/query/PhabricatorRepositoryQuery.php @@ -317,4 +317,9 @@ return $this->formatWhereClause($where); } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationDiffusion'; + } + } Index: src/applications/search/query/PhabricatorNamedQueryQuery.php =================================================================== --- src/applications/search/query/PhabricatorNamedQueryQuery.php +++ src/applications/search/query/PhabricatorNamedQueryQuery.php @@ -81,4 +81,10 @@ return $this->formatWhereClause($where); } + + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationSearch'; + } + } Index: src/applications/search/query/PhabricatorSavedQueryQuery.php =================================================================== --- src/applications/search/query/PhabricatorSavedQueryQuery.php +++ src/applications/search/query/PhabricatorSavedQueryQuery.php @@ -65,4 +65,10 @@ return $this->formatWhereClause($where); } + + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationSearch'; + } + } Index: src/applications/slowvote/phid/PhabricatorSlowvotePHIDTypePoll.php =================================================================== --- src/applications/slowvote/phid/PhabricatorSlowvotePHIDTypePoll.php +++ src/applications/slowvote/phid/PhabricatorSlowvotePHIDTypePoll.php @@ -16,15 +16,12 @@ return new PhabricatorSlowvotePoll(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhabricatorSlowvoteQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/slowvote/query/PhabricatorSlowvoteQuery.php =================================================================== --- src/applications/slowvote/query/PhabricatorSlowvoteQuery.php +++ src/applications/slowvote/query/PhabricatorSlowvoteQuery.php @@ -168,4 +168,9 @@ return 'p.id'; } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationSlowvote'; + } + } Index: src/applications/tokens/phid/PhabricatorTokenPHIDTypeToken.php =================================================================== --- src/applications/tokens/phid/PhabricatorTokenPHIDTypeToken.php +++ src/applications/tokens/phid/PhabricatorTokenPHIDTypeToken.php @@ -16,15 +16,12 @@ return new PhabricatorToken(); } - public function loadObjects( + protected function buildQueryForObjects( PhabricatorObjectQuery $query, array $phids) { return id(new PhabricatorTokenQuery()) - ->setViewer($query->getViewer()) - ->setParentQuery($query) - ->withPHIDs($phids) - ->execute(); + ->withPHIDs($phids); } public function loadHandles( Index: src/applications/tokens/query/PhabricatorTokenGivenQuery.php =================================================================== --- src/applications/tokens/query/PhabricatorTokenGivenQuery.php +++ src/applications/tokens/query/PhabricatorTokenGivenQuery.php @@ -89,4 +89,8 @@ return $results; } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationTokens'; + } + } Index: src/applications/tokens/query/PhabricatorTokenQuery.php =================================================================== --- src/applications/tokens/query/PhabricatorTokenQuery.php +++ src/applications/tokens/query/PhabricatorTokenQuery.php @@ -61,4 +61,9 @@ return $tokens; } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationTokens'; + } + } Index: src/applications/tokens/query/PhabricatorTokenReceiverQuery.php =================================================================== --- src/applications/tokens/query/PhabricatorTokenReceiverQuery.php +++ src/applications/tokens/query/PhabricatorTokenReceiverQuery.php @@ -34,4 +34,8 @@ return $this->tokenCounts; } + public function getQueryApplicationClass() { + return 'PhabricatorApplicationTokens'; + } + } Index: src/applications/transactions/phid/PhabricatorApplicationTransactionPHIDTypeTransaction.php =================================================================== --- src/applications/transactions/phid/PhabricatorApplicationTransactionPHIDTypeTransaction.php +++ src/applications/transactions/phid/PhabricatorApplicationTransactionPHIDTypeTransaction.php @@ -20,6 +20,12 @@ return null; } + protected function buildQueryForObjects( + PhabricatorObjectQuery $object_query, + array $phids) { + throw new Exception(); + } + public function loadObjects( PhabricatorObjectQuery $object_query, array $phids) { @@ -55,11 +61,17 @@ continue; } - $xactions = id(clone $query) + $xaction_query = id(clone $query) ->setViewer($object_query->getViewer()) ->setParentQuery($object_query) - ->withPHIDs($subtype_phids) - ->execute(); + ->withPHIDs($subtype_phids); + + if (!$xaction_query->canViewerUseQueryApplication()) { + $object_query->addPolicyFilteredPHIDs(array_fuse($subtype_phids)); + continue; + } + + $xactions = $xaction_query->execute(); $results += mpull($xactions, null, 'getPHID'); } Index: src/applications/transactions/query/PhabricatorApplicationTransactionCommentQuery.php =================================================================== --- src/applications/transactions/query/PhabricatorApplicationTransactionCommentQuery.php +++ src/applications/transactions/query/PhabricatorApplicationTransactionCommentQuery.php @@ -59,4 +59,10 @@ return $this->formatWhereClause($where); } + public function getQueryApplicationClass() { + // TODO: Figure out the app via the template? + return null; + } + + } Index: src/applications/transactions/query/PhabricatorApplicationTransactionQuery.php =================================================================== --- src/applications/transactions/query/PhabricatorApplicationTransactionQuery.php +++ src/applications/transactions/query/PhabricatorApplicationTransactionQuery.php @@ -160,4 +160,10 @@ return $this->formatWhereClause($where); } + + public function getQueryApplicationClass() { + // TODO: Sort this out? + return null; + } + } Index: src/infrastructure/query/policy/PhabricatorPolicyAwareQuery.php =================================================================== --- src/infrastructure/query/policy/PhabricatorPolicyAwareQuery.php +++ src/infrastructure/query/policy/PhabricatorPolicyAwareQuery.php @@ -35,6 +35,7 @@ private $capabilities; private $workspace = array(); private $policyFilteredPHIDs = array(); + private $canUseApplication; /* -( Query Configuration )------------------------------------------------ */ @@ -213,9 +214,13 @@ $this->rawResultLimit = 0; } - try { - $page = $this->loadPage(); - } catch (PhabricatorEmptyQueryException $ex) { + if ($this->canViewerUseQueryApplication()) { + try { + $page = $this->loadPage(); + } catch (PhabricatorEmptyQueryException $ex) { + $page = array(); + } + } else { $page = array(); } @@ -317,7 +322,7 @@ PhabricatorPolicyCapability::CAN_VIEW); } - protected function addPolicyFilteredPHIDs(array $phids) { + public function addPolicyFilteredPHIDs(array $phids) { $this->policyFilteredPHIDs += $phids; if ($this->getParentQuery()) { $this->getParentQuery()->addPolicyFilteredPHIDs($phids); @@ -581,4 +586,43 @@ return false; } + + /** + * If this query belongs to an application, return the application class name + * here. This will prevent the query from returning results if the viewer can + * not access the application. + * + * If this query does not belong to an application, return `null`. + * + * @return string|null Application class name. + */ + abstract public function getQueryApplicationClass(); + + + /** + * Determine if the viewer has permission to use this query's application. + * For queries which aren't part of an application, this method always returns + * true. + * + * @return bool True if the viewer has application-level permission to + * execute the query. + */ + public function canViewerUseQueryApplication() { + if ($this->canUseApplication === null) { + $class = $this->getQueryApplicationClass(); + if (!$class) { + $this->canUseApplication = true; + } else { + $result = id(new PhabricatorApplicationQuery()) + ->setViewer($this->getViewer()) + ->withClasses(array($class)) + ->execute(); + + $this->canUseApplication = (bool)$result; + } + } + + return $this->canUseApplication; + } + }