From c497d4861180ff924a27c1b8bd173c248981b95c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vanesa=20Smo=C4=BEakov=C3=A1?= Date: Sun, 10 May 2026 03:40:24 +0200 Subject: [PATCH] MID-11096 Fix missing zip suffix on tracing reports --- .../admin/reports/ReportDownloadHelper.java | 18 ++++- .../web/ReportDownloadHelperTest.java | 71 +++++++++++++++++++ gui/admin-gui/testng-integration.xml | 1 + release-notes.adoc | 1 + 4 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 gui/admin-gui/src/test/java/com/evolveum/midpoint/web/ReportDownloadHelperTest.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/ReportDownloadHelper.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/ReportDownloadHelper.java index f52101f8f85..f2df6e2baf0 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/ReportDownloadHelper.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/ReportDownloadHelper.java @@ -30,6 +30,7 @@ public class ReportDownloadHelper implements Serializable { private static final Trace LOGGER = TraceManager.getTrace(ReportDownloadHelper.class); private static final String DOT_CLASS = ReportDownloadHelper.class.getName() + "."; private static final String OPERATION_DOWNLOAD_REPORT = DOT_CLASS + ".downloadReport"; + private static final String ZIP_EXTENSION = "zip"; private static final Map REPORT_EXPORT_TYPE_MAP = new HashMap<>(); static { @@ -61,11 +62,26 @@ public static String getReportFileName(ReportDataType currentReport) { if (StringUtils.isNotEmpty(name)) { // Sanitize to remove any path components for defense in depth // (browsers also ignore path components, but better to be safe) - return FilenameUtils.getName(name); + String sanitizedName = FilenameUtils.getName(name); + if (isZipReport(currentReport) && !hasZipExtension(sanitizedName)) { + return sanitizedName + "." + ZIP_EXTENSION; + } + return sanitizedName; } return "report"; // A fallback - this should not really occur } + private static boolean isZipReport(ReportDataType report) { + // ReportDataType has no ZIP file-format enum value, tracing stores ZIP outputs as files with .zip suffix. + return report != null + && report.getFilePath() != null + && hasZipExtension(report.getFilePath()); + } + + private static boolean hasZipExtension(String fileName) { + return ZIP_EXTENSION.equalsIgnoreCase(FilenameUtils.getExtension(fileName)); + } + public static InputStream createReport(ReportDataType report, AjaxDownloadBehaviorFromStream ajaxDownloadBehaviorFromStream, PageBase pageBase) { OperationResult result = new OperationResult(OPERATION_DOWNLOAD_REPORT); diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/ReportDownloadHelperTest.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/ReportDownloadHelperTest.java new file mode 100644 index 00000000000..b85804c93c7 --- /dev/null +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/ReportDownloadHelperTest.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2026 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ + +package com.evolveum.midpoint.web; + +import static org.testng.Assert.assertEquals; + +import com.evolveum.midpoint.web.page.admin.reports.ReportDownloadHelper; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ActiveProfiles; +import org.testng.Assert; +import org.testng.annotations.Test; + +import com.evolveum.midpoint.gui.test.TestMidPointSpringApplication; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportDataType; +import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; + +@ActiveProfiles("test") +@SpringBootTest(classes = TestMidPointSpringApplication.class) +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) +public class ReportDownloadHelperTest extends AbstractGuiIntegrationTest { + + @Test + public void zipReportFileNameHasZipExtension() { + ReportDataType report = report("trace-2026", "C:\\midpoint\\trace\\trace-2026.zip"); + + Assert.assertEquals(ReportDownloadHelper.getReportFileName(report), "trace-2026.zip"); + } + + @Test + public void zipReportFileNameDoesNotDuplicateZipExtension() { + ReportDataType report = report("trace-2026.zip", "C:\\midpoint\\trace\\trace-2026.zip"); + + assertEquals(ReportDownloadHelper.getReportFileName(report), "trace-2026.zip"); + } + + @Test + public void nonZipReportFileNameIsNotChanged() { + ReportDataType report = report("report-output", "C:\\midpoint\\export\\report-output.csv"); + + assertEquals(ReportDownloadHelper.getReportFileName(report), "report-output"); + } + + @Test + public void pathComponentsAreRemovedBeforeAppendingZipExtension() { + ReportDataType report = report("C:\\tmp\\trace-2026", "C:\\midpoint\\trace\\trace-2026.zip"); + + assertEquals(ReportDownloadHelper.getReportFileName(report), "trace-2026.zip"); + } + + @Test + public void reportWithoutFilePathDoesNotGetZipExtension() { + ReportDataType report = report("trace-2026", null); + + assertEquals(ReportDownloadHelper.getReportFileName(report), "trace-2026"); + } + + private static ReportDataType report(String name, String filePath) { + ReportDataType report = new ReportDataType() + .filePath(filePath); + if (name != null) { + report.name(new PolyStringType(name)); + } + return report; + } +} diff --git a/gui/admin-gui/testng-integration.xml b/gui/admin-gui/testng-integration.xml index 1e5394d1675..954ab7be19f 100644 --- a/gui/admin-gui/testng-integration.xml +++ b/gui/admin-gui/testng-integration.xml @@ -33,6 +33,7 @@ + diff --git a/release-notes.adoc b/release-notes.adoc index c606d71c93d..9d883933450 100644 --- a/release-notes.adoc +++ b/release-notes.adoc @@ -102,6 +102,7 @@ Overall, midPoint 4.10 opens up the world of identity management and governance * Delineation suggestions: filter parsing broken after recent GUI change. See bug:MID-11175[] * Fixed work item search by name causing repository mapping error. See bug:MID-8834[] * Fixed translation of archetype display labels in assignment picker and summary panel. See bug:MID-11177[] +* Fixed missing .zip extension when downloading tracing report files. See bug:MID-11096[] === Releases Of Other Components