-
-
Notifications
You must be signed in to change notification settings - Fork 4.1k
Description
Overview of the issue
Summary: There are several issues with the jdl query parser, the way enum values are stored internally and on export
- Enums like
QUOTES("\"")orCOMMA_SPACE (", "), both correctly escaped and quoted, can't be imported - Enums with special chars won't be exported correctly. Jhipster export jdl generated no quotes for special characters.
- Even JDL-injection with enums is possible causes by the way how enum values are stored internally.
Examples and steps to reproduce:
Example 1: Missing quotes on export and Enum injection
JHipster JDL
JDL definitions (Example 1)
application {
config {
applicationType monolith
authenticationType jwt
baseName jdlbugs
buildTool maven
cacheProvider ehcache
clientFramework angular
clientTheme none
creationTimestamp 1760733393175
databaseType sql
devDatabaseType h2Disk
enableHibernateCache true
enableTranslation true
jhipsterVersion "9.0.0-alpha.0"
jwtSecretKey "ZjNhZDE2MGIxMDFkMGU5ZDI0ODE1ZmVkYjlmZjgxOTIyMzE4OGE1ODUyMGNmZjlmOTUyMGYxYTFkOTIzYzU2NzAxMWQyMjZiNzczOGJmYzZjOTE1MjIzMTUzYWViOTBmYTdlZmU3Y2RkOTVlY2U1NGRmOTRlMDJmMTc0MjI2MTg="
languages [en]
microfrontends []
nativeLanguage en
packageName com.mycompany.myapp
prodDatabaseType postgresql
reactive false
testFrameworks []
withAdminUi true
}
entities Test
}
entity Test {
test SpecialChars
}
enum SpecialChars {
Ue ("Ü") // special character, has to be quoted
Try_to_inject_enum_in_entity_json("a), InjectedEnum(a")
}
Import enum-special-chars1.jdl:
jhipster import-jdl enum-special-chars1.jdl
Export Jdl:
jhipster export-jdl enum-special-chars-export.jdl
Result is:
JDL definitions (Example 1 exported)
application {
config {
applicationType monolith
authenticationType jwt
baseName jdlbugs
buildTool maven
cacheProvider ehcache
clientFramework angular
clientTheme none
creationTimestamp 1760733393175
databaseType sql
devDatabaseType h2Disk
enableHibernateCache true
enableTranslation true
jhipsterVersion "9.0.0-alpha.0"
jwtSecretKey "ZjNhZDE2MGIxMDFkMGU5ZDI0ODE1ZmVkYjlmZjgxOTIyMzE4OGE1ODUyMGNmZjlmOTUyMGYxYTFkOTIzYzU2NzAxMWQyMjZiNzczOGJmYzZjOTE1MjIzMTUzYWViOTBmYTdlZmU3Y2RkOTVlY2U1NGRmOTRlMDJmMTc0MjI2MTg="
languages [en]
microfrontends []
nativeLanguage en
packageName com.mycompany.myapp
prodDatabaseType postgresql
reactive false
testFrameworks []
withAdminUi true
}
entities Test
}
@ChangelogDate("20251017204639")
entity Test {
test SpecialChars
}
enum SpecialChars {
Ue (Ü),
Try_to_inject_enum_in_entity_json (a),
InjectedEnum(a)
}
search Test with no
Import exported jdl:
jhipster import-jdl enum-special-chars-export.jdl
results in this exception:
[..]
Welcome to JHipster v9.0.0-alpha.0
INFO! Generating jdls enum-special-chars-export.jdl
ERROR! An error occured while running jhipster:jdl#parseJDL
ERROR! ERROR! unexpected character: ->Ü<- at offset: 881, skipped 1 characters.
Error: unexpected character: ->Ü<- at offset: 881, skipped 1 characters.
at getCst (generator-jhipster/dist/lib/jdl/core/parsing/api.js:31:15)
at parse (generator-jhipster/dist/lib/jdl/core/parsing/api.js:24:17)
at parse (generator-jhipster/dist/lib/jdl/core/readers/jdl-reader.js:78:31)
at parseFromContent (generator-jhipster/dist/lib/jdl/core/readers/jdl-reader.js:44:12)
at createImporterFromContent (generator-jhipster/dist/lib/jdl/jdl-importer.js:61:21)
at JdlGenerator.parseJDL (generator-jhipster/dist/generators/jdl/generator.js:116:34)
at JdlGenerator.executeTask (generator-jhipster/node_modules/yeoman-generator/dist/actions/lifecycle.js:265:26)
at env.queueTask.once (generator-jhipster/node_modules/yeoman-generator/dist/actions/lifecycle.js:232:56)
at runLoop.add.once (generator-jhipster/node_modules/yeoman-environment/dist/environment-base.js:383:23)
at Immediate.<anonymous> (generator-jhipster/node_modules/grouped-queue/lib/subqueue.js:52:34)
Example 2: JDL parser can't handle quoted and escaped special characters correctly
JDL definitions (Example 2)
application {
config {
applicationType monolith
authenticationType jwt
baseName jdlbugs
buildTool maven
cacheProvider ehcache
clientFramework angular
clientTheme none
creationTimestamp 1760733393175
databaseType sql
devDatabaseType h2Disk
enableHibernateCache true
enableTranslation true
jhipsterVersion "9.0.0-alpha.0"
jwtSecretKey "ZjNhZDE2MGIxMDFkMGU5ZDI0ODE1ZmVkYjlmZjgxOTIyMzE4OGE1ODUyMGNmZjlmOTUyMGYxYTFkOTIzYzU2NzAxMWQyMjZiNzczOGJmYzZjOTE1MjIzMTUzYWViOTBmYTdlZmU3Y2RkOTVlY2U1NGRmOTRlMDJmMTc0MjI2MTg="
languages [en]
microfrontends []
nativeLanguage en
packageName com.mycompany.myapp
prodDatabaseType postgresql
reactive false
testFrameworks []
withAdminUi true
}
entities Test
}
entity Test {
test SpecialChars2
}
enum SpecialChars2 {
ESCAPING_WORKS("\")
ESCAPED_QUOTES_FAIL(""")
}
jhipster import-jdl enum-special-chars2.jdl
results in this exception:
Welcome to JHipster v9.0.0-alpha.0
INFO! Generating jdls enum-special-chars.jdl
ERROR! An error occured while running jhipster:jdl#parseJDL
ERROR! ERROR! unexpected character: ->"<- at offset: 892, skipped 1 characters.
Error: unexpected character: ->"<- at offset: 892, skipped 1 characters.
at getCst (generator-jhipster/dist/lib/jdl/core/parsing/api.js:31:15)
at parse (generator-jhipster/dist/lib/jdl/core/parsing/api.js:24:17)
at parse (generator-jhipster/dist/lib/jdl/core/readers/jdl-reader.js:78:31)
at parseFromContent (generator-jhipster/dist/lib/jdl/core/readers/jdl-reader.js:44:12)
at createImporterFromContent (generator-jhipster/dist/lib/jdl/jdl-importer.js:61:21)
at JdlGenerator.parseJDL (generator-jhipster/dist/generators/jdl/generator.js:116:34)
at JdlGenerator.executeTask (generator-jhipster/node_modules/yeoman-generator/dist/actions/lifecycle.js:265:26)
at env.queueTask.once (generator-jhipster/node_modules/yeoman-generator/dist/actions/lifecycle.js:232:56)
at runLoop.add.once (generator-jhipster/node_modules/yeoman-environment/dist/environment-base.js:383:23)
at Immediate.<anonymous> (generator-jhipster/node_modules/grouped-queue/lib/subqueue.js:52:34)
Example 3: JDL parser can't handle enum values with comma and space
JDL definitions (Example 3)
application {
config {
applicationType monolith
authenticationType jwt
baseName jdlbugs
buildTool maven
cacheProvider ehcache
clientFramework angular
clientTheme none
creationTimestamp 1760733393175
databaseType sql
devDatabaseType h2Disk
enableHibernateCache true
enableTranslation true
jhipsterVersion "9.0.0-alpha.0"
jwtSecretKey "ZjNhZDE2MGIxMDFkMGU5ZDI0ODE1ZmVkYjlmZjgxOTIyMzE4OGE1ODUyMGNmZjlmOTUyMGYxYTFkOTIzYzU2NzAxMWQyMjZiNzczOGJmYzZjOTE1MjIzMTUzYWViOTBmYTdlZmU3Y2RkOTVlY2U1NGRmOTRlMDJmMTc0MjI2MTg="
languages [en]
microfrontends []
nativeLanguage en
packageName com.mycompany.myapp
prodDatabaseType postgresql
reactive false
testFrameworks []
withAdminUi true
}
entities Test
}
entity Test {
test SpecialChars2
}
enum SpecialChars2 {
COMMA_SPACE_CANNOT_BE_PARSED (", ")
}
jhipster import-jdl enum-special-chars3.jdl
results in this exception:
Welcome to JHipster v9.0.0-alpha.0
INFO! Generating jdls enum-special-chars3.jdl
info Generating 1 application
_______________________________________________________________________________________________________________
Documentation for creating an application is at https://www.jhipster.tech/creating-an-app/
Application files will be generated in folder: /home/martin/Jhipster/jdlbugs
_______________________________________________________________________________________________________________
ERROR! An error occured while running jhipster:base-application:bootstrap#prepareFieldsForTemplates
ERROR! ERROR! Cannot read properties of null (reading '1')
TypeError: Cannot read properties of null (reading '1')
at generator-jhipster/dist/generators/base-application/support/prepare-field.js:338:26
at Array.map (<anonymous>)
at getEnumValuesWithCustomValues (generator-jhipster/dist/generators/base-application/support/prepare-field.js:332:34)
at prepareCommonFieldForTemplates (generator-jhipster/dist/generators/base-application/support/prepare-field.js:266:28)
at BootstrapBaseApplicationGenerator.prepareFieldsForTemplates (generator-jhipster/dist/generators/base-application/generators/bootstrap/generator.js:303:17)
at BootstrapBaseApplicationGenerator.executeTask (generator-jhipster/node_modules/yeoman-generator/dist/actions/lifecycle.js:265:26)
at env.queueTask.once (generator-jhipster/node_modules/yeoman-generator/dist/actions/lifecycle.js:232:56)
at runLoop.add.once (generator-jhipster/node_modules/yeoman-environment/dist/environment-base.js:383:23)
at Immediate.<anonymous> (/home/martin/Jhipster/generator-jhipster/node_modules/grouped-queue/lib/subqueue.js:52:34)
at process.processImmediate (node:internal/timers:491:21)
- JDL is mandatory for bug reports. This will allow us to use automated tests and generate the broken sample using
jhipster from-issuecommand.
Motivation for or Use Case
- The JDL parser should handle special characters in enum values.
- Special characters in enum values should be exported correctly.
- JDL-injection should not be possible
Reproduce the error
Related issues
Suggest a Fix
The root cause for these issues is how fieldValues for enum are stored. This explains how injection is possible. Jhipster removes all quotes because a single string is used to store enum data:
{
"annotations": {
"changelogDate": "20251017204639"
},
"applications": ["jdlbugs"],
"fields": [
{
"fieldName": "umlaut",
"fieldType": "SpecialChars",
"fieldValues": "Ue (Ü),Try_to_inject_enum_in_entity_json (a),InjectedEnum(a)"
}
],
"name": "Test",
"relationships": [],
"searchEngine": "no"
}
Parsing a single string for enum values correctly is very complex. I suggest using an array or JSON in general e.q.
{
"annotations": {
"changelogDate": "20251017204639"
},
"applications": ["jdlbugs"],
"fields": [
{
"fieldName": "umlaut",
"fieldType": "SpecialChars",
"fieldValues": [
{
"enumFieldName": "Ue",
"enumFieldValue": "Ü"
}
{
"enumFieldName": "Try_to_inject_enum_in_entity_json",
"enumFieldValue": "a),InjectedEnum(a"
}
]
}
],
"name": "Test",
"relationships": [],
"searchEngine": "no"
}
Injection will fail and exporting with quotes will become simple: If "enumValue" contains a non alphanumeric value, then enumValue has to be exported in qoutes.
JHipster Version(s)
JHipster v9.0.0-alpha.0 , latest git version
Browsers and Operating System
- Tickets opened without reproduction steps or that doesn't follows the template recommendation will be closed.
- Checking this box is mandatory (this is just to show you read everything)