Advertisement
Guest User

Untitled

a guest
Nov 14th, 2019
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.01 KB | None | 0 0
  1. package wiki;
  2.  
  3. import org.apache.commons.io.IOUtils;
  4. import org.apache.http.Header;
  5. import org.apache.http.HttpEntity;
  6. import org.apache.http.client.HttpClient;
  7. import org.apache.http.client.config.RequestConfig;
  8. import org.apache.http.client.methods.CloseableHttpResponse;
  9. import org.apache.http.client.methods.HttpGet;
  10. import org.apache.http.client.methods.HttpPost;
  11. import org.apache.http.conn.ConnectTimeoutException;
  12. import org.apache.http.impl.client.CloseableHttpClient;
  13. import org.apache.http.impl.client.HttpClientBuilder;
  14. import org.apache.http.util.EntityUtils;
  15.  
  16. import org.jetbrains.annotations.NotNull;
  17. import org.json.*;
  18.  
  19. import javax.naming.NamingException;
  20. import java.io.InputStream;
  21. import java.io.UnsupportedEncodingException;
  22. import java.net.URI;
  23. import java.net.URLEncoder;
  24. import java.net.UnknownHostException;
  25. import java.nio.charset.StandardCharsets;
  26. import java.util.ArrayList;
  27. import java.util.Arrays;
  28. import java.util.HashMap;
  29. import java.util.HashSet;
  30.  
  31. /**
  32.  * API для работы с сайтом
  33.  */
  34. public class SiteAPI {
  35.     /**
  36.      * Логин для авторизации на сайте
  37.      */
  38.     private String login;
  39.     /**
  40.      * Пароль для соединения с сайтом
  41.      */
  42.     private String password;
  43.     /**
  44.      * Имя хоста для соединения с сайтом
  45.      */
  46.     private String hostName;
  47.     /**
  48.      * Смещение временной зоны
  49.      */
  50.     private String timezoneOffset;
  51.     /**
  52.      * Имя протокола для соединения с сайтом (http, https)
  53.      */
  54.     private String protocol;
  55.     /**
  56.      * Клиент для соединения
  57.      */
  58.     private CloseableHttpClient httpClient;
  59.     /**
  60.      * Куки для авторизации
  61.      */
  62.     private String authCookie;
  63.  
  64.     /**
  65.      * Токен для запросов с XSRF-Token
  66.      */
  67.     private String xsrfToken;
  68.     /**
  69.      * Таймштамп последней авторизации
  70.      */
  71.     private long lastAuthorizeTimestamp;
  72.  
  73.     /**
  74.      * Создаёт новый объект данных
  75.      * @param login логин для авторизации
  76.      * @param password  пароль для авторизации
  77.      * @param hostName имя хоста для соединения
  78.      * @param protocol протокол для соединения
  79.      */
  80.     SiteAPI(String login, String password, String hostName, String protocol, String timezoneOffset) {
  81.         this.login = login;
  82.         this.password = password;
  83.         this.hostName = hostName;
  84.         if (this.hostName.endsWith("/")) {
  85.             this.hostName = this.hostName.substring(0, this.hostName.length() - 1);
  86.         }
  87.         this.protocol = protocol.toLowerCase();
  88.         this.httpClient = HttpClientBuilder.create().setRedirectStrategy(new KmsRedirectStrategy()).build();
  89.         this.timezoneOffset = timezoneOffset;
  90.         this.lastAuthorizeTimestamp = 0;
  91.     }
  92.  
  93.     /**
  94.      * Возвращает данные страницы авторизации для дальнейшего разбора
  95.      * @throws Exception исключение в случае ошибки
  96.      */
  97.     private void tryAuthorize() throws Exception {
  98.         boolean error;
  99.         do {
  100.             String encodedLogin = URLEncoder.encode(this.login, "UTF-8");
  101.             String encodedPassword = URLEncoder.encode(this.password, "UTF-8");
  102.             String encodedTimezoneOffset = URLEncoder.encode(this.timezoneOffset, "UTF-8");
  103.  
  104.             String url = this.toAbsoluteUrl("/kms/lh/login/post?username=" + encodedLogin + "&password=" + encodedPassword + "&monitoring=&timezoneOffset=" + encodedTimezoneOffset + "&loginform=true");
  105.  
  106.             HttpPost request = new HttpPost(url);
  107.             request.addHeader("User-Agent", "FindBrokenLinks");
  108.             request.addHeader("Content-Type", "application/x-www-form-urlencoded");
  109.             request.addHeader("Referrer", this.toAbsoluteUrl("/kms/lh/login"));
  110.             CloseableHttpResponse response = httpClient.execute(request);
  111.             int statusCode = response.getStatusLine().getStatusCode();
  112.             boolean authError = true;
  113.             if (statusCode == 302) {
  114.                 Header[] headers = response.getAllHeaders();
  115.                 StringBuilder authResult = new StringBuilder("Авторизация на сайте вернула следующие заголовки, помимо кода 302: \n");
  116.                 for (Header header: headers) {
  117.                     authResult.append(header.getName()).append(": ").append(header.getValue()).append("\n");
  118.                 }
  119.                 Utils.logDebugInfo(authResult.toString());
  120.                 Header[] location = response.getHeaders("Location");
  121.                 if (location.length == 0) {
  122.                     location = response.getHeaders("location");
  123.                 }
  124.                 Header[] cookie = response.getHeaders("Set-Cookie");
  125.                 if (cookie.length == 0) {
  126.                     cookie = response.getHeaders("set-cookie");
  127.                 }
  128.                 if ((location.length == 1) && (cookie.length > 0)) {
  129.                     // Если редирект происходит в
  130.                     if (location[0].getValue().contains("/kms/lh/;jsessionid=") || location[0].getValue().endsWith("/kms/lh/") || location[0].getValue().contains("/kms/lh/?")) {
  131.                         ArrayList<String> list = new ArrayList<>();
  132.                         for (Header header : cookie) {
  133.                             String[] parts = header.getValue().split(";");
  134.                             list.add(parts[0]);
  135.                         }
  136.                         this.authCookie = String.join("; ", list);
  137.                         authError = false;
  138.                     }
  139.                 }
  140.                 error = false;
  141.             } else {
  142.                 // В таком случае, явно не ошибка, прокси, авторизация провалена
  143.                 error = statusCode == 503;
  144.             }
  145.             EntityUtils.consume(response.getEntity());
  146.             if (!error && authError) {
  147.                 throw new Exception("Не удаётся авторизоваться в KMS, проверьте корректность логина и пароля");
  148.             }
  149.         } while (error);
  150.  
  151.         String[] parts = this.authCookie.split(";");
  152.         this.xsrfToken = null;
  153.         for (String part : parts) {
  154.             String[] result = part.split("=");
  155.             if (result.length == 2) {
  156.                 if (result[0].equals("XSRF-TOKEN")) {
  157.                     this.xsrfToken = result[1];
  158.                 }
  159.             }
  160.         }
  161.         if (this.xsrfToken == null) {
  162.             this.xsrfToken = "";
  163.             throw new Exception("Не удаётся получить XSRF-токен при авторизации");
  164.         }
  165.         this.lastAuthorizeTimestamp = System.currentTimeMillis();
  166.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement