From 68c68a126a61f9f9d3154e912498efb1448ea420 Mon Sep 17 00:00:00 2001
From: 0xb00bface <0xboobface@gmail.com>
Date: Sat, 11 Dec 2021 14:04:03 +0100
Subject: [PATCH] Fix Streamate by removing the use of the XSRF

Apparently the XSRF is not needed anymore
---
 .../streamate/StreamateFollowedService.java   | 51 +++++++--------
 .../streamate/StreamateUpdateService.java     | 47 +++++++-------
 .../sites/streamate/StreamateHttpClient.java  | 62 ++++---------------
 3 files changed, 55 insertions(+), 105 deletions(-)

diff --git a/client/src/main/java/ctbrec/ui/sites/streamate/StreamateFollowedService.java b/client/src/main/java/ctbrec/ui/sites/streamate/StreamateFollowedService.java
index 3a74a193..eec86094 100644
--- a/client/src/main/java/ctbrec/ui/sites/streamate/StreamateFollowedService.java
+++ b/client/src/main/java/ctbrec/ui/sites/streamate/StreamateFollowedService.java
@@ -1,23 +1,5 @@
 package ctbrec.ui.sites.streamate;
 
-import static ctbrec.Model.State.*;
-import static ctbrec.io.HttpConstants.*;
-import static ctbrec.sites.streamate.Streamate.*;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.UUID;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.xpath.XPathExpressionException;
-
-import org.json.JSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.xml.sax.SAXException;
-
 import ctbrec.Config;
 import ctbrec.Model;
 import ctbrec.io.HttpException;
@@ -27,15 +9,26 @@ import ctbrec.sites.streamate.StreamateModel;
 import ctbrec.ui.tabs.PaginatedScheduledService;
 import javafx.concurrent.Task;
 import okhttp3.Request;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.*;
