From f5645d8be7c8ef6d915077a88e4be19bb1057b6e Mon Sep 17 00:00:00 2001 From: Jim Graham Date: Fri, 16 Feb 2024 11:27:16 -0500 Subject: [PATCH] =?UTF-8?q?Make=20=E2=80=9Croot=E2=80=9D=20a=20reserved=20?= =?UTF-8?q?key=20for=20Contexts=20(#16475)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### What does it do? 1. Prevents "root" from being specified as a Context key. 2. Slightly refactors the `Create->beforeSave() `error testing conditional to use a `switch` statement so only relevant code will execute in that block. 3. Additionally, in the second commit, leverages the newly-added `RESERVED_KEYS` constant (in the `modContext` base class) in the Context processor `GetList` class. ### Why is it needed? The keyword "root" is used as the default id for all trees in the core. As such, attempting to create a Context with that key results in errors in the rendering of the Resources tree. ### How to test Attempt to create a new Context with the key "root." You should receive an error message indicating the key is reserved. ### Related issue(s)/PR(s) Resolves #16457 --- core/lexicon/en/context.inc.php | 1 + .../Revolution/Processors/Context/Create.php | 21 +++++++++++++------ .../Revolution/Processors/Context/GetList.php | 2 +- core/src/Revolution/modContext.php | 7 +++++++ 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/core/lexicon/en/context.inc.php b/core/lexicon/en/context.inc.php index 405adb938f3..7352df973c2 100644 --- a/core/lexicon/en/context.inc.php +++ b/core/lexicon/en/context.inc.php @@ -18,6 +18,7 @@ $_lang['context_err_ns'] = 'Context not specified.'; $_lang['context_err_ns_key'] = 'Please specify a valid key for the Context.'; $_lang['context_err_remove'] = 'An error occurred while trying to delete the Context.'; +$_lang['context_err_reserved'] = 'The Context key you chose is reserved for system use only. Please specify a different key.'; $_lang['context_err_save'] = 'An error occurred while saving the Context.'; $_lang['context_id'] = 'Ctx ID'; $_lang['context_key'] = 'Context Key'; diff --git a/core/src/Revolution/Processors/Context/Create.php b/core/src/Revolution/Processors/Context/Create.php index ab3c691f5bb..a368d0df17f 100644 --- a/core/src/Revolution/Processors/Context/Create.php +++ b/core/src/Revolution/Processors/Context/Create.php @@ -1,4 +1,5 @@ getProperty('key'); - if (empty($key)) { - $this->addFieldError('key', $this->modx->lexicon('context_err_ns_key')); + + switch (true) { + case empty($key): + $this->addFieldError('key', $this->modx->lexicon('context_err_ns_key')); + break; + case in_array(strtolower($key), $this->classKey::RESERVED_KEYS): + $this->addFieldError('key', $this->modx->lexicon('context_err_reserved')); + break; + case $this->alreadyExists($key): + $this->addFieldError('key', $this->modx->lexicon('context_err_ae')); + // no default } - if ($this->alreadyExists($key)) { - $this->addFieldError('key', $this->modx->lexicon('context_err_ae')); + if ($this->hasErrors()) { + return false; } $this->object->set('key', $key); - return !$this->hasErrors(); + return true; } /** diff --git a/core/src/Revolution/Processors/Context/GetList.php b/core/src/Revolution/Processors/Context/GetList.php index 1fbc0c97249..56aafadbe55 100644 --- a/core/src/Revolution/Processors/Context/GetList.php +++ b/core/src/Revolution/Processors/Context/GetList.php @@ -163,7 +163,7 @@ public function prepareRow(xPDOObject $object) if ($this->canEdit) { $contextArray['perm'][] = 'pedit'; } - if (!in_array($object->get('key'), ['mgr', 'web']) && $this->canRemove) { + if (!in_array($object->get('key'), $this->classKey::RESERVED_KEYS) && $this->canRemove) { $contextArray['perm'][] = 'premove'; } diff --git a/core/src/Revolution/modContext.php b/core/src/Revolution/modContext.php index a4c03e61cb9..a86ca5c44e9 100644 --- a/core/src/Revolution/modContext.php +++ b/core/src/Revolution/modContext.php @@ -23,6 +23,13 @@ */ class modContext extends modAccessibleObject { + /** + * A set of Context keys that are restricted to system use only + * + * @var array RESERVED_KEYS + */ + public const RESERVED_KEYS = ['mgr', 'web', 'root']; + /** * An array of configuration options for this context *