2012-09-13 19:15:08 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
final class PhabricatorPolicyQuery extends PhabricatorQuery {
|
|
|
|
|
|
|
|
private $viewer;
|
|
|
|
private $object;
|
|
|
|
|
|
|
|
public function setViewer(PhabricatorUser $viewer) {
|
|
|
|
$this->viewer = $viewer;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setObject(PhabricatorPolicyInterface $object) {
|
|
|
|
$this->object = $object;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static function renderPolicyDescriptions(
|
|
|
|
PhabricatorUser $viewer,
|
|
|
|
PhabricatorPolicyInterface $object) {
|
|
|
|
|
|
|
|
$results = array();
|
|
|
|
$policies = null;
|
|
|
|
$global = self::getGlobalPolicies();
|
|
|
|
|
|
|
|
$capabilities = $object->getCapabilities();
|
|
|
|
foreach ($capabilities as $capability) {
|
|
|
|
$policy = $object->getPolicy($capability);
|
2012-09-28 02:08:17 +02:00
|
|
|
if (!$policy) {
|
|
|
|
continue;
|
|
|
|
}
|
2012-09-13 19:15:08 +02:00
|
|
|
|
|
|
|
if (isset($global[$policy])) {
|
|
|
|
$results[$capability] = $global[$policy]->renderDescription();
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($policies === null) {
|
|
|
|
// This slightly overfetches data, but it shouldn't generally
|
|
|
|
// be a problem.
|
|
|
|
$policies = id(new PhabricatorPolicyQuery())
|
|
|
|
->setViewer($viewer)
|
|
|
|
->setObject($object)
|
|
|
|
->execute();
|
|
|
|
}
|
|
|
|
|
|
|
|
$results[$capability] = $policies[$policy]->renderDescription();
|
|
|
|
}
|
|
|
|
|
|
|
|
return $results;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function execute() {
|
|
|
|
if (!$this->viewer) {
|
|
|
|
throw new Exception('Call setViewer() before execute()!');
|
|
|
|
}
|
|
|
|
if (!$this->object) {
|
|
|
|
throw new Exception('Call setObject() before execute()!');
|
|
|
|
}
|
|
|
|
|
|
|
|
$results = $this->getGlobalPolicies();
|
|
|
|
|
|
|
|
if ($this->viewer->getPHID()) {
|
|
|
|
$projects = id(new PhabricatorProjectQuery())
|
|
|
|
->setViewer($this->viewer)
|
|
|
|
->withMemberPHIDs(array($this->viewer->getPHID()))
|
|
|
|
->execute();
|
|
|
|
if ($projects) {
|
|
|
|
foreach ($projects as $project) {
|
|
|
|
$results[] = id(new PhabricatorPolicy())
|
|
|
|
->setType(PhabricatorPolicyType::TYPE_PROJECT)
|
|
|
|
->setPHID($project->getPHID())
|
|
|
|
->setHref('/project/view/'.$project->getID().'/')
|
|
|
|
->setName($project->getName());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$results = mpull($results, null, 'getPHID');
|
|
|
|
|
|
|
|
$other_policies = array();
|
|
|
|
$capabilities = $this->object->getCapabilities();
|
|
|
|
foreach ($capabilities as $capability) {
|
|
|
|
$policy = $this->object->getPolicy($capability);
|
|
|
|
if (!$policy) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
$other_policies[$policy] = $policy;
|
|
|
|
}
|
|
|
|
|
|
|
|
// If this install doesn't have "Public" enabled, remove it as an option
|
|
|
|
// unless the object already has a "Public" policy. In this case we retain
|
|
|
|
// the policy but enforce it as thought it was "All Users".
|
|
|
|
$show_public = PhabricatorEnv::getEnvConfig('policy.allow-public');
|
|
|
|
if (!$show_public &&
|
|
|
|
empty($other_policies[PhabricatorPolicies::POLICY_PUBLIC])) {
|
|
|
|
unset($results[PhabricatorPolicies::POLICY_PUBLIC]);
|
|
|
|
}
|
|
|
|
|
|
|
|
$other_policies = array_diff_key($other_policies, $results);
|
|
|
|
|
|
|
|
if ($other_policies) {
|
2013-09-11 21:27:28 +02:00
|
|
|
$handles = id(new PhabricatorHandleQuery())
|
2012-09-13 19:15:08 +02:00
|
|
|
->setViewer($this->viewer)
|
2013-09-11 21:27:28 +02:00
|
|
|
->withPHIDs($other_policies)
|
|
|
|
->execute();
|
2012-09-13 19:15:08 +02:00
|
|
|
foreach ($other_policies as $phid) {
|
2013-05-26 18:51:14 +02:00
|
|
|
$results[$phid] = PhabricatorPolicy::newFromPolicyAndHandle(
|
|
|
|
$phid,
|
|
|
|
$handles[$phid]);
|
2012-09-13 19:15:08 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$results = msort($results, 'getSortKey');
|
|
|
|
|
|
|
|
return $results;
|
|
|
|
}
|
|
|
|
|
2013-05-26 17:43:09 +02:00
|
|
|
public static function isGlobalPolicy($policy) {
|
|
|
|
$globalPolicies = self::getGlobalPolicies();
|
|
|
|
|
|
|
|
if (isset($globalPolicies[$policy])) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2013-05-26 18:51:14 +02:00
|
|
|
public static function getGlobalPolicy($policy) {
|
|
|
|
if (!self::isGlobalPolicy($policy)) {
|
|
|
|
throw new Exception("Policy '{$policy}' is not a global policy!");
|
|
|
|
}
|
|
|
|
return idx(self::getGlobalPolicies(), $policy);
|
|
|
|
}
|
|
|
|
|
2012-09-13 19:15:08 +02:00
|
|
|
private static function getGlobalPolicies() {
|
|
|
|
static $constants = array(
|
|
|
|
PhabricatorPolicies::POLICY_PUBLIC,
|
|
|
|
PhabricatorPolicies::POLICY_USER,
|
|
|
|
PhabricatorPolicies::POLICY_ADMIN,
|
|
|
|
PhabricatorPolicies::POLICY_NOONE,
|
|
|
|
);
|
|
|
|
|
|
|
|
$results = array();
|
|
|
|
foreach ($constants as $constant) {
|
|
|
|
$results[$constant] = id(new PhabricatorPolicy())
|
|
|
|
->setType(PhabricatorPolicyType::TYPE_GLOBAL)
|
|
|
|
->setPHID($constant)
|
|
|
|
->setName(self::getGlobalPolicyName($constant));
|
|
|
|
}
|
|
|
|
|
|
|
|
return $results;
|
|
|
|
}
|
|
|
|
|
|
|
|
private static function getGlobalPolicyName($policy) {
|
|
|
|
switch ($policy) {
|
|
|
|
case PhabricatorPolicies::POLICY_PUBLIC:
|
2012-09-17 19:17:25 +02:00
|
|
|
return pht('Public (No Login Required)');
|
2012-09-13 19:15:08 +02:00
|
|
|
case PhabricatorPolicies::POLICY_USER:
|
|
|
|
return pht('All Users');
|
|
|
|
case PhabricatorPolicies::POLICY_ADMIN:
|
|
|
|
return pht('Administrators');
|
|
|
|
case PhabricatorPolicies::POLICY_NOONE:
|
|
|
|
return pht('No One');
|
|
|
|
default:
|
|
|
|
return pht('Unknown Policy');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|