@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator

Add default View, Edit, and Join Policies to Projects

Summary: Fixes T6567, lets admins set a default policy for new Projects.

Test Plan: Changed the default Policy, created a new Project. Project had correct defaults.

Reviewers: btrahan, epriestley

Reviewed By: epriestley

Subscribers: Korvin, epriestley

Maniphest Tasks: T6567

Differential Revision: https://secure.phabricator.com/D10890

+72 -3
+6
src/__phutil_library_map__.php
··· 2848 2848 'ProjectConduitAPIMethod' => 'applications/project/conduit/ProjectConduitAPIMethod.php', 2849 2849 'ProjectCreateConduitAPIMethod' => 'applications/project/conduit/ProjectCreateConduitAPIMethod.php', 2850 2850 'ProjectCreateProjectsCapability' => 'applications/project/capability/ProjectCreateProjectsCapability.php', 2851 + 'ProjectDefaultEditCapability' => 'applications/project/capability/ProjectDefaultEditCapability.php', 2852 + 'ProjectDefaultJoinCapability' => 'applications/project/capability/ProjectDefaultJoinCapability.php', 2853 + 'ProjectDefaultViewCapability' => 'applications/project/capability/ProjectDefaultViewCapability.php', 2851 2854 'ProjectQueryConduitAPIMethod' => 'applications/project/conduit/ProjectQueryConduitAPIMethod.php', 2852 2855 'ProjectRemarkupRule' => 'applications/project/remarkup/ProjectRemarkupRule.php', 2853 2856 'ProjectRemarkupRuleTestCase' => 'applications/project/remarkup/__tests__/ProjectRemarkupRuleTestCase.php', ··· 6090 6093 'ProjectConduitAPIMethod' => 'ConduitAPIMethod', 6091 6094 'ProjectCreateConduitAPIMethod' => 'ProjectConduitAPIMethod', 6092 6095 'ProjectCreateProjectsCapability' => 'PhabricatorPolicyCapability', 6096 + 'ProjectDefaultEditCapability' => 'PhabricatorPolicyCapability', 6097 + 'ProjectDefaultJoinCapability' => 'PhabricatorPolicyCapability', 6098 + 'ProjectDefaultViewCapability' => 'PhabricatorPolicyCapability', 6093 6099 'ProjectQueryConduitAPIMethod' => 'ProjectConduitAPIMethod', 6094 6100 'ProjectRemarkupRule' => 'PhabricatorObjectRemarkupRule', 6095 6101 'ProjectRemarkupRuleTestCase' => 'PhabricatorTestCase',
+12
src/applications/project/application/PhabricatorProjectApplication.php
··· 98 98 ProjectCanLockProjectsCapability::CAPABILITY => array( 99 99 'default' => PhabricatorPolicies::POLICY_ADMIN, 100 100 ), 101 + ProjectDefaultViewCapability::CAPABILITY => array( 102 + 'caption' => pht( 103 + 'Default view policy for newly created projects.'), 104 + ), 105 + ProjectDefaultEditCapability::CAPABILITY => array( 106 + 'caption' => pht( 107 + 'Default edit policy for newly created projects.'), 108 + ), 109 + ProjectDefaultJoinCapability::CAPABILITY => array( 110 + 'caption' => pht( 111 + 'Default join policy for newly created projects.'), 112 + ), 101 113 ); 102 114 } 103 115
+12
src/applications/project/capability/ProjectDefaultEditCapability.php
··· 1 + <?php 2 + 3 + final class ProjectDefaultEditCapability 4 + extends PhabricatorPolicyCapability { 5 + 6 + const CAPABILITY = 'project.default.edit'; 7 + 8 + public function getCapabilityName() { 9 + return pht('Default Edit Policy'); 10 + } 11 + 12 + }
+12
src/applications/project/capability/ProjectDefaultJoinCapability.php
··· 1 + <?php 2 + 3 + final class ProjectDefaultJoinCapability 4 + extends PhabricatorPolicyCapability { 5 + 6 + const CAPABILITY = 'project.default.join'; 7 + 8 + public function getCapabilityName() { 9 + return pht('Default Join Policy'); 10 + } 11 + 12 + }
+15
src/applications/project/capability/ProjectDefaultViewCapability.php
··· 1 + <?php 2 + 3 + final class ProjectDefaultViewCapability 4 + extends PhabricatorPolicyCapability { 5 + 6 + const CAPABILITY = 'project.default.view'; 7 + 8 + public function getCapabilityName() { 9 + return pht('Default View Policy'); 10 + } 11 + 12 + public function shouldAllowPublicPolicySetting() { 13 + return true; 14 + } 15 + }
+15 -3
src/applications/project/storage/PhabricatorProject.php
··· 36 36 const TABLE_DATASOURCE_TOKEN = 'project_datasourcetoken'; 37 37 38 38 public static function initializeNewProject(PhabricatorUser $actor) { 39 + $app = id(new PhabricatorApplicationQuery()) 40 + ->setViewer(PhabricatorUser::getOmnipotentUser()) 41 + ->withClasses(array('PhabricatorProjectApplication')) 42 + ->executeOne(); 43 + 44 + $view_policy = $app->getPolicy( 45 + ProjectDefaultViewCapability::CAPABILITY); 46 + $edit_policy = $app->getPolicy( 47 + ProjectDefaultEditCapability::CAPABILITY); 48 + $join_policy = $app->getPolicy( 49 + ProjectDefaultJoinCapability::CAPABILITY); 50 + 39 51 return id(new PhabricatorProject()) 40 52 ->setName('') 41 53 ->setAuthorPHID($actor->getPHID()) 42 54 ->setIcon(self::DEFAULT_ICON) 43 55 ->setColor(self::DEFAULT_COLOR) 44 - ->setViewPolicy(PhabricatorPolicies::POLICY_USER) 45 - ->setEditPolicy(PhabricatorPolicies::POLICY_USER) 46 - ->setJoinPolicy(PhabricatorPolicies::POLICY_USER) 56 + ->setViewPolicy($view_policy) 57 + ->setEditPolicy($edit_policy) 58 + ->setJoinPolicy($join_policy) 47 59 ->setIsMembershipLocked(0) 48 60 ->attachMemberPHIDs(array()) 49 61 ->attachSlugs(array());