[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/meta/controller/ -> PhabricatorApplicationEditController.php (source)

   1  <?php
   2  
   3  final class PhabricatorApplicationEditController
   4    extends PhabricatorApplicationsController {
   5  
   6    private $application;
   7  
   8    public function shouldRequireAdmin() {
   9      return true;
  10    }
  11  
  12    public function willProcessRequest(array $data) {
  13      $this->application = $data['application'];
  14    }
  15  
  16    public function processRequest() {
  17      $request = $this->getRequest();
  18      $user = $request->getUser();
  19  
  20      $application = id(new PhabricatorApplicationQuery())
  21        ->setViewer($user)
  22        ->withClasses(array($this->application))
  23        ->requireCapabilities(
  24          array(
  25            PhabricatorPolicyCapability::CAN_VIEW,
  26            PhabricatorPolicyCapability::CAN_EDIT,
  27          ))
  28        ->executeOne();
  29      if (!$application) {
  30        return new Aphront404Response();
  31      }
  32  
  33      $title = $application->getName();
  34  
  35      $view_uri = $this->getApplicationURI('view/'.get_class($application).'/');
  36  
  37      $policies = id(new PhabricatorPolicyQuery())
  38        ->setViewer($user)
  39        ->setObject($application)
  40        ->execute();
  41  
  42      if ($request->isFormPost()) {
  43        $result = array();
  44        foreach ($application->getCapabilities() as $capability) {
  45          $old = $application->getPolicy($capability);
  46          $new = $request->getStr('policy:'.$capability);
  47  
  48          if ($old == $new) {
  49            // No change to the setting.
  50            continue;
  51          }
  52  
  53          if (empty($policies[$new])) {
  54            // Not a standard policy, check for a custom policy.
  55            $policy = id(new PhabricatorPolicyQuery())
  56              ->setViewer($user)
  57              ->withPHIDs(array($new))
  58              ->executeOne();
  59            if (!$policy) {
  60              // Not a custom policy either. Can't set the policy to something
  61              // invalid, so skip this.
  62              continue;
  63            }
  64          }
  65  
  66          if ($new == PhabricatorPolicies::POLICY_PUBLIC) {
  67            $capobj = PhabricatorPolicyCapability::getCapabilityByKey(
  68              $capability);
  69            if (!$capobj || !$capobj->shouldAllowPublicPolicySetting()) {
  70              // Can't set non-public policies to public.
  71              continue;
  72            }
  73          }
  74  
  75          $result[$capability] = $new;
  76        }
  77  
  78        if ($result) {
  79          $key = 'phabricator.application-settings';
  80          $config_entry = PhabricatorConfigEntry::loadConfigEntry($key);
  81          $value = $config_entry->getValue();
  82  
  83          $phid = $application->getPHID();
  84          if (empty($value[$phid])) {
  85            $value[$application->getPHID()] = array();
  86          }
  87          if (empty($value[$phid]['policy'])) {
  88            $value[$phid]['policy'] = array();
  89          }
  90  
  91          $value[$phid]['policy'] = $result + $value[$phid]['policy'];
  92  
  93          // Don't allow users to make policy edits which would lock them out of
  94          // applications, since they would be unable to undo those actions.
  95          PhabricatorEnv::overrideConfig($key, $value);
  96          PhabricatorPolicyFilter::mustRetainCapability(
  97            $user,
  98            $application,
  99            PhabricatorPolicyCapability::CAN_VIEW);
 100  
 101          PhabricatorPolicyFilter::mustRetainCapability(
 102            $user,
 103            $application,
 104            PhabricatorPolicyCapability::CAN_EDIT);
 105  
 106          PhabricatorConfigEditor::storeNewValue(
 107            $user,
 108            $config_entry,
 109            $value,
 110            PhabricatorContentSource::newFromRequest($this->getRequest()));
 111        }
 112  
 113        return id(new AphrontRedirectResponse())->setURI($view_uri);
 114      }
 115  
 116      $descriptions = PhabricatorPolicyQuery::renderPolicyDescriptions(
 117        $user,
 118        $application);
 119  
 120      $form = id(new AphrontFormView())
 121        ->setUser($user);
 122  
 123      foreach ($application->getCapabilities() as $capability) {
 124        $label = $application->getCapabilityLabel($capability);
 125        $can_edit = $application->isCapabilityEditable($capability);
 126        $caption = $application->getCapabilityCaption($capability);
 127  
 128        if (!$can_edit) {
 129          $form->appendChild(
 130            id(new AphrontFormStaticControl())
 131              ->setLabel($label)
 132              ->setValue(idx($descriptions, $capability))
 133              ->setCaption($caption));
 134        } else {
 135          $form->appendChild(
 136            id(new AphrontFormPolicyControl())
 137            ->setUser($user)
 138            ->setCapability($capability)
 139            ->setPolicyObject($application)
 140            ->setPolicies($policies)
 141            ->setLabel($label)
 142            ->setName('policy:'.$capability)
 143            ->setCaption($caption));
 144        }
 145  
 146      }
 147  
 148      $form->appendChild(
 149        id(new AphrontFormSubmitControl())
 150          ->setValue(pht('Save Policies'))
 151          ->addCancelButton($view_uri));
 152  
 153      $crumbs = $this->buildApplicationCrumbs();
 154      $crumbs->addTextCrumb($application->getName(), $view_uri);
 155      $crumbs->addTextCrumb(pht('Edit Policies'));
 156  
 157      $header = id(new PHUIHeaderView())
 158        ->setHeader(pht('Edit Policies: %s', $application->getName()));
 159  
 160      $object_box = id(new PHUIObjectBoxView())
 161        ->setHeader($header)
 162        ->setForm($form);
 163  
 164      return $this->buildApplicationPage(
 165        array(
 166          $crumbs,
 167          $object_box,
 168        ),
 169        array(
 170          'title' => $title,
 171        ));
 172    }
 173  
 174  }


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1