1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-09-20 01:08:50 +02:00

Paste: Add edit policy

Summary: T5549

Test Plan: Set edit policy on paste, check that only users meeting the policy requirements can edit it.

Reviewers: epriestley, #blessed_reviewers

Reviewed By: epriestley, #blessed_reviewers

Subscribers: Korvin, epriestley

Maniphest Tasks: T5549

Differential Revision: https://secure.phabricator.com/D11097
This commit is contained in:
Alex Monk 2014-12-31 08:23:47 -08:00 committed by epriestley
parent debffb1c84
commit a84cd99893
8 changed files with 50 additions and 5 deletions

View file

@ -0,0 +1,3 @@
ALTER TABLE `{$NAMESPACE}_pastebin`.`pastebin_paste`
ADD `editPolicy` VARBINARY(64) NOT NULL
AFTER `viewPolicy`;

View file

@ -0,0 +1,2 @@
UPDATE `{$NAMESPACE}_pastebin`.`pastebin_paste` SET editPolicy = authorPHID
WHERE editPolicy = '';

View file

@ -1203,6 +1203,7 @@ phutil_register_library_map(array(
'PasteConduitAPIMethod' => 'applications/paste/conduit/PasteConduitAPIMethod.php', 'PasteConduitAPIMethod' => 'applications/paste/conduit/PasteConduitAPIMethod.php',
'PasteCreateConduitAPIMethod' => 'applications/paste/conduit/PasteCreateConduitAPIMethod.php', 'PasteCreateConduitAPIMethod' => 'applications/paste/conduit/PasteCreateConduitAPIMethod.php',
'PasteCreateMailReceiver' => 'applications/paste/mail/PasteCreateMailReceiver.php', 'PasteCreateMailReceiver' => 'applications/paste/mail/PasteCreateMailReceiver.php',
'PasteDefaultEditCapability' => 'applications/paste/capability/PasteDefaultEditCapability.php',
'PasteDefaultViewCapability' => 'applications/paste/capability/PasteDefaultViewCapability.php', 'PasteDefaultViewCapability' => 'applications/paste/capability/PasteDefaultViewCapability.php',
'PasteEmbedView' => 'applications/paste/view/PasteEmbedView.php', 'PasteEmbedView' => 'applications/paste/view/PasteEmbedView.php',
'PasteInfoConduitAPIMethod' => 'applications/paste/conduit/PasteInfoConduitAPIMethod.php', 'PasteInfoConduitAPIMethod' => 'applications/paste/conduit/PasteInfoConduitAPIMethod.php',
@ -4326,6 +4327,7 @@ phutil_register_library_map(array(
'PasteConduitAPIMethod' => 'ConduitAPIMethod', 'PasteConduitAPIMethod' => 'ConduitAPIMethod',
'PasteCreateConduitAPIMethod' => 'PasteConduitAPIMethod', 'PasteCreateConduitAPIMethod' => 'PasteConduitAPIMethod',
'PasteCreateMailReceiver' => 'PhabricatorMailReceiver', 'PasteCreateMailReceiver' => 'PhabricatorMailReceiver',
'PasteDefaultEditCapability' => 'PhabricatorPolicyCapability',
'PasteDefaultViewCapability' => 'PhabricatorPolicyCapability', 'PasteDefaultViewCapability' => 'PhabricatorPolicyCapability',
'PasteEmbedView' => 'AphrontView', 'PasteEmbedView' => 'AphrontView',
'PasteInfoConduitAPIMethod' => 'PasteConduitAPIMethod', 'PasteInfoConduitAPIMethod' => 'PasteConduitAPIMethod',

View file

@ -50,6 +50,9 @@ final class PhabricatorPasteApplication extends PhabricatorApplication {
PasteDefaultViewCapability::CAPABILITY => array( PasteDefaultViewCapability::CAPABILITY => array(
'caption' => pht('Default view policy for newly created pastes.'), 'caption' => pht('Default view policy for newly created pastes.'),
), ),
PasteDefaultEditCapability::CAPABILITY => array(
'caption' => pht('Default edit policy for newly created pastes.'),
),
); );
} }

View file

@ -0,0 +1,11 @@
<?php
final class PasteDefaultEditCapability extends PhabricatorPolicyCapability {
const CAPABILITY = 'paste.default.edit';
public function getCapabilityName() {
return pht('Default Edit Policy');
}
}

View file

@ -69,7 +69,8 @@ final class PhabricatorPasteEditController extends PhabricatorPasteController {
$v_language = $paste->getLanguage(); $v_language = $paste->getLanguage();
$v_text = $paste->getRawContent(); $v_text = $paste->getRawContent();
} }
$v_policy = $paste->getViewPolicy(); $v_view_policy = $paste->getViewPolicy();
$v_edit_policy = $paste->getEditPolicy();
if ($is_create) { if ($is_create) {
$v_projects = array(); $v_projects = array();
@ -93,7 +94,8 @@ final class PhabricatorPasteEditController extends PhabricatorPasteController {
$v_title = $request->getStr('title'); $v_title = $request->getStr('title');
$v_language = $request->getStr('language'); $v_language = $request->getStr('language');
$v_policy = $request->getStr('can_view'); $v_view_policy = $request->getStr('can_view');
$v_edit_policy = $request->getStr('can_edit');
$v_projects = $request->getArr('projects'); $v_projects = $request->getArr('projects');
// NOTE: The author is the only editor and can always view the paste, // NOTE: The author is the only editor and can always view the paste,
@ -119,7 +121,10 @@ final class PhabricatorPasteEditController extends PhabricatorPasteController {
->setNewValue($v_language); ->setNewValue($v_language);
$xactions[] = id(new PhabricatorPasteTransaction()) $xactions[] = id(new PhabricatorPasteTransaction())
->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY) ->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY)
->setNewValue($v_policy); ->setNewValue($v_view_policy);
$xactions[] = id(new PhabricatorPasteTransaction())
->setTransactionType(PhabricatorTransactions::TYPE_EDIT_POLICY)
->setNewValue($v_edit_policy);
$proj_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST; $proj_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST;
$xactions[] = id(new PhabricatorPasteTransaction()) $xactions[] = id(new PhabricatorPasteTransaction())
@ -136,7 +141,8 @@ final class PhabricatorPasteEditController extends PhabricatorPasteController {
} else { } else {
// make sure we update policy so its correctly populated to what // make sure we update policy so its correctly populated to what
// the user chose // the user chose
$paste->setViewPolicy($v_policy); $paste->setViewPolicy($v_view_policy);
$paste->setEditPolicy($v_edit_policy);
} }
} }
@ -174,6 +180,13 @@ final class PhabricatorPasteEditController extends PhabricatorPasteController {
->setPolicies($policies) ->setPolicies($policies)
->setName('can_view')); ->setName('can_view'));
$form->appendChild(
id(new AphrontFormPolicyControl())
->setUser($user)
->setCapability(PhabricatorPolicyCapability::CAN_EDIT)
->setPolicyObject($paste)
->setPolicies($policies)
->setName('can_edit'));
if ($v_projects) { if ($v_projects) {
$project_handles = $this->loadViewerHandles($v_projects); $project_handles = $this->loadViewerHandles($v_projects);

View file

@ -25,6 +25,7 @@ final class PhabricatorPasteEditor
'mime-type' => 'text/plain; charset=utf-8', 'mime-type' => 'text/plain; charset=utf-8',
'authorPHID' => $actor->getPHID(), 'authorPHID' => $actor->getPHID(),
'viewPolicy' => PhabricatorPolicies::POLICY_NOONE, 'viewPolicy' => PhabricatorPolicies::POLICY_NOONE,
'editPolicy' => PhabricatorPolicies::POLICY_NOONE,
)); ));
} }
@ -35,6 +36,7 @@ final class PhabricatorPasteEditor
$types[] = PhabricatorPasteTransaction::TYPE_TITLE; $types[] = PhabricatorPasteTransaction::TYPE_TITLE;
$types[] = PhabricatorPasteTransaction::TYPE_LANGUAGE; $types[] = PhabricatorPasteTransaction::TYPE_LANGUAGE;
$types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY;
$types[] = PhabricatorTransactions::TYPE_EDIT_POLICY;
$types[] = PhabricatorTransactions::TYPE_COMMENT; $types[] = PhabricatorTransactions::TYPE_COMMENT;
return $types; return $types;
@ -83,6 +85,9 @@ final class PhabricatorPasteEditor
case PhabricatorTransactions::TYPE_VIEW_POLICY: case PhabricatorTransactions::TYPE_VIEW_POLICY:
$object->setViewPolicy($xaction->getNewValue()); $object->setViewPolicy($xaction->getNewValue());
return; return;
case PhabricatorTransactions::TYPE_EDIT_POLICY:
$object->setEditPolicy($xaction->getNewValue());
return;
case PhabricatorTransactions::TYPE_COMMENT: case PhabricatorTransactions::TYPE_COMMENT:
case PhabricatorTransactions::TYPE_SUBSCRIBERS: case PhabricatorTransactions::TYPE_SUBSCRIBERS:
case PhabricatorTransactions::TYPE_EDGE: case PhabricatorTransactions::TYPE_EDGE:
@ -101,6 +106,7 @@ final class PhabricatorPasteEditor
case PhabricatorPasteTransaction::TYPE_TITLE: case PhabricatorPasteTransaction::TYPE_TITLE:
case PhabricatorPasteTransaction::TYPE_LANGUAGE: case PhabricatorPasteTransaction::TYPE_LANGUAGE:
case PhabricatorTransactions::TYPE_VIEW_POLICY: case PhabricatorTransactions::TYPE_VIEW_POLICY:
case PhabricatorTransactions::TYPE_EDIT_POLICY:
case PhabricatorTransactions::TYPE_COMMENT: case PhabricatorTransactions::TYPE_COMMENT:
case PhabricatorTransactions::TYPE_SUBSCRIBERS: case PhabricatorTransactions::TYPE_SUBSCRIBERS:
case PhabricatorTransactions::TYPE_EDGE: case PhabricatorTransactions::TYPE_EDGE:

