Skip to content
Snippets Groups Projects
Verified Commit fce65ce3 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #3392903 by borisson_, Wim Leers, phenaproxima: Validate inputs of...

Issue #3392903 by borisson_, Wim Leers, phenaproxima: Validate inputs of TypeResolver::resolveExpression(): only allow %parent, %type and %key

(cherry picked from commit 94e4d471)
parent 53c02df1
No related branches found
No related tags found
28 merge requests!122353526426-warning-for-missing,!12212Issue #3445525 by alexpott, japerry, catch, mglaman, longwave: Add BC layer...,!11958Issue #3490507 by alexpott, smustgrave: Fix bogus mocking in...,!11769Issue #3517987: Add option to contextual filters to encode slashes in query parameter.,!11185Issue #3477324 by andypost, alexpott: Fix usage of str_getcsv() and fgetcsv() for PHP 8.4,!10602Issue #3438769 by vinmayiswamy, antonnavi, michelle, amateescu: Sub workspace does not clear,!10301Issue #3469309 by mstrelan, smustgrave, moshe weitzman: Use one-time login...,!10187Issue #3487488 by dakwamine: ExtensionMimeTypeGuesser::guessMimeType must support file names with "0" (zero) like foo.0.zip,!9944Issue #3483353: Consider making the createCopy config action optionally fail...,!9929Issue #3445469 by pooja_sharma, smustgrave: Add additional test coverage for...,!9787Resolve issue 3479427 - bootstrap barrio issue under Windows,!9742Issue #3463908 by catch, quietone: Split OptionsFieldUiTest into two,!9526Issue #3458177 by mondrake, catch, quietone, godotislate, longwave, larowlan,...,!8738Issue #3424162 by camilledavis, dineshkumarbollu, smustgrave: Claro...,!8704Make greek characters available in ckeditor5,!8597Draft: Issue #3442259 by catch, quietone, dww: Reduce time of Migrate Upgrade tests...,!8533Issue #3446962 by kim.pepper: Remove incorrectly added...,!8517Issue #3443748 by NexusNovaz, smustgrave: Testcase creates false positive,!8325Update file Sort.php,!8095Expose document root on install,!7930Resolve #3427374 "Taxonomytid viewsargumentdefault plugin",!7627Issue #3439440 by nicxvan, Binoli Lalani, longwave: Remove country support from DateFormatter,!7445Issue #3440169: When using drupalGet(), provide an associative array for $headers,!7401#3271894 Fix documented StreamWrapperInterface return types for realpath() and dirname(),!7384Add constraints to system.advisories,!6502Draft: Resolve #2938524 "Plach testing issue",!38582585169-10.1.x,!3226Issue #2987537: Custom menu link entity type should not declare "bundle" entity key
Pipeline #128530 passed with warnings
Pipeline: drupal

#128533

    ......@@ -75,7 +75,8 @@ public static function resolveDynamicTypeName(string $name, mixed $data): string
    * The value the expression resolves to, or the given expression if it
    * cannot be resolved.
    *
    * @todo Validate the expression in https://www.drupal.org/project/drupal/issues/3392903
    * @throws \LogicException
    * Exception thrown if $expression is not a valid dynamic type expression.
    */
    public static function resolveExpression(string $expression, array|TypedDataInterface $data): string {
    if ($data instanceof TypedDataInterface) {
    ......@@ -87,8 +88,16 @@ public static function resolveExpression(string $expression, array|TypedDataInte
    }
    $parts = explode('.', $expression);
    $previous_name = NULL;
    // Process each value part, one at a time.
    while ($name = array_shift($parts)) {
    if (str_starts_with($name, '%') && !in_array($name, ['%parent', '%key', '%type'], TRUE)) {
    throw new \LogicException('`' . $expression . '` is not a valid dynamic type expression. Dynamic type expressions must contain at least `%parent`, `%key`, or `%type`.`');
    }
    if ($name === '%type' && $previous_name !== '%parent') {
    throw new \LogicException('`%type` can only used when immediately preceded by `%parent` in `' . $expression . '`');
    }
    $previous_name = $name;
    if (!is_array($data) || !isset($data[$name])) {
    // Key not found, return original value
    return $expression;
    ......
    ......@@ -64,7 +64,7 @@ public function testEntityTypeIdIsStatic(): void {
    }
    /**
    * Tests getting the entity type ID from the parent property path.
    * Tests getting the entity type ID.
    *
    * @param string $constraint_value
    * The entity type ID to supply to the validation constraint. Must be a
    ......@@ -74,9 +74,9 @@ public function testEntityTypeIdIsStatic(): void {
    * a bundle.
    *
    * @testWith ["%parent.entity_type_id", "entity_test_with_bundle"]
    * ["%paren.entity_type_id", "%paren.entity_type_id"]
    * ["%key", "bundle"]
    */
    public function testEntityTypeIdFromParent(string $constraint_value, string $resolved_entity_type_id): void {
    public function testDynamicEntityType(string $constraint_value, string $resolved_entity_type_id): void {
    /** @var \Drupal\Core\TypedData\TypedDataManagerInterface $typed_data_manager */
    $typed_data_manager = $this->container->get('typed_data_manager');
    ......
    <?php
    declare(strict_types=1);
    namespace Drupal\Tests\Core\Config;
    use Drupal\Core\Config\Schema\TypeResolver;
    use Drupal\Tests\UnitTestCase;
    /**
    * @covers \Drupal\Core\Config\Schema\TypeResolver
    * @group config
    */
    class TypeResolverTest extends UnitTestCase {
    /**
    * @testWith ["[foo.%bar.qux]", "`foo.%bar.qux` is not a valid dynamic type expression. Dynamic type expressions must contain at least `%parent`, `%key`, or `%type`.`", {"foo": "foo"}]
    * ["[%paren.field_type]", "`%paren.field_type` is not a valid dynamic type expression. Dynamic type expressions must contain at least `%parent`, `%key`, or `%type`."]
    * ["[something.%type]", "`%type` can only used when immediately preceded by `%parent` in `something.%type`", {"something": "something"}]
    */
    public function testInvalidType(string $name, string $message, array $data = []): void {
    $this->expectException(\LogicException::class);
    $this->expectExceptionMessage($message);
    TypeResolver::resolveDynamicTypeName($name, $data);
    }
    }
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Please register or to comment