diff --git a/build.gradle b/build.gradle index edab338..5cb5758 100644 --- a/build.gradle +++ b/build.gradle @@ -27,6 +27,7 @@ dependencies { implementation "org.springframework.boot:spring-boot-starter-security" implementation "org.springframework.boot:spring-boot-starter-websocket" implementation 'org.springframework.session:spring-session-core' + compile 'com.github.jmnarloch:modelmapper-spring-boot-starter:1.1.0' compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.10' compile group: 'commons-io', name: 'commons-io', version: '2.7' compile 'org.pcap4j:pcap4j-core:1.8.2' diff --git a/frontend b/frontend index c3f8cb0..fdbf6ca 160000 --- a/frontend +++ b/frontend @@ -1 +1 @@ -Subproject commit c3f8cb009107e95905f121ae9907fd691b27acd6 +Subproject commit fdbf6ca4646113450255bbceeb8b37969333a662 diff --git a/src/main/java/ru/serega6531/packmate/model/Pattern.java b/src/main/java/ru/serega6531/packmate/model/Pattern.java index 8c55477..f108752 100644 --- a/src/main/java/ru/serega6531/packmate/model/Pattern.java +++ b/src/main/java/ru/serega6531/packmate/model/Pattern.java @@ -42,6 +42,8 @@ public class Pattern { private PatternActionType actionType; + private Integer serviceId; + private long searchStartTimestamp; @ManyToMany(mappedBy = "foundPatterns", fetch = FetchType.LAZY) diff --git a/src/main/java/ru/serega6531/packmate/model/pojo/PatternDto.java b/src/main/java/ru/serega6531/packmate/model/pojo/PatternDto.java index 71969b4..2186f73 100644 --- a/src/main/java/ru/serega6531/packmate/model/pojo/PatternDto.java +++ b/src/main/java/ru/serega6531/packmate/model/pojo/PatternDto.java @@ -16,5 +16,6 @@ public class PatternDto { private PatternSearchType searchType; private PatternDirectionType directionType; private PatternActionType actionType; + private Integer serviceId; } diff --git a/src/main/java/ru/serega6531/packmate/service/PatternService.java b/src/main/java/ru/serega6531/packmate/service/PatternService.java index 038352a..2bf5350 100644 --- a/src/main/java/ru/serega6531/packmate/service/PatternService.java +++ b/src/main/java/ru/serega6531/packmate/service/PatternService.java @@ -6,6 +6,7 @@ import org.modelmapper.ModelMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +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; @@ -27,17 +28,19 @@ public class PatternService { private final PatternRepository repository; private final StreamService streamService; private final SubscriptionService subscriptionService; + private final ModelMapper modelMapper; private final Map patterns = new HashMap<>(); - private final ModelMapper modelMapper = new ModelMapper(); @Autowired public PatternService(PatternRepository repository, @Lazy StreamService streamService, - SubscriptionService subscriptionService) { + SubscriptionService subscriptionService, + ModelMapper modelMapper) { this.repository = repository; this.streamService = streamService; this.subscriptionService = subscriptionService; + this.modelMapper = modelMapper; repository.findAll().forEach(p -> patterns.put(p.getId(), p)); log.info("Loaded {} patterns", patterns.size()); @@ -51,9 +54,10 @@ public class PatternService { return patterns.values(); } - public Set findMatches(byte[] bytes, PatternDirectionType directionType, PatternActionType actionType) { + public Set findMatches(byte[] bytes, CtfService service, PatternDirectionType directionType, PatternActionType actionType) { final List list = patterns.values().stream() .filter(Pattern::isEnabled) + .filter(p -> p.getServiceId() == null || p.getServiceId() == service.getPort()) .filter(p -> p.getActionType() == actionType) .filter(p -> p.getDirectionType() == directionType || p.getDirectionType() == PatternDirectionType.BOTH) .collect(Collectors.toList()); diff --git a/src/main/java/ru/serega6531/packmate/service/ServicesService.java b/src/main/java/ru/serega6531/packmate/service/ServicesService.java index 075e056..9a16ad5 100644 --- a/src/main/java/ru/serega6531/packmate/service/ServicesService.java +++ b/src/main/java/ru/serega6531/packmate/service/ServicesService.java @@ -31,16 +31,18 @@ public class ServicesService { private final InetAddress localIp; private final Map services = new HashMap<>(); - private final ModelMapper modelMapper = new ModelMapper(); + private final ModelMapper modelMapper; @Autowired public ServicesService(ServiceRepository repository, SubscriptionService subscriptionService, @Lazy PcapService pcapService, + ModelMapper modelMapper, @Value("${local-ip}") String localIpString) throws UnknownHostException { this.repository = repository; this.subscriptionService = subscriptionService; this.pcapService = pcapService; + this.modelMapper = modelMapper; this.localIp = InetAddress.getByName(localIpString); repository.findAll().forEach(s -> services.put(s.getPort(), s)); diff --git a/src/main/java/ru/serega6531/packmate/service/StreamService.java b/src/main/java/ru/serega6531/packmate/service/StreamService.java index 1e8c67c..44d331d 100644 --- a/src/main/java/ru/serega6531/packmate/service/StreamService.java +++ b/src/main/java/ru/serega6531/packmate/service/StreamService.java @@ -37,11 +37,11 @@ public class StreamService { private final CountingService countingService; 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"); - private final ModelMapper modelMapper = new ModelMapper(); @Autowired public StreamService(StreamRepository repository, @@ -50,6 +50,7 @@ public class StreamService { CountingService countingService, SubscriptionService subscriptionService, RsaKeysHolder keysHolder, + ModelMapper modelMapper, @Value("${ignore-empty-packets}") boolean ignoreEmptyPackets) { this.repository = repository; this.patternService = patternService; @@ -57,6 +58,7 @@ public class StreamService { this.countingService = countingService; this.subscriptionService = subscriptionService; this.keysHolder = keysHolder; + this.modelMapper = modelMapper; this.ignoreEmptyPackets = ignoreEmptyPackets; } @@ -103,7 +105,7 @@ public class StreamService { packets = new StreamOptimizer(keysHolder, service, packets).optimizeStream(); - if (isStreamIgnored(packets)) { + if (isStreamIgnored(packets, service)) { log.debug("New stream is ignored"); return false; } @@ -115,7 +117,7 @@ public class StreamService { packet.setStream(savedStream); } - Set foundPatterns = matchPatterns(packets); + Set foundPatterns = matchPatterns(packets, service); savedStream.setFoundPatterns(foundPatterns); savedStream.setPackets(packets); savedStream = save(savedStream); @@ -167,12 +169,13 @@ public class StreamService { return "" + alphabet[hash % l] + alphabet[(hash / l) % l] + alphabet[(hash / (l * l)) % l]; } - private Set matchPatterns(List packets) { + private Set matchPatterns(List packets, CtfService service) { Set foundPatterns = new HashSet<>(); for (Packet packet : packets) { PatternDirectionType direction = packet.isIncoming() ? PatternDirectionType.INPUT : PatternDirectionType.OUTPUT; - final Set matches = patternService.findMatches(packet.getContent(), direction, PatternActionType.FIND); + final Set matches = patternService.findMatches(packet.getContent(), service, + direction, PatternActionType.FIND); packet.setMatches(matches); matches.forEach(m -> m.setPacket(packet)); @@ -210,10 +213,11 @@ public class StreamService { return matched; } - private boolean isStreamIgnored(List packets) { + private boolean isStreamIgnored(List packets, CtfService service) { for (Packet packet : packets) { PatternDirectionType direction = packet.isIncoming() ? PatternDirectionType.INPUT : PatternDirectionType.OUTPUT; - final Set matches = patternService.findMatches(packet.getContent(), direction, PatternActionType.IGNORE); + final Set matches = patternService.findMatches(packet.getContent(), service, + direction, PatternActionType.IGNORE); if (!matches.isEmpty()) { return true; }