Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15385264
D17757.id42770.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
16 KB
Referenced Files
None
Subscribers
None
D17757.id42770.diff
View Options
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
@@ -1847,9 +1847,12 @@
'PhabricatorApplicationDatasource' => 'applications/meta/typeahead/PhabricatorApplicationDatasource.php',
'PhabricatorApplicationDetailViewController' => 'applications/meta/controller/PhabricatorApplicationDetailViewController.php',
'PhabricatorApplicationEditController' => 'applications/meta/controller/PhabricatorApplicationEditController.php',
+ 'PhabricatorApplicationEditEngine' => 'applications/meta/editor/PhabricatorApplicationEditEngine.php',
'PhabricatorApplicationEditHTTPParameterHelpView' => 'applications/transactions/view/PhabricatorApplicationEditHTTPParameterHelpView.php',
+ 'PhabricatorApplicationEditor' => 'applications/meta/editor/PhabricatorApplicationEditor.php',
'PhabricatorApplicationEmailCommandsController' => 'applications/meta/controller/PhabricatorApplicationEmailCommandsController.php',
'PhabricatorApplicationPanelController' => 'applications/meta/controller/PhabricatorApplicationPanelController.php',
+ 'PhabricatorApplicationPolicyChangeTransaction' => 'applications/meta/xactions/PhabricatorApplicationPolicyChangeTransaction.php',
'PhabricatorApplicationProfileMenuItem' => 'applications/search/menuitem/PhabricatorApplicationProfileMenuItem.php',
'PhabricatorApplicationQuery' => 'applications/meta/query/PhabricatorApplicationQuery.php',
'PhabricatorApplicationSchemaSpec' => 'applications/meta/storage/PhabricatorApplicationSchemaSpec.php',
@@ -6848,9 +6851,12 @@
'PhabricatorApplicationDatasource' => 'PhabricatorTypeaheadDatasource',
'PhabricatorApplicationDetailViewController' => 'PhabricatorApplicationsController',
'PhabricatorApplicationEditController' => 'PhabricatorApplicationsController',
+ 'PhabricatorApplicationEditEngine' => 'PhabricatorEditEngine',
'PhabricatorApplicationEditHTTPParameterHelpView' => 'AphrontView',
+ 'PhabricatorApplicationEditor' => 'PhabricatorApplicationTransactionEditor',
'PhabricatorApplicationEmailCommandsController' => 'PhabricatorApplicationsController',
'PhabricatorApplicationPanelController' => 'PhabricatorApplicationsController',
+ 'PhabricatorApplicationPolicyChangeTransaction' => 'PhabricatorApplicationTransactionType',
'PhabricatorApplicationProfileMenuItem' => 'PhabricatorProfileMenuItem',
'PhabricatorApplicationQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'PhabricatorApplicationSchemaSpec' => 'PhabricatorConfigSchemaSpec',
diff --git a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
--- a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
+++ b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
@@ -38,6 +38,11 @@
$header->setStatus('fa-ban', 'dark', pht('Uninstalled'));
}
+ $timeline = $this->buildTransactionTimeline(
+ $selected,
+ new PhabricatorApplicationApplicationTransactionQuery());
+ $timeline->setShouldTerminate(true);
+
$curtain = $this->buildCurtain($selected);
$details = $this->buildPropertySectionView($selected);
$policies = $this->buildPolicyView($selected);
@@ -61,6 +66,7 @@
->setMainColumn(array(
$policies,
$panels,
+ $timeline,
))
->addPropertySection(pht('Details'), $details);
diff --git a/src/applications/meta/controller/PhabricatorApplicationEditController.php b/src/applications/meta/controller/PhabricatorApplicationEditController.php
--- a/src/applications/meta/controller/PhabricatorApplicationEditController.php
+++ b/src/applications/meta/controller/PhabricatorApplicationEditController.php
@@ -30,11 +30,15 @@
->execute();
if ($request->isFormPost()) {
+ $xactions = array();
+
$result = array();
+ $template = $application->getApplicationTransactionTemplate();
foreach ($application->getCapabilities() as $capability) {
$old = $application->getPolicy($capability);
$new = $request->getStr('policy:'.$capability);
+ // XXX what if new is null?
if ($old == $new) {
// No change to the setting.
continue;
@@ -63,41 +67,23 @@
}
$result[$capability] = $new;
+
+ $xactions[] = id(clone $template)
+ ->setTransactionType(
+ PhabricatorApplicationPolicyChangeTransaction::TRANSACTIONTYPE)
+ ->setMetadataValue('capability.name', $capability)
+ ->setNewValue($new);
}
if ($result) {
- $key = 'phabricator.application-settings';
- $config_entry = PhabricatorConfigEntry::loadConfigEntry($key);
- $value = $config_entry->getValue();
-
- $phid = $application->getPHID();
- if (empty($value[$phid])) {
- $value[$application->getPHID()] = array();
- }
- if (empty($value[$phid]['policy'])) {
- $value[$phid]['policy'] = array();
- }
-
- $value[$phid]['policy'] = $result + $value[$phid]['policy'];
-
- // Don't allow users to make policy edits which would lock them out of
- // applications, since they would be unable to undo those actions.
- PhabricatorEnv::overrideConfig($key, $value);
- PhabricatorPolicyFilter::mustRetainCapability(
- $user,
- $application,
- PhabricatorPolicyCapability::CAN_VIEW);
-
- PhabricatorPolicyFilter::mustRetainCapability(
- $user,
- $application,
- PhabricatorPolicyCapability::CAN_EDIT);
-
- PhabricatorConfigEditor::storeNewValue(
- $user,
- $config_entry,
- $value,
- PhabricatorContentSource::newFromRequest($request));
+ // $this->simulateNewConfig($application, $user, $result);
+
+ id(new PhabricatorApplicationEditor())
+ ->setActor($user)
+ ->setContentSourceFromRequest($request)
+ ->setContinueOnNoEffect(true)
+ ->setContinueOnMissingFields(true)
+ ->applyTransactions($application, $xactions);
}
return id(new AphrontRedirectResponse())->setURI($view_uri);
@@ -194,4 +180,36 @@
->appendChild($view);
}
+ private function simulateNewConfig(
+ PhabricatorApplication $application,
+ PhabricatorUser $user,
+ array $new_config) {
+ $key = 'phabricator.application-settings';
+ $config_entry = PhabricatorConfigEntry::loadConfigEntry($key);
+ $value = $config_entry->getValue();
+
+ $phid = $application->getPHID();
+ if (empty($value[$phid])) {
+ $value[$application->getPHID()] = array();
+ }
+ if (empty($value[$phid]['policy'])) {
+ $value[$phid]['policy'] = array();
+ }
+
+ $value[$phid]['policy'] = $new_config + $value[$phid]['policy'];
+
+ // Don't allow users to make policy edits which would lock them out of
+ // applications, since they would be unable to undo those actions.
+ PhabricatorEnv::overrideConfig($key, $value);
+ PhabricatorPolicyFilter::mustRetainCapability(
+ $user,
+ $application,
+ PhabricatorPolicyCapability::CAN_VIEW);
+
+ PhabricatorPolicyFilter::mustRetainCapability(
+ $user,
+ $application,
+ PhabricatorPolicyCapability::CAN_EDIT);
+ }
+
}
diff --git a/src/applications/meta/editor/PhabricatorApplicationEditEngine.php b/src/applications/meta/editor/PhabricatorApplicationEditEngine.php
new file mode 100644
--- /dev/null
+++ b/src/applications/meta/editor/PhabricatorApplicationEditEngine.php
@@ -0,0 +1,64 @@
+<?php
+
+final class PhabricatorApplicationEditEngine
+ extends PhabricatorEditEngine {
+
+ const ENGINECONST = 'application.application';
+
+ public function getEngineApplicationClass() {
+ return 'PhabricatorApplicationsApplication';
+ }
+
+ public function getEngineName() {
+ return pht('Applications');
+ }
+
+ public function getSummaryHeader() {
+ return pht('Configure Application Forms');
+ }
+
+ public function getSummaryText() {
+ return pht('Configure creation and editing forms in Applications.');
+ }
+
+ public function isEngineConfigurable() {
+ return false;
+ }
+
+ protected function newEditableObject() {
+ throw new PhutilMethodNotImplementedException();
+ }
+
+ protected function newObjectQuery() {
+ return new PhabricatorApplicationQuery();
+ }
+
+ protected function getObjectCreateTitleText($object) {
+ return pht('Create New Application');
+ }
+
+ protected function getObjectEditTitleText($object) {
+ return pht('Edit Application: %s', $object->getName());
+ }
+
+ protected function getObjectEditShortText($object) {
+ return $object->getName();
+ }
+
+ protected function getObjectCreateShortText() {
+ return pht('Create Application');
+ }
+
+ protected function getObjectName() {
+ return pht('Application');
+ }
+
+ protected function getObjectViewURI($object) {
+ return $object->getViewURI();
+ }
+
+ protected function buildCustomEditFields($object) {
+ return array();
+ }
+
+}
diff --git a/src/applications/meta/editor/PhabricatorApplicationEditor.php b/src/applications/meta/editor/PhabricatorApplicationEditor.php
new file mode 100644
--- /dev/null
+++ b/src/applications/meta/editor/PhabricatorApplicationEditor.php
@@ -0,0 +1,42 @@
+<?php
+
+final class PhabricatorApplicationEditor
+ extends PhabricatorApplicationTransactionEditor {
+
+ public function getEditorApplicationClass() {
+ return 'PhabricatorApplicationsApplication';
+ }
+
+ public function getEditorObjectsDescription() {
+ return pht('Application');
+ }
+
+ protected function supportsSearch() {
+ return true;
+ }
+
+ public function getTransactionTypes() {
+ $types = parent::getTransactionTypes();
+ $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY;
+ $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY;
+
+ return $types;
+ }
+
+ protected function shouldSendMail(
+ PhabricatorLiskDAO $object,
+ array $xactions) {
+ return false;
+ }
+
+ protected function shouldPublishFeedStory(
+ PhabricatorLiskDAO $object,
+ array $xactions) {
+ return true;
+ }
+
+ protected function getMailTo(PhabricatorLiskDAO $object) {
+ return array();
+ }
+
+}
diff --git a/src/applications/meta/storage/PhabricatorApplicationApplicationTransaction.php b/src/applications/meta/storage/PhabricatorApplicationApplicationTransaction.php
--- a/src/applications/meta/storage/PhabricatorApplicationApplicationTransaction.php
+++ b/src/applications/meta/storage/PhabricatorApplicationApplicationTransaction.php
@@ -11,10 +11,6 @@
return PhabricatorApplicationApplicationPHIDType::TYPECONST;
}
- public function getApplicationTransactionCommentObject() {
- return new PhabricatorApplicationTransactionComment();
- }
-
public function getBaseTransactionClass() {
return 'PhabricatorApplicationTransactionType';
}
diff --git a/src/applications/meta/xactions/PhabricatorApplicationPolicyChangeTransaction.php b/src/applications/meta/xactions/PhabricatorApplicationPolicyChangeTransaction.php
new file mode 100644
--- /dev/null
+++ b/src/applications/meta/xactions/PhabricatorApplicationPolicyChangeTransaction.php
@@ -0,0 +1,121 @@
+<?php
+
+final class PhabricatorApplicationPolicyChangeTransaction
+ extends PhabricatorApplicationTransactionType {
+
+ const TRANSACTIONTYPE = 'application.policy';
+
+ private $policies;
+
+ public function generateOldValue($object) {
+ $application = $object;
+ $capability = $this->getCapabilityName();
+ return $application->getPolicy($capability);
+ }
+
+ public function applyInternalEffects($object, $value) {
+ $application = $object;
+ $user = $this->getViewer();
+
+ $key = 'phabricator.application-settings';
+ $config_entry = PhabricatorConfigEntry::loadConfigEntry($key);
+ $current_value = $config_entry->getValue();
+
+ $phid = $application->getPHID();
+ if (empty($current_value[$phid])) {
+ $current_value[$application->getPHID()] = array();
+ }
+ if (empty($current_value[$phid]['policy'])) {
+ $current_value[$phid]['policy'] = array();
+ }
+
+ $update = array($this->getCapabilityName() => $value);
+
+ $current_value[$phid]['policy'] = $update + $current_value[$phid]['policy'];
+
+ PhabricatorConfigEditor::storeNewValue(
+ $user,
+ $config_entry,
+ $current_value,
+ PhabricatorContentSource::newForSource('xaction', array(), $force = true));
+ }
+
+ public function getTitle() {
+ $old = $this->renderPolicy($this->getOldValue());
+ $new = $this->renderPolicy($this->getNewValue());
+
+ // austin changed the "View Badges" policy from "Administrators" to "No One"
+ return pht(
+ '%s changed the "%s" policy from %s to %s.',
+ $this->renderAuthor(),
+ $this->renderCapability(),
+ $old,
+ $new);
+ }
+
+ public function getTitleForFeed() {
+ $old = $this->renderPolicy($this->getOldValue());
+ $new = $this->renderPolicy($this->getNewValue());
+
+ // austin changed the "Can Use Application" policy for application
+ // "Badges" from "No One" to "All Users"
+ return pht(
+ '%s changed the "%s" policy for application %s from "%s" to "%s".',
+ $this->renderAuthor(),
+ $this->renderCapability(),
+ $this->renderObject(),
+ $old,
+ $new);
+ }
+
+ public function validateTransactions($object, array $xactions) {
+ $errors = array();
+
+ // TODO should we simulate the policies here instead of before creating the
+ // actions?
+
+ return $errors;
+ }
+
+ // "Administrators", "No One", etc
+ private function renderPolicy($name) {
+ $policies = $this->getAllPolicies();
+
+ $policy_obj = idx($policies, $name);
+ if ($policy_obj !== null) {
+ $policy_label = $policy_obj->getName();
+ } else {
+ $policy_label = $name;
+ }
+
+ return $this->renderValue($policy_label);
+ }
+
+ private function getAllPolicies() {
+ if (!$this->policies) {
+ // cant use PhabricatorPolicyQuery::renderPolicyDescriptions(), because
+ // that only returns:
+ // array($capability => $currently_configured_policy_description)
+ $viewer = $this->getViewer();
+ $application = $this->getObject();
+ $this->policies = id(new PhabricatorPolicyQuery())
+ ->setViewer($viewer)
+ ->setObject($application)
+ ->execute();
+ }
+
+ return $this->policies;
+ }
+
+ // Should be like "View", "Edit", etc
+ private function renderCapability() {
+ $application = $this->getObject();
+ $capability = $this->getCapabilityName();
+ return $application->getCapabilityLabel($capability);
+ }
+
+ private function getCapabilityName() {
+ return $this->getMetadataValue('capability.name');
+ }
+
+}
diff --git a/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php b/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php
--- a/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php
+++ b/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php
@@ -322,6 +322,8 @@
$xtype = $this->getModularTransactionType($type);
if ($xtype) {
+ $xtype = clone $xtype;
+ $xtype->setStorage($xaction);
return $xtype->generateOldValue($object);
}
@@ -402,6 +404,8 @@
$xtype = $this->getModularTransactionType($type);
if ($xtype) {
+ $xtype = clone $xtype;
+ $xtype->setStorage($xaction);
return $xtype->generateNewValue($object, $xaction->getNewValue());
}
@@ -541,6 +545,9 @@
$xtype = $this->getModularTransactionType($type);
if ($xtype) {
+ $xtype = clone $xtype;
+ $xtype->setStorage($xaction);
+ $xtype->setViewer($xaction->getViewer());
return $xtype->applyInternalEffects($object, $xaction->getNewValue());
}
@@ -2714,6 +2721,10 @@
$has_support = true;
}
+ if ($object instanceof PhabricatorApplication) {
+ $has_support = true;
+ }
+
if ($object instanceof PhabricatorProjectInterface) {
$project_phids = PhabricatorEdgeQuery::loadDestinationPHIDs(
$object->getPHID(),
diff --git a/src/applications/transactions/storage/PhabricatorModularTransactionType.php b/src/applications/transactions/storage/PhabricatorModularTransactionType.php
--- a/src/applications/transactions/storage/PhabricatorModularTransactionType.php
+++ b/src/applications/transactions/storage/PhabricatorModularTransactionType.php
@@ -315,4 +315,8 @@
return $editor->getPHIDList($old, $new);
}
+ public function getMetadataValue($key, $default = null) {
+ return $this->getStorage()->getMetadataValue($key, $default);
+ }
+
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Mar 15, 10:06 PM (3 d, 18 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7704100
Default Alt Text
D17757.id42770.diff (16 KB)
Attached To
Mode
D17757: Implement modular transactions for application policy changes
Attached
Detach File
Event Timeline
Log In to Comment