From 25627b05d30dd899f8426de6081c9284a30dd641 Mon Sep 17 00:00:00 2001 From: Alex Pott <alex.a.pott@googlemail.com> Date: Tue, 5 Aug 2014 11:01:55 +0100 Subject: [PATCH] Issue #2302165 by cilefen | kgoel: Only allow loading by plugin definition properties. --- core/lib/Drupal/Core/Menu/MenuTreeStorage.php | 6 +++-- .../Core/Menu/MenuTreeStorageInterface.php | 3 +++ .../src/Tests/Menu/MenuTreeStorageTest.php | 23 +++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/core/lib/Drupal/Core/Menu/MenuTreeStorage.php b/core/lib/Drupal/Core/Menu/MenuTreeStorage.php index 6741d3540aba..c1c137f2ded6 100644 --- a/core/lib/Drupal/Core/Menu/MenuTreeStorage.php +++ b/core/lib/Drupal/Core/Menu/MenuTreeStorage.php @@ -635,11 +635,13 @@ protected function prepareLink(array $link, $intersect = FALSE) { * {@inheritdoc} */ public function loadByProperties(array $properties) { - // @todo Only allow loading by plugin definition properties. - https://www.drupal.org/node/2302165 $query = $this->connection->select($this->table, $this->options); $query->fields($this->table, $this->definitionFields()); foreach ($properties as $name => $value) { + if (!in_array($name, $this->definitionFields())) { + $fields = implode(', ', $this->definitionFields()); + throw new \InvalidArgumentException(String::format('An invalid property name, @name was specified. Allowed property names are: @fields.', array('@name' => $name, '@fields' => $fields))); + } $query->condition($name, $value); } $loaded = $this->safeExecuteSelect($query)->fetchAllAssoc('id', \PDO::FETCH_ASSOC); diff --git a/core/lib/Drupal/Core/Menu/MenuTreeStorageInterface.php b/core/lib/Drupal/Core/Menu/MenuTreeStorageInterface.php index a5d512d4ee5c..78028e146f25 100644 --- a/core/lib/Drupal/Core/Menu/MenuTreeStorageInterface.php +++ b/core/lib/Drupal/Core/Menu/MenuTreeStorageInterface.php @@ -71,6 +71,9 @@ public function loadMultiple(array $ids); * @param array $properties * The properties to filter by. * + * @throws \InvalidArgumentException + * Thrown if an invalid property name is specified in $properties. + * * @return array * An array of menu link definition arrays. */ diff --git a/core/modules/system/src/Tests/Menu/MenuTreeStorageTest.php b/core/modules/system/src/Tests/Menu/MenuTreeStorageTest.php index 75b4f1e225fc..7f39b377f8e1 100644 --- a/core/modules/system/src/Tests/Menu/MenuTreeStorageTest.php +++ b/core/modules/system/src/Tests/Menu/MenuTreeStorageTest.php @@ -299,6 +299,29 @@ public function testSubtreeHeight() { $this->assertEqual($this->treeStorage->getSubtreeHeight($child4->getPluginId()), 1); } + /** + * Tests MenuTreeStorage::loadByProperties(). + */ + public function testLoadByProperties() { + $properties = array('foo' => 'bar'); + $msg = 'An invalid property name throws an exception.'; + try { + $this->treeStorage->loadByProperties($properties); + $this->fail($msg); + } + catch (\InvalidArgumentException $e) { + $this->assertEqual( + 'An invalid property name, foo was specified. Allowed property names are: menu_name, route_name, route_parameters, url, title, title_arguments, title_context, description, parent, weight, options, expanded, hidden, provider, metadata, class, form_class, id.', + $e->getMessage() + ); + $this->pass($msg); + } + $this->addMenuLink(1); + $properties = array(array('menu_name' => 'tools')); + $links = $this->treeStorage->loadByProperties($properties); + $this->assertEqual('tools', $links[1]['menu_name']); + } + /** * Adds a link with the given ID and supply defaults. */ -- GitLab