Skip to content
Snippets Groups Projects
Verified Commit 121b5617 authored by Luc Everse's avatar Luc Everse :passport_control:
Browse files

Generate valid filenames for exports

parent dbe38245
No related branches found
No related tags found
2 merge requests!122AuTA 2.0 master merge,!80Feature - Assignment exports
Pipeline #178883 passed
......@@ -30,6 +30,7 @@ import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;
......@@ -39,6 +40,12 @@ import java.util.function.Consumer;
*/
@Controller
public class AssignmentExportController {
/**
* The datetime formatter for timestamps included in filenames.
*/
private static final DateTimeFormatter FILENAME_TIMESTAMP_FORMATTER =
DateTimeFormatter.ofPattern("yyyy-MM-dd--HH-mm-ssxx");
/**
* The header all CSV files are given.
*
......@@ -384,7 +391,7 @@ public class AssignmentExportController {
return assignment.getName().replace('"', '-')
+ "-export"
+ '-' + kind
+ '-' + ZonedDateTime.now()
+ '-' + ZonedDateTime.now().format(FILENAME_TIMESTAMP_FORMATTER)
+ '.' + format;
}
}
......@@ -22,6 +22,7 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import java.time.Instant;
import java.util.List;
import java.util.Optional;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static org.assertj.core.api.Assertions.assertThat;
......@@ -39,6 +40,10 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
public class AssignmentExportControllerTest {
private static final Pattern VALID_FILENAME_ATTRIBUTE_PATTERN = Pattern.compile(
"filename=\"[^<>:\"/\\\\|?*]+\""
);
private static final String AID = "test assignment ID";
private static final String ANAME = "test assignment - look ma, no metrics";
......@@ -257,6 +262,17 @@ public class AssignmentExportControllerTest {
.andExpect(jsonPath("$.errors[0].code", equalTo("INVALID_FORMAT")));
}
@Test
public void testFilenameIsValidWindowsFilename() throws Exception {
// Specifically Windows because it is the most strict common platform
// (Linux accepts pretty much anything)
final var res = this.performAsync(get("/api/v1/assignment/" + AID + "/export")).andReturn();
assertThat(res.getResponse().getHeader("Content-Disposition"))
.containsPattern(VALID_FILENAME_ATTRIBUTE_PATTERN);
}
@Test
public void testCsvContents() throws Exception {
final var csv = this.performAsync(get("/api/v1/assignment/" + AID + "/export?format=csv"))
......
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment