package com.safeqr.app.qrcode.service; import com.fasterxml.jackson.databind.ObjectMapper; import com.safeqr.app.qrcode.dto.request.QRCodePayload; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.*; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; import java.util.Map; @Service public class VirusTotalService { private static final Logger logger = LoggerFactory.getLogger(VirusTotalService.class); @Value("${virustotal.api.key}") private String apiKey; private final RestTemplate restTemplate; private final ObjectMapper objectMapper; public VirusTotalService() { this.restTemplate = new RestTemplate(); this.objectMapper = new ObjectMapper(); } public String scanURL(QRCodePayload payload) { String urlToScan = payload.getData(); logger.info("Scanning URL: {}", urlToScan); UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("https://www.virustotal.com/api/v3/urls"); HttpHeaders headers = new HttpHeaders(); headers.set("accept", "application/json"); headers.set("content-type", "application/x-www-form-urlencoded"); headers.set("x-apikey", apiKey); String body = "url=" + urlToScan; HttpEntity request = new HttpEntity<>(body, headers); ResponseEntity response = restTemplate.postForEntity(builder.toUriString(), request, String.class); logger.info("Response from VirusTotal scan: {}", response.getBody()); try { Map responseBody = objectMapper.readValue(response.getBody(), Map.class); Map data = (Map) responseBody.get("data"); return (String) data.get("id"); } catch (Exception e) { logger.error("Error parsing response from VirusTotal scan", e); throw new RuntimeException("Error parsing response from VirusTotal scan", e); } } public boolean getAnalysis(String analysisId) { logger.info("Retrieving analysis for ID: {}", analysisId); UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("https://www.virustotal.com/api/v3/analyses/" + analysisId); HttpHeaders headers = new HttpHeaders(); headers.set("accept", "application/json"); headers.set("x-apikey", apiKey); HttpEntity request = new HttpEntity<>(headers); ResponseEntity response = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, request, String.class); logger.info("Response from VirusTotal analysis: {}", response.getBody()); try { Map responseBody = objectMapper.readValue(response.getBody(), Map.class); Map data = (Map) responseBody.get("data"); Map attributes = (Map) data.get("attributes"); Map stats = (Map) attributes.get("stats"); return evaluateSafety(stats); } catch (Exception e) { logger.error("Error parsing response from VirusTotal analysis", e); throw new RuntimeException("Error parsing response from VirusTotal analysis", e); } } private boolean evaluateSafety(Map stats) { int malicious = stats.getOrDefault("malicious", 0); int suspicious = stats.getOrDefault("suspicious", 0); return malicious < 5 && suspicious < 5; } }