Problem/Motivation
MediaSourceBase::getSourceFieldName() doesn't check the character count of the field name it generates. It can generate field names that are invalid because they exceed 32 characters.
Steps to reproduce
- Create a media type that uses a source with a machine name longer than 20 characters
- This results in an invalid field name: "field_media_" + [more than 20 characters] > 32 characters ->
FieldExceptionthrown
See failing test from patch #5 below:
There was 1 error:
1) Drupal\Tests\media\Kernel\MediaSourceTest::testSourceFieldCreation
Drupal\Core\Field\FieldException: Attempt to create a field storage with an name longer than 32 characters: field_media_test_source_with_a_really_long_name
/var/www/html/core/modules/field/src/Entity/FieldStorageConfig.php:326
/var/www/html/core/modules/field/src/Entity/FieldStorageConfig.php:297
/var/www/html/core/lib/Drupal/Core/Entity/EntityStorageBase.php:562
/var/www/html/core/lib/Drupal/Core/Entity/EntityStorageBase.php:517
/var/www/html/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorage.php:253
/var/www/html/core/lib/Drupal/Core/Entity/EntityBase.php:339
/var/www/html/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php:607
/var/www/html/core/modules/media/tests/src/Kernel/MediaSourceTest.php:504
/var/www/html/vendor/phpunit/phpunit/src/Framework/TestResult.php:726
Proposed resolution
Modify MediaSourceBase::getSourceFieldName() to ensure its returned field name doesn't exceed 32 characters.
Remaining tasks
UpdateMediaSourceBase::getSourceFieldName()to limit returned value to 32 charactersUpdate test coverage
User interface changes
None
API changes
None
Data model changes
None
Release notes snippet
TBD
| Comment | File | Size | Author |
|---|---|---|---|
| #46 | After MR MediaSource.png | 111.24 KB | sagarmohite0031 |
| #46 | Before MR MediaSource.png | 109.93 KB | sagarmohite0031 |
Issue fork drupal-3276845
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
Comment #2
chris burge commentedIgnore this patch file ↑
Comment #3
chris burge commentedIgnore this patch file ↑
Comment #5
chris burge commentedComment #7
chris burge commentedComment #8
chris burge commentedChanging status to 'Active' as there's no patch with corrective code, only a failing test.
Comment #9
chris burge commentedUpdated patch attached with corrective behavior and test coverage.
Comment #10
chris burge commentedComment #13
smustgrave commentedThis issue is being reviewed by the kind folks in Slack, #needs-review-queue-initiative. We are working to keep the size of Needs Review queue [2700+ issues] to around 400 (1 month or less), following Review a patch or merge request as a guide.
On Drupal 10 by cloning the image source file and using the test case annotation
I would expect to get the error because the id test_source_with_a_really_long_name is too long but it passes just fine.
Is there a missing step?
Comment #14
Deshna Chauhan commentedAdd patch against #9 in 10.1 version.
Comment #15
bramdriesenHiding patch #14 as it's incomplete. You omitted the /core/modules/media/tests/modules/media_test_source/src/Plugin/media/Source/TestSourceWithAReallyLongName.php
@Deshna Chauhan Please stop uploading incomplete and broken re-roll patches without an interdiff.
Comment #16
bramdriesenComment #17
quietone commented@Deshna Chauhan, I am removing credit for the unhelpful patch per How is credit granted for Drupal core issues.
Comment #18
chris burge commentedAttached is rerolled patch for Drupal 10.1. Also attached is a failing patch to demonstrate the bug via test coverage.
The output I'm seeing locally for the failing patch is provided below:
Comment #19
chris burge commentedThis bug popped up again yesterday over in the oEmbed Provider module's issue queue: #3339725: Attempt to create a field storage with an name longer than 32 characters. Folks are definitely still running into it.
Comment #20
smustgrave commentedTried replicating in #13 what step was I missing
Comment #22
chris burge commented@smustgrave - I'm not 100% clear on steps followed in #13.
If you take a look at the test coverage provided by the patch, you'll see two steps:
Step 1: Create a Media Source plugin:
Step 2: Create a media type using said media source as its source:
Failed test error:
Comment #23
bramdriesenA few small code nits. But I don't think that this should hold this back :)
Maybe a small nit, but this could be converted to a single line of code.
Don't think it's needed to cast the strlen to a variable.
Comment #25
bramdriesenComment #26
chris burge commentedThe failing test was unrelated and an intermittent FunctionalJavascript failure. I reran tests, and they passed. Setting back to RTBC.
Comment #27
needs-review-queue-bot commentedThe Needs Review Queue Bot tested this issue. It no longer applies to Drupal core. Therefore, this issue status is now "Needs work".
Apart from a re-roll or rebase, this issue may need more work to address feedback in the issue or MR comments. To progress an issue, incorporate this feedback as part of the process of updating the issue. This helps other contributors to know what is outstanding.
Consult the Drupal Contributor Guide to find step-by-step guides for working with issues.
Comment #29
alex.bukach commentedRerolled the patch #18 against 10.3.
Comment #30
smustgrave commentedFixes should be in an MR for tests to run and against 11.x
Comment #31
shalini_jha commentedComment #33
shalini_jha commentedI have replicated the issue regarding the source field name length and applied the necessary fixes, which appear to resolve the issue. After reviewing the test cases, I identified several underlying problems, all of which have been addressed. Following these fixes, the functionality is now working correctly, and the source field name is properly truncated to a maximum of 32 characters. I have submitted a merge request for this change and am moving it to "Needs Review." Kindly review it at your convenience.
Comment #34
smustgrave commentedComment #35
shalini_jha commentedComment #36
shalini_jha commentedI have looked into how to convert the annotation for MediaSource to an attribute. However, I noticed that there is currently no predefined attribute available for MediaSource, unlike some other components like Action, which do have attributes defined.
Could you please guide me on whether we need to create a new attribute for MediaSource, similar to Action, before changing the plugin from annotation to attribute? Your guidance on this would be greatly appreciated.
Moving this to 'Needs Review' to get your help. Sorry for the inconvenience.
Comment #37
smustgrave commentedMediaSource already exists as an attribute, check the media mdoule.
Comment #38
shalini_jha commentedComment #39
shalini_jha commentedThank you for your help, I have verified that the MediaSource attribute has already been added.
my bad missed to check this. I have addressed the feedback accordingly and am moving this to "Needs Review."
Comment #40
smustgrave commentedTest coverage appears to be there.
And all feedback appears to be addressed.
Comment #41
larowlanLeft a question on the MR
Comment #42
shalini_jha commentedComment #43
shalini_jha commentedThank you, @larowlan, for the review and feedback. I am looking into this.
Comment #44
shalini_jha commentedAs per the MR feedback, I debugged and verified that the output of EntityTypeInterface::ID_MAX_LENGTH is correct and returns 32. This makes it a better approach compared to using a hard coded value. I have adjusted the logic accordingly based on these changes.
I also re-ran the tests, and everything is working as expected. Leaving this in Review for your feedback.
Comment #45
shalini_jha commentedComment #46
sagarmohite0031 commentedHello,
Verified on Drupal 11,
MR applied successfully,
Not able to reproduce issue.
Attaching before and after screenshots.
Comment #47
bramdriesenCode can still be improved. Nits from #23 are still not fixed. And it overall does not look to respect best practices.
Comment #48
shalini_jha commentedComment #49
shalini_jha commentedThank you, @BramDriesen, for the review and feedback. I have updated the code according to the feedback provided by you. For the constant, I have removed the variable and directly used it in the checks. I re-ran the tests after these changes, and it is working as expected. Moving on for your review—please review it and let me know if anything else needs to be updated.
Comment #50
shalini_jha commentedComment #51
bramdriesenLooks ok to me. Still not easily readable though. Maybe converting
'_' . $triesto"_$tries"helps, but I'll leave that in the middle for now.Tests works as expected since the test only run failed.
Comment #55
larowlanCommitted to 11.x and backported to 11.1.x - thanks!