diff --git a/frontend b/frontend index 630ceb9..23503a5 160000 --- a/frontend +++ b/frontend @@ -1 +1 @@ -Subproject commit 630ceb9241ce4fc707b572f689a2b27c13be52cd +Subproject commit 23503a5ac768319d7d5f55e18a5a8406767b543c diff --git a/src/main/java/ru/serega6531/packmate/controller/PacketController.java b/src/main/java/ru/serega6531/packmate/controller/PacketController.java index e70a38f..1156ce2 100644 --- a/src/main/java/ru/serega6531/packmate/controller/PacketController.java +++ b/src/main/java/ru/serega6531/packmate/controller/PacketController.java @@ -1,14 +1,16 @@ package ru.serega6531.packmate.controller; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; -import ru.serega6531.packmate.model.Packet; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import ru.serega6531.packmate.model.pojo.PacketDto; import ru.serega6531.packmate.model.pojo.PacketPagination; import ru.serega6531.packmate.service.StreamService; import java.util.List; -import java.util.stream.Collectors; @RestController @RequestMapping("/api/packet/") @@ -23,10 +25,7 @@ public class PacketController { @PostMapping("/{streamId}") public List getPacketsForStream(@PathVariable long streamId, @RequestBody PacketPagination pagination) { - List packets = streamService.getPackets(streamId, pagination.getStartingFrom(), pagination.getPageSize()); - return packets.stream() - .map(streamService::packetToDto) - .collect(Collectors.toList()); + return streamService.getPackets(streamId, pagination.getStartingFrom(), pagination.getPageSize()); } } diff --git a/src/main/java/ru/serega6531/packmate/controller/PatternController.java b/src/main/java/ru/serega6531/packmate/controller/PatternController.java index 445cbda..8c5c2ab 100644 --- a/src/main/java/ru/serega6531/packmate/controller/PatternController.java +++ b/src/main/java/ru/serega6531/packmate/controller/PatternController.java @@ -9,8 +9,9 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import ru.serega6531.packmate.model.Pattern; +import ru.serega6531.packmate.model.pojo.PatternCreateDto; import ru.serega6531.packmate.model.pojo.PatternDto; +import ru.serega6531.packmate.model.pojo.PatternUpdateDto; import ru.serega6531.packmate.service.PatternService; import java.util.List; @@ -53,11 +54,13 @@ public class PatternController { } @PostMapping - public PatternDto addPattern(@RequestBody PatternDto dto) { - dto.setEnabled(true); - Pattern pattern = service.fromDto(dto); - Pattern saved = service.save(pattern); - return service.toDto(saved); + public PatternDto addPattern(@RequestBody PatternCreateDto dto) { + return service.create(dto); + } + + @PostMapping("/{id}") + public PatternDto updatePattern(@PathVariable int id, @RequestBody PatternUpdateDto dto) { + return service.update(id, dto); } } diff --git a/src/main/java/ru/serega6531/packmate/controller/ServiceController.java b/src/main/java/ru/serega6531/packmate/controller/ServiceController.java index d23ce3a..e8b55e6 100644 --- a/src/main/java/ru/serega6531/packmate/controller/ServiceController.java +++ b/src/main/java/ru/serega6531/packmate/controller/ServiceController.java @@ -8,8 +8,9 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import ru.serega6531.packmate.model.CtfService; +import ru.serega6531.packmate.model.pojo.ServiceCreateDto; import ru.serega6531.packmate.model.pojo.ServiceDto; +import ru.serega6531.packmate.model.pojo.ServiceUpdateDto; import ru.serega6531.packmate.service.ServicesService; import java.util.List; @@ -27,9 +28,7 @@ public class ServiceController { @GetMapping public List getServices() { - return service.findAll().stream() - .map(service::toDto) - .toList(); + return service.findAll(); } @DeleteMapping("/{port}") @@ -38,9 +37,13 @@ public class ServiceController { } @PostMapping - public CtfService addService(@RequestBody ServiceDto dto) { - CtfService newService = this.service.fromDto(dto); - return this.service.save(newService); + public ServiceDto addService(@RequestBody ServiceCreateDto dto) { + return this.service.create(dto); + } + + @PostMapping("/{port}") + public ServiceDto updateService(@PathVariable int port, @RequestBody ServiceUpdateDto dto) { + return this.service.update(port, dto); } } diff --git a/src/main/java/ru/serega6531/packmate/controller/StreamController.java b/src/main/java/ru/serega6531/packmate/controller/StreamController.java index 12d888a..2346fc9 100644 --- a/src/main/java/ru/serega6531/packmate/controller/StreamController.java +++ b/src/main/java/ru/serega6531/packmate/controller/StreamController.java @@ -26,16 +26,12 @@ public class StreamController { @PostMapping("/all") public List getStreams(@RequestBody StreamPagination pagination) { - return service.findAll(pagination, Optional.empty(), pagination.isFavorites()).stream() - .map(service::streamToDto) - .toList(); + return service.findAll(pagination, Optional.empty(), pagination.isFavorites()); } @PostMapping("/{port}") public List getStreams(@PathVariable int port, @RequestBody StreamPagination pagination) { - return service.findAll(pagination, Optional.of(port), pagination.isFavorites()).stream() - .map(service::streamToDto) - .toList(); + return service.findAll(pagination, Optional.of(port), pagination.isFavorites()); } @PostMapping("/{id}/favorite") diff --git a/src/main/java/ru/serega6531/packmate/model/Stream.java b/src/main/java/ru/serega6531/packmate/model/Stream.java index 5eb553a..9d88a7a 100644 --- a/src/main/java/ru/serega6531/packmate/model/Stream.java +++ b/src/main/java/ru/serega6531/packmate/model/Stream.java @@ -53,7 +53,7 @@ public class Stream { private long endTimestamp; - @ManyToMany(fetch = FetchType.EAGER) + @ManyToMany @JoinTable( name = "stream_found_patterns", joinColumns = @JoinColumn(name = "stream_id"), diff --git a/src/main/java/ru/serega6531/packmate/model/pojo/PatternCreateDto.java b/src/main/java/ru/serega6531/packmate/model/pojo/PatternCreateDto.java new file mode 100644 index 0000000..8c39fef --- /dev/null +++ b/src/main/java/ru/serega6531/packmate/model/pojo/PatternCreateDto.java @@ -0,0 +1,19 @@ +package ru.serega6531.packmate.model.pojo; + +import lombok.Data; +import ru.serega6531.packmate.model.enums.PatternActionType; +import ru.serega6531.packmate.model.enums.PatternDirectionType; +import ru.serega6531.packmate.model.enums.PatternSearchType; + +@Data +public class PatternCreateDto { + + private String name; + private String value; + private String color; + private PatternSearchType searchType; + private PatternDirectionType directionType; + private PatternActionType actionType; + private Integer serviceId; + +} diff --git a/src/main/java/ru/serega6531/packmate/model/pojo/PatternUpdateDto.java b/src/main/java/ru/serega6531/packmate/model/pojo/PatternUpdateDto.java new file mode 100644 index 0000000..72bbb83 --- /dev/null +++ b/src/main/java/ru/serega6531/packmate/model/pojo/PatternUpdateDto.java @@ -0,0 +1,11 @@ +package ru.serega6531.packmate.model.pojo; + +import lombok.Data; + +@Data +public class PatternUpdateDto { + + private String name; + private String color; + +} diff --git a/src/main/java/ru/serega6531/packmate/model/pojo/ServiceCreateDto.java b/src/main/java/ru/serega6531/packmate/model/pojo/ServiceCreateDto.java new file mode 100644 index 0000000..98ce728 --- /dev/null +++ b/src/main/java/ru/serega6531/packmate/model/pojo/ServiceCreateDto.java @@ -0,0 +1,17 @@ +package ru.serega6531.packmate.model.pojo; + +import lombok.Data; + +@Data +public class ServiceCreateDto { + + private int port; + private String name; + private boolean decryptTls; + private boolean processChunkedEncoding; + private boolean ungzipHttp; + private boolean urldecodeHttpRequests; + private boolean mergeAdjacentPackets; + private boolean parseWebSockets; + +} \ No newline at end of file diff --git a/src/main/java/ru/serega6531/packmate/model/pojo/ServiceUpdateDto.java b/src/main/java/ru/serega6531/packmate/model/pojo/ServiceUpdateDto.java new file mode 100644 index 0000000..db46765 --- /dev/null +++ b/src/main/java/ru/serega6531/packmate/model/pojo/ServiceUpdateDto.java @@ -0,0 +1,17 @@ +package ru.serega6531.packmate.model.pojo; + +import lombok.Data; + +@Data +public class ServiceUpdateDto { + + private int port; + private String name; + private boolean decryptTls; + private boolean processChunkedEncoding; + private boolean ungzipHttp; + private boolean urldecodeHttpRequests; + private boolean mergeAdjacentPackets; + private boolean parseWebSockets; + +} \ No newline at end of file diff --git a/src/main/java/ru/serega6531/packmate/service/PatternService.java b/src/main/java/ru/serega6531/packmate/service/PatternService.java index dc81f2b..b6cb012 100644 --- a/src/main/java/ru/serega6531/packmate/service/PatternService.java +++ b/src/main/java/ru/serega6531/packmate/service/PatternService.java @@ -6,13 +6,16 @@ import org.modelmapper.ModelMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import ru.serega6531.packmate.model.CtfService; import ru.serega6531.packmate.model.FoundPattern; import ru.serega6531.packmate.model.Pattern; import ru.serega6531.packmate.model.enums.PatternActionType; import ru.serega6531.packmate.model.enums.PatternDirectionType; import ru.serega6531.packmate.model.enums.SubscriptionMessageType; +import ru.serega6531.packmate.model.pojo.PatternCreateDto; import ru.serega6531.packmate.model.pojo.PatternDto; +import ru.serega6531.packmate.model.pojo.PatternUpdateDto; import ru.serega6531.packmate.model.pojo.SubscriptionMessage; import ru.serega6531.packmate.repository.PatternRepository; @@ -103,15 +106,35 @@ public class PatternService { } } - public Pattern save(Pattern pattern) { + @Transactional + public PatternDto create(PatternCreateDto dto) { + Pattern pattern = fromDto(dto); + + pattern.setEnabled(true); + pattern.setDeleted(false); + pattern.setSearchStartTimestamp(System.currentTimeMillis()); + + Pattern saved = save(pattern); + return toDto(saved); + } + + @Transactional + public PatternDto update(int id, PatternUpdateDto dto) { + Pattern pattern = repository.findById(id).orElseThrow(); + + modelMapper.map(dto, pattern); + + Pattern saved = save(pattern); + return toDto(saved); + } + + private Pattern save(Pattern pattern) { try { PatternMatcher.compilePattern(pattern); } catch (Exception e) { throw new IllegalArgumentException(e.getMessage()); } - pattern.setSearchStartTimestamp(System.currentTimeMillis()); - final Pattern saved = repository.save(pattern); patterns.put(saved.getId(), saved); @@ -136,12 +159,11 @@ public class PatternService { } } - public Pattern fromDto(PatternDto dto) { + public Pattern fromDto(PatternCreateDto dto) { return modelMapper.map(dto, Pattern.class); } public PatternDto toDto(Pattern pattern) { return modelMapper.map(pattern, PatternDto.class); } - } diff --git a/src/main/java/ru/serega6531/packmate/service/PcapService.java b/src/main/java/ru/serega6531/packmate/service/PcapService.java index b633055..a3652e7 100644 --- a/src/main/java/ru/serega6531/packmate/service/PcapService.java +++ b/src/main/java/ru/serega6531/packmate/service/PcapService.java @@ -4,8 +4,8 @@ import lombok.extern.slf4j.Slf4j; import org.pcap4j.core.PcapNativeException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import ru.serega6531.packmate.model.CtfService; import ru.serega6531.packmate.model.enums.SubscriptionMessageType; +import ru.serega6531.packmate.model.pojo.ServiceDto; import ru.serega6531.packmate.model.pojo.SubscriptionMessage; import ru.serega6531.packmate.pcap.NoOpPcapWorker; import ru.serega6531.packmate.pcap.PcapWorker; @@ -40,14 +40,14 @@ public class PcapService { } } - public void updateFilter(Collection services) { + public void updateFilter(Collection services) { String filter; if (services.isEmpty()) { filter = "tcp or udp"; } else { final String ports = services.stream() - .map(CtfService::getPort) + .map(ServiceDto::getPort) .map(p -> "port " + p) .collect(Collectors.joining(" or ")); diff --git a/src/main/java/ru/serega6531/packmate/service/ServicesService.java b/src/main/java/ru/serega6531/packmate/service/ServicesService.java index 1255f14..358b530 100644 --- a/src/main/java/ru/serega6531/packmate/service/ServicesService.java +++ b/src/main/java/ru/serega6531/packmate/service/ServicesService.java @@ -6,9 +6,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import ru.serega6531.packmate.model.CtfService; import ru.serega6531.packmate.model.enums.SubscriptionMessageType; +import ru.serega6531.packmate.model.pojo.ServiceCreateDto; import ru.serega6531.packmate.model.pojo.ServiceDto; +import ru.serega6531.packmate.model.pojo.ServiceUpdateDto; import ru.serega6531.packmate.model.pojo.SubscriptionMessage; import ru.serega6531.packmate.repository.ServiceRepository; @@ -67,8 +70,11 @@ public class ServicesService { return Optional.ofNullable(services.get(port)); } - public Collection findAll() { - return services.values(); + public List findAll() { + return services.values() + .stream() + .map(this::toDto) + .toList(); } public void deleteByPort(int port) { @@ -82,9 +88,31 @@ public class ServicesService { updateFilter(); } - public CtfService save(CtfService service) { - log.info("Added or edited service '{}' at port {}", service.getName(), service.getPort()); + @Transactional + public ServiceDto create(ServiceCreateDto dto) { + if (repository.existsById(dto.getPort())) { + throw new IllegalArgumentException("Service already exists"); + } + CtfService service = fromDto(dto); + + log.info("Added service '{}' at port {}", service.getName(), service.getPort()); + + return save(service); + } + + @Transactional + public ServiceDto update(int port, ServiceUpdateDto dto) { + CtfService service = repository.findById(port).orElseThrow(); + + log.info("Edited service '{}' at port {}", service.getName(), service.getPort()); + + modelMapper.map(dto, service); + service.setPort(port); + return save(service); + } + + private ServiceDto save(CtfService service) { final CtfService saved = repository.save(service); services.put(saved.getPort(), saved); @@ -92,18 +120,18 @@ public class ServicesService { updateFilter(); - return saved; + return toDto(saved); } public void updateFilter() { pcapService.updateFilter(findAll()); } - public ServiceDto toDto(CtfService service) { + private ServiceDto toDto(CtfService service) { return modelMapper.map(service, ServiceDto.class); } - public CtfService fromDto(ServiceDto dto) { + private CtfService fromDto(ServiceCreateDto dto) { return modelMapper.map(dto, CtfService.class); } diff --git a/src/main/java/ru/serega6531/packmate/service/StreamService.java b/src/main/java/ru/serega6531/packmate/service/StreamService.java index 82a0faa..5bce095 100644 --- a/src/main/java/ru/serega6531/packmate/service/StreamService.java +++ b/src/main/java/ru/serega6531/packmate/service/StreamService.java @@ -48,7 +48,6 @@ public class StreamService { private final SubscriptionService subscriptionService; private final RsaKeysHolder keysHolder; private final ModelMapper modelMapper; - private final boolean ignoreEmptyPackets; private final java.util.regex.Pattern userAgentPattern = java.util.regex.Pattern.compile("User-Agent: (.+)\\r\\n"); @@ -251,8 +250,12 @@ public class StreamService { return saved; } - public List getPackets(long streamId, @Nullable Long startingFrom, int pageSize) { - return repository.getPackets(streamId, startingFrom, Pageable.ofSize(pageSize)); + @Transactional + public List getPackets(long streamId, @Nullable Long startingFrom, int pageSize) { + return repository.getPackets(streamId, startingFrom, Pageable.ofSize(pageSize)) + .stream() + .map(this::packetToDto) + .toList(); } /** @@ -268,7 +271,8 @@ public class StreamService { repository.setFavorite(id, favorite); } - public List findAll(StreamPagination pagination, Optional service, boolean onlyFavorites) { + @Transactional + public List findAll(StreamPagination pagination, Optional service, boolean onlyFavorites) { PageRequest page = PageRequest.of(0, pagination.getPageSize(), Sort.Direction.DESC, "id"); Specification spec = Specification.where(null); @@ -289,7 +293,11 @@ public class StreamService { spec = spec.and(streamPatternsContains(pagination.getPattern())); } - return repository.findAll(spec, page).getContent(); + return repository.findAll(spec, page) + .getContent() + .stream() + .map(this::streamToDto) + .toList(); } public List findAllBetweenTimestamps(long start, long end) {