diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/admin/ReportingController.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/admin/ReportingController.java index 6da7d5f0cc..1b559ba1a4 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/admin/ReportingController.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/controller/admin/ReportingController.java @@ -420,7 +420,7 @@ private boolean processReport(String reportName, HttpServletRequest request, Htt UserAccount account = PolicyHelper.getUserAccount(vreq); RequestModelAccess rma = ModelAccess.on(vreq); // Generate the report directly into the output stream - report.generateReport(response.getOutputStream(), rma, account); + report.generateReport(response.getOutputStream(), rma, account, request.getParameterMap()); } catch (IOException | ReportGeneratorException e) { log.error("Unable to generate the report", e); } diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/freemarker/config/FreemarkerConfiguration.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/freemarker/config/FreemarkerConfiguration.java index f32b349154..50b91541af 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/freemarker/config/FreemarkerConfiguration.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/freemarker/config/FreemarkerConfiguration.java @@ -25,6 +25,7 @@ import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.EditConfigurationConstants; import edu.cornell.mannlib.vitro.webapp.freemarker.loader.FreemarkerTemplateLoader; import edu.cornell.mannlib.vitro.webapp.i18n.freemarker.I18nMethodModel; +import edu.cornell.mannlib.vitro.webapp.i18n.freemarker.ReportAuthMethodModel; import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus; import edu.cornell.mannlib.vitro.webapp.utils.developer.DeveloperSettings; import edu.cornell.mannlib.vitro.webapp.utils.developer.Key; @@ -273,6 +274,8 @@ private void addMethods(FreemarkerConfigurationImpl c) { c.setSharedVariable("placeholderImageUrl", new IndividualPlaceholderImageUrlMethod()); c.setSharedVariable("i18n", new I18nMethodModel()); + c.setSharedVariable("isReportAuth", new ReportAuthMethodModel()); + } private Map getRevisionInfo(ServletContext ctx) { diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/i18n/freemarker/ReportAuthMethodModel.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/i18n/freemarker/ReportAuthMethodModel.java new file mode 100644 index 0000000000..2a00017b21 --- /dev/null +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/i18n/freemarker/ReportAuthMethodModel.java @@ -0,0 +1,30 @@ +/* $This file is distributed under the terms of the license in LICENSE$ */ + +package edu.cornell.mannlib.vitro.webapp.i18n.freemarker; + +import static edu.cornell.mannlib.vitro.webapp.auth.attributes.AccessOperation.EXECUTE; +import static edu.cornell.mannlib.vitro.webapp.auth.policy.PolicyHelper.isAuthorizedForActions; + +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import edu.cornell.mannlib.vitro.webapp.auth.objects.ReportGeneratorAccessObject; +import freemarker.core.Environment; +import freemarker.template.TemplateMethodModelEx; +import freemarker.template.TemplateModelException; + +public class ReportAuthMethodModel implements TemplateMethodModelEx { + + @Override + public Object exec(List args) throws TemplateModelException { + if (args.isEmpty() || args.get(0) == null) { + return false; + } + Environment env = Environment.getCurrentEnvironment(); + HttpServletRequest request = (HttpServletRequest) env.getCustomAttribute("request"); + String uri = args.get(0).toString(); + return isAuthorizedForActions(request, new ReportGeneratorAccessObject(uri), EXECUTE); + } + +} diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/AbstractYARGTemplateReport.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/AbstractYARGTemplateReport.java index 697e2126df..27d563a230 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/AbstractYARGTemplateReport.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/AbstractYARGTemplateReport.java @@ -34,7 +34,7 @@ public abstract class AbstractYARGTemplateReport extends AbstractTemplateReport * Generate the report */ protected void generateReport(OutputStream outputStream, String name, ReportOutputType type, - RequestModelAccess request, UserAccount account) { + RequestModelAccess request, UserAccount account, Map parameters) { // Create a new report builder and template ReportBuilder reportBuilder = new ReportBuilder(); ReportTemplateBuilder reportTemplateBuilder = new ReportTemplateBuilder(); @@ -56,7 +56,7 @@ protected void generateReport(OutputStream outputStream, String name, ReportOutp Map params = new HashMap(); for (DataSource dataSource : getDataSources()) { // Get the output of the datasource - String body = dataSource.getBody(new HashMap<>(), request, account); + String body = dataSource.getBody(parameters, request, account); if (!StringUtils.isEmpty(body)) { // Bind the output to the name given in the datasource configuration params.put(dataSource.getOutputName(), body); diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/OpenDopeWordReport.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/OpenDopeWordReport.java index c33afe0b0d..441c7b82e6 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/OpenDopeWordReport.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/OpenDopeWordReport.java @@ -112,8 +112,8 @@ private void convertObjectNodeToXml(Document xmlDoc, String outputName, JsonNode } @Override - public void generateReport(OutputStream outputStream, RequestModelAccess request, UserAccount account) - throws ReportGeneratorException { + public void generateReport(OutputStream outputStream, RequestModelAccess request, UserAccount account, + Map parameters) throws ReportGeneratorException { // Get the XML Document xmlDoc = generateXml(request, account); try { diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/ReportGenerator.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/ReportGenerator.java index a073caca1c..da38402492 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/ReportGenerator.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/ReportGenerator.java @@ -4,6 +4,7 @@ import java.io.OutputStream; import java.util.List; +import java.util.Map; import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; import edu.cornell.mannlib.vitro.webapp.modelaccess.RequestModelAccess; @@ -32,10 +33,11 @@ public interface ReportGenerator { * Generates the report directly into the specified output stream * * @param outputStream Stream to write report into + * @param map * @throws ReportGeneratorException */ - void generateReport(OutputStream outputStream, RequestModelAccess request, UserAccount account) - throws ReportGeneratorException; + void generateReport(OutputStream outputStream, RequestModelAccess request, UserAccount account, + Map map) throws ReportGeneratorException; void setIsPersistent(boolean isPersistent); diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/TemplateExcelReport.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/TemplateExcelReport.java index 161c2cc98a..bf6d4f34c4 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/TemplateExcelReport.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/TemplateExcelReport.java @@ -3,6 +3,7 @@ package edu.cornell.mannlib.vitro.webapp.reporting; import java.io.OutputStream; +import java.util.Map; import com.haulmont.yarg.structure.ReportOutputType; import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; @@ -19,8 +20,8 @@ public String getContentType() throws ReportGeneratorException { } @Override - public void generateReport(OutputStream outputStream, RequestModelAccess request, UserAccount account) - throws ReportGeneratorException { - generateReport(outputStream, "report.xlsx", ReportOutputType.xlsx, request, account); + public void generateReport(OutputStream outputStream, RequestModelAccess request, UserAccount account, + Map parameters) throws ReportGeneratorException { + generateReport(outputStream, "report.xlsx", ReportOutputType.xlsx, request, account, parameters); } } diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/TemplateWordReport.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/TemplateWordReport.java index a3c3f50a7d..3eb2fabc87 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/TemplateWordReport.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/reporting/TemplateWordReport.java @@ -3,6 +3,7 @@ package edu.cornell.mannlib.vitro.webapp.reporting; import java.io.OutputStream; +import java.util.Map; import com.haulmont.yarg.structure.ReportOutputType; import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; @@ -19,8 +20,8 @@ public String getContentType() throws ReportGeneratorException { } @Override - public void generateReport(OutputStream outputStream, RequestModelAccess request, UserAccount account) - throws ReportGeneratorException { - generateReport(outputStream, "report.docx", ReportOutputType.docx, request, account); + public void generateReport(OutputStream outputStream, RequestModelAccess request, UserAccount account, + Map params) throws ReportGeneratorException { + generateReport(outputStream, "report.docx", ReportOutputType.docx, request, account, params); } } diff --git a/api/src/test/java/edu/cornell/mannlib/vitro/webapp/reporting/TemplateExcelReportTest.java b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/reporting/TemplateExcelReportTest.java index 50612ceb2f..9806e8935e 100644 --- a/api/src/test/java/edu/cornell/mannlib/vitro/webapp/reporting/TemplateExcelReportTest.java +++ b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/reporting/TemplateExcelReportTest.java @@ -10,6 +10,7 @@ import java.io.OutputStream; import java.nio.file.Files; import java.util.Base64; +import java.util.HashMap; import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames; @@ -50,7 +51,7 @@ public void testExcelReport() throws Exception { reportGenerator.addDatasource(getDataSource()); reportGenerator.setTemplateBase64(string); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - reportGenerator.generateReport(baos, rma, account); + reportGenerator.generateReport(baos, rma, account, new HashMap()); assertFalse(baos.size() == 0); if (debug) { File file = new File(REPORTING_DIR + "/report.xlsx"); diff --git a/api/src/test/java/edu/cornell/mannlib/vitro/webapp/reporting/TemplateWordReportTest.java b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/reporting/TemplateWordReportTest.java index ca53b0e5e7..672f934a79 100644 --- a/api/src/test/java/edu/cornell/mannlib/vitro/webapp/reporting/TemplateWordReportTest.java +++ b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/reporting/TemplateWordReportTest.java @@ -10,6 +10,7 @@ import java.io.OutputStream; import java.nio.file.Files; import java.util.Base64; +import java.util.HashMap; import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames; @@ -50,7 +51,7 @@ public void testWordReport() throws Exception { reportGenerator.addDatasource(getDataSource()); reportGenerator.setTemplateBase64(string); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - reportGenerator.generateReport(baos, rma, account); + reportGenerator.generateReport(baos, rma, account, new HashMap()); assertFalse(baos.size() == 0); if (debug) { File file = new File(REPORTING_DIR + "/report.docx");