Skip to content

fix(deps): batch security update — 2 vulnerabilities - #42173

Merged
subrata71 merged 4 commits into
releasefrom
fix/dependabot-batch-20260829-023747
Sep 10, 2026
Merged

fix(deps): batch security update — 2 vulnerabilities#42173
subrata71 merged 4 commits into
releasefrom
fix/dependabot-batch-20260829-023747

Conversation

@appsmith-smithes

@appsmith-smithes appsmith-smithes Bot commented Aug 29, 2026

Copy link
Copy Markdown
Contributor

Summary

Updates org.mariadb:r2dbc-mariadb to 1.4.1 and keeps MySQL datasource construction compatible with the upgraded driver.

Resolved alerts

Compatibility changes

  • Generate direct r2dbc:mariadb:// URLs while retaining the plugin's explicit connection pool.
  • Normalize stored legacy r2dbc:pool:mariadb:// URLs before MariaDB driver configuration.
  • Exclude server-provided Reactor Netty and Netty base classes from the PF4J plugin package.
  • Cover single-endpoint, multi-endpoint, and stored-URL construction with regression tests.

Impact on existing instances

  • Fresh install: MySQL datasources use the MariaDB 1.4.1 driver and direct URL scheme.
  • Upgrade from defaults: Existing endpoint-based datasources continue to use explicit connection pooling.
  • Upgrade from customized configuration: Stored legacy pooled URLs are normalized at runtime without changing persisted data.
  • Rollback: No datasource migration occurs; older versions continue to read the unchanged stored URL.

Automation

/ok-to-test tags="@tag.All"

Tip

🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉
Workflow run: https://github.com/appsmithorg/appsmith/actions/runs/33876793418
Commit: 77ea5be
Cypress dashboard.
Tags: @tag.All
Spec:


Fri, 04 Sep 2026 14:25:12 UTC

Fixes https://linear.app/appsmith/issue/APP-15930/fixdeps-batch-security-update-r2dbc-mariadb-141-cve-2026-55859-cve

@appsmith-smithes appsmith-smithes Bot added the ok-to-test Required label for CI label Aug 29, 2026
@github-actions github-actions Bot added Bug Something isn't working Frontend This label marks the issue or pull request to reference client code High This issue blocks a user from building or impacts a lot of users Regressed Scenarios that were working before but have now regressed Table Widget Verified When issue is retested post its fixed Widgets Product This label groups issues related to widgets labels Aug 29, 2026
@appsmith-smithes appsmith-smithes Bot added the hacktron-exclude Skip Hacktron security scan for this PR label Aug 29, 2026
@github-actions github-actions Bot removed the Bug Something isn't working label Aug 29, 2026
@github-actions

Copy link
Copy Markdown

