FINERACT-1757: Uppercase letters in the datatable name is failing on postgres
This commit is contained in:
committed by
Adam Saghy
parent
5f713be7ec
commit
6f2b0198a2
+19
-3
@@ -204,17 +204,19 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<JsonObject> queryDataTable(String datatable, String columnFilter, String valueFilter, String resultColumns) {
|
||||
public List<JsonObject> queryDataTable(String datatable, final String columnFilter, String valueFilter, String resultColumns) {
|
||||
Arrays.asList(datatable, columnFilter, valueFilter, resultColumns).forEach(SQLInjectionValidator::validateDynamicQuery);
|
||||
|
||||
List<ResultsetColumnHeaderData> resultsetColumnHeaderData = genericDataService.fillResultsetColumnHeaders(datatable);
|
||||
validateRequestParams(columnFilter, valueFilter, resultColumns, resultsetColumnHeaderData);
|
||||
String filterColumnType = resultsetColumnHeaderData.stream().filter(column -> Objects.equals(columnFilter, column.getColumnName()))
|
||||
.findFirst().map(ResultsetColumnHeaderData::getColumnType).orElse(columnFilter + " does not exist in datatable");
|
||||
|
||||
String sql = "select " + resultColumns + " from " + datatable + " where " + columnFilter + " = ?";
|
||||
SqlRowSet rowSet = null;
|
||||
String filterColumnType = resultsetColumnHeaderData.stream().filter(column -> Objects.equals(columnFilter, column.getColumnName()))
|
||||
.findFirst().map(ResultsetColumnHeaderData::getColumnType).orElse(columnFilter + " does not exist in datatable");
|
||||
if (databaseTypeResolver.isPostgreSQL()) {
|
||||
sql = "select " + escapeFieldNames(resultColumns) + " from " + sqlGenerator.escape(datatable) + " where "
|
||||
+ escapeFieldNames(columnFilter) + " = ?";
|
||||
rowSet = callFilteredPgSql(sql, valueFilter, filterColumnType);
|
||||
} else if (databaseTypeResolver.isMySQL()) {
|
||||
rowSet = callFilteredMysql(sql, valueFilter, filterColumnType);
|
||||
@@ -234,6 +236,7 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
|
||||
private void extractResults(SqlRowSet rowSet, String[] resultColumnNames, List<JsonObject> results) {
|
||||
JsonObject json = new JsonObject();
|
||||
for (String rcn : resultColumnNames) {
|
||||
rcn = rcn.replaceAll("\"", "");
|
||||
Object rowValue = rowSet.getObject(rcn);
|
||||
if (rowValue != null) {
|
||||
if (rowValue instanceof Character) {
|
||||
@@ -332,6 +335,19 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
|
||||
return jdbcTemplate.queryForRowSet(sql, new Object[] { finalValueFilter }, argType);
|
||||
}
|
||||
|
||||
private String escapeFieldNames(final String inputFields) {
|
||||
final String delimiter = ",";
|
||||
if (StringUtils.isBlank(inputFields)) {
|
||||
return inputFields;
|
||||
}
|
||||
final String[] fieldList = StringUtils.split(inputFields, delimiter);
|
||||
final String[] outputFields = new String[fieldList.length];
|
||||
for (int i = 0; i < fieldList.length; i++) {
|
||||
outputFields[i] = sqlGenerator.escape(fieldList[i].trim());
|
||||
}
|
||||
return String.join(",", outputFields);
|
||||
}
|
||||
|
||||
private static void validateRequestParams(String columnFilter, String valueFilter, String resultColumns,
|
||||
List<ResultsetColumnHeaderData> resultsetColumnHeaderData) {
|
||||
List<ApiParameterError> paramErrors = new ArrayList<>();
|
||||
|
||||
+5
@@ -27,6 +27,7 @@ import com.google.gson.JsonObject;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException;
|
||||
import org.apache.fineract.infrastructure.core.service.database.DatabaseSpecificSQLGenerator;
|
||||
import org.apache.fineract.infrastructure.core.service.database.DatabaseTypeResolver;
|
||||
import org.apache.fineract.infrastructure.dataqueries.data.ResultsetColumnHeaderData;
|
||||
import org.apache.fineract.infrastructure.security.utils.SQLInjectionException;
|
||||
@@ -52,6 +53,9 @@ public class ReadWriteNonCoreDataServiceImplTest {
|
||||
@Mock
|
||||
private DatabaseTypeResolver databaseTypeResolver;
|
||||
|
||||
@Mock
|
||||
private DatabaseSpecificSQLGenerator sqlGenerator;
|
||||
|
||||
@InjectMocks
|
||||
private ReadWriteNonCoreDataServiceImpl underTest;
|
||||
|
||||
@@ -81,6 +85,7 @@ public class ReadWriteNonCoreDataServiceImplTest {
|
||||
.thenReturn(sqlRS);
|
||||
when(sqlRS.next()).thenReturn(true).thenReturn(false);
|
||||
when(sqlRS.getObject(ArgumentMatchers.anyString())).thenReturn("value1").thenReturn("value2");
|
||||
when(sqlGenerator.escape(ArgumentMatchers.anyString())).thenReturn("rc1").thenReturn("rc2").thenReturn("table").thenReturn("cf1");
|
||||
when(databaseTypeResolver.isPostgreSQL()).thenReturn(true);
|
||||
|
||||
ResultsetColumnHeaderData cf1 = ResultsetColumnHeaderData.detailed("cf1", "text", 10L, false, false, null, null, false, false);
|
||||
|
||||
Reference in New Issue
Block a user