From 0943561dcb780596a13a6c34b9090bfebe825dfa Mon Sep 17 00:00:00 2001 From: epriestley Date: Tue, 27 Aug 2019 07:05:11 -0700 Subject: [PATCH] Fix incorrect construction of subtype map when validating "subtype" transactions against non-subtypable objects Summary: Fixes T13389. Currently, we try to "newSubtypeMap()" unconditionally, even if the underlying object does not support subtypes. - Only try to build a subtype map if subtype transactions are actually being applied. - When subtype transactions are applied to a non-subtypable object, fail more explicitly. Test Plan: Clicked "Make Editable" in a fresh Calendar transaction form, got an editable form instead of a fatal from "newSubtypeMap()". (Calendar events are not currently subtypable.) Maniphest Tasks: T13389 Differential Revision: https://secure.phabricator.com/D20741 --- ...habricatorEditEngineSubtypeTransaction.php | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/applications/transactions/xaction/PhabricatorEditEngineSubtypeTransaction.php b/src/applications/transactions/xaction/PhabricatorEditEngineSubtypeTransaction.php index 53ec221631..a2a8538115 100644 --- a/src/applications/transactions/xaction/PhabricatorEditEngineSubtypeTransaction.php +++ b/src/applications/transactions/xaction/PhabricatorEditEngineSubtypeTransaction.php @@ -25,11 +25,30 @@ final class PhabricatorEditEngineSubtypeTransaction } public function validateTransactions($object, array $xactions) { - $map = $object->getEngine() + $errors = array(); + + if (!$xactions) { + return $errors; + } + + $engine = $object->getEngine(); + + if (!$engine->supportsSubtypes()) { + foreach ($xactions as $xaction) { + $errors[] = $this->newInvalidError( + pht( + 'Edit engine (of class "%s") does not support subtypes, so '. + 'subtype transactions can not be applied to it.', + get_class($engine)), + $xaction); + } + return $errors; + } + + $map = $engine ->setViewer($this->getActor()) ->newSubtypeMap(); - $errors = array(); foreach ($xactions as $xaction) { $new = $xaction->getNewValue();