From ab66d88be4e0bc109da445a5ba83e39b945d9d0d Mon Sep 17 00:00:00 2001
From: Nicola Fulvio Calabria <nicola.calabria@inaf.it>
Date: Fri, 1 Oct 2021 17:58:14 +0200
Subject: [PATCH] Added BAD_REQUEST exception in case of file overwrite attempt

---
 .../ia2/transfer/service/PutFileService.java     |  6 +++++-
 .../transfer/controller/CopyControllerTest.java  |  3 ---
 .../controller/PutFileControllerTest.java        | 16 ++++++++++++++++
 3 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/src/main/java/it/inaf/ia2/transfer/service/PutFileService.java b/src/main/java/it/inaf/ia2/transfer/service/PutFileService.java
index be3a79b..f7462f9 100644
--- a/src/main/java/it/inaf/ia2/transfer/service/PutFileService.java
+++ b/src/main/java/it/inaf/ia2/transfer/service/PutFileService.java
@@ -7,6 +7,7 @@ package it.inaf.ia2.transfer.service;
 
 import it.inaf.ia2.transfer.persistence.FileDAO;
 import it.inaf.ia2.transfer.persistence.model.FileInfo;
+import it.inaf.oats.vospace.exception.InvalidArgumentException;
 import it.inaf.oats.vospace.exception.QuotaExceededException;
 import java.io.File;
 import java.io.IOException;
@@ -96,9 +97,12 @@ public class PutFileService {
         // the first upload (fsPath not null)
         if(destinationFileInfo.getActualBasePath() != null) {
             if(destinationFileInfo.getFsPath() != null) {
-                LOG.warn("Node {} fsPath is not null: {}. Overwriting.", 
+                LOG.error("Node {} fsPath is not null: {}. Overwriting.", 
                         destinationFileInfo.getVirtualPath(), 
                         destinationFileInfo.getFsPath());
+                        throw new InvalidArgumentException("Node " + 
+                        destinationFileInfo.getVirtualPath() +
+                        " is already populated. Overwriting not allowed.");
             }
             
             destinationFileInfo.setFsPath(this.generateFsPath().toString());                       
diff --git a/src/test/java/it/inaf/ia2/transfer/controller/CopyControllerTest.java b/src/test/java/it/inaf/ia2/transfer/controller/CopyControllerTest.java
index c084b25..c754418 100644
--- a/src/test/java/it/inaf/ia2/transfer/controller/CopyControllerTest.java
+++ b/src/test/java/it/inaf/ia2/transfer/controller/CopyControllerTest.java
@@ -34,9 +34,6 @@ public class CopyControllerTest {
 
     @Autowired
     private MockMvc mockMvc;
-
-    @MockBean
-    private FileCopyService fileCopyService;
     
     private static String jobId;
     private static String sourceVosRootPath;
diff --git a/src/test/java/it/inaf/ia2/transfer/controller/PutFileControllerTest.java b/src/test/java/it/inaf/ia2/transfer/controller/PutFileControllerTest.java
index 58dbe07..a4221b6 100644
--- a/src/test/java/it/inaf/ia2/transfer/controller/PutFileControllerTest.java
+++ b/src/test/java/it/inaf/ia2/transfer/controller/PutFileControllerTest.java
@@ -98,7 +98,23 @@ public class PutFileControllerTest {
 
         assertTrue(file.delete());
     }
+    
+    @Test
+    public void putGenericFileOverwriteDenied() throws Exception {
+
+        when(fileDao.getRemainingQuota(any())).thenReturn(null);
+
+        String randomFileName = UUID.randomUUID().toString();
+        FileInfo fileInfo = createBaseFileInfo(randomFileName);
+        fileInfo.setFsPath("year/month/date/UUID-whatever");
 
+        MockMultipartFile fakeFile = new MockMultipartFile("file", "test.txt", "text/plain", "content".getBytes());
+
+        mockMvc.perform(putMultipart("/path/to/test.txt")
+                .file(fakeFile))
+                .andDo(print())
+                .andExpect(status().isBadRequest());
+    }
     
     @Test
     public void putGenericFileWithJobId() throws Exception {
-- 
GitLab