Problem/Motivation

User role entity is not yet fully validatable:

./vendor/bin/drush config:inspect --filter-keys=user.role.anonymous --detail --list-constraints --fields=key,validatability,constraints    
➜  🤖 Analyzing…

 ------------------------------------------------ ------------- --------------------------------------------------------------------------------------------- 
  Key                                              Validatable   Validation constraints                                                                       
 ------------------------------------------------ ------------- --------------------------------------------------------------------------------------------- 
  user.role.anonymous                              66%           ValidKeys: '<infer>'                                                                         
   user.role.anonymous:                            Validatable   ValidKeys: '<infer>'                                                                         
   user.role.anonymous:_core                       Validatable   ValidKeys:                                                                                   
                                                                   - default_config_hash                                                                      
   user.role.anonymous:_core.default_config_hash   Validatable   NotNull: {  }                                                                                
                                                                 Regex: '/^[a-zA-Z0-9\-_]+$/'                                                                 
                                                                 Length: 43                                                                                   
                                                                 ↣ PrimitiveType: {  }                                                                        
   user.role.anonymous:dependencies                Validatable   ValidKeys: '<infer>'                                                                         
   user.role.anonymous:dependencies.config         NOT           ❌ @todo Add validation constraints to ancestor type: config_dependencies                    
   user.role.anonymous:dependencies.config.0       Validatable   NotBlank: {  }                                                                               
                                                                 ConfigExists: {  }                                                                           
                                                                 ↣ PrimitiveType: {  }                                                                        
   user.role.anonymous:dependencies.module         NOT           ❌ @todo Add validation constraints to ancestor type: config_dependencies                    
   user.role.anonymous:dependencies.module.0       Validatable   NotBlank: {  }                                                                               
                                                                 ExtensionName: {  }                                                                          
                                                                 ExtensionExists: module                                                                      
                                                                 ↣ PrimitiveType: {  }                                                                        
   user.role.anonymous:dependencies.module.1       Validatable   NotBlank: {  }                                                                               
                                                                 ExtensionName: {  }                                                                          
                                                                 ExtensionExists: module                                                                      
                                                                 ↣ PrimitiveType: {  }                                                                        
   user.role.anonymous:dependencies.module.2       Validatable   NotBlank: {  }                                                                               
                                                                 ExtensionName: {  }                                                                          
                                                                 ExtensionExists: module                                                                      
                                                                 ↣ PrimitiveType: {  }                                                                        
   user.role.anonymous:dependencies.module.3       Validatable   NotBlank: {  }                                                                               
                                                                 ExtensionName: {  }                                                                          
                                                                 ExtensionExists: module                                                                      
                                                                 ↣ PrimitiveType: {  }                                                                        
   user.role.anonymous:dependencies.module.4       Validatable   NotBlank: {  }                                                                               
                                                                 ExtensionName: {  }                                                                          
                                                                 ExtensionExists: module                                                                      
                                                                 ↣ PrimitiveType: {  }                                                                        
   user.role.anonymous:dependencies.module.5       Validatable   NotBlank: {  }                                                                               
                                                                 ExtensionName: {  }                                                                          
                                                                 ExtensionExists: module                                                                      
                                                                 ↣ PrimitiveType: {  }                                                                        
   user.role.anonymous:dependencies.module.6       Validatable   NotBlank: {  }                                                                               
                                                                 ExtensionName: {  }                                                                          
                                                                 ExtensionExists: module                                                                      
                                                                 ↣ PrimitiveType: {  }                                                                        
   user.role.anonymous:id                          Validatable   Regex:                                                                                       
                                                                   pattern: '/^[a-z0-9_]+$/'                                                                  
                                                                   message: 'The %value machine name is not valid.'                                           
                                                                 Length:                                                                                      
                                                                   max: 166                                                                                   
                                                                 ↣ PrimitiveType: {  }                                                                        
   user.role.anonymous:is_admin                    Validatable   ↣ PrimitiveType: {  }                                                                        
   user.role.anonymous:label                       Validatable   Regex:                                                                                       
                                                                   pattern: '/([^\PC])/u'                                                                     
                                                                   match: false                                                                               
                                                                   message: 'Labels are not allowed to span multiple lines or contain control characters.'    
                                                                 NotBlank: {  }                                                                               
                                                                 ↣ PrimitiveType: {  }                                                                        
   user.role.anonymous:langcode                    Validatable   NotNull: {  }                                                                                
                                                                 Choice:                                                                                      
                                                                   callback: 'Drupal\Core\TypedData\Plugin\DataType\LanguageReference::getAllValidLangcodes'  
                                                                 ↣ PrimitiveType: {  }                                                                        
   user.role.anonymous:permissions                 NOT           ⚠️  @todo Add validation constraints to config entity type: user.role.*                      
   user.role.anonymous:permissions.0               NOT           ⚠️  @todo Add validation constraints to config entity type: user.role.*                      
   user.role.anonymous:permissions.1               NOT           ⚠️  @todo Add validation constraints to config entity type: user.role.*                      
   user.role.anonymous:permissions.2               NOT           ⚠️  @todo Add validation constraints to config entity type: user.role.*                      
   user.role.anonymous:permissions.3               NOT           ⚠️  @todo Add validation constraints to config entity type: user.role.*                      
   user.role.anonymous:permissions.4               NOT           ⚠️  @todo Add validation constraints to config entity type: user.role.*                      
   user.role.anonymous:permissions.5               NOT           ⚠️  @todo Add validation constraints to config entity type: user.role.*                      
   user.role.anonymous:permissions.6               NOT           ⚠️  @todo Add validation constraints to config entity type: user.role.*                      
   user.role.anonymous:status                      Validatable   ↣ PrimitiveType: {  }                                                                        
   user.role.anonymous:uuid                        Validatable   Uuid: {  }                                                                                   
                                                                 ↣ PrimitiveType: {  }                                                                        
   user.role.anonymous:weight                      Validatable   Range:                                                                                       
                                                                   min: -2147483648                                                                           
                                                                   max: 2147483647                                                                            
                                                                 FullyValidatable: null                                                                       
                                                                 ↣ PrimitiveType: {  }                                                                        
 ------------------------------------------------ ------------- --------------------------------------------------------------------------------------------- 

