Skip to content

[JDL/Enum]: Parsing issues with special chars / Missing quotes on export / JDL-injection with enums #31082

@nitram84

Description

@nitram84
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("\"") or COMMA_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-issue command.
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)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions