From abd92353604ca6ad1e31b903d5ffaa83215350ec Mon Sep 17 00:00:00 2001 From: Shrikant Kandula Date: Fri, 10 Apr 2020 09:59:50 +0000 Subject: [PATCH] Richer plugin validations --- .../external/plugins/PluginExecutor.java | 9 ++++- .../com/external/plugins/MongoPlugin.java | 7 ++-- .../com/external/plugins/PostgresPlugin.java | 35 ++++++++++++++----- .../com/external/plugins/RapidApiPlugin.java | 12 +++---- .../com/external/plugins/RestApiPlugin.java | 18 ++++++---- .../services/DatasourceServiceImpl.java | 7 ++-- .../services/DatasourceServiceTest.java | 7 ++-- 7 files changed, 66 insertions(+), 29 deletions(-) diff --git a/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/plugins/PluginExecutor.java b/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/plugins/PluginExecutor.java index e6e566e482..c6ab7dbaf0 100644 --- a/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/plugins/PluginExecutor.java +++ b/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/plugins/PluginExecutor.java @@ -3,8 +3,11 @@ package com.appsmith.external.plugins; import com.appsmith.external.models.ActionConfiguration; import com.appsmith.external.models.DatasourceConfiguration; import org.pf4j.ExtensionPoint; +import org.springframework.util.CollectionUtils; import reactor.core.publisher.Mono; +import java.util.Set; + public interface PluginExecutor extends ExtensionPoint { /** @@ -34,5 +37,9 @@ public interface PluginExecutor extends ExtensionPoint { */ void datasourceDestroy(Object connection); - Boolean isDatasourceValid(DatasourceConfiguration datasourceConfiguration); + default boolean isDatasourceValid(DatasourceConfiguration datasourceConfiguration) { + return CollectionUtils.isEmpty(validateDatasource(datasourceConfiguration)); + } + + Set validateDatasource(DatasourceConfiguration datasourceConfiguration); } diff --git a/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/MongoPlugin.java b/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/MongoPlugin.java index 9f56a58c4a..933dcac907 100644 --- a/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/MongoPlugin.java +++ b/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/MongoPlugin.java @@ -19,6 +19,8 @@ import org.pf4j.PluginWrapper; import reactor.core.publisher.Mono; import java.math.BigInteger; +import java.util.HashSet; +import java.util.Set; @Slf4j public class MongoPlugin extends BasePlugin { @@ -127,8 +129,9 @@ public class MongoPlugin extends BasePlugin { } @Override - public Boolean isDatasourceValid(DatasourceConfiguration datasourceConfiguration) { - return true; + public Set validateDatasource(DatasourceConfiguration datasourceConfiguration) { + // TODO: Apply validations for MongoDB datasource. + return new HashSet<>(); } } diff --git a/app/server/appsmith-plugins/postgresPlugin/src/main/java/com/external/plugins/PostgresPlugin.java b/app/server/appsmith-plugins/postgresPlugin/src/main/java/com/external/plugins/PostgresPlugin.java index 233140a85f..9e38b1ac6c 100644 --- a/app/server/appsmith-plugins/postgresPlugin/src/main/java/com/external/plugins/PostgresPlugin.java +++ b/app/server/appsmith-plugins/postgresPlugin/src/main/java/com/external/plugins/PostgresPlugin.java @@ -12,11 +12,13 @@ import org.apache.commons.lang.ObjectUtils; import org.pf4j.Extension; import org.pf4j.PluginWrapper; import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; import reactor.core.publisher.Mono; import java.sql.Connection; import java.sql.*; import java.util.*; +import java.util.stream.Stream; import static com.appsmith.external.models.Connection.Mode.READ_ONLY; @@ -150,21 +152,38 @@ public class PostgresPlugin extends BasePlugin { } } - @SuppressWarnings("RedundantIfStatement") @Override - public Boolean isDatasourceValid(@NonNull DatasourceConfiguration datasourceConfiguration) { + public Set validateDatasource(@NonNull DatasourceConfiguration datasourceConfiguration) { + Set invalids = new HashSet<>(); if (CollectionUtils.isEmpty(datasourceConfiguration.getEndpoints())) { - return false; + invalids.add("Missing endpoint."); } - if (datasourceConfiguration.getAuthentication() == null - || datasourceConfiguration.getAuthentication().getUsername() == null - || datasourceConfiguration.getAuthentication().getPassword() == null) { - return false; + if (datasourceConfiguration.getConnection() != null + && datasourceConfiguration.getConnection().getMode() == null) { + invalids.add("Missing Connection Mode."); } - return true; + if (datasourceConfiguration.getAuthentication() == null) { + invalids.add("Authentication details missing."); + + } else { + if (StringUtils.isEmpty(datasourceConfiguration.getAuthentication().getUsername())) { + invalids.add("Missing username for authentication."); + } + + if (StringUtils.isEmpty(datasourceConfiguration.getAuthentication().getPassword())) { + invalids.add("Missing password for authentication."); + } + + if (StringUtils.isEmpty(datasourceConfiguration.getAuthentication().getDatabaseName())) { + invalids.add("Missing database name."); + } + + } + + return invalids; } } diff --git a/app/server/appsmith-plugins/rapidApiPlugin/src/main/java/com/external/plugins/RapidApiPlugin.java b/app/server/appsmith-plugins/rapidApiPlugin/src/main/java/com/external/plugins/RapidApiPlugin.java index fb0c83ee6e..e5933204b8 100644 --- a/app/server/appsmith-plugins/rapidApiPlugin/src/main/java/com/external/plugins/RapidApiPlugin.java +++ b/app/server/appsmith-plugins/rapidApiPlugin/src/main/java/com/external/plugins/RapidApiPlugin.java @@ -30,9 +30,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -250,10 +248,10 @@ public class RapidApiPlugin extends BasePlugin { } @Override - public Boolean isDatasourceValid(DatasourceConfiguration datasourceConfiguration) { - // Since the datasource is created by rapid api & not by the user and it can't be edited - // Assume that everything is good. Return true. - return true; + public Set validateDatasource(DatasourceConfiguration datasourceConfiguration) { + // Since the datasource is created by rapid api & not by the user and it can't be edited. + // Assume that everything is good. Return as valid. + return new HashSet<>(); } private void addHeadersToRequest(WebClient.Builder webClientBuilder, List headers) { diff --git a/app/server/appsmith-plugins/restApiPlugin/src/main/java/com/external/plugins/RestApiPlugin.java b/app/server/appsmith-plugins/restApiPlugin/src/main/java/com/external/plugins/RestApiPlugin.java index b264a82070..dd60d40dae 100644 --- a/app/server/appsmith-plugins/restApiPlugin/src/main/java/com/external/plugins/RestApiPlugin.java +++ b/app/server/appsmith-plugins/restApiPlugin/src/main/java/com/external/plugins/RestApiPlugin.java @@ -32,8 +32,10 @@ import java.net.URISyntaxException; import java.net.URL; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; public class RestApiPlugin extends BasePlugin { private static int MAX_REDIRECTS = 5; @@ -216,19 +218,21 @@ public class RestApiPlugin extends BasePlugin { } @Override - public Boolean isDatasourceValid(DatasourceConfiguration datasourceConfiguration) { + public Set validateDatasource(DatasourceConfiguration datasourceConfiguration) { + Set invalids = new HashSet<>(); + if (datasourceConfiguration.getUrl() == null) { - System.out.println("URL is null. Data validation failed"); - return false; + invalids.add("Missing URL."); } - // Check for URL validity + try { + // Check for URL validity new URL(datasourceConfiguration.getUrl()).toURI(); - return true; } catch (Exception e) { - System.out.println("URL is invalid. Data validation failed"); - return false; + invalids.add("Invalid URL: '" + e.getMessage() + "'"); } + + return invalids; } private boolean addHeadersToRequestAndAscertainContentType(WebClient.Builder webClientBuilder, diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/DatasourceServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/DatasourceServiceImpl.java index 83dbab57c6..edd25ba220 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/DatasourceServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/DatasourceServiceImpl.java @@ -139,11 +139,14 @@ public class DatasourceServiceImpl extends BaseService validateDatasource(DatasourceConfiguration datasourceConfiguration) { System.out.println("In the datasourceValidate"); - return true; + return new HashSet<>(); } }