diff --git a/src/main/java/com/pledge/torgi/service/DownloadHeadlessService.java b/src/main/java/com/pledge/torgi/service/DownloadHeadlessService.java index e2a043e..5fb4c36 100644 --- a/src/main/java/com/pledge/torgi/service/DownloadHeadlessService.java +++ b/src/main/java/com/pledge/torgi/service/DownloadHeadlessService.java @@ -1,9 +1,6 @@ package com.pledge.torgi.service; -import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; import com.pledge.torgi.model.TorgiEvent; import com.pledge.torgi.repositories.TorgiEventRepository; import lombok.SneakyThrows; @@ -26,7 +23,6 @@ import java.nio.file.FileSystems; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.*; -import java.util.regex.Pattern; import static com.pledge.torgi.utils.AppUtils.EMPTY; import static java.util.Objects.nonNull; @@ -34,15 +30,17 @@ import static java.util.Objects.nonNull; public class DownloadHeadlessService { private final Logger logger = LoggerFactory.getLogger(DownloadHeadlessService.class); - private final ObjectMapper objectMapper = new ObjectMapper().configure(JsonParser.Feature.INCLUDE_SOURCE_IN_LOCATION, true).configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).enable(JsonParser.Feature.INCLUDE_SOURCE_IN_LOCATION); - Pattern cadastralPattern = Pattern.compile("\\d{1,2}:\\d{1,2}:\\d{1,7}:\\d{1,9}"); - Pattern vinPattern = Pattern.compile("\\b[A-HJ-NPR-Z0-9-]{12,17}\\b"); @SneakyThrows public Map downloadExcel(int retryCount, String link) { try { HttpURLConnection connection = (HttpURLConnection) new URL(link).openConnection(); connection.setRequestMethod("GET"); + connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"); + connection.setRequestProperty("Accept", "application/json, text/plain, */*"); + connection.setRequestProperty("Accept-Language", "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7"); + connection.setConnectTimeout(5000); + connection.setReadTimeout(10000); if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { Map data = new HashMap<>(); Workbook wb = new XSSFWorkbook(connection.getInputStream()); diff --git a/src/main/java/com/pledge/torgi/service/EmailService.java b/src/main/java/com/pledge/torgi/service/EmailService.java index b3349c2..71c3e8e 100644 --- a/src/main/java/com/pledge/torgi/service/EmailService.java +++ b/src/main/java/com/pledge/torgi/service/EmailService.java @@ -4,66 +4,32 @@ import com.pledge.torgi.controller.storage.FileService; import com.pledge.torgi.model.Emails; import com.pledge.torgi.repositories.EmailsRepository; import com.pledge.torgi.utils.StartParams; -import lombok.SneakyThrows; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import javax.net.ssl.*; -import java.security.cert.X509Certificate; import java.time.LocalDateTime; import java.util.List; @Slf4j @Service +@AllArgsConstructor public class EmailService { private final FileService fileService; private final EmailsRepository emailsRepository; - @SneakyThrows - public EmailService(FileService fileService, EmailsRepository emailsRepository) { - this.emailsRepository = emailsRepository; - this.fileService = fileService; - - TrustManager[] trustAllCerts = new TrustManager[]{ - new X509TrustManager() { - public java.security.cert.X509Certificate[] getAcceptedIssuers() { - return null; - } - - public void checkClientTrusted(X509Certificate[] certs, String authType) { - // Ничего не проверяем - } - - public void checkServerTrusted(X509Certificate[] certs, String authType) { - // Ничего не проверяем - } - } - }; - - SSLContext sc = SSLContext.getInstance("TLS"); - sc.init(null, trustAllCerts, new java.security.SecureRandom()); - HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); - - HostnameVerifier allHostsValid = new HostnameVerifier() { - public boolean verify(String hostname, SSLSession session) { - return true; - } - }; - HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); - } - public void processEmails(StartParams params) { - log.error("Start email processing"); + log.info("Start email processing"); if (!params.getEnableEmailScan()) { - log.error("Email processing disabled"); + log.info("Email processing disabled"); return; } List alreadyProcessed = emailsRepository.findTop10ByOrderByIdDesc(); List emailData = new ReceiveEmailService("imap.gmail.com", 993, params.getFrom(), params.getToken(), params.getSpecialEmail(), log) .downloadEmails(alreadyProcessed); int sendLetters = 0; - log.error("Extracted letters = {}", emailData.size()); + log.info("Extracted letters = {}", emailData.size()); for (EmailData data : emailData) { if (alreadyProcessed(data.getEmailId())) { continue; @@ -72,7 +38,7 @@ public class EmailService { saveProcessedEmail(data); sendLetters++; } - log.error("End email processing, send letters = {}", sendLetters); + log.info("End email processing, send letters = {}", sendLetters); } private boolean alreadyProcessed(String emailId) { diff --git a/src/main/java/com/pledge/torgi/service/MainService.java b/src/main/java/com/pledge/torgi/service/MainService.java index 20c2f0e..b69ebc7 100644 --- a/src/main/java/com/pledge/torgi/service/MainService.java +++ b/src/main/java/com/pledge/torgi/service/MainService.java @@ -2,28 +2,81 @@ package com.pledge.torgi.service; import com.pledge.torgi.controller.DownloadHeadlessController; import com.pledge.torgi.utils.StartParams; -import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; +import javax.net.ssl.*; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; import java.util.concurrent.TimeUnit; @Service +@Slf4j @EnableScheduling -@AllArgsConstructor public class MainService { private final StartParams params; private final DownloadHeadlessController headlessController; private final EmailService emailService; + private static final String ISSUER_NAME = "CN=Russian Trusted Sub CA,O=The Ministry of Digital Development and Communications,C=RU"; - @Scheduled(timeUnit = TimeUnit.SECONDS, fixedRate = 120) + public MainService(StartParams params, DownloadHeadlessController headlessController, EmailService emailService) { + this.params = params; + this.headlessController = headlessController; + this.emailService = emailService; + + initSSL(); + } + + private void initSSL() { + TrustManager[] trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + + public void checkClientTrusted(X509Certificate[] certs, String authType) { + // Ничего не проверяем + } + + public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException { + if (certs.length != 1) { + throw new CertificateException(); + } + X509Certificate cert = certs[0]; + if (!cert.getIssuerX500Principal().getName().equals(ISSUER_NAME)) + { + throw new CertificateException("Current issuer name = %s, expected = %s".formatted(cert.getIssuerX500Principal().getName(), ISSUER_NAME)); + } + } + } + }; + + try { + SSLContext sc = SSLContext.getInstance("TLSv1.2"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + + HostnameVerifier allHostsValid = new HostnameVerifier() { + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); + } catch (Exception ex) { + log.error("Error during ssl init", ex); + } + } + + + @Scheduled(timeUnit = TimeUnit.SECONDS, fixedRate = 120, initialDelay = 5) public void getNewData() { headlessController.process(); headlessController.richData(); } - @Scheduled(timeUnit = TimeUnit.SECONDS, fixedRate = 600) + @Scheduled(timeUnit = TimeUnit.SECONDS, fixedRate = 600, initialDelay = 10) public void checkEmail() { emailService.processEmails(params); }