Skip to content

Commit 1bb9a61

Browse files
authored
Merge pull request #5 from WMS-DEV/backend-add-list
Backend add domains list
2 parents 2aa5f1d + 3834d19 commit 1bb9a61

6 files changed

Lines changed: 112 additions & 4 deletions

File tree

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package pl.wmsdev.hacknation.controller;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.http.ResponseEntity;
5+
import org.springframework.web.bind.annotation.*;
6+
import pl.wmsdev.hacknation.entity.DomainAddRequest;
7+
import pl.wmsdev.hacknation.entity.DomainEntry;
8+
import pl.wmsdev.hacknation.repository.DomainRepository;
9+
10+
import java.util.List;
11+
12+
@RestController
13+
@RequestMapping("/api/v1/domains")
14+
@RequiredArgsConstructor
15+
public class DomainListController {
16+
private final DomainRepository domainRepository;
17+
18+
@GetMapping("")
19+
public ResponseEntity<List<DomainEntry>> getGovDomains() {
20+
return ResponseEntity.ok(domainRepository.findAll());
21+
}
22+
23+
// TODO: Find a better way to seed the database
24+
@PostMapping("")
25+
public ResponseEntity<DomainEntry> addDomain(@RequestBody DomainAddRequest request) {
26+
return ResponseEntity.ok(domainRepository.save(DomainEntry.builder()
27+
.domain(request.domain())
28+
.build()));
29+
}
30+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package pl.wmsdev.hacknation.entity;
2+
3+
public record DomainAddRequest(String domain) {
4+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package pl.wmsdev.hacknation.entity;
2+
3+
import jakarta.persistence.*;
4+
import lombok.*;
5+
6+
import java.util.UUID;
7+
8+
@Entity
9+
@Getter
10+
@Setter
11+
@Builder
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
public class DomainEntry {
15+
@Id
16+
@GeneratedValue(strategy = GenerationType.IDENTITY)
17+
private int id;
18+
19+
@Column(unique = true, nullable = false)
20+
private String domain;
21+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package pl.wmsdev.hacknation.http;
2+
3+
import jakarta.servlet.*;
4+
import jakarta.servlet.http.*;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
8+
9+
import java.io.IOException;
10+
11+
@Configuration
12+
@EnableWebMvc
13+
@Slf4j
14+
public class CORSFilter implements Filter {
15+
16+
@Override
17+
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
18+
19+
if (servletResponse instanceof HttpServletResponse) {
20+
HttpServletResponse response = (HttpServletResponse) servletResponse;
21+
HttpServletRequest request = (HttpServletRequest) servletRequest;
22+
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
23+
response.setHeader("Access-Control-Allow-Credentials", "true");
24+
response.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD");
25+
response.setHeader("Access-Control-Max-Age", "3600");
26+
response.setHeader("Access-Control-Allow-Headers", "*");
27+
28+
if ("OPTIONS".equalsIgnoreCase((request.getMethod()))) {
29+
response.setStatus(HttpServletResponse.SC_OK);
30+
} else {
31+
filterChain.doFilter(request, response);
32+
}
33+
log.info("Added CORS headers to response using CORSFilter");
34+
35+
}
36+
37+
}
38+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package pl.wmsdev.hacknation.repository;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
import org.springframework.stereotype.Repository;
5+
import pl.wmsdev.hacknation.entity.DomainEntry;
6+
7+
import java.util.List;
8+
import java.util.Optional;
9+
import java.util.UUID;
10+
11+
@Repository
12+
public interface DomainRepository extends JpaRepository<DomainEntry, UUID> {
13+
Optional<DomainEntry> findByDomain(String domain);
14+
}

backend/hacknation/src/main/java/pl/wmsdev/hacknation/service/GovValidatorService.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import pl.wmsdev.hacknation.entity.CheckResponse;
66
import pl.wmsdev.hacknation.entity.HashEntry;
77
import pl.wmsdev.hacknation.entity.PageData;
8+
import pl.wmsdev.hacknation.repository.DomainRepository;
89
import pl.wmsdev.hacknation.repository.HashRepository;
910
import pl.wmsdev.hacknation.values.CheckResult;
1011
import pl.wmsdev.hacknation.values.PageValidation.*;
@@ -24,9 +25,8 @@
2425
@Service
2526
@RequiredArgsConstructor
2627
public class GovValidatorService {
27-
28-
private static final Pattern GOV_PL_PATTERN = Pattern.compile("^(?:[a-zA-Z0-9-]+\\.)*gov\\.pl$");
2928
private final HashRepository hashRepository;
29+
private final DomainRepository domainRepository;
3030

3131
public CheckResponse validatePage(PageData pageData) {
3232
UUID validationId = UUID.randomUUID();
@@ -63,13 +63,14 @@ private URL validateUrl(String url) throws MalformedUrlError {
6363
}
6464

6565
private void validateTld(URL url) throws FraudulentTldError {
66-
if (!GOV_PL_PATTERN.matcher(url.getHost()).matches()) {
66+
var host = url.getHost();
67+
if (domainRepository.findByDomain(host).isEmpty()) {
6768
throw new FraudulentTldError();
6869
}
6970
}
7071

7172
private void validateHttps(URL url) throws NoHttpsError {
72-
if (url.getProtocol().equalsIgnoreCase("https")) {
73+
if (!url.getProtocol().equalsIgnoreCase("https")) {
7374
throw new NoHttpsError();
7475
}
7576
}

0 commit comments

Comments
 (0)