Skip to content

Commit 7a23498

Browse files
committed
Create FileValidator to check Uploaded Files
1 parent 85d6cba commit 7a23498

File tree

5 files changed

+72
-2
lines changed

5 files changed

+72
-2
lines changed

src/main/java/de/jadenk/springcloud/controller/DashboardController.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package de.jadenk.springcloud.controller;
22

33
import de.jadenk.springcloud.dto.UserDTO;
4+
import de.jadenk.springcloud.exception.CustomIllegalArgumentException;
5+
import de.jadenk.springcloud.exception.CustomRuntimeException;
46
import de.jadenk.springcloud.exception.ResourceNotFoundException;
57
import de.jadenk.springcloud.model.*;
68
import de.jadenk.springcloud.repository.FileAuthorizationRepository;
79
import de.jadenk.springcloud.repository.FolderRepository;
810
import de.jadenk.springcloud.repository.UploadedFileRepository;
911
import de.jadenk.springcloud.repository.UserRepository;
1012
import de.jadenk.springcloud.service.*;
13+
import de.jadenk.springcloud.util.FileValidator;
1114
import de.jadenk.springcloud.util.MessageService;
1215
import de.jadenk.springcloud.util.WebhookEvent;
1316
import org.springframework.beans.factory.annotation.Autowired;
@@ -146,6 +149,8 @@ public String dashboard(@RequestParam(value = "error", required = false) String
146149
model.addAttribute("error", "There is an current Upload in Progress.");
147150
} else if ("NoAccess".equals(error)) {
148151
model.addAttribute("error", "You aren't Allowed to see this.");
152+
} else if ("metaData".equals(error)) {
153+
model.addAttribute("error", "Invalid File Meta-Data.");
149154
} else if (error != null) {
150155
model.addAttribute("error", "An Error occurred.");
151156
}
@@ -201,6 +206,14 @@ public String deleteFolder(@RequestParam Long folderId, Principal principal) {
201206
// =========================
202207
// Datei-Upload
203208
// =========================
209+
private boolean isValidContentType(String contentType) {
210+
return contentType.matches("(?i)(image/(png|jpg|jpeg|gif|bmp|tiff|webp)|" +
211+
"application/(pdf|msword|vnd\\.ms-excel|vnd\\.ms-powerpoint)|" +
212+
"text/(plain|csv|rtf)|" +
213+
"audio/(mp3|wav|ogg|flac)|" +
214+
"video/(mp4|mov|avi|mkv|wmv)|" +
215+
"application/(zip|x-rar-compressed|x-7z-compressed|x-tar|gzip|bzip2))");
216+
}
204217
/*
205218
* POST /upload
206219
* Upload von einem oder mehreren Dateien
@@ -221,10 +234,12 @@ public String handleUpload(@RequestParam("file") MultipartFile[] files,
221234
}
222235

223236
for (MultipartFile file : files) {
224-
if (!file.isEmpty()) {
225-
fileUploadService.uploadFile(file, currentUser, folder);
237+
if (!FileValidator.isValid(file)) {
238+
return "redirect:/dashboard?error=metaData";
226239
}
240+
fileUploadService.uploadFile(file, currentUser, folder);
227241
}
242+
228243
} catch (Exception e) {
229244
e.printStackTrace();
230245
return "redirect:/dashboard?error=uploadError";
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package de.jadenk.springcloud.exception;
2+
3+
public class CustomIllegalArgumentException extends IllegalArgumentException {
4+
5+
public CustomIllegalArgumentException(String msg) {
6+
super(msg);
7+
}
8+
9+
}

src/main/java/de/jadenk/springcloud/exception/GlobalExceptionHandler.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,9 @@ public void handleCustomRuntimeException(CustomRuntimeException ex) {
2121
public String handleResourceNotFound() {
2222
return "redirect:/dashboard?error=NoAccess";
2323
}
24+
25+
@ExceptionHandler(CustomIllegalArgumentException.class)
26+
public String handleIllegalArgument() {
27+
return "redirect:/dashboard?error=metaData";
28+
}
2429
}

src/main/java/de/jadenk/springcloud/service/FileUploadService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public class FileUploadService {
4444

4545

4646
public void uploadFile(MultipartFile file, User owner, Folder folder) throws IOException {
47+
4748
FileUploadProgressListener progressListener = new FileUploadProgressListener(file);
4849

4950
byte[] fileBytes = file.getBytes();
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package de.jadenk.springcloud.util;
2+
3+
import java.net.URLConnection;
4+
import java.util.Arrays;
5+
import java.util.HashSet;
6+
import java.util.Set;
7+
8+
import org.springframework.web.multipart.MultipartFile;
9+
10+
public class FileValidator {
11+
12+
// verbotene Endungen
13+
private static final Set<String> BLOCKED_EXTENSIONS = new HashSet<>(Arrays.asList(
14+
"cmd", "msi", "com", "php", "html"
15+
));
16+
17+
/**
18+
* Prüft, ob Datei gültig ist:
19+
* - Endung nicht in Blocklist
20+
* - Content-Type wird von Java erkannt
21+
*/
22+
public static boolean isValid(MultipartFile file) {
23+
if (file == null || file.isEmpty()) return false;
24+
25+
String filename = file.getOriginalFilename();
26+
27+
if (filename == null || filename.isEmpty()) return false;
28+
29+
int dotIndex = filename.lastIndexOf('.');
30+
if (dotIndex < 0) return false;
31+
String ext = filename.substring(dotIndex + 1).toLowerCase();
32+
33+
if (BLOCKED_EXTENSIONS.contains(ext)) return false;
34+
35+
String guessedType = URLConnection.guessContentTypeFromName(filename);
36+
if (guessedType == null) return false;
37+
38+
return true;
39+
}
40+
}

0 commit comments

Comments
 (0)