View file

@ -17,6 +17,7 @@ final class PhabricatorPaste extends PhabricatorPasteDAO
protected $language; protected $language;
protected $parentPHID; protected $parentPHID;
protected $viewPolicy; protected $viewPolicy;
protected $editPolicy;
protected $mailKey; protected $mailKey;
private $content = self::ATTACHABLE; private $content = self::ATTACHABLE;
@ -29,11 +30,13 @@ final class PhabricatorPaste extends PhabricatorPasteDAO
->executeOne(); ->executeOne();
$view_policy = $app->getPolicy(PasteDefaultViewCapability::CAPABILITY); $view_policy = $app->getPolicy(PasteDefaultViewCapability::CAPABILITY);
$edit_policy = $app->getPolicy(PasteDefaultEditCapability::CAPABILITY);
return id(new PhabricatorPaste()) return id(new PhabricatorPaste())
->setTitle('') ->setTitle('')
->setAuthorPHID($actor->getPHID()) ->setAuthorPHID($actor->getPHID())
->setViewPolicy($view_policy); ->setViewPolicy($view_policy)
->setEditPolicy($edit_policy);
} }
public function getURI() { public function getURI() {
@ -146,6 +149,8 @@ final class PhabricatorPaste extends PhabricatorPasteDAO
public function getPolicy($capability) { public function getPolicy($capability) {
if ($capability == PhabricatorPolicyCapability::CAN_VIEW) { if ($capability == PhabricatorPolicyCapability::CAN_VIEW) {
return $this->viewPolicy; return $this->viewPolicy;
} else if ($capability == PhabricatorPolicyCapability::CAN_EDIT) {
return $this->editPolicy;
} }
return PhabricatorPolicies::POLICY_NOONE; return PhabricatorPolicies::POLICY_NOONE;
} }