Skip to content

Commit 4489204

Browse files
author
epriestley
committed
Add Drydock default edit/view policies and a "Create Blueprint" policy
Summary: Ref T2015. Allow configuration of default edit/view policies for blueprints. Add create policy. Remove administrative exception in policies. Test Plan: Configured these settings and created (or, with a restrictive create setting, tried to create) blueprints. Reviewers: btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T2015 Differential Revision: https://secure.phabricator.com/D7921
1 parent 962aca6 commit 4489204

9 files changed

+98
-12
lines changed

src/__phutil_library_map__.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,9 @@
653653
'DrydockBlueprintScopeGuard' => 'applications/drydock/util/DrydockBlueprintScopeGuard.php',
654654
'DrydockBlueprintSearchEngine' => 'applications/drydock/query/DrydockBlueprintSearchEngine.php',
655655
'DrydockBlueprintViewController' => 'applications/drydock/controller/DrydockBlueprintViewController.php',
656+
'DrydockCapabilityCreateBlueprints' => 'applications/drydock/capability/DrydockCapabilityCreateBlueprints.php',
657+
'DrydockCapabilityDefaultEdit' => 'applications/drydock/capability/DrydockCapabilityDefaultEdit.php',
658+
'DrydockCapabilityDefaultView' => 'applications/drydock/capability/DrydockCapabilityDefaultView.php',
656659
'DrydockCommandInterface' => 'applications/drydock/interface/command/DrydockCommandInterface.php',
657660
'DrydockConsoleController' => 'applications/drydock/controller/DrydockConsoleController.php',
658661
'DrydockConstants' => 'applications/drydock/constants/DrydockConstants.php',
@@ -3080,6 +3083,9 @@
30803083
'DrydockBlueprintQuery' => 'DrydockQuery',
30813084
'DrydockBlueprintSearchEngine' => 'PhabricatorApplicationSearchEngine',
30823085
'DrydockBlueprintViewController' => 'DrydockBlueprintController',
3086+
'DrydockCapabilityCreateBlueprints' => 'PhabricatorPolicyCapability',
3087+
'DrydockCapabilityDefaultEdit' => 'PhabricatorPolicyCapability',
3088+
'DrydockCapabilityDefaultView' => 'PhabricatorPolicyCapability',
30833089
'DrydockCommandInterface' => 'DrydockInterface',
30843090
'DrydockConsoleController' => 'DrydockController',
30853091
'DrydockController' => 'PhabricatorController',

src/applications/drydock/application/PhabricatorApplicationDrydock.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ public function getBaseURI() {
77
}
88

99
public function getShortDescription() {
10-
return 'Allocate Software Resources';
10+
return pht('Allocate Software Resources');
1111
}
1212

1313
public function getIconName() {
@@ -57,4 +57,18 @@ public function getRoutes() {
5757
);
5858
}
5959

60+
protected function getCustomCapabilities() {
61+
return array(
62+
DrydockCapabilityDefaultView::CAPABILITY => array(
63+
),
64+
DrydockCapabilityDefaultEdit::CAPABILITY => array(
65+
'default' => PhabricatorPolicies::POLICY_ADMIN,
66+
),
67+
DrydockCapabilityCreateBlueprints::CAPABILITY => array(
68+
'default' => PhabricatorPolicies::POLICY_ADMIN,
69+
),
70+
);
71+
}
72+
73+
6074
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
final class DrydockCapabilityCreateBlueprints
4+
extends PhabricatorPolicyCapability {
5+
6+
const CAPABILITY = 'drydock.blueprint.create';
7+
8+
public function getCapabilityKey() {
9+
return self::CAPABILITY;
10+
}
11+
12+
public function getCapabilityName() {
13+
return pht('Can Create Blueprints');
14+
}
15+
16+
public function describeCapabilityRejection() {
17+
return pht('You do not have permission to create Drydock blueprints.');
18+
}
19+
20+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
final class DrydockCapabilityDefaultEdit
4+
extends PhabricatorPolicyCapability {
5+
6+
const CAPABILITY = 'drydock.default.edit';
7+
8+
public function getCapabilityKey() {
9+
return self::CAPABILITY;
10+
}
11+
12+
public function getCapabilityName() {
13+
return pht('Default Blueprint Edit Policy');
14+
}
15+
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
final class DrydockCapabilityDefaultView
4+
extends PhabricatorPolicyCapability {
5+
6+
const CAPABILITY = 'drydock.default.view';
7+
8+
public function getCapabilityKey() {
9+
return self::CAPABILITY;
10+
}
11+
12+
public function getCapabilityName() {
13+
return pht('Default Blueprint View Policy');
14+
}
15+
16+
}

src/applications/drydock/controller/DrydockBlueprintCreateController.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ public function processRequest() {
77
$request = $this->getRequest();
88
$viewer = $request->getUser();
99

10+
$this->requireApplicationCapability(
11+
DrydockCapabilityCreateBlueprints::CAPABILITY);
12+
1013
$implementations =
1114
DrydockBlueprintImplementation::getAllBlueprintImplementations();
1215

src/applications/drydock/controller/DrydockBlueprintEditController.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ public function processRequest() {
2929
$impl = $blueprint->getImplementation();
3030
$cancel_uri = $this->getApplicationURI('blueprint/'.$this->id.'/');
3131
} else {
32+
$this->requireApplicationCapability(
33+
DrydockCapabilityCreateBlueprints::CAPABILITY);
34+
3235
$class = $request->getStr('class');
3336

3437
$impl = DrydockBlueprintImplementation::getNamedImplementation($class);

src/applications/drydock/controller/DrydockBlueprintListController.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,16 @@ public function renderResultsList(
5050
}
5151

5252
public function buildApplicationCrumbs() {
53+
$can_create = $this->hasApplicationCapability(
54+
DrydockCapabilityCreateBlueprints::CAPABILITY);
55+
5356
$crumbs = parent::buildApplicationCrumbs();
5457
$crumbs->addAction(
5558
id(new PHUIListItemView())
5659
->setName(pht('New Blueprint'))
5760
->setHref($this->getApplicationURI('/blueprint/create/'))
61+
->setDisabled(!$can_create)
62+
->setWorkflow(!$can_create)
5863
->setIcon('create'));
5964
return $crumbs;
6065
}

src/applications/drydock/storage/DrydockBlueprint.php

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,19 @@ final class DrydockBlueprint extends DrydockDAO
1212
private $implementation = self::ATTACHABLE;
1313

1414
public static function initializeNewBlueprint(PhabricatorUser $actor) {
15+
$app = id(new PhabricatorApplicationQuery())
16+
->setViewer($actor)
17+
->withClasses(array('PhabricatorApplicationDrydock'))
18+
->executeOne();
19+
20+
$view_policy = $app->getPolicy(
21+
DrydockCapabilityDefaultView::CAPABILITY);
22+
$edit_policy = $app->getPolicy(
23+
DrydockCapabilityDefaultEdit::CAPABILITY);
24+
1525
return id(new DrydockBlueprint())
26+
->setViewPolicy($view_policy)
27+
->setEditPolicy($edit_policy)
1628
->setBlueprintName('');
1729
}
1830

@@ -67,19 +79,10 @@ public function getPolicy($capability) {
6779
}
6880

6981
public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
70-
switch ($capability) {
71-
case PhabricatorPolicyCapability::CAN_VIEW:
72-
case PhabricatorPolicyCapability::CAN_EDIT:
73-
return $viewer->getIsAdmin();
74-
}
82+
return false;
7583
}
7684

7785
public function describeAutomaticCapability($capability) {
78-
switch ($capability) {
79-
case PhabricatorPolicyCapability::CAN_VIEW:
80-
return pht('Administrators can always view blueprints.');
81-
case PhabricatorPolicyCapability::CAN_EDIT:
82-
return pht('Administrators can always edit blueprints.');
83-
}
86+
return null;
8487
}
8588
}

0 commit comments

Comments
 (0)