Issue #2220757 by Karol Haltenberger, xjm, drifter, zserno: Limit length of Config:: to something <= 166 characters.
parent
660165cce6
commit
c0d5ab21ed
|
@ -14,6 +14,7 @@ use Drupal\Core\Entity\EntityMalformedException;
|
||||||
use Drupal\Core\Entity\EntityStorageBase;
|
use Drupal\Core\Entity\EntityStorageBase;
|
||||||
use Drupal\Core\Config\Config;
|
use Drupal\Core\Config\Config;
|
||||||
use Drupal\Core\Config\StorageInterface;
|
use Drupal\Core\Config\StorageInterface;
|
||||||
|
use Drupal\Core\Config\Entity\Exception\ConfigEntityIdLengthException;
|
||||||
use Drupal\Core\Entity\EntityTypeInterface;
|
use Drupal\Core\Entity\EntityTypeInterface;
|
||||||
use Drupal\Core\Entity\EntityStorageException;
|
use Drupal\Core\Entity\EntityStorageException;
|
||||||
use Drupal\Core\Entity\Query\QueryFactory;
|
use Drupal\Core\Entity\Query\QueryFactory;
|
||||||
|
@ -38,6 +39,19 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||||
*/
|
*/
|
||||||
class ConfigEntityStorage extends EntityStorageBase implements ConfigEntityStorageInterface, ImportableEntityStorageInterface {
|
class ConfigEntityStorage extends EntityStorageBase implements ConfigEntityStorageInterface, ImportableEntityStorageInterface {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Length limit of the configuration entity ID.
|
||||||
|
*
|
||||||
|
* Most file systems limit a file name's length to 255 characters. In
|
||||||
|
* order to leave sufficient characters to construct a configuration prefix,
|
||||||
|
* the configuration entity ID is limited to 166 characters which
|
||||||
|
* leaves 83 characters for the configuration prefix. 5 characters are
|
||||||
|
* reserved for the file extension.
|
||||||
|
*
|
||||||
|
* @see \Drupal\Core\Config\ConfigBase::MAX_NAME_LENGTH
|
||||||
|
*/
|
||||||
|
const MAX_ID_LENGTH = 166;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The UUID service.
|
* The UUID service.
|
||||||
*
|
*
|
||||||
|
@ -322,6 +336,15 @@ class ConfigEntityStorage extends EntityStorageBase implements ConfigEntityStora
|
||||||
$entity->original = $this->loadUnchanged($id);
|
$entity->original = $this->loadUnchanged($id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check the configuration entity ID length.
|
||||||
|
// @see \Drupal\Core\Config\Entity\ConfigEntityStorage::MAX_ID_LENGTH
|
||||||
|
if (strlen($entity->{$this->idKey}) > self::MAX_ID_LENGTH) {
|
||||||
|
throw new ConfigEntityIdLengthException(String::format('Configuration entity ID @id exceeds maximum allowed length of @length characters.', array(
|
||||||
|
'@id' => $entity->{$this->idKey},
|
||||||
|
'@length' => self::MAX_ID_LENGTH,
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
$entity->preSave($this);
|
$entity->preSave($this);
|
||||||
$this->invokeHook('presave', $entity);
|
$this->invokeHook('presave', $entity);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Contains \Drupal\Core\Config\Entity\Exception\ConfigEntityIdLengthException.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Drupal\Core\Config\Entity\Exception;
|
||||||
|
|
||||||
|
use Drupal\Core\Config\ConfigException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines an exception thrown when a configuration entity ID is too long.
|
||||||
|
*/
|
||||||
|
class ConfigEntityIdLengthException extends ConfigException {}
|
|
@ -7,8 +7,11 @@
|
||||||
|
|
||||||
namespace Drupal\config\Tests;
|
namespace Drupal\config\Tests;
|
||||||
|
|
||||||
|
use Drupal\Component\Utility\String;
|
||||||
use Drupal\Core\Entity\EntityMalformedException;
|
use Drupal\Core\Entity\EntityMalformedException;
|
||||||
use Drupal\Core\Entity\EntityStorageException;
|
use Drupal\Core\Entity\EntityStorageException;
|
||||||
|
use Drupal\Core\Config\Entity\ConfigEntityStorage;
|
||||||
|
use Drupal\Core\Config\Entity\Exception\ConfigEntityIdLengthException;
|
||||||
use Drupal\Core\Language\Language;
|
use Drupal\Core\Language\Language;
|
||||||
use Drupal\simpletest\WebTestBase;
|
use Drupal\simpletest\WebTestBase;
|
||||||
|
|
||||||
|
@ -142,6 +145,55 @@ class ConfigEntityTest extends WebTestBase {
|
||||||
$this->assertIdentical($config_test->isNew(), FALSE);
|
$this->assertIdentical($config_test->isNew(), FALSE);
|
||||||
$this->assertIdentical($config_test->getOriginalId(), $expected['id']);
|
$this->assertIdentical($config_test->getOriginalId(), $expected['id']);
|
||||||
|
|
||||||
|
// Verify that a configuration entity can be saved with an ID of the
|
||||||
|
// maximum allowed length, but not longer.
|
||||||
|
|
||||||
|
// Test with a short ID.
|
||||||
|
$id_length_config_test = entity_create('config_test', array(
|
||||||
|
'id' => $this->randomName(8),
|
||||||
|
));
|
||||||
|
try {
|
||||||
|
$id_length_config_test->save();
|
||||||
|
$this->pass(String::format("config_test entity with ID length @length was saved.", array(
|
||||||
|
'@length' => strlen($id_length_config_test->id))
|
||||||
|
));
|
||||||
|
}
|
||||||
|
catch (ConfigEntityIdLengthException $e) {
|
||||||
|
$this->fail($e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test with an ID of the maximum allowed length.
|
||||||
|
$id_length_config_test = entity_create('config_test', array(
|
||||||
|
'id' => $this->randomName(ConfigEntityStorage::MAX_ID_LENGTH),
|
||||||
|
));
|
||||||
|
try {
|
||||||
|
$id_length_config_test->save();
|
||||||
|
$this->pass(String::format("config_test entity with ID length @length was saved.", array(
|
||||||
|
'@length' => strlen($id_length_config_test->id),
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
catch (ConfigEntityIdLengthException $e) {
|
||||||
|
$this->fail($e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test with an ID exeeding the maximum allowed length.
|
||||||
|
$id_length_config_test = entity_create('config_test', array(
|
||||||
|
'id' => $this->randomName(ConfigEntityStorage::MAX_ID_LENGTH + 1),
|
||||||
|
));
|
||||||
|
try {
|
||||||
|
$status = $id_length_config_test->save();
|
||||||
|
$this->fail(String::format("config_test entity with ID length @length exceeding the maximum allowed length of @max saved successfully", array(
|
||||||
|
'@length' => strlen($id_length_config_test->id),
|
||||||
|
'@max' => ConfigEntityStorage::MAX_ID_LENGTH,
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
catch (ConfigEntityIdLengthException $e) {
|
||||||
|
$this->pass(String::format("config_test entity with ID length @length exceeding the maximum allowed length of @max failed to save", array(
|
||||||
|
'@length' => strlen($id_length_config_test->id),
|
||||||
|
'@max' => ConfigEntityStorage::MAX_ID_LENGTH,
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
// Ensure that creating an entity with the same id as an existing one is not
|
// Ensure that creating an entity with the same id as an existing one is not
|
||||||
// possible.
|
// possible.
|
||||||
$same_id = entity_create('config_test', array(
|
$same_id = entity_create('config_test', array(
|
||||||
|
|
Loading…
Reference in New Issue