diff --git a/src/main/java/ru/serega6531/packmate/PcapWorker.java b/src/main/java/ru/serega6531/packmate/PcapWorker.java index 2be65e9..6cc9b1f 100644 --- a/src/main/java/ru/serega6531/packmate/PcapWorker.java +++ b/src/main/java/ru/serega6531/packmate/PcapWorker.java @@ -32,8 +32,7 @@ public class PcapWorker { private final ServicesService servicesService; private final StreamService streamService; private final PacketService packetService; - private final PatternService patternService; - private final PacketsSubscriptionService subscriptionService; + private final StreamSubscriptionService subscriptionService; private final PcapNetworkInterface device; private PcapHandle pcap = null; @@ -53,14 +52,12 @@ public class PcapWorker { public PcapWorker(ServicesService servicesService, StreamService streamService, PacketService packetService, - PatternService patternService, - PacketsSubscriptionService subscriptionService, + StreamSubscriptionService subscriptionService, @Value("${interface-name}") String interfaceName, @Value("${local-ip}") String localIp) throws PcapNativeException { this.servicesService = servicesService; this.streamService = streamService; this.packetService = packetService; - this.patternService = patternService; this.subscriptionService = subscriptionService; this.localIp = localIp; @@ -193,16 +190,15 @@ public class PcapWorker { } if(rst || (acksForStream.contains(sourceIpAndPort) && acksForStream.contains(destIpAndPort))) { - final Stream finishedStream = saveStream(stream); log.info("Конец стрима"); - subscriptionService.broadcastNewStream(finishedStream); + saveStream(stream); } } } } } - private Stream saveStream(UnfinishedStream unfinishedStream) { + private void saveStream(UnfinishedStream unfinishedStream) { final List packets = unfinishedStreams.get(unfinishedStream); Stream stream = new Stream(); @@ -216,14 +212,17 @@ public class PcapWorker { unfinishedStream.getSecondPort() ).get()); - final Stream saved = streamService.save(stream); + Stream savedStream = streamService.save(stream); + List savedPackets = new ArrayList<>(); for (ru.serega6531.packmate.model.Packet packet : packets) { - packet.setStream(saved); - packetService.save(packet); + packet.setStream(savedStream); + savedPackets.add(packetService.save(packet)); } - return saved; + savedStream.setPackets(savedPackets); + savedStream = streamService.save(savedStream); + subscriptionService.broadcastNewStream(savedStream); } private Optional findService(String firstIp, int firstPort, String secondIp, int secondPort) { diff --git a/src/main/java/ru/serega6531/packmate/WebSocketHandler.java b/src/main/java/ru/serega6531/packmate/WebSocketHandler.java index e6c6999..f2c93e9 100644 --- a/src/main/java/ru/serega6531/packmate/WebSocketHandler.java +++ b/src/main/java/ru/serega6531/packmate/WebSocketHandler.java @@ -5,15 +5,15 @@ import org.springframework.stereotype.Component; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; -import ru.serega6531.packmate.service.PacketsSubscriptionService; +import ru.serega6531.packmate.service.StreamSubscriptionService; @Component public class WebSocketHandler extends TextWebSocketHandler { - private final PacketsSubscriptionService subscriptionService; + private final StreamSubscriptionService subscriptionService; @Autowired - public WebSocketHandler(PacketsSubscriptionService subscriptionService) { + public WebSocketHandler(StreamSubscriptionService subscriptionService) { this.subscriptionService = subscriptionService; } diff --git a/src/main/java/ru/serega6531/packmate/model/Stream.java b/src/main/java/ru/serega6531/packmate/model/Stream.java index 52ff19b..98bfd33 100644 --- a/src/main/java/ru/serega6531/packmate/model/Stream.java +++ b/src/main/java/ru/serega6531/packmate/model/Stream.java @@ -7,6 +7,7 @@ import ru.serega6531.packmate.Protocol; import javax.persistence.*; import java.util.List; +import java.util.Set; @Data @Entity @@ -39,4 +40,6 @@ public class Stream { private long endTimestamp; + private Set foundPatterns; + } diff --git a/src/main/java/ru/serega6531/packmate/service/PatternService.java b/src/main/java/ru/serega6531/packmate/service/PatternService.java index 770d7fd..63c66c9 100644 --- a/src/main/java/ru/serega6531/packmate/service/PatternService.java +++ b/src/main/java/ru/serega6531/packmate/service/PatternService.java @@ -1,12 +1,15 @@ package ru.serega6531.packmate.service; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ru.serega6531.packmate.model.Pattern; import ru.serega6531.packmate.repository.PatternRepository; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; @Service @Slf4j @@ -23,6 +26,14 @@ public class PatternService { return repository.findAll(); } + public List findMatching(byte[] bytes) { + String content = new String(bytes); + + return findAll().stream() + .filter(pattern -> StringUtils.containsIgnoreCase(content, pattern.getValue())) + .collect(Collectors.toList()); + } + public void deleteById(int id) { repository.deleteById(id); } diff --git a/src/main/java/ru/serega6531/packmate/service/StreamService.java b/src/main/java/ru/serega6531/packmate/service/StreamService.java index aff65a9..b289f95 100644 --- a/src/main/java/ru/serega6531/packmate/service/StreamService.java +++ b/src/main/java/ru/serega6531/packmate/service/StreamService.java @@ -3,24 +3,39 @@ package ru.serega6531.packmate.service; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import ru.serega6531.packmate.model.Pattern; import ru.serega6531.packmate.model.Stream; import ru.serega6531.packmate.repository.StreamRepository; +import java.util.HashSet; import java.util.List; import java.util.Optional; +import java.util.Set; @Service @Slf4j public class StreamService { private final StreamRepository repository; + private final PatternService patternService; @Autowired - public StreamService(StreamRepository repository) { + public StreamService(StreamRepository repository, PatternService patternService) { this.repository = repository; + this.patternService = patternService; } public Stream save(Stream stream) { + if(!stream.getPackets().isEmpty()) { + Set matches = new HashSet<>(); + + stream.getPackets().forEach(packet -> { + matches.addAll(patternService.findMatching(packet.getContent())); + }); + + stream.setFoundPatterns(matches); + } + final Stream saved = repository.save(stream); log.info("Создан стрим с id {}", saved.getId()); return saved; diff --git a/src/main/java/ru/serega6531/packmate/service/PacketsSubscriptionService.java b/src/main/java/ru/serega6531/packmate/service/StreamSubscriptionService.java similarity index 93% rename from src/main/java/ru/serega6531/packmate/service/PacketsSubscriptionService.java rename to src/main/java/ru/serega6531/packmate/service/StreamSubscriptionService.java index 2c56a75..16ca820 100644 --- a/src/main/java/ru/serega6531/packmate/service/PacketsSubscriptionService.java +++ b/src/main/java/ru/serega6531/packmate/service/StreamSubscriptionService.java @@ -15,14 +15,14 @@ import java.util.List; @Service @Slf4j -public class PacketsSubscriptionService { +public class StreamSubscriptionService { private List subscribers = new ArrayList<>(); private final ObjectMapper mapper; @Autowired - public PacketsSubscriptionService(ObjectMapper mapper) { + public StreamSubscriptionService(ObjectMapper mapper) { this.mapper = mapper; }