From 5f55b073f3a297388d66e9d549e3c6e7c889db6e Mon Sep 17 00:00:00 2001 From: heyethereum Date: Wed, 14 Aug 2024 00:56:12 +0800 Subject: [PATCH] fixed incorrect mapping --- ...RLFeatures.java => URLFeaturesMapper.java} | 74 +++++++++++-------- .../prediction/service/PredictionService.java | 23 +++++- .../service/URLVerificationService.java | 4 +- 3 files changed, 66 insertions(+), 35 deletions(-) rename src/main/java/com/safeqr/app/prediction/model/{URLFeatures.java => URLFeaturesMapper.java} (68%) diff --git a/src/main/java/com/safeqr/app/prediction/model/URLFeatures.java b/src/main/java/com/safeqr/app/prediction/model/URLFeaturesMapper.java similarity index 68% rename from src/main/java/com/safeqr/app/prediction/model/URLFeatures.java rename to src/main/java/com/safeqr/app/prediction/model/URLFeaturesMapper.java index e105b94..746aaf9 100644 --- a/src/main/java/com/safeqr/app/prediction/model/URLFeatures.java +++ b/src/main/java/com/safeqr/app/prediction/model/URLFeaturesMapper.java @@ -1,18 +1,22 @@ package com.safeqr.app.prediction.model; import com.fasterxml.jackson.annotation.JsonProperty; +import com.safeqr.app.qrcode.entity.QRCodeTypeEntity; +import com.safeqr.app.qrcode.entity.URLEntity; import com.safeqr.app.qrcode.model.URLModel; import lombok.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; @Getter @Builder @NoArgsConstructor @AllArgsConstructor -public class URLFeatures { +public class URLFeaturesMapper { + private static final Logger logger = LoggerFactory.getLogger(URLFeaturesMapper.class); + @JsonProperty("domain") private Integer domain; @@ -70,27 +74,29 @@ public class URLFeatures { @JsonProperty("contents") private Integer contents; - public static URLFeatures fromEntity(URLModel urlModel) { - URLFeatures features = URLFeatures.builder() + public static URLFeaturesMapper fromEntity(URLModel urlModel) { + URLEntity details = urlModel.getDetails(); + QRCodeTypeEntity qrCodeTypeEntity = urlModel.getData().getInfo(); + URLFeaturesMapper features = URLFeaturesMapper.builder() .build(); - features.setDomain(urlModel.getDetails().getDomain()); - features.setSubdomain(urlModel.getDetails().getSubdomain()); - features.setTopLevelDomain(urlModel.getDetails().getTopLevelDomain()); - features.setQuery(urlModel.getDetails().getQuery()); - features.setFragment(urlModel.getDetails().getFragment()); - features.setPath(urlModel.getDetails().getPath()); - features.setRedirect(urlModel.getDetails().getRedirect()); - features.setRedirectChain(urlModel.getDetails().getRedirectChain()); - features.setHstsHeader(urlModel.getDetails().getHstsHeader()); - features.setSslStripping(urlModel.getDetails().getSslStripping()); - features.setHostnameEmbedding(urlModel.getDetails().getHostnameEmbedding()); - features.setJavascriptCheck(urlModel.getDetails().getJavascriptCheck()); - features.setShorteningService(urlModel.getDetails().getShorteningService()); - features.setHasIpAddress(urlModel.getDetails().getHasIpAddress()); - features.setTrackingDescriptions(urlModel.getDetails().getTrackingDescriptions()); - features.setUrlEncoding(urlModel.getDetails().getUrlEncoding()); - features.setHasExecutable(urlModel.getDetails().getHasExecutable()); - features.setTls(Math.toIntExact(urlModel.getData().getInfo().getId())); + features.setDomain(details.getDomain()); + features.setSubdomain(details.getSubdomain()); + features.setTopLevelDomain(details.getTopLevelDomain()); + features.setQuery(details.getQuery()); + features.setFragment(details.getFragment()); + features.setPath(details.getPath()); + features.setRedirect(details.getRedirect()); + features.setRedirectChain(details.getRedirectChain()); + features.setHstsHeader(details.getHstsHeader()); + features.setSslStripping(details.getSslStripping()); + features.setHostnameEmbedding(details.getHostnameEmbedding()); + features.setJavascriptCheck(details.getJavascriptCheck()); + features.setShorteningService(details.getShorteningService()); + features.setHasIpAddress(details.getHasIpAddress()); + features.setTrackingDescriptions(details.getTrackingDescriptions()); + features.setUrlEncoding(details.getUrlEncoding()); + features.setHasExecutable(details.getHasExecutable()); + features.setTls(Math.toIntExact(qrCodeTypeEntity.getId())); features.setContents(urlModel.getData().getContents()); return features; @@ -149,18 +155,16 @@ public class URLFeatures { // Custom setter for hstsHeader public void setHstsHeader(List hstsHeader) { + logger.info("HSTS header value: {}", hstsHeader); if (hstsHeader == null || hstsHeader.isEmpty()) { this.hstsHeader = 0; - } else if (hstsHeader.get(0).startsWith("{") && hstsHeader.get(0).endsWith("}")) { - Pattern pattern = Pattern.compile("\"(.*?)\""); - Matcher matcher = pattern.matcher(hstsHeader.get(0)); - if (matcher.find() && matcher.group(1).toLowerCase().contains("no")) { + } else { + logger.info("first hsts header value: {}", hstsHeader.get(0)); + if (hstsHeader.get(0).toLowerCase().contains("no")) { this.hstsHeader = 0; } else { this.hstsHeader = 1; } - } else { - this.hstsHeader = 1; } } @@ -190,7 +194,17 @@ public class URLFeatures { } public void setRedirectChain(List redirectChain) { - this.redirectChain = (redirectChain != null) ? redirectChain.size() : 0; + logger.info("Redirect chain: {}", redirectChain); + if (redirectChain != null) { + // Calculate the total number of characters in the list of strings + int totalChars; + totalChars = redirectChain.stream() + .mapToInt(String::length) + .sum(); + this.redirectChain = totalChars; + } else { + this.redirectChain = 0; + } } public void setContents(String contents) { diff --git a/src/main/java/com/safeqr/app/prediction/service/PredictionService.java b/src/main/java/com/safeqr/app/prediction/service/PredictionService.java index 2513d7a..b3d2fe0 100644 --- a/src/main/java/com/safeqr/app/prediction/service/PredictionService.java +++ b/src/main/java/com/safeqr/app/prediction/service/PredictionService.java @@ -1,7 +1,7 @@ package com.safeqr.app.prediction.service; import com.fasterxml.jackson.databind.ObjectMapper; -import com.safeqr.app.prediction.model.URLFeatures; +import com.safeqr.app.prediction.model.URLFeaturesMapper; import com.safeqr.app.qrcode.model.URLModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,15 +29,32 @@ public class PredictionService { public String predict(URLModel urlModel) { // Convert URLModel to URLFeatures - URLFeatures features = URLFeatures.fromEntity(urlModel); + URLFeaturesMapper features = URLFeaturesMapper.fromEntity(urlModel); logger.info("Prediction request: {}", features); + logger.info("feature contents : {}", features.getContents()); + logger.info("feature domain : {}", features.getDomain()); + logger.info("feature sub-domain : {}", features.getSubdomain()); + logger.info("feature tld : {}", features.getTopLevelDomain()); + logger.info("feature path : {}", features.getPath()); + logger.info("feature query : {}", features.getQuery()); + logger.info("feature fragment : {}", features.getFragment()); + logger.info("feature redirect : {}", features.getRedirect()); + logger.info("feature redirect chain: {}", features.getRedirectChain()); + logger.info("feature shortening service: {}", features.getShorteningService()); + logger.info("feature hasExecutable: {}", features.getHasExecutable()); + logger.info("feature hasIP: {}", features.getHasIpAddress()); + logger.info("feature hostname embedding: {}", features.getHostnameEmbedding()); + logger.info("feature hsts header: {}", features.getHstsHeader()); + logger.info("feature javascript check: {}", features.getJavascriptCheck()); + logger.info("feature tracking: {}", features.getTrackingDescriptions()); + logger.info("feature urlencoding: {}", features.getUrlEncoding()); // Prepare the HTTP headers HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); // Create the HTTP entity containing the features and headers - HttpEntity requestEntity = new HttpEntity<>(features, headers); + HttpEntity requestEntity = new HttpEntity<>(features, headers); // Make the HTTP POST request to the FastAPI prediction endpoint ResponseEntity response = restTemplate.exchange( diff --git a/src/main/java/com/safeqr/app/qrcode/service/URLVerificationService.java b/src/main/java/com/safeqr/app/qrcode/service/URLVerificationService.java index d1165b1..5814ddf 100644 --- a/src/main/java/com/safeqr/app/qrcode/service/URLVerificationService.java +++ b/src/main/java/com/safeqr/app/qrcode/service/URLVerificationService.java @@ -60,8 +60,8 @@ public class URLVerificationService { // Define a Set of suspicious file extensions private static final Set SUSPICIOUS_EXTENSIONS = Stream.of( ".exe", ".bat", ".sh", ".cmd", ".scr", ".pif", ".application", ".gadget", - ".vb", ".vbs", ".js", ".jse", ".ws", ".wsf", ".msc", ".com", ".cpl", - ".msi", ".ps1", ".py", ".pyc", ".pyo", ".rb", ".app", ".bin", ".run" + ".vb", ".vbs", ".js", ".jse", ".ws", ".wsf", ".msc", ".cpl", + ".msi", ".ps1", ".py", ".pyc", ".pyo", ".rb", ".bin", ".run" ).collect(Collectors.toUnmodifiableSet()); // Checks if the URL has executable file