This is an automated email from the ASF dual-hosted git repository.
mattyb149 pushed a commit to branch support/nifi-1.x
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/support/nifi-1.x by this push:
new 1fdca9128b NIFI-11920 Improved JDBC and JNDI JMS Connection URL
Validation
1fdca9128b is described below
commit 1fdca9128bc5d9c61575837e5e08c3b97b86ed97
Author: exceptionfactory <[email protected]>
AuthorDate: Tue Aug 8 09:22:35 2023 -0500
NIFI-11920 Improved JDBC and JNDI JMS Connection URL Validation
Signed-off-by: Matt Burgess <[email protected]>
---
.../org/apache/nifi/dbcp/utils/DBCPProperties.java | 3 +-
.../jms/cf/JndiJmsConnectionFactoryProperties.java | 8 +++--
.../cf/JndiJmsConnectionFactoryProviderTest.java | 23 ++++++++++++-
.../apache/nifi/dbcp/ConnectionUrlValidator.java | 6 ++--
...UrlValidator.java => DriverClassValidator.java} | 29 ++++++----------
.../nifi/dbcp/ConnectionUrlValidatorTest.java | 20 +++++++++++
...atorTest.java => DriverClassValidatorTest.java} | 40 ++++++++++++++++------
.../apache/nifi/dbcp/HikariCPConnectionPool.java | 2 +-
8 files changed, 93 insertions(+), 38 deletions(-)
diff --git
a/nifi-nar-bundles/nifi-extension-utils/nifi-dbcp-base/src/main/java/org/apache/nifi/dbcp/utils/DBCPProperties.java
b/nifi-nar-bundles/nifi-extension-utils/nifi-dbcp-base/src/main/java/org/apache/nifi/dbcp/utils/DBCPProperties.java
index 6f8c94b592..32774810bb 100644
---
a/nifi-nar-bundles/nifi-extension-utils/nifi-dbcp-base/src/main/java/org/apache/nifi/dbcp/utils/DBCPProperties.java
+++
b/nifi-nar-bundles/nifi-extension-utils/nifi-dbcp-base/src/main/java/org/apache/nifi/dbcp/utils/DBCPProperties.java
@@ -22,6 +22,7 @@ import
org.apache.nifi.components.resource.ResourceCardinality;
import org.apache.nifi.components.resource.ResourceType;
import org.apache.nifi.dbcp.ConnectionUrlValidator;
import org.apache.nifi.dbcp.DBCPValidator;
+import org.apache.nifi.dbcp.DriverClassValidator;
import org.apache.nifi.expression.ExpressionLanguageScope;
import org.apache.nifi.kerberos.KerberosUserService;
import org.apache.nifi.processor.util.StandardValidators;
@@ -67,7 +68,7 @@ public final class DBCPProperties {
.description("Database driver class name")
.defaultValue(null)
.required(true)
- .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+ .addValidator(new DriverClassValidator())
.expressionLanguageSupported(ExpressionLanguageScope.VARIABLE_REGISTRY)
.build();
diff --git
a/nifi-nar-bundles/nifi-jms-bundle/nifi-jms-processors/src/main/java/org/apache/nifi/jms/cf/JndiJmsConnectionFactoryProperties.java
b/nifi-nar-bundles/nifi-jms-bundle/nifi-jms-processors/src/main/java/org/apache/nifi/jms/cf/JndiJmsConnectionFactoryProperties.java
index 823ae0d976..7267c6ea53 100644
---
a/nifi-nar-bundles/nifi-jms-bundle/nifi-jms-processors/src/main/java/org/apache/nifi/jms/cf/JndiJmsConnectionFactoryProperties.java
+++
b/nifi-nar-bundles/nifi-jms-bundle/nifi-jms-processors/src/main/java/org/apache/nifi/jms/cf/JndiJmsConnectionFactoryProperties.java
@@ -158,10 +158,11 @@ public class JndiJmsConnectionFactoryProperties {
public ValidationResult validate(final String subject, final String
input, final ValidationContext context) {
final ValidationResult.Builder builder = new
ValidationResult.Builder().subject(subject).input(input);
- if (input == null || input.isEmpty()) {
+ final String url =
context.newPropertyValue(input).evaluateAttributeExpressions().getValue();
+ if (url == null || url.isEmpty()) {
builder.valid(false);
builder.explanation("URL is required");
- } else if (isUrlAllowed(input)) {
+ } else if (isUrlAllowed(url)) {
builder.valid(true);
builder.explanation("URL scheme allowed");
} else {
@@ -176,7 +177,8 @@ public class JndiJmsConnectionFactoryProperties {
private boolean isUrlAllowed(final String input) {
final boolean allowed;
- final Matcher matcher = URL_SCHEME_PATTERN.matcher(input);
+ final String normalizedUrl = input.trim();
+ final Matcher matcher = URL_SCHEME_PATTERN.matcher(normalizedUrl);
if (matcher.matches()) {
final String scheme = matcher.group(SCHEME_GROUP);
allowed = isSchemeAllowed(scheme);
diff --git
a/nifi-nar-bundles/nifi-jms-bundle/nifi-jms-processors/src/test/java/org/apache/nifi/jms/cf/JndiJmsConnectionFactoryProviderTest.java
b/nifi-nar-bundles/nifi-jms-bundle/nifi-jms-processors/src/test/java/org/apache/nifi/jms/cf/JndiJmsConnectionFactoryProviderTest.java
index b331660200..40b90ea022 100644
---
a/nifi-nar-bundles/nifi-jms-bundle/nifi-jms-processors/src/test/java/org/apache/nifi/jms/cf/JndiJmsConnectionFactoryProviderTest.java
+++
b/nifi-nar-bundles/nifi-jms-bundle/nifi-jms-processors/src/test/java/org/apache/nifi/jms/cf/JndiJmsConnectionFactoryProviderTest.java
@@ -41,6 +41,10 @@ public class JndiJmsConnectionFactoryProviderTest {
private static final String LDAP_PROVIDER_URL = "ldap://127.0.0.1";
+ private static final String LDAP_PROVIDER_URL_SPACED = String.format("
%s", LDAP_PROVIDER_URL);
+
+ private static final String LDAP_PROVIDER_URL_EXPRESSION =
"ldap:${separator}//127.0.0.1";
+
private static final String HOST_PORT_URL = "127.0.0.1:1024";
private static final String LDAP_ALLOWED_URL_SCHEMES = "ldap";
@@ -81,6 +85,24 @@ public class JndiJmsConnectionFactoryProviderTest {
runner.assertNotValid(provider);
}
+ @Test
+ void testPropertiesInvalidUrlSchemeSpaced() {
+ setFactoryProperties();
+
+ runner.setProperty(provider,
JndiJmsConnectionFactoryProperties.JNDI_PROVIDER_URL, LDAP_PROVIDER_URL_SPACED);
+
+ runner.assertNotValid(provider);
+ }
+
+ @Test
+ void testPropertiesInvalidUrlSchemeExpression() {
+ setFactoryProperties();
+
+ runner.setProperty(provider,
JndiJmsConnectionFactoryProperties.JNDI_PROVIDER_URL,
LDAP_PROVIDER_URL_EXPRESSION);
+
+ runner.assertNotValid(provider);
+ }
+
@Test
void testPropertiesHostPortUrl() {
setFactoryProperties();
@@ -90,7 +112,6 @@ public class JndiJmsConnectionFactoryProviderTest {
runner.assertValid(provider);
}
-
@Test
void testUrlSchemeValidSystemProperty() {
try {
diff --git
a/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/main/java/org/apache/nifi/dbcp/ConnectionUrlValidator.java
b/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/main/java/org/apache/nifi/dbcp/ConnectionUrlValidator.java
index c997d14006..a5863840ec 100644
---
a/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/main/java/org/apache/nifi/dbcp/ConnectionUrlValidator.java
+++
b/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/main/java/org/apache/nifi/dbcp/ConnectionUrlValidator.java
@@ -37,11 +37,11 @@ public class ConnectionUrlValidator implements Validator {
builder.valid(false);
builder.explanation("Connection URL required");
} else {
- final String url =
context.newPropertyValue(input).evaluateAttributeExpressions().getValue();
+ final String url =
context.newPropertyValue(input).evaluateAttributeExpressions().getValue().trim();
if (isUrlUnsupported(url)) {
builder.valid(false);
- builder.explanation(String.format("Connection URL starts with
an unsupported scheme %s", UNSUPPORTED_SCHEMES));
+ builder.explanation(String.format("Connection URL contains an
unsupported scheme %s", UNSUPPORTED_SCHEMES));
} else {
builder.valid(true);
builder.explanation("Connection URL is valid");
@@ -55,7 +55,7 @@ public class ConnectionUrlValidator implements Validator {
boolean unsupported = false;
for (final String unsupportedScheme : UNSUPPORTED_SCHEMES) {
- if (url.startsWith(unsupportedScheme)) {
+ if (url.contains(unsupportedScheme)) {
unsupported = true;
break;
}
diff --git
a/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/main/java/org/apache/nifi/dbcp/ConnectionUrlValidator.java
b/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/main/java/org/apache/nifi/dbcp/DriverClassValidator.java
similarity index 61%
copy from
nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/main/java/org/apache/nifi/dbcp/ConnectionUrlValidator.java
copy to
nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/main/java/org/apache/nifi/dbcp/DriverClassValidator.java
index c997d14006..bffe1961e7 100644
---
a/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/main/java/org/apache/nifi/dbcp/ConnectionUrlValidator.java
+++
b/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/main/java/org/apache/nifi/dbcp/DriverClassValidator.java
@@ -24,10 +24,10 @@ import java.util.Collections;
import java.util.Set;
/**
- * Database Connection URL Validator supports system attribute expressions and
evaluates URL formatting
+ * Database Driver Class Validator supports system attribute expressions and
evaluates class names against unsupported values
*/
-public class ConnectionUrlValidator implements Validator {
- private static final Set<String> UNSUPPORTED_SCHEMES =
Collections.singleton("jdbc:h2");
+public class DriverClassValidator implements Validator {
+ private static final Set<String> UNSUPPORTED_CLASSES =
Collections.singleton("org.h2.Driver");
@Override
public ValidationResult validate(final String subject, final String input,
final ValidationContext context) {
@@ -35,32 +35,23 @@ public class ConnectionUrlValidator implements Validator {
if (input == null || input.isEmpty()) {
builder.valid(false);
- builder.explanation("Connection URL required");
+ builder.explanation("Driver Class required");
} else {
- final String url =
context.newPropertyValue(input).evaluateAttributeExpressions().getValue();
+ final String driverClass =
context.newPropertyValue(input).evaluateAttributeExpressions().getValue().trim();
- if (isUrlUnsupported(url)) {
+ if (isDriverClassUnsupported(driverClass)) {
builder.valid(false);
- builder.explanation(String.format("Connection URL starts with
an unsupported scheme %s", UNSUPPORTED_SCHEMES));
+ builder.explanation(String.format("Driver Class is listed as
unsupported %s", UNSUPPORTED_CLASSES));
} else {
builder.valid(true);
- builder.explanation("Connection URL is valid");
+ builder.explanation("Driver Class is valid");
}
}
return builder.build();
}
- private boolean isUrlUnsupported(final String url) {
- boolean unsupported = false;
-
- for (final String unsupportedScheme : UNSUPPORTED_SCHEMES) {
- if (url.startsWith(unsupportedScheme)) {
- unsupported = true;
- break;
- }
- }
-
- return unsupported;
+ private boolean isDriverClassUnsupported(final String driverClass) {
+ return UNSUPPORTED_CLASSES.contains(driverClass);
}
}
diff --git
a/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/test/java/org/apache/nifi/dbcp/ConnectionUrlValidatorTest.java
b/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/test/java/org/apache/nifi/dbcp/ConnectionUrlValidatorTest.java
index 0421434eb0..5086b78512 100644
---
a/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/test/java/org/apache/nifi/dbcp/ConnectionUrlValidatorTest.java
+++
b/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/test/java/org/apache/nifi/dbcp/ConnectionUrlValidatorTest.java
@@ -37,6 +37,10 @@ class ConnectionUrlValidatorTest {
private static final String UNSUPPORTED_URL = "jdbc:h2:file";
+ private static final String UNSUPPORTED_URL_SPACED = String.format(" %s ",
UNSUPPORTED_URL);
+
+ private static final String UNSUPPORTED_URL_EXPRESSION =
String.format("${attribute}%s", UNSUPPORTED_URL);
+
private static final String VENDOR_URL = "jdbc:vendor";
private ValidationContext validationContext;
@@ -67,6 +71,22 @@ class ConnectionUrlValidatorTest {
assertFalse(result.isValid());
}
+ @Test
+ void testValidateUnsupportedUrlExpressionLanguage() {
+ final ValidationResult result = validator.validate(SUBJECT,
UNSUPPORTED_URL_EXPRESSION, validationContext);
+
+ assertNotNull(result);
+ assertFalse(result.isValid());
+ }
+
+ @Test
+ void testValidateUnsupportedUrlSpaced() {
+ final ValidationResult result = validator.validate(SUBJECT,
UNSUPPORTED_URL_SPACED, validationContext);
+
+ assertNotNull(result);
+ assertFalse(result.isValid());
+ }
+
@Test
void testValidateSupportedUrl() {
final ValidationResult result = validator.validate(SUBJECT,
VENDOR_URL, validationContext);
diff --git
a/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/test/java/org/apache/nifi/dbcp/ConnectionUrlValidatorTest.java
b/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/test/java/org/apache/nifi/dbcp/DriverClassValidatorTest.java
similarity index 64%
copy from
nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/test/java/org/apache/nifi/dbcp/ConnectionUrlValidatorTest.java
copy to
nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/test/java/org/apache/nifi/dbcp/DriverClassValidatorTest.java
index 0421434eb0..02de83de89 100644
---
a/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/test/java/org/apache/nifi/dbcp/ConnectionUrlValidatorTest.java
+++
b/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-api/src/test/java/org/apache/nifi/dbcp/DriverClassValidatorTest.java
@@ -29,23 +29,27 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
-class ConnectionUrlValidatorTest {
+class DriverClassValidatorTest {
- private static final String SUBJECT = "Database URL";
+ private static final String SUBJECT = "Database Driver Class";
private static final String EMPTY = "";
- private static final String UNSUPPORTED_URL = "jdbc:h2:file";
+ private static final String UNSUPPORTED_DRIVER = "org.h2.Driver";
- private static final String VENDOR_URL = "jdbc:vendor";
+ private static final String UNSUPPORTED_DRIVER_SPACED = String.format(" %s
", UNSUPPORTED_DRIVER);
+
+ private static final String UNSUPPORTED_DRIVER_EXPRESSION =
String.format("${attribute}%s", UNSUPPORTED_DRIVER);
+
+ private static final String OTHER_DRIVER = "org.apache.nifi.Driver";
private ValidationContext validationContext;
- private ConnectionUrlValidator validator;
+ private DriverClassValidator validator;
@BeforeEach
void setValidator() {
- validator = new ConnectionUrlValidator();
+ validator = new DriverClassValidator();
final MockProcessContext processContext = (MockProcessContext)
TestRunners.newTestRunner(NoOpProcessor.class).getProcessContext();
validationContext = new MockValidationContext(processContext);
@@ -60,16 +64,32 @@ class ConnectionUrlValidatorTest {
}
@Test
- void testValidateUnsupportedUrl() {
- final ValidationResult result = validator.validate(SUBJECT,
UNSUPPORTED_URL, validationContext);
+ void testValidateUnsupportedDriver() {
+ final ValidationResult result = validator.validate(SUBJECT,
UNSUPPORTED_DRIVER, validationContext);
+
+ assertNotNull(result);
+ assertFalse(result.isValid());
+ }
+
+ @Test
+ void testValidateUnsupportedDriverExpressionLanguage() {
+ final ValidationResult result = validator.validate(SUBJECT,
UNSUPPORTED_DRIVER_EXPRESSION, validationContext);
+
+ assertNotNull(result);
+ assertFalse(result.isValid());
+ }
+
+ @Test
+ void testValidateUnsupportedDriverSpaced() {
+ final ValidationResult result = validator.validate(SUBJECT,
UNSUPPORTED_DRIVER_SPACED, validationContext);
assertNotNull(result);
assertFalse(result.isValid());
}
@Test
- void testValidateSupportedUrl() {
- final ValidationResult result = validator.validate(SUBJECT,
VENDOR_URL, validationContext);
+ void testValidateSupportedDriver() {
+ final ValidationResult result = validator.validate(SUBJECT,
OTHER_DRIVER, validationContext);
assertNotNull(result);
assertTrue(result.isValid());
diff --git
a/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-hikari-dbcp-service/src/main/java/org/apache/nifi/dbcp/HikariCPConnectionPool.java
b/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-hikari-dbcp-service/src/main/java/org/apache/nifi/dbcp/HikariCPConnectionPool.java
index f4f7f68e8d..876afbb599 100644
---
a/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-hikari-dbcp-service/src/main/java/org/apache/nifi/dbcp/HikariCPConnectionPool.java
+++
b/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-hikari-dbcp-service/src/main/java/org/apache/nifi/dbcp/HikariCPConnectionPool.java
@@ -98,7 +98,7 @@ public class HikariCPConnectionPool extends
AbstractControllerService implements
.description("The fully-qualified class name of the JDBC driver.
Example: com.mysql.jdbc.Driver")
.defaultValue(null)
.required(true)
- .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+ .addValidator(new DriverClassValidator())
.expressionLanguageSupported(ExpressionLanguageScope.VARIABLE_REGISTRY)
.build();