Работа над добавлением поиска паттернов

This commit is contained in:
serega6531
2019-04-30 17:21:22 +03:00
parent 0e9820fb46
commit 64507a6d07
6 changed files with 46 additions and 18 deletions

View File

@@ -32,8 +32,7 @@ public class PcapWorker {
private final ServicesService servicesService; private final ServicesService servicesService;
private final StreamService streamService; private final StreamService streamService;
private final PacketService packetService; private final PacketService packetService;
private final PatternService patternService; private final StreamSubscriptionService subscriptionService;
private final PacketsSubscriptionService subscriptionService;
private final PcapNetworkInterface device; private final PcapNetworkInterface device;
private PcapHandle pcap = null; private PcapHandle pcap = null;
@@ -53,14 +52,12 @@ public class PcapWorker {
public PcapWorker(ServicesService servicesService, public PcapWorker(ServicesService servicesService,
StreamService streamService, StreamService streamService,
PacketService packetService, PacketService packetService,
PatternService patternService, StreamSubscriptionService subscriptionService,
PacketsSubscriptionService subscriptionService,
@Value("${interface-name}") String interfaceName, @Value("${interface-name}") String interfaceName,
@Value("${local-ip}") String localIp) throws PcapNativeException { @Value("${local-ip}") String localIp) throws PcapNativeException {
this.servicesService = servicesService; this.servicesService = servicesService;
this.streamService = streamService; this.streamService = streamService;
this.packetService = packetService; this.packetService = packetService;
this.patternService = patternService;
this.subscriptionService = subscriptionService; this.subscriptionService = subscriptionService;
this.localIp = localIp; this.localIp = localIp;
@@ -193,16 +190,15 @@ public class PcapWorker {
} }
if(rst || (acksForStream.contains(sourceIpAndPort) && acksForStream.contains(destIpAndPort))) { if(rst || (acksForStream.contains(sourceIpAndPort) && acksForStream.contains(destIpAndPort))) {
final Stream finishedStream = saveStream(stream);
log.info("Конец стрима"); log.info("Конец стрима");
subscriptionService.broadcastNewStream(finishedStream); saveStream(stream);
} }
} }
} }
} }
} }
private Stream saveStream(UnfinishedStream unfinishedStream) { private void saveStream(UnfinishedStream unfinishedStream) {
final List<ru.serega6531.packmate.model.Packet> packets = unfinishedStreams.get(unfinishedStream); final List<ru.serega6531.packmate.model.Packet> packets = unfinishedStreams.get(unfinishedStream);
Stream stream = new Stream(); Stream stream = new Stream();
@@ -216,14 +212,17 @@ public class PcapWorker {
unfinishedStream.getSecondPort() unfinishedStream.getSecondPort()
).get()); ).get());
final Stream saved = streamService.save(stream); Stream savedStream = streamService.save(stream);
List<ru.serega6531.packmate.model.Packet> savedPackets = new ArrayList<>();
for (ru.serega6531.packmate.model.Packet packet : packets) { for (ru.serega6531.packmate.model.Packet packet : packets) {
packet.setStream(saved); packet.setStream(savedStream);
packetService.save(packet); savedPackets.add(packetService.save(packet));
} }
return saved; savedStream.setPackets(savedPackets);
savedStream = streamService.save(savedStream);
subscriptionService.broadcastNewStream(savedStream);
} }
private Optional<CtfService> findService(String firstIp, int firstPort, String secondIp, int secondPort) { private Optional<CtfService> findService(String firstIp, int firstPort, String secondIp, int secondPort) {

View File

@@ -5,15 +5,15 @@ import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler; import org.springframework.web.socket.handler.TextWebSocketHandler;
import ru.serega6531.packmate.service.PacketsSubscriptionService; import ru.serega6531.packmate.service.StreamSubscriptionService;
@Component @Component
public class WebSocketHandler extends TextWebSocketHandler { public class WebSocketHandler extends TextWebSocketHandler {
private final PacketsSubscriptionService subscriptionService; private final StreamSubscriptionService subscriptionService;
@Autowired @Autowired
public WebSocketHandler(PacketsSubscriptionService subscriptionService) { public WebSocketHandler(StreamSubscriptionService subscriptionService) {
this.subscriptionService = subscriptionService; this.subscriptionService = subscriptionService;
} }

View File

@@ -7,6 +7,7 @@ import ru.serega6531.packmate.Protocol;
import javax.persistence.*; import javax.persistence.*;
import java.util.List; import java.util.List;
import java.util.Set;
@Data @Data
@Entity @Entity
@@ -39,4 +40,6 @@ public class Stream {
private long endTimestamp; private long endTimestamp;
private Set<Pattern> foundPatterns;
} }

View File

@@ -1,12 +1,15 @@
package ru.serega6531.packmate.service; package ru.serega6531.packmate.service;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import ru.serega6531.packmate.model.Pattern; import ru.serega6531.packmate.model.Pattern;
import ru.serega6531.packmate.repository.PatternRepository; import ru.serega6531.packmate.repository.PatternRepository;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
@Service @Service
@Slf4j @Slf4j
@@ -23,6 +26,14 @@ public class PatternService {
return repository.findAll(); return repository.findAll();
} }
public List<Pattern> 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) { public void deleteById(int id) {
repository.deleteById(id); repository.deleteById(id);
} }

View File

@@ -3,24 +3,39 @@ package ru.serega6531.packmate.service;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import ru.serega6531.packmate.model.Pattern;
import ru.serega6531.packmate.model.Stream; import ru.serega6531.packmate.model.Stream;
import ru.serega6531.packmate.repository.StreamRepository; import ru.serega6531.packmate.repository.StreamRepository;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
@Service @Service
@Slf4j @Slf4j
public class StreamService { public class StreamService {
private final StreamRepository repository; private final StreamRepository repository;
private final PatternService patternService;
@Autowired @Autowired
public StreamService(StreamRepository repository) { public StreamService(StreamRepository repository, PatternService patternService) {
this.repository = repository; this.repository = repository;
this.patternService = patternService;
} }
public Stream save(Stream stream) { public Stream save(Stream stream) {
if(!stream.getPackets().isEmpty()) {
Set<Pattern> matches = new HashSet<>();
stream.getPackets().forEach(packet -> {
matches.addAll(patternService.findMatching(packet.getContent()));
});
stream.setFoundPatterns(matches);
}
final Stream saved = repository.save(stream); final Stream saved = repository.save(stream);
log.info("Создан стрим с id {}", saved.getId()); log.info("Создан стрим с id {}", saved.getId());
return saved; return saved;

View File

@@ -15,14 +15,14 @@ import java.util.List;
@Service @Service
@Slf4j @Slf4j
public class PacketsSubscriptionService { public class StreamSubscriptionService {
private List<WebSocketSession> subscribers = new ArrayList<>(); private List<WebSocketSession> subscribers = new ArrayList<>();
private final ObjectMapper mapper; private final ObjectMapper mapper;
@Autowired @Autowired
public PacketsSubscriptionService(ObjectMapper mapper) { public StreamSubscriptionService(ObjectMapper mapper) {
this.mapper = mapper; this.mapper = mapper;
} }