+
+import static ctbrec.Model.State.OFFLINE;
+import static ctbrec.Model.State.ONLINE;
+import static ctbrec.io.HttpConstants.*;
+import static ctbrec.sites.streamate.Streamate.NAIAD_URL;
 
 public class StreamateFollowedService extends PaginatedScheduledService {
 
     private static final Logger LOG = LoggerFactory.getLogger(StreamateFollowedService.class);
 
     private static final int MODELS_PER_PAGE = 48;
-    private Streamate streamate;
-    private StreamateHttpClient httpClient;
-    private String url;
+    private final Streamate streamate;
+    private final StreamateHttpClient httpClient;
+    private final String url;
     private boolean showOnline = true;
 
     public StreamateFollowedService(Streamate streamate) {
@@ -46,13 +39,14 @@ public class StreamateFollowedService extends PaginatedScheduledService {
 
     @Override
     protected Task<List<Model>> createTask() {
-        return new Task<List<Model>>() {
+        return new Task<>() {
             @Override
-            public List<Model> call() throws IOException, SAXException, ParserConfigurationException, XPathExpressionException {
+            public List<Model> call() throws IOException {
                 httpClient.login();
                 String saKey = httpClient.getSaKey();
                 String pageUrl = url + "&from=" + ((page - 1) * MODELS_PER_PAGE) + "&size=" + MODELS_PER_PAGE;
                 LOG.debug("Fetching page {}", pageUrl);
+                var smtid = UUID.randomUUID() + "G0211569057409";
                 var request = new Request.Builder()
                         .url(pageUrl)
                         .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent)
@@ -62,14 +56,13 @@ public class StreamateFollowedService extends PaginatedScheduledService {
                         .header(REFERER, streamate.getBaseUrl() + "/view/favorites")
                         .header("sakey", saKey)
                         .header("platform", "SCP")
-                        .header("smtid", UUID.randomUUID().toString() + "G0211569057409")
-                        .header("smeid", UUID.randomUUID().toString() + "G0211569057409")
-                        .header("smvid", UUID.randomUUID().toString() + "G0211569057409")
-                        .header("X-XSRF-TOKEN", httpClient.getXsrfToken())
+                        .header("smtid", smtid)
+                        .header("smeid", smtid)
+                        .header("smvid", smtid)
                         .build();
-                try(var response = streamate.getHttpClient().execute(request)) {
+                try (var response = streamate.getHttpClient().execute(request)) {
                     if (response.isSuccessful()) {
-                        return parseModels(response.body().string());
+                        return parseModels(Objects.requireNonNull(response.body(), "HTTP response body is null").string());
                     } else {
                         throw new HttpException(response.code(), response.message());
                     }
diff --git a/client/src/main/java/ctbrec/ui/sites/streamate/StreamateUpdateService.java b/client/src/main/java/ctbrec/ui/sites/streamate/StreamateUpdateService.java
index 8c56813e..ce05a485 100644
--- a/client/src/main/java/ctbrec/ui/sites/streamate/StreamateUpdateService.java
+++ b/client/src/main/java/ctbrec/ui/sites/streamate/StreamateUpdateService.java
@@ -1,21 +1,5 @@
 package ctbrec.ui.sites.streamate;
 
-import static ctbrec.Model.State.*;
-import static ctbrec.io.HttpConstants.*;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.xpath.XPathExpressionException;
-
-import org.json.JSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.xml.sax.SAXException;
-
 import ctbrec.Model;
 import ctbrec.io.HttpException;
 import ctbrec.sites.streamate.Streamate;
@@ -23,15 +7,27 @@ import ctbrec.sites.streamate.StreamateHttpClient;
 import ctbrec.sites.streamate.StreamateModel;
 import ctbrec.ui.tabs.PaginatedScheduledService;
 import javafx.concurrent.Task;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.UUID;
+
+import static ctbrec.Model.State.*;
+import static ctbrec.io.HttpConstants.ORIGIN;
 
 public class StreamateUpdateService extends PaginatedScheduledService {
 
     private static final Logger LOG = LoggerFactory.getLogger(StreamateUpdateService.class);
 
     private static final int MODELS_PER_PAGE = 48;
-    private Streamate streamate;
-    private StreamateHttpClient httpClient;
-    private String url;
+    private final Streamate streamate;
+    private final StreamateHttpClient httpClient;
+    private final String url;
 
     public StreamateUpdateService(Streamate streamate, String url) {
         this.streamate = streamate;
@@ -41,25 +37,26 @@ public class StreamateUpdateService extends PaginatedScheduledService {
 
     @Override
     protected Task<List<Model>> createTask() {
-        return new Task<List<Model>>() {
+        return new Task<>() {
             @Override
-            public List<Model> call() throws IOException, SAXException, ParserConfigurationException, XPathExpressionException {
+            public List<Model> call() throws IOException {
                 int from = (page - 1) * MODELS_PER_PAGE;
                 String saKey = httpClient.getSaKey();
                 String pageUrl = url + "&from=" + from + "&size=" + MODELS_PER_PAGE;
                 LOG.debug("Fetching page {}", pageUrl);
+                var smtid = UUID.randomUUID() + "G0211569057409";
                 var request = httpClient.newRequestBuilder()
                         .url(pageUrl)
                         .header(ORIGIN, streamate.getBaseUrl())
                         .header("sakey", saKey)
                         .header("platform", "SCP")
-                        .header("smtid", UUID.randomUUID().toString() + "G0211569057409")
-                        .header("smeid", UUID.randomUUID().toString() + "G0211569057409")
-                        .header("smvid", UUID.randomUUID().toString() + "G0211569057409")
+                        .header("smtid", smtid)
+                        .header("smeid", smtid)
+                        .header("smvid", smtid)
                         .build();
                 try (var response = httpClient.execute(request)) {
                     if (response.isSuccessful()) {
-                        return parseModels(response.body().string());
+                        return parseModels(Objects.requireNonNull(response.body(), "HTTP response body is null").string());
                     } else {
                         throw new HttpException(response.code(), response.message());
                     }
diff --git a/common/src/main/java/ctbrec/sites/streamate/StreamateHttpClient.java b/common/src/main/java/ctbrec/sites/streamate/StreamateHttpClient.java
index 9ca5c4ec..6d51d53c 100644
--- a/common/src/main/java/ctbrec/sites/streamate/StreamateHttpClient.java
+++ b/common/src/main/java/ctbrec/sites/streamate/StreamateHttpClient.java
@@ -1,28 +1,19 @@
 package ctbrec.sites.streamate;
 
-import static ctbrec.io.HttpConstants.*;
+import ctbrec.Config;
+import ctbrec.io.HttpClient;
+import okhttp3.*;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.util.Collections;
 import java.util.Locale;
 import java.util.NoSuchElementException;
-import java.util.UUID;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import java.util.Objects;
 
-import org.json.JSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import ctbrec.Config;
-import ctbrec.io.HttpClient;
-import ctbrec.io.HttpException;
-import okhttp3.Cookie;
-import okhttp3.HttpUrl;
-import okhttp3.MediaType;
-import okhttp3.Request;
-import okhttp3.RequestBody;
-import okhttp3.Response;
+import static ctbrec.io.HttpConstants.*;
 
 public class StreamateHttpClient extends HttpClient {
 
@@ -34,7 +25,6 @@ public class StreamateHttpClient extends HttpClient {
     private Long userId;
     private String saKey = "";
     private String userNickname = "";
-    private String xsrfToken = null;
 
     public StreamateHttpClient(Config config) {
         super("streamate", config);
@@ -54,31 +44,6 @@ public class StreamateHttpClient extends HttpClient {
         } catch (NoSuchElementException e) {
             // ignore
         }
-
-        loadXsrfToken();
-    }
-
-    private void loadXsrfToken() {
-        // do a first request to get cookies and stuff
-        Request req = new Request.Builder() //
-                .url(Streamate.BASE_URL + "/initialData.js") //
-                .header(USER_AGENT, config.getSettings().httpUserAgent) //
-                .header(COOKIE, "smtid="+UUID.randomUUID().toString()+"; Xld_rct=1;") //
-                .header(REFERER, Streamate.BASE_URL)
-                .build();
-        try (Response resp = execute(req)) {
-            if (resp.code() == 200) {
-                LOG.info("Initial request was fine, Extracting XSRF token");
-                Matcher m = Pattern.compile("\"xsrfToken\":\"(.*?)\"").matcher(resp.body().string());
-                if (m.find()) {
-                    xsrfToken = m.group(1);
-                }
-            } else {
-                throw new HttpException(resp.code(), resp.message());
-            }
-        } catch (IOException e) {
-            LOG.error("Initial request failed", e);
-        }
     }
 
     @Override
@@ -113,7 +78,7 @@ public class StreamateHttpClient extends HttpClient {
                 .post(body)
                 .build();
         try (Response response = client.newCall(login).execute()) {
-            String content = response.body().string();
+            String content = Objects.requireNonNull(response.body(), "HTTP response body is null").string();
             if(response.isSuccessful()) {
                 JSONObject json = new JSONObject(content);
                 loggedIn = json.has(SAKEY_KEY);
@@ -135,8 +100,7 @@ public class StreamateHttpClient extends HttpClient {
                 .header(ACCEPT, MIMETYPE_APPLICATION_JSON)
                 .header(ACCEPT_LANGUAGE, Locale.ENGLISH.getLanguage())
                 .header(REFERER, Streamate.BASE_URL)
-                .header(X_REQUESTED_WITH, XML_HTTP_REQUEST)
-                .header("X-XSRF-TOKEN", getXsrfToken()); // @formatter:on
+                .header(X_REQUESTED_WITH, XML_HTTP_REQUEST); // @formatter:on
     }
 
     /**
@@ -148,7 +112,7 @@ public class StreamateHttpClient extends HttpClient {
         Request request = newRequestBuilder().url(url).build();
         try (Response response = execute(request)) {
             if (response.isSuccessful()) {
-                String content = response.body().string();
+                String content = Objects.requireNonNull(response.body(), "HTTP response body is null").string();
                 JSONObject json = new JSONObject(content);
                 return json.optString("status").equals("SM_OK");
             } else {
@@ -173,8 +137,4 @@ public class StreamateHttpClient extends HttpClient {
     public String getUserNickname() {
         return userNickname;
     }
-
-    public String getXsrfToken() {
-        return xsrfToken;
-    }
 }