Added content-length protections.
This commit is contained in:
		
							parent
							
								
									75680d1041
								
							
						
					
					
						commit
						a001ef89e9
					
				| 
						 | 
					@ -25,6 +25,8 @@ import java.time.format.DateTimeFormatter;
 | 
				
			||||||
public class UploadService {
 | 
					public class UploadService {
 | 
				
			||||||
	private static final Logger log = LoggerFactory.getLogger(UploadService.class);
 | 
						private static final Logger log = LoggerFactory.getLogger(UploadService.class);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private static final long MAX_UPLOAD_SIZE_BYTES = (1024 * 1024 * 1024); // 1 Gb
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private final StoredFileRepository storedFileRepository;
 | 
						private final StoredFileRepository storedFileRepository;
 | 
				
			||||||
	private final VideoProcessingTaskRepository videoTaskRepository;
 | 
						private final VideoProcessingTaskRepository videoTaskRepository;
 | 
				
			||||||
	private final FileService fileService;
 | 
						private final FileService fileService;
 | 
				
			||||||
| 
						 | 
					@ -46,6 +48,14 @@ public class UploadService {
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	@Transactional
 | 
						@Transactional
 | 
				
			||||||
	public FileUploadResponse processableVideoUpload(HttpServletRequest request) {
 | 
						public FileUploadResponse processableVideoUpload(HttpServletRequest request) {
 | 
				
			||||||
 | 
							String contentLengthStr = request.getHeader("Content-Length");
 | 
				
			||||||
 | 
							if (contentLengthStr == null || !contentLengthStr.matches("\\d+")) {
 | 
				
			||||||
 | 
								throw new ResponseStatusException(HttpStatus.LENGTH_REQUIRED);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							long contentLength = Long.parseUnsignedLong(contentLengthStr);
 | 
				
			||||||
 | 
							if (contentLength > MAX_UPLOAD_SIZE_BYTES) {
 | 
				
			||||||
 | 
								throw new ResponseStatusException(HttpStatus.PAYLOAD_TOO_LARGE);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		Path tempFile;
 | 
							Path tempFile;
 | 
				
			||||||
		String filename = request.getHeader("X-Gymboard-Filename");
 | 
							String filename = request.getHeader("X-Gymboard-Filename");
 | 
				
			||||||
		if (filename == null) filename = "unnamed.mp4";
 | 
							if (filename == null) filename = "unnamed.mp4";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,6 +44,7 @@ public class UploadServiceTest {
 | 
				
			||||||
		);
 | 
							);
 | 
				
			||||||
		HttpServletRequest mockRequest = mock(HttpServletRequest.class);
 | 
							HttpServletRequest mockRequest = mock(HttpServletRequest.class);
 | 
				
			||||||
		when(mockRequest.getHeader("X-Filename")).thenReturn("testing.mp4");
 | 
							when(mockRequest.getHeader("X-Filename")).thenReturn("testing.mp4");
 | 
				
			||||||
 | 
							when(mockRequest.getHeader("Content-Length")).thenReturn("123");
 | 
				
			||||||
		ServletInputStream mockRequestInputStream = mock(ServletInputStream.class);
 | 
							ServletInputStream mockRequestInputStream = mock(ServletInputStream.class);
 | 
				
			||||||
		when(mockRequest.getInputStream()).thenReturn(mockRequestInputStream);
 | 
							when(mockRequest.getInputStream()).thenReturn(mockRequestInputStream);
 | 
				
			||||||
		var expectedResponse = new FileUploadResponse("abc");
 | 
							var expectedResponse = new FileUploadResponse("abc");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue