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 23895b5dbfb..97a32c691f8 100644 --- a/core/src/Revolution/Processors/Context/GetList.php +++ b/core/src/Revolution/Processors/Context/GetList.php @@ -118,7 +118,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 *