Skip to content

Commit 33985d4

Browse files
authored
154 protected reset (#170)
reset endpoint obfuscation with user defined secret
1 parent 5cc5b18 commit 33985d4

File tree

5 files changed

+33
-5
lines changed

5 files changed

+33
-5
lines changed

backend/src/main/java/de/openvalidation/openvalidationidebackend/infrastructure/database/DatabaseResetController.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44
import org.springframework.beans.factory.annotation.Autowired;
55
import org.springframework.http.HttpStatus;
66
import org.springframework.web.bind.annotation.DeleteMapping;
7+
import org.springframework.web.bind.annotation.PathVariable;
78
import org.springframework.web.bind.annotation.ResponseStatus;
89
import org.springframework.web.bind.annotation.RestController;
910

11+
import java.util.Optional;
12+
1013
@RestController
1114
@Hidden
1215
public class DatabaseResetController {
@@ -17,9 +20,9 @@ public DatabaseResetController(DatabaseResetService databaseResetService) {
1720
this.databaseResetService = databaseResetService;
1821
}
1922

20-
@DeleteMapping(value = "/reset")
23+
@DeleteMapping(value = {"/reset", "/reset/{endpointSecret}"})
2124
@ResponseStatus(HttpStatus.NO_CONTENT)
22-
public void resetDatabaseToInitialState() {
23-
databaseResetService.resetDatabaseToInitialState();
25+
public void resetDatabaseToInitialState(@PathVariable Optional<String> endpointSecret) {
26+
databaseResetService.resetDatabaseToInitialState(endpointSecret.orElse(""));
2427
}
2528
}

backend/src/main/java/de/openvalidation/openvalidationidebackend/infrastructure/database/DatabaseResetService.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,29 @@
33
import de.openvalidation.openvalidationidebackend.domain.ruleset.RulesetRepository;
44
import de.openvalidation.openvalidationidebackend.domain.schema.SchemaRepository;
55
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.beans.factory.annotation.Value;
67
import org.springframework.stereotype.Service;
78

89
@Service
910
public class DatabaseResetService {
1011
private RulesetRepository rulesetRepository;
1112
private SchemaRepository schemaRepository;
1213
private DatabaseInitializer databaseInitializer;
14+
private String endpointSecret;
1315

1416
@Autowired
15-
public DatabaseResetService(RulesetRepository rulesetRepository, SchemaRepository schemaRepository, DatabaseInitializer databaseInitializer) {
17+
public DatabaseResetService(RulesetRepository rulesetRepository, SchemaRepository schemaRepository, DatabaseInitializer databaseInitializer,
18+
@Value("${reset-secret:}") String endpointSecret) {
1619
this.rulesetRepository = rulesetRepository;
1720
this.schemaRepository = schemaRepository;
1821
this.databaseInitializer = databaseInitializer;
22+
this.endpointSecret = endpointSecret;
1923
}
2024

21-
public void resetDatabaseToInitialState() {
25+
public void resetDatabaseToInitialState(String endpointSecret) {
26+
if (!endpointSecret.equals(this.endpointSecret)) {
27+
throw new InvalidResetSecret();
28+
}
2229
rulesetRepository.deleteAll();
2330
schemaRepository.deleteAll();
2431
databaseInitializer.createInitialData();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package de.openvalidation.openvalidationidebackend.infrastructure.database;
2+
3+
import org.springframework.http.HttpStatus;
4+
import org.springframework.web.bind.annotation.ResponseStatus;
5+
6+
@ResponseStatus(code = HttpStatus.FORBIDDEN, reason = "Invalid reset secret")
7+
public class InvalidResetSecret extends RuntimeException {
8+
}

backend/src/test/java/de/openvalidation/openvalidationidebackend/infrastructure/database/DatabaseResetIntegrationTest.java

+9
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import org.springframework.test.context.junit.jupiter.SpringExtension;
1010
import org.springframework.test.web.servlet.MockMvc;
1111

12+
import java.util.UUID;
13+
1214
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
1315
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
1416

@@ -26,4 +28,11 @@ public void onResetDatabaseToInitialState_thenStatusSuccessful() throws Exceptio
2628
.andExpect(status().is2xxSuccessful());
2729
}
2830

31+
@Test
32+
public void onResetDatabaseToInitialState_whenInvalidSecret_thenStatusClientError() throws Exception {
33+
mockMvc.perform(delete("/reset/" + UUID.randomUUID().toString())
34+
.contentType(MediaType.APPLICATION_JSON))
35+
.andExpect(status().is4xxClientError());
36+
}
37+
2938
}

docker-compose.yml

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ services:
2121
- OPENVALIDATION_IDE_DB_USER=openvalidation_ide
2222
- OPENVALIDATION_IDE_DB_PW=_OPeN_VALiDAtION_IdE
2323
# - CORS_HEADERS=https://sample-1.com,https://sample-2.com
24+
# - RESET_SECRET=a1936b67-f700-49fb-97ef-a5215b727892
2425
ports:
2526
- "8080:8080"
2627
depends_on:

0 commit comments

Comments
 (0)