Failed server tests

  • com.external.plugins.ElasticSearchPluginTest#
  • com.external.plugins.DynamoPluginTest#
  • com.external.plugins.RestrictedHostJedisSocketFactoryTest#
  • com.external.plugins.RedisPluginTest#
  • com.external.utils.RedisURIUtilsTest#
  • com.external.plugins.MssqlGetDBSchemaTest#
  • com.external.plugins.MssqlPluginTest#
  • com.external.plugins.MssqlDatabaseNameValidationTest#
  • com.external.plugins.FirestorePluginTest#
  • com.external.plugins.RedshiftPluginTest#
  • com.external.plugins.AmazonS3PluginTest#
  • com.external.utils.AmazonS3ErrorUtilsTest#
  • com.external.config.RowsBulkAppendMethodTest#
  • com.external.config.FileInfoMethodTest#
  • com.external.config.FileListMethodTest#
  • com.external.config.MethodConfigTest#
  • com.external.config.GetDatasourceMetadataMethodTest#
  • com.external.config.RowsGetMethodTest#
  • com.external.config.SheetsUtilTest#
  • com.external.config.GetStructureMethodTest#
  • com.external.config.RowsUpdateMethodTest#
  • com.external.config.RowsAppendMethodTest#
  • com.external.config.RowsBulkUpdateMethodTest#
  • com.external.plugins.GraphQLPluginTest#
  • com.external.plugins.SnowflakePluginTest#
  • com.external.plugins.SmtpPluginTest#
  • com.external.plugins.EmbeddingCommandTest#
  • com.external.plugins.VisionCommandTest#
  • com.external.plugins.OpenAIPluginTest#
  • com.external.plugins.ChatCommandTest#
  • com.external.plugins.CommandUtilsTest#
  • com.external.plugins.AnthropicPluginTest#
  • com.external.plugins.GenerateContentCommandTest#
  • com.external.plugins.GoogleAiPluginTest#
  • com.external.plugins.services.FieldValidationHelperTest#
  • com.external.plugins.services.HeadersUtilTest#
  • com.external.plugins.services.AiFeatureServiceFactoryTest#
  • com.external.plugins.services.features.TextEntityExtractionServiceImplTest#
  • com.external.plugins.services.features.ImageEntityExtractionServiceImplTest#
  • com.external.plugins.services.features.TextClassificationServiceImplTest#
  • com.external.plugins.services.features.TextSummarizationServiceImplTest#
  • com.external.plugins.services.features.TextGenerationServiceImplTest#
  • com.external.plugins.services.features.ImageClassificationServiceImplTest#
  • com.external.plugins.services.features.ImageCaptioningServiceImplTest#
  • com.external.plugins.services.FileUtilTest#
  • com.external.plugins.AwsLambdaPluginTest#
  • com.external.plugins.DatabricksPluginTest#
  • com.appsmith.git.service.GitRepoSanityCheckTest#
  • com.appsmith.git.service.BashServiceTest#
  • com.appsmith.git.handler.ce.FSGitHandlerSymlinkCloneTest#
  • com.appsmith.git.helpers.DSLTransformerHelperTest#
  • com.appsmith.git.helpers.FileUtilsImplTest#
  • com.appsmith.git.converters.GsonDoubleToLongConverterTest#
  • GsonUnorderedToOrderedSerializationTest#
  • com.external.plugins.MySqlPluginTest#datasourceCreate_doesNotRunOnTheSubscribingThread
  • com.external.plugins.MySqlPluginTest#testAliasColumnNames
  • com.external.plugins.MySqlPluginTest#testConnectMySQLContainer
  • com.external.plugins.MySqlPluginTest#testConnectMySQLContainerWithInvalidTimezone
  • com.external.plugins.MySqlPluginTest#testDatasourceDestroy
  • com.external.plugins.MySqlPluginTest#testDatasourceWithNullPassword
  • com.external.plugins.MySqlPluginTest#testDatasourceWithRootUserAndNullPassword
  • com.external.plugins.MySqlPluginTest#testDuplicateColumnNames
  • com.external.plugins.MySqlPluginTest#testExecute
  • com.external.plugins.MySqlPluginTest#testExecuteCommon_queryWithComments_callValidationCallsAfterRemovingComments
  • com.external.plugins.MySqlPluginTest#testExecuteDataTypes
  • com.external.plugins.MySqlPluginTest#testExecuteDataTypesExtensive
  • com.external.plugins.MySqlPluginTest#testExecuteDescTableCmd
  • com.external.plugins.MySqlPluginTest#testExecuteDescribeTableCmd
  • com.external.plugins.MySqlPluginTest#testExecuteWithFormattingWithSelectCmd
  • com.external.plugins.MySqlPluginTest#testExecuteWithFormattingWithShowCmd
  • com.external.plugins.MySqlPluginTest#testExecuteWithLongRunningQuery
  • com.external.plugins.MySqlPluginTest#testExecuteWithPreparedStatement
  • com.external.plugins.MySqlPluginTest#testLongValueWithPreparedStatement
  • com.external.plugins.MySqlPluginTest#testMySqlNoPasswordExceptionMessage
  • com.external.plugins.MySqlPluginTest#testNullAsStringWithPreparedStatement
  • com.external.plugins.MySqlPluginTest#testNullObjectWithPreparedStatement
  • com.external.plugins.MySqlPluginTest#testNumericValuesHavingLeadingZeroWithPreparedStatement
  • com.external.plugins.MySqlPluginTest#testPreparedStatementErrorWithIsKeyword
  • com.external.plugins.MySqlPluginTest#testPreparedStatementWithBooleanType
  • com.external.plugins.MySqlPluginTest#testPreparedStatementWithRealTypes
  • com.external.plugins.MySqlPluginTest#testSslDefault
  • com.external.plugins.MySqlPluginTest#testSslDisabled
  • com.external.plugins.MySqlPluginTest#testSslRequired
  • com.external.plugins.MySqlPluginTest#testStaleConnectionCheck
  • com.external.plugins.MySqlPluginTest#testStructure
  • com.external.plugins.MySqlPluginTest#testTestDatasource

