Skip to content

Commit da171f8

Browse files
author
Stig Lindqvist
committed
Merge pull request #36 from halkyon/environment_view
Adding specific permissions for viewers for DNEnvironment.
2 parents ed151a8 + fca6ac2 commit da171f8

4 files changed

Lines changed: 61 additions & 2 deletions

File tree

code/model/DNEnvironment.php

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
* @method DNProject Project()
1313
* @method DataList Deployments()
1414
*
15+
* @method ManyManyList Viewers()
16+
* @method ManyManyList ViewerGroups()
1517
* @method ManyManyList Deployers()
1618
* @method ManyManyList DeployerGroups()
1719
* @method ManyManyList CanRestoreMembers()
@@ -87,6 +89,8 @@ class DNEnvironment extends DataObject {
8789
* @var array
8890
*/
8991
public static $many_many = array(
92+
"Viewers" => "Member", // Who can view this environment
93+
"ViewerGroups" => "Group",
9094
"Deployers" => "Member", // Who can deploy to this environment
9195
"DeployerGroups" => "Group",
9296
"CanRestoreMembers" => "Member", // Who can restore archive files to this environment
@@ -268,12 +272,23 @@ public function CanCancelPipeline() {
268272
}
269273

270274
/**
271-
* Environments are only viewable by people that can view the parent project
275+
* Environments are only viewable by people that can view the environment.
272276
*
273277
* @param Member $member
274278
* @return boolean
275279
*/
276280
public function canView($member = null) {
281+
if(!$member) $member = Member::currentUser();
282+
if(!$member) return false; // Must be logged in to check permissions
283+
284+
if(Permission::checkMember($member, 'ADMIN')) return true;
285+
286+
// if no Viewers or ViewerGroups defined, fallback to DNProject::canView permissions
287+
if($this->Viewers()->exists() || $this->ViewerGroups()->exists()) {
288+
return $this->Viewers()->byID($member->ID)
289+
|| $member->inGroups($this->ViewerGroups());
290+
}
291+
277292
return $this->Project()->canView($member);
278293
}
279294

@@ -767,6 +782,12 @@ public function getCMSFields() {
767782
));
768783

769784
$fields->addFieldsToTab('Root.UserPermissions', array(
785+
// The viewers of the environment
786+
$this
787+
->buildPermissionField('ViewerGroups', 'Viewers', $groups, $members)
788+
->setTitle('Who can view this environment?')
789+
->setDescription('Groups or Users who can view this environment'),
790+
770791
// The Main.Deployers
771792
$this
772793
->buildPermissionField('DeployerGroups', 'Deployers', $groups, $members)

code/model/DNProject.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,12 @@ public function getRepository() {
300300
* Provides a DNEnvironmentList of environments found in this project.
301301
*/
302302
public function DNEnvironmentList() {
303-
return DNEnvironment::get()->filter('ProjectID', $this->ID)->setProjectID($this->ID);
303+
return DNEnvironment::get()
304+
->filter('ProjectID', $this->ID)
305+
->setProjectID($this->ID)
306+
->filterByCallBack(function($item) {
307+
return $item->canView();
308+
});
304309
}
305310

306311
/**

tests/DNEnvironmentTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,20 @@ public function testPermissions() {
2626
$environment = $this->getEnvironment();
2727

2828
// Check deployer / restorer permissions
29+
$viewer = $this->objFromFixture('Member', 'viewer');
30+
$viewerbygroup = $this->objFromFixture('Member', 'viewerbygroup');
2931
$deployer = $this->objFromFixture('Member', 'deployer');
3032
$deployerbygroup = $this->objFromFixture('Member', 'deployerbygroup');
3133
$restorer = $this->objFromFixture('Member', 'restorer');
3234
$restorerbygroup = $this->objFromFixture('Member', 'restorerbygroup');
3335

36+
$random = new Member(array('Email' => 'random@example.com'));
37+
$random->write();
38+
39+
$this->assertFalse($environment->canView($random));
40+
$this->assertTrue($environment->canView($viewer));
41+
$this->assertTrue($environment->canView($viewerbygroup));
42+
3443
$this->assertTrue($environment->canDeploy($deployer));
3544
$this->assertTrue($environment->canDeploy($deployerbygroup));
3645
$this->assertFalse($environment->canDeploy($restorer));
@@ -88,6 +97,17 @@ public function testPermissions() {
8897
$this->assertFalse($environment->canAbort($approverbygroup));
8998
$this->assertTrue($environment->canAbort($canceller));
9099
$this->assertTrue($environment->canAbort($cancellerbygroup));
100+
}
91101

102+
public function testViewerPermissionInheritedFromProjectIfNotConfigured() {
103+
$environment = $this->objFromFixture('DNEnvironment', 'dev');
104+
$viewerbygroup = $this->objFromFixture('Member', 'viewerbygroup');
105+
106+
$random = new Member(array('Email' => 'random@example.com'));
107+
$random->write();
108+
109+
$this->assertFalse($environment->canView($random));
110+
$this->assertTrue($environment->canView($viewerbygroup));
92111
}
112+
93113
}

tests/DNEnvironmentTest.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
Member:
2+
viewer:
3+
Email: viewer@example.com
4+
viewerbygroup:
5+
Email: viewer2@example.com
26
deployer:
37
Email: deployer@example.com
48
deployerbygroup:
@@ -32,6 +36,9 @@ Member:
3236
cancellerbygroup:
3337
Email: canceller2@example.com
3438
Group:
39+
viewer:
40+
Title: Viewers
41+
Members: =>Member.viewerbygroup
3542
deployer:
3643
Title: deployers
3744
Members: =>Member.deployerbygroup
@@ -59,10 +66,13 @@ Group:
5966
DNProject:
6067
testproject:
6168
Name: 'testproject'
69+
Viewers: =>Group.viewer
6270
DNEnvironment:
6371
uat:
6472
Name: uat
6573
Project: =>DNProject.testproject
74+
Viewers: =>Member.viewer
75+
ViewerGroups: =>Group.viewer
6676
Deployers: =>Member.deployer
6777
DeployerGroups: =>Group.deployer
6878
CanRestoreMembers: =>Member.restorer
@@ -79,3 +89,6 @@ DNEnvironment:
7989
PipelineApproverGroups: =>Group.approver
8090
PipelineCancellers: =>Member.canceller
8191
PipelineCancellerGroups: =>Group.canceller
92+
dev:
93+
Name: dev
94+
Project: =>DNProject.testproject

0 commit comments

Comments
 (0)