From 1687bbaafdda7e80f3a17d5a421f63f641523109 Mon Sep 17 00:00:00 2001 From: buczekp <buczekp> Date: Tue, 23 Feb 2010 08:40:39 +0000 Subject: [PATCH] [LMS-1361] use predefined query id instead of sql for security reasons SVN: 14877 --- .../GridCustomExpressionTranslator.java | 4 +--- .../web/client/IQueryClientService.java | 4 ++++ .../web/client/IQueryClientServiceAsync.java | 5 +++++ .../application/module/IQueryProvider.java | 2 ++ .../application/module/QueryViewer.java | 20 +++++++++++------ .../module/RunCannedQueryToolbar.java | 6 +++++ .../module/RunCustomQueryToolbar.java | 5 +++++ .../client/web/server/QueryClientService.java | 16 ++++++++++++++ .../plugin/query/server/QueryServer.java | 9 ++++---- .../shared/basic/dto/QueryExpression.java | 22 +++---------------- 10 files changed, 60 insertions(+), 33 deletions(-) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/GridCustomExpressionTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/GridCustomExpressionTranslator.java index c4bf94ce45d..f3c2cfd6a6f 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/GridCustomExpressionTranslator.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/GridCustomExpressionTranslator.java @@ -21,8 +21,6 @@ import static org.apache.commons.lang.StringEscapeUtils.escapeHtml; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.StringEscapeUtils; - import ch.systemsx.cisd.openbis.generic.shared.basic.ExpressionUtil; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExpression; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomColumn; @@ -111,7 +109,7 @@ public final class GridCustomExpressionTranslator result.setId(HibernateUtils.getId(expression)); result.setModificationDate(expression.getModificationDate()); result.setExpression(escapeHtml(expression.getExpression())); - result.setDescription(StringEscapeUtils.escapeHtml(expression.getDescription())); + result.setDescription(escapeHtml(expression.getDescription())); result.setRegistrator(PersonTranslator.translate(expression.getRegistrator())); result.setRegistrationDate(expression.getRegistrationDate()); result.setDatabaseInstance(DatabaseInstanceTranslator.translate(expression diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/IQueryClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/IQueryClientService.java index 5cd1f2c447a..7c319786941 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/IQueryClientService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/IQueryClientService.java @@ -39,6 +39,10 @@ public interface IQueryClientService extends IClientService /** Returns label of the database used for queries or null if it is not configured. */ public String tryToGetQueryDatabaseLabel() throws UserFailureException; + /** Returns results of the query with specified id. */ + public TableModelReference createQueryResultsReport(TechId queryId, + QueryParameterBindings bindingsOrNull) throws UserFailureException; + /** Returns results of the specified SQL query. */ public TableModelReference createQueryResultsReport(String sqlQuery, QueryParameterBindings bindingsOrNull) throws UserFailureException; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/IQueryClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/IQueryClientServiceAsync.java index b6c38752244..d19dc8fd3dc 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/IQueryClientServiceAsync.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/IQueryClientServiceAsync.java @@ -41,6 +41,10 @@ public interface IQueryClientServiceAsync extends IClientServiceAsync /** @see IQueryClientService#tryToGetQueryDatabaseLabel() */ public void tryToGetQueryDatabaseLabel(AsyncCallback<String> callback); + /** @see IQueryClientService#createQueryResultsReport(TechId, QueryParameterBindings) */ + public void createQueryResultsReport(TechId techId, QueryParameterBindings bindingsOrNull, + AsyncCallback<TableModelReference> callback); + /** @see IQueryClientService#createQueryResultsReport(String, QueryParameterBindings) */ public void createQueryResultsReport(String sqlQuery, QueryParameterBindings bindingsOrNull, AsyncCallback<TableModelReference> callback); @@ -65,4 +69,5 @@ public interface IQueryClientServiceAsync extends IClientServiceAsync /** @see IQueryClientService#updateQuery(IExpressionUpdates) */ public void updateQuery(final IExpressionUpdates queryUpdate, AsyncCallback<Void> callback); + } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/IQueryProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/IQueryProvider.java index 7d0e17125b8..34369263ac7 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/IQueryProvider.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/IQueryProvider.java @@ -24,6 +24,8 @@ import ch.systemsx.cisd.openbis.plugin.query.shared.basic.dto.QueryParameterBind */ public interface IQueryProvider extends IDatabaseModificationObserver { + Long tryGetQueryId(); + String tryGetSQLQuery(); QueryParameterBindings tryGetQueryParameterBindings(); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/QueryViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/QueryViewer.java index c23a42729f6..5243bf300bf 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/QueryViewer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/QueryViewer.java @@ -31,6 +31,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.report. import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.report.ReportGeneratedCallback.IOnReportComponentGeneratedAction; import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction; import ch.systemsx.cisd.openbis.generic.shared.basic.IReportInformationProvider; +import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind; import ch.systemsx.cisd.openbis.plugin.query.client.web.client.IQueryClientServiceAsync; import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.Constants; @@ -86,16 +87,21 @@ public class QueryViewer extends ContentPanel implements IDatabaseModificationOb private void refresh() { + Long queryIdOrNull = queryProvider.tryGetQueryId(); String sqlQueryOrNull = queryProvider.tryGetSQLQuery(); QueryParameterBindings bindingsOrNull = queryProvider.tryGetQueryParameterBindings(); - if (sqlQueryOrNull != null) + ReportGeneratedCallback callback = + new ReportGeneratedCallback(viewContext.getCommonViewContext(), + createReportInformationProvider(sqlQueryOrNull), + createDisplayQueryResultsAction()); + if (queryIdOrNull != null) { - viewContext.getService().createQueryResultsReport( - sqlQueryOrNull, - bindingsOrNull, - new ReportGeneratedCallback(viewContext.getCommonViewContext(), - createReportInformationProvider(sqlQueryOrNull), - createDisplayQueryResultsAction())); + viewContext.getService().createQueryResultsReport(new TechId(queryIdOrNull), + bindingsOrNull, callback); + } else if (sqlQueryOrNull != null) + { + viewContext.getService().createQueryResultsReport(sqlQueryOrNull, bindingsOrNull, + callback); } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/RunCannedQueryToolbar.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/RunCannedQueryToolbar.java index 923099c6a3d..c65e7d66445 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/RunCannedQueryToolbar.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/RunCannedQueryToolbar.java @@ -191,6 +191,12 @@ public class RunCannedQueryToolbar extends AbstractCustomQueryToolbar // ICustomQueryProvider // + public Long tryGetQueryId() + { + QueryExpression selectedQueryOrNull = querySelectionWidget.tryGetSelected(); + return selectedQueryOrNull == null ? null : selectedQueryOrNull.getId(); + } + public String tryGetSQLQuery() { QueryExpression selectedQueryOrNull = querySelectionWidget.tryGetSelected(); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/RunCustomQueryToolbar.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/RunCustomQueryToolbar.java index d871a08e0c5..3da7aced0f3 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/RunCustomQueryToolbar.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/RunCustomQueryToolbar.java @@ -69,6 +69,11 @@ public class RunCustomQueryToolbar extends AbstractCustomQueryToolbar // ICustomQueryProvider // + public Long tryGetQueryId() + { + return null; + } + public String tryGetSQLQuery() { return queryField.getValue(); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/server/QueryClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/server/QueryClientService.java index 5c0d81d651e..768c216e075 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/server/QueryClientService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/server/QueryClientService.java @@ -103,6 +103,22 @@ public class QueryClientService extends AbstractClientService implements IQueryC } } + public TableModelReference createQueryResultsReport(TechId query, + QueryParameterBindings bindingsOrNull) + { + try + { + final String sessionToken = getSessionToken(); + final TableModel tableModel = + queryServer.queryDatabase(sessionToken, query, bindingsOrNull); + String resultSetKey = saveInCache(tableModel.getRows()); + return new TableModelReference(resultSetKey, tableModel.getHeader()); + } catch (final UserFailureException e) + { + throw UserFailureExceptionTranslator.translate(e); + } + } + public List<QueryExpression> listQueries() throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException { diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServer.java index ebabc090627..b2e12fc955e 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServer.java @@ -21,6 +21,7 @@ import java.util.Properties; import javax.annotation.Resource; +import org.apache.commons.lang.StringEscapeUtils; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Component; @@ -74,8 +75,7 @@ public class QueryServer extends AbstractServer<IQueryServer> implements IQueryS QueryServer(final ISessionManager<Session> sessionManager, final IDAOFactory daoFactory, final ISampleTypeSlaveServerPlugin sampleTypeSlaveServerPlugin, - final IDataSetTypeSlaveServerPlugin dataSetTypeSlaveServerPlugin, - IDAO dao) + final IDataSetTypeSlaveServerPlugin dataSetTypeSlaveServerPlugin, IDAO dao) { super(sessionManager, daoFactory, sampleTypeSlaveServerPlugin, dataSetTypeSlaveServerPlugin); this.dao = dao; @@ -188,7 +188,8 @@ public class QueryServer extends AbstractServer<IQueryServer> implements IQueryS { IQueryDAO queryDAO = getDAOFactory().getQueryDAO(); QueryPE query = queryDAO.getByTechId(queryId); - return queryDatabase(query.getExpression(), bindings); + String expression = StringEscapeUtils.unescapeHtml(query.getExpression()); + return queryDatabase(expression, bindings); } catch (DataAccessException ex) { throw new UserFailureException(ex.getMostSpecificCause().getMessage(), ex); @@ -199,7 +200,7 @@ public class QueryServer extends AbstractServer<IQueryServer> implements IQueryS { return getDAO().query(sqlQuery, bindings); } - + private IDAO getDAO() { if (dao == null) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/shared/basic/dto/QueryExpression.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/shared/basic/dto/QueryExpression.java index eba620b45d5..56cb8631e68 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/shared/basic/dto/QueryExpression.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/shared/basic/dto/QueryExpression.java @@ -16,8 +16,6 @@ package ch.systemsx.cisd.openbis.plugin.query.shared.basic.dto; -import java.util.List; - import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExpressionWithParameters; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; @@ -26,32 +24,18 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder; * * @author Piotr Buczek */ +// TODO 2010-02-23, Piotr Buczek: no need to use subclasses public class QueryExpression extends AbstractExpressionWithParameters { private static final long serialVersionUID = ServiceVersionHolder.VERSION; - private List<String> allParameters; - public QueryExpression() { } - // TODO remove - public List<String> getAllParameters() - { - return allParameters; - } - - private void setAllParameters(List<String> allParameters) - { - this.allParameters = allParameters; - } - - @Override - public void setupParameters(List<String> allParameters) + public QueryExpression(String expression) { - super.setupParameters(allParameters); - setAllParameters(allParameters); + setExpression(expression); } } -- GitLab