@github-actions github-actions Bot added the Bug Something isn't working label Aug 29, 2026
@appsmith-smithes

Copy link
Copy Markdown
Contributor Author

Fixed in c8c7888.

Root cause: r2dbc-mariadb 1.4.1 now interprets the R2DBC SPI PROTOCOL option as MariaDB HaMode. Our generated URL was r2dbc:pool:mariadb://..., which parses as DRIVER=pool, PROTOCOL=mariadb; the upgraded driver therefore rejected mariadb as an invalid HA mode.

Fix: Generate r2dbc:mariadb://... instead. The plugin already constructs its ConnectionPool explicitly, so the pool URL wrapper was redundant. Added a regression test asserting DRIVER=mariadb, no PROTOCOL, and successful 1.4.1 configuration construction.

Local verification: regression test failed before the fix and passed after it; all 34 non-container MySQL plugin tests passed; Spotless passed; the plugin package build passed. Full container/Cypress verification is now running in CI.

@appsmith-smithes

Copy link
Copy Markdown
Contributor Author

Follow-up fix in e83bbd0. The first fresh Cypress pass confirmed the HaMode=mariadb error was gone, but exposed a second 1.4.1 compatibility issue: reactor-netty-core became a new compile dependency and was packaged inside the PF4J plugin alongside duplicate Netty base classes. That caused a parent/plugin classloader cast failure (EpollEventLoopGroup vs EventLoopGroup).

The follow-up excludes the server-provided Reactor Netty and Netty base classes from the plugin, while retaining aligned 4.1.136 macOS DNS native artifacts. A clean package inspection confirms the plugin now contains 0 reactor/netty entries and 0 Netty channel/buffer/handler base entries; 34 plugin tests, package, and Spotless still pass. Fresh full CI is starting now.

@appsmith-smithes

Copy link
Copy Markdown
Contributor Author

✅ Final verification complete on e83bbd0.

  • Quality checks: passed (server unit tests, Spotless, qc-result)
  • PR Automation test suite: passed
  • All 60 Cypress shards passed
  • ci-test-result: passed
  • Semgrep: passed

Run: https://github.com/appsmithorg/appsmith/actions/runs/33268309168

@appsmith-smithes
appsmith-smithes Bot marked this pull request as ready for review August 31, 2026 15:20
@appsmith-smithes
appsmith-smithes Bot requested a review from a team as a code owner August 31, 2026 15:20
@appsmith-smithes
appsmith-smithes Bot requested a review from subrata71 August 31, 2026 15:20
@wyattwalter wyattwalter removed the hacktron-exclude Skip Hacktron security scan for this PR label Aug 31, 2026

@wyattwalter wyattwalter left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the behavioral side of this bump (it is not quite version-bumps-only — the URL scheme change alters runtime connection-factory construction). Verified clean, so nobody needs to re-check these:

  • Both alerts are fixed at exactly 1.4.1 (CVE-2026-55859, CVE-2026-55860), and no other plugin depends on r2dbc-mariadb.
  • Connection pooling is unaffected: the pool: prefix never engaged r2dbc-pool (the code builds MariadbConnectionFactory directly and wraps it in ConnectionPool in getNewConnectionPool), so dropping it changes nothing about pooling.
  • SSL modes survive the bump: SslMode.from accepts required as a TRUST alias identically in 1.1.4 and 1.4.1 (checked both jars).
  • The new netty/reactor-netty exclusions are covered by green server-unit-tests (real testcontainers connections) and the full Cypress run.

One real gap (inline comment on MySqlDatasourceUtils.java): the fix covers only the endpoints branch; stored URL-based datasources carrying the old r2dbc:pool:mariadb:// format now fail under 1.4.1.