Steps to reproduce

  1. Get a local git clone of Drupal core 11.x.
  2. composer require drupal/config_inspector — or manually install https://www.drupal.org/project/config_inspector/releases/2.1.5 or newer (which supports Drupal 11!)
  3. composer require drush/drush
  4. vendor/bin/drush config:inspect --filter-keys=user.role.anonymous --detail --list-constraints

Proposed resolution

Add validation constraints to missing properties.

This requires looking at the existing code and admin UI (if any) to understand which values could be considered valid. Eventually this needs to be reviewed by the relevant subsystem maintainer.

For examples, search *.schema.yml files for the string constraints: 😊

Reach out to @borisson_ or @wimleers in the #distributions-and-recipes.

Remaining tasks

User interface changes

None.

API changes

None.

Data model changes

More validation 🚀

Release notes snippet

None.

Issue fork drupal-3445215

Command icon Show commands

Start within a Git clone of the project using the version control instructions.

Or, if you do not have SSH keys set up on git.drupalcode.org:

Comments

narendraR created an issue. See original summary.

narendrar’s picture

Status: Active » Needs review
smustgrave’s picture

Status: Needs review » Reviewed & tested by the community
StatusFileSize
new70.5 KB

Using configuration inspector on a standard install I see

validate

So believe this one is good.

wim leers’s picture

Status: Reviewed & tested by the community » Needs work
Issue tags: +Portland2024

I don't see any justification for making is_admin and weight optional values? I kinda get weight being optional … but not is_admin.

Plus, if they're optional, then that should be reflected on the class properties too, and that's not the case:

  /**
   * The weight of this role in administrative listings.
   *
   * @var int
   */
  protected $weight;

+

  /**
   * An indicator whether the role has all permissions.
   *
   * @var bool
   */
  protected $is_admin;

mikelutz made their first commit to this issue’s fork.

mtift made their first commit to this issue’s fork.

mtift’s picture

Status: Needs work » Needs review
wim leers’s picture

Status: Needs review » Needs work
mtift’s picture

Status: Needs work » Needs review
wim leers’s picture

Status: Needs review » Needs work
mikelutz’s picture

Status: Needs work » Needs review

Done.

smustgrave’s picture

Status: Needs review » Reviewed & tested by the community

Feedback appears to be addressed.

alexpott’s picture

Status: Reviewed & tested by the community » Needs work

Added some review comments. I'm not sure about the nullability being added here.

mtift’s picture

@alexpott I don't see any comments. Did you add them on https://git.drupalcode.org/project/drupal/-/merge_requests/7910?

mtift’s picture

Status: Needs work » Needs review
smustgrave’s picture

Status: Needs review » Needs work

MR appears to have a large number of failures.

borisson_’s picture

Looks like a lot of the current failures are because of invalid configuration in tests.

borisson_’s picture

Status: Needs work » Needs review

Discussed with @alexpott at drupal dev days, setting default values on the entity.

borisson_’s picture

Status: Needs review » Needs work

The remaining failures are all in rest, but I don't understand how to fix them.

borisson_’s picture

Status: Needs work » Needs review
Issue tags: +DevDaysBurgas2024

Hurrah, it's green.

smustgrave’s picture

Status: Needs review » Reviewed & tested by the community

Feedback appears to be addressed for this one.

alexpott’s picture

Status: Reviewed & tested by the community » Fixed

Committed f4ae13d and pushed to 11.x. Thanks!

  • alexpott committed f4ae13d0 on 11.x
    Issue #3445215 by narendraR, borisson_, mtift, mikelutz, smustgrave, Wim...

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.

xjm’s picture

Aforementioned Portland discussion. Remember to add credits for in-person discussions, folks!