Differential D13159 Diff 31835 src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php
Show First 20 Lines • Show All 258 Lines • ▼ Show 20 Lines | if ($this->object instanceof PhabricatorTokenReceiverInterface) { | ||||
$types[] = PhabricatorTransactions::TYPE_TOKEN; | $types[] = PhabricatorTransactions::TYPE_TOKEN; | ||||
} | } | ||||
if ($this->object instanceof PhabricatorProjectInterface || | if ($this->object instanceof PhabricatorProjectInterface || | ||||
$this->object instanceof PhabricatorMentionableInterface) { | $this->object instanceof PhabricatorMentionableInterface) { | ||||
$types[] = PhabricatorTransactions::TYPE_EDGE; | $types[] = PhabricatorTransactions::TYPE_EDGE; | ||||
} | } | ||||
if ($this->object instanceof PhabricatorSpacesInterface) { | |||||
$types[] = PhabricatorTransactions::TYPE_SPACE; | |||||
} | |||||
return $types; | return $types; | ||||
} | } | ||||
private function adjustTransactionValues( | private function adjustTransactionValues( | ||||
PhabricatorLiskDAO $object, | PhabricatorLiskDAO $object, | ||||
PhabricatorApplicationTransaction $xaction) { | PhabricatorApplicationTransaction $xaction) { | ||||
if ($xaction->shouldGenerateOldValue()) { | if ($xaction->shouldGenerateOldValue()) { | ||||
Show All 12 Lines | switch ($xaction->getTransactionType()) { | ||||
case PhabricatorTransactions::TYPE_SUBSCRIBERS: | case PhabricatorTransactions::TYPE_SUBSCRIBERS: | ||||
return array_values($this->subscribers); | return array_values($this->subscribers); | ||||
case PhabricatorTransactions::TYPE_VIEW_POLICY: | case PhabricatorTransactions::TYPE_VIEW_POLICY: | ||||
return $object->getViewPolicy(); | return $object->getViewPolicy(); | ||||
case PhabricatorTransactions::TYPE_EDIT_POLICY: | case PhabricatorTransactions::TYPE_EDIT_POLICY: | ||||
return $object->getEditPolicy(); | return $object->getEditPolicy(); | ||||
case PhabricatorTransactions::TYPE_JOIN_POLICY: | case PhabricatorTransactions::TYPE_JOIN_POLICY: | ||||
return $object->getJoinPolicy(); | return $object->getJoinPolicy(); | ||||
case PhabricatorTransactions::TYPE_SPACE: | |||||
$space_phid = $object->getSpacePHID(); | |||||
if ($space_phid === null) { | |||||
if ($this->getIsNewObject()) { | |||||
// In this case, just return `null` so we know this is the initial | |||||
// transaction and it should be hidden. | |||||
return null; | |||||
} | |||||
$default_space = PhabricatorSpacesNamespaceQuery::getDefaultSpace(); | |||||
if ($default_space) { | |||||
$space_phid = $default_space->getPHID(); | |||||
} | |||||
} | |||||
return $space_phid; | |||||
case PhabricatorTransactions::TYPE_EDGE: | case PhabricatorTransactions::TYPE_EDGE: | ||||
$edge_type = $xaction->getMetadataValue('edge:type'); | $edge_type = $xaction->getMetadataValue('edge:type'); | ||||
if (!$edge_type) { | if (!$edge_type) { | ||||
throw new Exception( | throw new Exception( | ||||
pht( | pht( | ||||
"Edge transaction has no '%s'!", | "Edge transaction has no '%s'!", | ||||
'edge:type')); | 'edge:type')); | ||||
} | } | ||||
Show All 29 Lines | switch ($xaction->getTransactionType()) { | ||||
case PhabricatorTransactions::TYPE_SUBSCRIBERS: | case PhabricatorTransactions::TYPE_SUBSCRIBERS: | ||||
return $this->getPHIDTransactionNewValue($xaction); | return $this->getPHIDTransactionNewValue($xaction); | ||||
case PhabricatorTransactions::TYPE_VIEW_POLICY: | case PhabricatorTransactions::TYPE_VIEW_POLICY: | ||||
case PhabricatorTransactions::TYPE_EDIT_POLICY: | case PhabricatorTransactions::TYPE_EDIT_POLICY: | ||||
case PhabricatorTransactions::TYPE_JOIN_POLICY: | case PhabricatorTransactions::TYPE_JOIN_POLICY: | ||||
case PhabricatorTransactions::TYPE_BUILDABLE: | case PhabricatorTransactions::TYPE_BUILDABLE: | ||||
case PhabricatorTransactions::TYPE_TOKEN: | case PhabricatorTransactions::TYPE_TOKEN: | ||||
case PhabricatorTransactions::TYPE_INLINESTATE: | case PhabricatorTransactions::TYPE_INLINESTATE: | ||||
return $xaction->getNewValue(); | case PhabricatorTransactions::TYPE_SPACE: | ||||
$space_phid = $xaction->getNewValue(); | |||||
if (!strlen($space_phid)) { | |||||
// If an install has no Spaces, we might end up with the empty string | |||||
// here instead of a strict `null`. Just make this work like callers | |||||
// might reasonably expect. | |||||
return null; | |||||
} else { | |||||
return $space_phid; | |||||
} | |||||
case PhabricatorTransactions::TYPE_EDGE: | case PhabricatorTransactions::TYPE_EDGE: | ||||
return $this->getEdgeTransactionNewValue($xaction); | return $this->getEdgeTransactionNewValue($xaction); | ||||
case PhabricatorTransactions::TYPE_CUSTOMFIELD: | case PhabricatorTransactions::TYPE_CUSTOMFIELD: | ||||
$field = $this->getCustomFieldForTransaction($object, $xaction); | $field = $this->getCustomFieldForTransaction($object, $xaction); | ||||
return $field->getNewValueFromApplicationTransactions($xaction); | return $field->getNewValueFromApplicationTransactions($xaction); | ||||
case PhabricatorTransactions::TYPE_COMMENT: | case PhabricatorTransactions::TYPE_COMMENT: | ||||
return null; | return null; | ||||
default: | default: | ||||
▲ Show 20 Lines • Show All 83 Lines • ▼ Show 20 Lines | switch ($xaction->getTransactionType()) { | ||||
case PhabricatorTransactions::TYPE_BUILDABLE: | case PhabricatorTransactions::TYPE_BUILDABLE: | ||||
case PhabricatorTransactions::TYPE_TOKEN: | case PhabricatorTransactions::TYPE_TOKEN: | ||||
case PhabricatorTransactions::TYPE_VIEW_POLICY: | case PhabricatorTransactions::TYPE_VIEW_POLICY: | ||||
case PhabricatorTransactions::TYPE_EDIT_POLICY: | case PhabricatorTransactions::TYPE_EDIT_POLICY: | ||||
case PhabricatorTransactions::TYPE_JOIN_POLICY: | case PhabricatorTransactions::TYPE_JOIN_POLICY: | ||||
case PhabricatorTransactions::TYPE_SUBSCRIBERS: | case PhabricatorTransactions::TYPE_SUBSCRIBERS: | ||||
case PhabricatorTransactions::TYPE_INLINESTATE: | case PhabricatorTransactions::TYPE_INLINESTATE: | ||||
case PhabricatorTransactions::TYPE_EDGE: | case PhabricatorTransactions::TYPE_EDGE: | ||||
case PhabricatorTransactions::TYPE_SPACE: | |||||
case PhabricatorTransactions::TYPE_COMMENT: | case PhabricatorTransactions::TYPE_COMMENT: | ||||
return $this->applyBuiltinInternalTransaction($object, $xaction); | return $this->applyBuiltinInternalTransaction($object, $xaction); | ||||
} | } | ||||
return $this->applyCustomInternalTransaction($object, $xaction); | return $this->applyCustomInternalTransaction($object, $xaction); | ||||
} | } | ||||
private function applyExternalEffects( | private function applyExternalEffects( | ||||
Show All 32 Lines | switch ($xaction->getTransactionType()) { | ||||
return $field->applyApplicationTransactionExternalEffects($xaction); | return $field->applyApplicationTransactionExternalEffects($xaction); | ||||
case PhabricatorTransactions::TYPE_EDGE: | case PhabricatorTransactions::TYPE_EDGE: | ||||
case PhabricatorTransactions::TYPE_BUILDABLE: | case PhabricatorTransactions::TYPE_BUILDABLE: | ||||
case PhabricatorTransactions::TYPE_TOKEN: | case PhabricatorTransactions::TYPE_TOKEN: | ||||
case PhabricatorTransactions::TYPE_VIEW_POLICY: | case PhabricatorTransactions::TYPE_VIEW_POLICY: | ||||
case PhabricatorTransactions::TYPE_EDIT_POLICY: | case PhabricatorTransactions::TYPE_EDIT_POLICY: | ||||
case PhabricatorTransactions::TYPE_JOIN_POLICY: | case PhabricatorTransactions::TYPE_JOIN_POLICY: | ||||
case PhabricatorTransactions::TYPE_INLINESTATE: | case PhabricatorTransactions::TYPE_INLINESTATE: | ||||
case PhabricatorTransactions::TYPE_SPACE: | |||||
case PhabricatorTransactions::TYPE_COMMENT: | case PhabricatorTransactions::TYPE_COMMENT: | ||||
return $this->applyBuiltinExternalTransaction($object, $xaction); | return $this->applyBuiltinExternalTransaction($object, $xaction); | ||||
} | } | ||||
return $this->applyCustomExternalTransaction($object, $xaction); | return $this->applyCustomExternalTransaction($object, $xaction); | ||||
} | } | ||||
protected function applyCustomInternalTransaction( | protected function applyCustomInternalTransaction( | ||||
Show All 36 Lines | switch ($xaction->getTransactionType()) { | ||||
$object->setViewPolicy($xaction->getNewValue()); | $object->setViewPolicy($xaction->getNewValue()); | ||||
break; | break; | ||||
case PhabricatorTransactions::TYPE_EDIT_POLICY: | case PhabricatorTransactions::TYPE_EDIT_POLICY: | ||||
$object->setEditPolicy($xaction->getNewValue()); | $object->setEditPolicy($xaction->getNewValue()); | ||||
break; | break; | ||||
case PhabricatorTransactions::TYPE_JOIN_POLICY: | case PhabricatorTransactions::TYPE_JOIN_POLICY: | ||||
$object->setJoinPolicy($xaction->getNewValue()); | $object->setJoinPolicy($xaction->getNewValue()); | ||||
break; | break; | ||||
case PhabricatorTransactions::TYPE_SPACE: | |||||
$object->setSpacePHID($xaction->getNewValue()); | |||||
break; | |||||
} | } | ||||
} | } | ||||
/** | /** | ||||
* See @{method::applyBuiltinInternalTransaction}. | * See @{method::applyBuiltinInternalTransaction}. | ||||
*/ | */ | ||||
protected function applyBuiltinExternalTransaction( | protected function applyBuiltinExternalTransaction( | ||||
PhabricatorLiskDAO $object, | PhabricatorLiskDAO $object, | ||||
▲ Show 20 Lines • Show All 637 Lines • ▼ Show 20 Lines | protected function requireCapabilities( | ||||
switch ($xaction->getTransactionType()) { | switch ($xaction->getTransactionType()) { | ||||
case PhabricatorTransactions::TYPE_COMMENT: | case PhabricatorTransactions::TYPE_COMMENT: | ||||
PhabricatorPolicyFilter::requireCapability( | PhabricatorPolicyFilter::requireCapability( | ||||
$actor, | $actor, | ||||
$object, | $object, | ||||
PhabricatorPolicyCapability::CAN_VIEW); | PhabricatorPolicyCapability::CAN_VIEW); | ||||
break; | break; | ||||
case PhabricatorTransactions::TYPE_VIEW_POLICY: | case PhabricatorTransactions::TYPE_VIEW_POLICY: | ||||
PhabricatorPolicyFilter::requireCapability( | |||||
$actor, | |||||
$object, | |||||
PhabricatorPolicyCapability::CAN_EDIT); | |||||
break; | |||||
case PhabricatorTransactions::TYPE_EDIT_POLICY: | case PhabricatorTransactions::TYPE_EDIT_POLICY: | ||||
PhabricatorPolicyFilter::requireCapability( | |||||
$actor, | |||||
$object, | |||||
PhabricatorPolicyCapability::CAN_EDIT); | |||||
break; | |||||
case PhabricatorTransactions::TYPE_JOIN_POLICY: | case PhabricatorTransactions::TYPE_JOIN_POLICY: | ||||
case PhabricatorTransactions::TYPE_SPACE: | |||||
PhabricatorPolicyFilter::requireCapability( | PhabricatorPolicyFilter::requireCapability( | ||||
$actor, | $actor, | ||||
$object, | $object, | ||||
PhabricatorPolicyCapability::CAN_EDIT); | PhabricatorPolicyCapability::CAN_EDIT); | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
▲ Show 20 Lines • Show All 664 Lines • ▼ Show 20 Lines | switch ($type) { | ||||
break; | break; | ||||
case PhabricatorTransactions::TYPE_EDIT_POLICY: | case PhabricatorTransactions::TYPE_EDIT_POLICY: | ||||
$errors[] = $this->validatePolicyTransaction( | $errors[] = $this->validatePolicyTransaction( | ||||
$object, | $object, | ||||
$xactions, | $xactions, | ||||
$type, | $type, | ||||
PhabricatorPolicyCapability::CAN_EDIT); | PhabricatorPolicyCapability::CAN_EDIT); | ||||
break; | break; | ||||
case PhabricatorTransactions::TYPE_SPACE: | |||||
$errors[] = $this->validateSpaceTransactions( | |||||
$object, | |||||
$xactions, | |||||
$type); | |||||
break; | |||||
case PhabricatorTransactions::TYPE_CUSTOMFIELD: | case PhabricatorTransactions::TYPE_CUSTOMFIELD: | ||||
$groups = array(); | $groups = array(); | ||||
foreach ($xactions as $xaction) { | foreach ($xactions as $xaction) { | ||||
$groups[$xaction->getMetadataValue('customfield:key')][] = $xaction; | $groups[$xaction->getMetadataValue('customfield:key')][] = $xaction; | ||||
} | } | ||||
$field_list = PhabricatorCustomField::getObjectFields( | $field_list = PhabricatorCustomField::getObjectFields( | ||||
$object, | $object, | ||||
▲ Show 20 Lines • Show All 70 Lines • ▼ Show 20 Lines | if ($this->getIsNewObject()) { | ||||
$capability)); | $capability)); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
return $errors; | return $errors; | ||||
} | } | ||||
private function validateSpaceTransactions( | |||||
PhabricatorLiskDAO $object, | |||||
array $xactions, | |||||
$transaction_type) { | |||||
$errors = array(); | |||||
$all_spaces = PhabricatorSpacesNamespaceQuery::getAllSpaces(); | |||||
$viewer_spaces = PhabricatorSpacesNamespaceQuery::getViewerSpaces( | |||||
$this->getActor()); | |||||
foreach ($xactions as $xaction) { | |||||
$space_phid = $xaction->getNewValue(); | |||||
if ($space_phid === null) { | |||||
if (!$all_spaces) { | |||||
// The install doesn't have any spaces, so this is fine. | |||||
continue; | |||||
} | |||||
// The install has some spaces, so every object needs to be put | |||||
// in a valid space. | |||||
$errors[] = new PhabricatorApplicationTransactionValidationError( | |||||
$transaction_type, | |||||
pht('Invalid'), | |||||
pht('You must choose a space for this object.'), | |||||
$xaction); | |||||
continue; | |||||
} | |||||
// If the PHID isn't `null`, it needs to be a valid space that the | |||||
// viewer can see. | |||||
if (empty($viewer_spaces[$space_phid])) { | |||||
$errors[] = new PhabricatorApplicationTransactionValidationError( | |||||
$transaction_type, | |||||
pht('Invalid'), | |||||
pht( | |||||
'You can not shift this object in the selected space, because '. | |||||
btrahan: maybe shift into or what have you instead of put? | |||||
'the space does not exist or you do not have access to it.'), | |||||
$xaction); | |||||
} | |||||
} | |||||
return $errors; | |||||
} | |||||
protected function adjustObjectForPolicyChecks( | protected function adjustObjectForPolicyChecks( | ||||
PhabricatorLiskDAO $object, | PhabricatorLiskDAO $object, | ||||
array $xactions) { | array $xactions) { | ||||
return clone $object; | return clone $object; | ||||
} | } | ||||
protected function validateAllTransactions( | protected function validateAllTransactions( | ||||
▲ Show 20 Lines • Show All 1,004 Lines • Show Last 20 Lines |
maybe shift into or what have you instead of put?