Two smaller things while this pom is open:

  • The r2dbc-pool version comment warns about incompatibility with r2dbc-mysql 0.8.2.RELEASE, which is no longer a dependency of this plugin. It will misdirect the next person doing a CVE bump on r2dbc-pool — please update or delete it.
  • The three <version>${netty.version}</version> tags are redundant with the inherited Spring Boot BOM pin (arangoDBPlugin declares its netty deps without versions). Optional.

Description nits: Resolves #730 / #731 uses Dependabot alert numbers, which GitHub links to two unrelated 2020 issues in this repo — better to reference the alert URLs. And the "No code changes — version bumps only" line is now stale given the MySqlDatasourceUtils change and new test.

urlBuilder.append(datasourceConfiguration.getUrl());
} else {
urlBuilder.append("r2dbc:pool:mariadb://");
urlBuilder.append("r2dbc:mariadb://");

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This fixes the endpoints branch, but the getUrl() branch two lines up still passes stored URLs through verbatim into the same ConnectionFactoryOptions.parse -> MariadbConnectionConfiguration.fromOptions path.

Why that now breaks: 1.4.1's fromOptions reads ConnectionFactoryOptions.PROTOCOL and feeds it to Builder.haMode(...) (1.1.4 ignored PROTOCOL entirely — verified in both jars), and HaMode.from("mariadb") throws IllegalArgumentException("Wrong argument value 'mariadb' for HaMode"). So a datasource stored with the previously-valid r2dbc:pool:mariadb://host:3306/db URL — API-created or git-imported; the UI form has no URL field — parses to DRIVER=pool, PROTOCOL=mariadb and fails on every datasourceCreate after this upgrade.

Suggest normalizing a leading pool: segment (or forcing the mariadb driver option) at the common parse point below, so both branches are covered.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 77ea5be. getBuilder now normalizes only a leading r2dbc:pool:mariadb:// immediately before the common parse point. The stored-URL regression test failed before the fix with Wrong argument value 'mariadb' for HaMode and passes after normalization.

@Test
public void testStandardConnectionOptionsAreCompatibleWithMariaDbDriver() {
DatasourceConfiguration dsConfig = getDatasourceConfigurationWithStandardConnectionMethod();
ConnectionFactoryOptions options =

@wyattwalter wyattwalter Aug 31, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I checked that this test fails without the URL change (DRIVER comes back as pool), so it does cover the fix. Two gaps worth closing while here:

  1. Multi-endpoint: getBuilder comma-joins hosts into r2dbc:mariadb://h1:3306,h2:3306/db, and with PROTOCOL now absent it is unverified that 1.4.1 parses that host list the way 1.1.4 did. A two-endpoint variant of this test would pin it down.
  2. The URL branch (datasourceConfiguration.getUrl()) has no coverage at all — see the comment on MySqlDatasourceUtils.java; a test with url set and endpoints empty would document the intended behavior under 1.4.1.

Also consider driving getNewConnectionPool(...) here instead of hand-rolling fromOptions, so addSslOptionsToBuilder and allowPublicKeyRetrieval(true) are exercised against future driver bumps too.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Covered in 77ea5be. Added a two-endpoint test that builds MariadbConnectionConfiguration and asserts both host/port pairs survive parsing, plus stored-URL coverage. Kept these at getBuilder level to isolate URL parsing; existing plugin tests exercise pool construction. Locally: 14/14 focused tests pass, Spotless passes, and the plugin packages successfully.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@wyattwalter Please check again.

@github-actions github-actions Bot removed the Bug Something isn't working label Sep 4, 2026
@linear-code

linear-code Bot commented Sep 8, 2026

Copy link
Copy Markdown

APP-15930

@appsmithorg appsmithorg deleted a comment from github-actions Bot Sep 8, 2026
@subrata71
subrata71 merged commit d754da7 into release Sep 10, 2026
164 of 167 checks passed
@subrata71
subrata71 deleted the fix/dependabot-batch-20260829-023747 branch September 10, 2026 13:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Frontend This label marks the issue or pull request to reference client code High This issue blocks a user from building or impacts a lot of users ok-to-test Required label for CI Regressed Scenarios that were working before but have now regressed Table Widget Verified When issue is retested post its fixed Widgets Product This label groups issues related to widgets

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants