Работа над добавлением поиска паттернов
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user