diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2847,6 +2847,9 @@ 'ProjectConduitAPIMethod' => 'applications/project/conduit/ProjectConduitAPIMethod.php', 'ProjectCreateConduitAPIMethod' => 'applications/project/conduit/ProjectCreateConduitAPIMethod.php', 'ProjectCreateProjectsCapability' => 'applications/project/capability/ProjectCreateProjectsCapability.php', + 'ProjectDefaultEditCapability' => 'applications/project/capability/ProjectDefaultEditCapability.php', + 'ProjectDefaultJoinCapability' => 'applications/project/capability/ProjectDefaultJoinCapability.php', + 'ProjectDefaultViewCapability' => 'applications/project/capability/ProjectDefaultViewCapability.php', 'ProjectQueryConduitAPIMethod' => 'applications/project/conduit/ProjectQueryConduitAPIMethod.php', 'ProjectRemarkupRule' => 'applications/project/remarkup/ProjectRemarkupRule.php', 'ProjectRemarkupRuleTestCase' => 'applications/project/remarkup/__tests__/ProjectRemarkupRuleTestCase.php', @@ -5312,6 +5315,7 @@ 'PhabricatorRepositoryDAO', 'PhabricatorPolicyInterface', 'PhabricatorFlaggableInterface', + 'PhabricatorProjectInterface', 'PhabricatorTokenReceiverInterface', 'PhabricatorSubscribableInterface', 'PhabricatorMentionableInterface', @@ -6087,6 +6091,9 @@ 'ProjectConduitAPIMethod' => 'ConduitAPIMethod', 'ProjectCreateConduitAPIMethod' => 'ProjectConduitAPIMethod', 'ProjectCreateProjectsCapability' => 'PhabricatorPolicyCapability', + 'ProjectDefaultEditCapability' => 'PhabricatorPolicyCapability', + 'ProjectDefaultJoinCapability' => 'PhabricatorPolicyCapability', + 'ProjectDefaultViewCapability' => 'PhabricatorPolicyCapability', 'ProjectQueryConduitAPIMethod' => 'ProjectConduitAPIMethod', 'ProjectRemarkupRule' => 'PhabricatorObjectRemarkupRule', 'ProjectRemarkupRuleTestCase' => 'PhabricatorTestCase', diff --git a/src/applications/project/application/PhabricatorProjectApplication.php b/src/applications/project/application/PhabricatorProjectApplication.php --- a/src/applications/project/application/PhabricatorProjectApplication.php +++ b/src/applications/project/application/PhabricatorProjectApplication.php @@ -98,6 +98,18 @@ ProjectCanLockProjectsCapability::CAPABILITY => array( 'default' => PhabricatorPolicies::POLICY_ADMIN, ), + ProjectDefaultViewCapability::CAPABILITY => array( + 'caption' => pht( + 'Default view policy for newly created projects.'), + ), + ProjectDefaultEditCapability::CAPABILITY => array( + 'caption' => pht( + 'Default edit policy for newly created projects.'), + ), + ProjectDefaultJoinCapability::CAPABILITY => array( + 'caption' => pht( + 'Default join policy for newly created projects.'), + ), ); } diff --git a/src/applications/project/capability/ProjectDefaultEditCapability.php b/src/applications/project/capability/ProjectDefaultEditCapability.php new file mode 100644 --- /dev/null +++ b/src/applications/project/capability/ProjectDefaultEditCapability.php @@ -0,0 +1,15 @@ +<?php + +final class ProjectDefaultEditCapability + extends PhabricatorPolicyCapability { + + const CAPABILITY = 'project.default.edit'; + + public function getCapabilityName() { + return pht('Default Edit Policy'); + } + + public function shouldAllowPublicPolicySetting() { + return false; + } +} diff --git a/src/applications/project/capability/ProjectDefaultJoinCapability.php b/src/applications/project/capability/ProjectDefaultJoinCapability.php new file mode 100644 --- /dev/null +++ b/src/applications/project/capability/ProjectDefaultJoinCapability.php @@ -0,0 +1,15 @@ +<?php + +final class ProjectDefaultJoinCapability + extends PhabricatorPolicyCapability { + + const CAPABILITY = 'project.default.join'; + + public function getCapabilityName() { + return pht('Default Join Policy'); + } + + public function shouldAllowPublicPolicySetting() { + return false; + } +} diff --git a/src/applications/project/capability/ProjectDefaultViewCapability.php b/src/applications/project/capability/ProjectDefaultViewCapability.php new file mode 100644 --- /dev/null +++ b/src/applications/project/capability/ProjectDefaultViewCapability.php @@ -0,0 +1,15 @@ +<?php + +final class ProjectDefaultViewCapability + extends PhabricatorPolicyCapability { + + const CAPABILITY = 'project.default.view'; + + public function getCapabilityName() { + return pht('Default View Policy'); + } + + public function shouldAllowPublicPolicySetting() { + return true; + } +} diff --git a/src/applications/project/storage/PhabricatorProject.php b/src/applications/project/storage/PhabricatorProject.php --- a/src/applications/project/storage/PhabricatorProject.php +++ b/src/applications/project/storage/PhabricatorProject.php @@ -36,14 +36,26 @@ const TABLE_DATASOURCE_TOKEN = 'project_datasourcetoken'; public static function initializeNewProject(PhabricatorUser $actor) { + $app = id(new PhabricatorApplicationQuery()) + ->setViewer(PhabricatorUser::getOmnipotentUser()) + ->withClasses(array('PhabricatorProjectApplication')) + ->executeOne(); + + $view_policy = $app->getPolicy( + ProjectDefaultViewCapability::CAPABILITY); + $edit_policy = $app->getPolicy( + ProjectDefaultEditCapability::CAPABILITY); + $join_policy = $app->getPolicy( + ProjectDefaultJoinCapability::CAPABILITY); + return id(new PhabricatorProject()) ->setName('') ->setAuthorPHID($actor->getPHID()) ->setIcon(self::DEFAULT_ICON) ->setColor(self::DEFAULT_COLOR) - ->setViewPolicy(PhabricatorPolicies::POLICY_USER) - ->setEditPolicy(PhabricatorPolicies::POLICY_USER) - ->setJoinPolicy(PhabricatorPolicies::POLICY_USER) + ->setViewPolicy($view_policy) + ->setEditPolicy($edit_policy) + ->setJoinPolicy($join_policy) ->setIsMembershipLocked(0) ->attachMemberPHIDs(array()) ->attachSlugs(array());