Don't return any results for viewerprojects() if the viewer is in no projects
Summary:
Fixes T10135. When the viewer is a member of no projects, specify the constraint type as a new "EMPTY" type.
When a query has an "EMPTY" constraint, fail fast with no results.
Test Plan:
  - Viewed a viewerprojects() query result set as a user in no projects.
    - Before patch: got a lot of hits. After patch: no hits.
  - Viewed a normal result set, no changes.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T10135
Differential Revision: https://secure.phabricator.com/D15003
			
			
This commit is contained in:
		| @@ -63,11 +63,17 @@ final class PhabricatorProjectLogicalViewerDatasource | |||||||
|     $phids = mpull($projects, 'getPHID'); |     $phids = mpull($projects, 'getPHID'); | ||||||
|  |  | ||||||
|     $results = array(); |     $results = array(); | ||||||
|  |     if ($phids) { | ||||||
|       foreach ($phids as $phid) { |       foreach ($phids as $phid) { | ||||||
|         $results[] = new PhabricatorQueryConstraint( |         $results[] = new PhabricatorQueryConstraint( | ||||||
|           PhabricatorQueryConstraint::OPERATOR_OR, |           PhabricatorQueryConstraint::OPERATOR_OR, | ||||||
|           $phid); |           $phid); | ||||||
|       } |       } | ||||||
|  |     } else { | ||||||
|  |       $results[] = new PhabricatorQueryConstraint( | ||||||
|  |         PhabricatorQueryConstraint::OPERATOR_EMPTY, | ||||||
|  |         null); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return $results; |     return $results; | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -7,6 +7,7 @@ final class PhabricatorQueryConstraint extends Phobject { | |||||||
|   const OPERATOR_NOT = 'not'; |   const OPERATOR_NOT = 'not'; | ||||||
|   const OPERATOR_NULL = 'null'; |   const OPERATOR_NULL = 'null'; | ||||||
|   const OPERATOR_ANCESTOR = 'ancestor'; |   const OPERATOR_ANCESTOR = 'ancestor'; | ||||||
|  |   const OPERATOR_EMPTY = 'empty'; | ||||||
|  |  | ||||||
|   private $operator; |   private $operator; | ||||||
|   private $value; |   private $value; | ||||||
|   | |||||||
| @@ -1872,6 +1872,16 @@ abstract class PhabricatorCursorPagedPolicyAwareQuery | |||||||
|       return $this; |       return $this; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     foreach ($this->edgeLogicConstraints as $type => $constraints) { | ||||||
|  |       foreach ($constraints as $operator => $list) { | ||||||
|  |         switch ($operator) { | ||||||
|  |           case PhabricatorQueryConstraint::OPERATOR_EMPTY: | ||||||
|  |             throw new PhabricatorEmptyQueryException( | ||||||
|  |               pht('This query specifies an empty constraint.')); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     // This should probably be more modular, eventually, but we only do |     // This should probably be more modular, eventually, but we only do | ||||||
|     // project-based edge logic today. |     // project-based edge logic today. | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 epriestley
					epriestley