From 94316f2aec7bb18e04416f27e5936ac992eca564 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Sat, 23 Feb 2019 16:24:56 +0100
Subject: [PATCH] OO-3906: ensure uploaded filenames are unique

---
 .../model/xml/AssessmentItemBuilder.java      | 19 +++++++++++++++++++
 .../interactions/DrawingEditorController.java |  3 +++
 .../interactions/HotspotEditorController.java |  3 +++
 3 files changed, 25 insertions(+)

diff --git a/src/main/java/org/olat/ims/qti21/model/xml/AssessmentItemBuilder.java b/src/main/java/org/olat/ims/qti21/model/xml/AssessmentItemBuilder.java
index f38682ddddf..5b8d8b0585a 100644
--- a/src/main/java/org/olat/ims/qti21/model/xml/AssessmentItemBuilder.java
+++ b/src/main/java/org/olat/ims/qti21/model/xml/AssessmentItemBuilder.java
@@ -22,6 +22,7 @@ package org.olat.ims.qti21.model.xml;
 import static org.olat.ims.qti21.QTI21Constants.MAXSCORE_IDENTIFIER;
 import static org.olat.ims.qti21.QTI21Constants.MINSCORE_IDENTIFIER;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -30,6 +31,7 @@ import javax.xml.transform.stream.StreamResult;
 import org.olat.core.gui.render.StringOutput;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
+import org.olat.core.util.FileUtils;
 import org.olat.ims.qti21.QTI21Constants;
 import org.olat.ims.qti21.model.QTI21QuestionType;
 import org.olat.ims.qti21.model.xml.ModalFeedbackBuilder.ModalFeedbackType;
@@ -343,6 +345,23 @@ public abstract class AssessmentItemBuilder {
 		return interactionNames;
 	}
 	
+	/**
+	 * 
+	 * @param uploadedFilename The uploaded filename
+	 * @param currentFilename The current filename
+	 * @param directory The directory where the file will be saved
+	 * @return A proposition of unique filename
+	 */
+	public String checkFilename(String uploadedFilename, String currentFilename, File directory) {
+		if(uploadedFilename == null) return null;
+
+		if(!uploadedFilename.equals(currentFilename)) {
+			File file = new File(directory, uploadedFilename);
+			uploadedFilename = FileUtils.rename(file);
+		}
+		return uploadedFilename;
+	}
+	
 	protected final void serializeJqtiObject(QtiNode block, StringOutput sb) {
 		final XsltSerializationOptions xsltSerializationOptions = new XsltSerializationOptions();
         xsltSerializationOptions.setIndenting(false);
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/DrawingEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/DrawingEditorController.java
index 2edf5f4f3c0..337753345f3 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/DrawingEditorController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/DrawingEditorController.java
@@ -217,6 +217,9 @@ public class DrawingEditorController extends FormBasicController {
 				backgroundEl.validate(status);
 				if(status.isEmpty()) {
 					flc.setDirty(true);
+					String uniqueFilename = itemBuilder
+							.checkFilename(backgroundEl.getUploadFileName(), itemBuilder.getBackground(), itemFile.getParentFile());
+					backgroundEl.setUploadFileName(uniqueFilename);
 					backgroundImage = backgroundEl.moveUploadFileTo(itemFile.getParentFile());
 					backgroundEl.setInitialFile(backgroundImage);
 				}
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/HotspotEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/HotspotEditorController.java
index 7db80fd6ccc..446c02193be 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/HotspotEditorController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/HotspotEditorController.java
@@ -362,6 +362,9 @@ public class HotspotEditorController extends FormBasicController {
 				backgroundEl.validate(status);
 				if(status.isEmpty()) {
 					flc.setDirty(true);
+					String uniqueFilename = itemBuilder
+							.checkFilename(backgroundEl.getUploadFileName(), itemBuilder.getBackground(), itemFile.getParentFile());
+					backgroundEl.setUploadFileName(uniqueFilename);
 					backgroundImage = backgroundEl.moveUploadFileTo(itemFile.getParentFile());
 					Size size = imageService.getSize(new LocalFileImpl(backgroundImage), null);
 					optimizeResizeEl(size, true);
-- 
GitLab