@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
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Allow users to set view policies on files explicitly

Summary: Ref T4589. Allow users to adjust visibility settings on files explicitly. This makes it easier to understand and manage upcoming changes in T4589.

Test Plan: Changed the view policy for a file several times.

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: epriestley

Maniphest Tasks: T4589

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

+128 -5
+2
src/__phutil_library_map__.php
··· 1538 1538 'PhabricatorFileDataController' => 'applications/files/controller/PhabricatorFileDataController.php', 1539 1539 'PhabricatorFileDeleteController' => 'applications/files/controller/PhabricatorFileDeleteController.php', 1540 1540 'PhabricatorFileDropUploadController' => 'applications/files/controller/PhabricatorFileDropUploadController.php', 1541 + 'PhabricatorFileEditController' => 'applications/files/controller/PhabricatorFileEditController.php', 1541 1542 'PhabricatorFileEditor' => 'applications/files/editor/PhabricatorFileEditor.php', 1542 1543 'PhabricatorFileFilePHIDType' => 'applications/files/phid/PhabricatorFileFilePHIDType.php', 1543 1544 'PhabricatorFileImageMacro' => 'applications/macro/storage/PhabricatorFileImageMacro.php', ··· 4354 4355 'PhabricatorFileDataController' => 'PhabricatorFileController', 4355 4356 'PhabricatorFileDeleteController' => 'PhabricatorFileController', 4356 4357 'PhabricatorFileDropUploadController' => 'PhabricatorFileController', 4358 + 'PhabricatorFileEditController' => 'PhabricatorFileController', 4357 4359 'PhabricatorFileEditor' => 'PhabricatorApplicationTransactionEditor', 4358 4360 'PhabricatorFileFilePHIDType' => 'PhabricatorPHIDType', 4359 4361 'PhabricatorFileImageMacro' => array(
+1
src/applications/files/application/PhabricatorFilesApplication.php
··· 50 50 'compose/' => 'PhabricatorFileComposeController', 51 51 'comment/(?P<id>[1-9]\d*)/' => 'PhabricatorFileCommentController', 52 52 'delete/(?P<id>[1-9]\d*)/' => 'PhabricatorFileDeleteController', 53 + 'edit/(?P<id>[1-9]\d*)/' => 'PhabricatorFileEditController', 53 54 'info/(?P<phid>[^/]+)/' => 'PhabricatorFileInfoController', 54 55 'data/(?P<key>[^/]+)/(?P<phid>[^/]+)/.*' 55 56 => 'PhabricatorFileDataController',
+95
src/applications/files/controller/PhabricatorFileEditController.php
··· 1 + <?php 2 + 3 + final class PhabricatorFileEditController extends PhabricatorFileController { 4 + 5 + private $id; 6 + 7 + public function willProcessRequest(array $data) { 8 + $this->id = $data['id']; 9 + } 10 + 11 + public function processRequest() { 12 + $request = $this->getRequest(); 13 + $viewer = $request->getUser(); 14 + 15 + $file = id(new PhabricatorFileQuery()) 16 + ->setViewer($viewer) 17 + ->withIDs(array($this->id)) 18 + ->requireCapabilities( 19 + array( 20 + PhabricatorPolicyCapability::CAN_VIEW, 21 + PhabricatorPolicyCapability::CAN_EDIT, 22 + )) 23 + ->executeOne(); 24 + if (!$file) { 25 + return new Aphront404Response(); 26 + } 27 + 28 + $title = pht('Edit %s', $file->getName()); 29 + $view_uri = '/'.$file->getMonogram(); 30 + 31 + $validation_exception = null; 32 + if ($request->isFormPost()) { 33 + $can_view = $request->getStr('canView'); 34 + 35 + $xactions = array(); 36 + 37 + $xactions[] = id(new PhabricatorFileTransaction()) 38 + ->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY) 39 + ->setNewValue($can_view); 40 + 41 + $editor = id(new PhabricatorFileEditor()) 42 + ->setActor($viewer) 43 + ->setContentSourceFromRequest($request) 44 + ->setContinueOnNoEffect(true); 45 + 46 + try { 47 + $editor->applyTransactions($file, $xactions); 48 + return id(new AphrontRedirectResponse())->setURI($view_uri); 49 + } catch (PhabricatorApplicationTransactionValidationException $ex) { 50 + $validation_exception = $ex; 51 + 52 + $file->setViewPolicy($can_view); 53 + } 54 + } 55 + 56 + 57 + $policies = id(new PhabricatorPolicyQuery()) 58 + ->setViewer($viewer) 59 + ->setObject($file) 60 + ->execute(); 61 + 62 + $form = id(new AphrontFormView()) 63 + ->setUser($viewer) 64 + ->appendChild( 65 + id(new AphrontFormPolicyControl()) 66 + ->setUser($viewer) 67 + ->setCapability(PhabricatorPolicyCapability::CAN_VIEW) 68 + ->setPolicyObject($file) 69 + ->setPolicies($policies) 70 + ->setName('canView')) 71 + ->appendChild( 72 + id(new AphrontFormSubmitControl()) 73 + ->addCancelButton($view_uri) 74 + ->setValue(pht('Save Changes'))); 75 + 76 + $crumbs = $this->buildApplicationCrumbs() 77 + ->addTextCrumb($file->getMonogram(), $view_uri) 78 + ->addTextCrumb(pht('Edit')); 79 + 80 + $object_box = id(new PHUIObjectBoxView()) 81 + ->setHeaderText($title) 82 + ->setValidationException($validation_exception) 83 + ->appendChild($form); 84 + 85 + return $this->buildApplicationPage( 86 + array( 87 + $crumbs, 88 + $object_box, 89 + ), 90 + array( 91 + 'title' => $title, 92 + )); 93 + } 94 + 95 + }
+18 -4
src/applications/files/controller/PhabricatorFileInfoController.php
··· 115 115 116 116 private function buildActionView(PhabricatorFile $file) { 117 117 $request = $this->getRequest(); 118 - $user = $request->getUser(); 118 + $viewer = $request->getUser(); 119 119 120 120 $id = $file->getID(); 121 121 122 + $can_edit = PhabricatorPolicyFilter::hasCapability( 123 + $viewer, 124 + $file, 125 + PhabricatorPolicyCapability::CAN_EDIT); 126 + 122 127 $view = id(new PhabricatorActionListView()) 123 - ->setUser($user) 128 + ->setUser($viewer) 124 129 ->setObjectURI($this->getRequest()->getRequestURI()) 125 130 ->setObject($file); 126 131 ··· 133 138 } else { 134 139 $view->addAction( 135 140 id(new PhabricatorActionView()) 136 - ->setUser($user) 141 + ->setUser($viewer) 137 142 ->setRenderAsForm(true) 138 143 ->setDownload(true) 139 144 ->setName(pht('Download File')) ··· 143 148 144 149 $view->addAction( 145 150 id(new PhabricatorActionView()) 151 + ->setName(pht('Edit File')) 152 + ->setIcon('fa-pencil') 153 + ->setHref($this->getApplicationURI("/edit/{$id}/")) 154 + ->setWorkflow(!$can_edit) 155 + ->setDisabled(!$can_edit)); 156 + 157 + $view->addAction( 158 + id(new PhabricatorActionView()) 146 159 ->setName(pht('Delete File')) 147 160 ->setIcon('fa-times') 148 161 ->setHref($this->getApplicationURI("/delete/{$id}/")) 149 - ->setWorkflow(true)); 162 + ->setWorkflow(true) 163 + ->setDisabled(!$can_edit)); 150 164 151 165 return $view; 152 166 }
+1 -1
src/applications/files/controller/PhabricatorFileShortcutController.php
··· 18 18 return new Aphront404Response(); 19 19 } 20 20 21 - return id(new AphrontRedirectResponse())->setURI($file->getBestURI()); 21 + return id(new AphrontRedirectResponse())->setURI($file->getInfoURI()); 22 22 } 23 23 24 24 }
+7
src/applications/files/editor/PhabricatorFileEditor.php
··· 7 7 $types = parent::getTransactionTypes(); 8 8 9 9 $types[] = PhabricatorTransactions::TYPE_COMMENT; 10 + $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; 10 11 11 12 return $types; 12 13 } ··· 26 27 protected function applyCustomInternalTransaction( 27 28 PhabricatorLiskDAO $object, 28 29 PhabricatorApplicationTransaction $xaction) { 30 + 31 + switch ($xaction->getTransactionType()) { 32 + case PhabricatorTransactions::TYPE_VIEW_POLICY: 33 + $object->setViewPolicy($xaction->getNewValue()); 34 + break; 35 + } 29 36 } 30 37 31 38 protected function applyCustomExternalTransaction(
+4
src/applications/files/storage/PhabricatorFile.php
··· 56 56 return parent::save(); 57 57 } 58 58 59 + public function getMonogram() { 60 + return 'F'.$this->getID(); 61 + } 62 + 59 63 public static function readUploadedFileData($spec) { 60 64 if (!$spec) { 61 65 throw new Exception('No file was uploaded!');