diff --git a/src/main/java/ctbrec/io/CookieJarImpl.java b/src/main/java/ctbrec/io/CookieJarImpl.java index 712ff30c..8baf7a25 100644 --- a/src/main/java/ctbrec/io/CookieJarImpl.java +++ b/src/main/java/ctbrec/io/CookieJarImpl.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import java.util.NoSuchElementException; import java.util.Objects; import java.util.Optional; @@ -78,5 +80,16 @@ public class CookieJarImpl implements CookieJar { return host; } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for (Entry> entry : cookieStore.entrySet()) { + sb.append(entry.getKey()).append(": ").append(entry.getValue()).append('\n'); + } + return sb.toString(); + } + protected Map> getCookies() { + return cookieStore; + } } diff --git a/src/main/java/ctbrec/io/CookieJsonAdapter.java b/src/main/java/ctbrec/io/CookieJsonAdapter.java new file mode 100644 index 00000000..c94df9b6 --- /dev/null +++ b/src/main/java/ctbrec/io/CookieJsonAdapter.java @@ -0,0 +1,79 @@ +package ctbrec.io; + +import java.io.IOException; + +import com.squareup.moshi.JsonAdapter; +import com.squareup.moshi.JsonReader; +import com.squareup.moshi.JsonWriter; + +import okhttp3.Cookie; +import okhttp3.Cookie.Builder; + +public class CookieJsonAdapter extends JsonAdapter { + + @Override + public Cookie fromJson(JsonReader reader) throws IOException { + Builder builder = new Cookie.Builder(); + // domain + reader.nextName(); + String domain = reader.nextString(); + builder.domain(domain); + + // expiresAt + reader.nextName(); + builder.expiresAt(reader.nextLong()); + + // host only + reader.nextName(); + if(reader.nextBoolean()) { + builder.hostOnlyDomain(domain); + } + + // http only + reader.nextName(); + if(reader.nextBoolean()) { + builder.httpOnly(); + } + + // name + reader.nextName(); + builder.name(reader.nextString()); + + // path + reader.nextName(); + builder.path(reader.nextString()); + + // persistent + reader.nextName(); + if(reader.nextBoolean()) { + // noop + } + + // secure + reader.nextName(); + if(reader.nextBoolean()) { + builder.secure(); + } + + // value + reader.nextName(); + builder.value(reader.nextString()); + + return builder.build(); + } + + @Override + public void toJson(JsonWriter writer, Cookie cookie) throws IOException { + writer.beginObject(); + writer.name("domain").value(cookie.domain()); + writer.name("expiresAt").value(cookie.expiresAt()); + writer.name("hostOnly").value(cookie.hostOnly()); + writer.name("httpOnly").value(cookie.httpOnly()); + writer.name("name").value(cookie.name()); + writer.name("path").value(cookie.path()); + writer.name("persistent").value(cookie.persistent()); + writer.name("secure").value(cookie.secure()); + writer.name("value").value(cookie.value()); + writer.endObject(); + } +} diff --git a/src/main/java/ctbrec/io/HttpClient.java b/src/main/java/ctbrec/io/HttpClient.java index 02c8f818..843d65a4 100644 --- a/src/main/java/ctbrec/io/HttpClient.java +++ b/src/main/java/ctbrec/io/HttpClient.java @@ -3,11 +3,20 @@ package ctbrec.io; import java.io.IOException; import java.net.Authenticator; import java.net.PasswordAuthentication; +import java.util.List; +import java.util.Map; import java.util.concurrent.TimeUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.squareup.moshi.JsonAdapter; +import com.squareup.moshi.Moshi; + import ctbrec.Config; import ctbrec.Settings.ProxyType; import okhttp3.ConnectionPool; +import okhttp3.Cookie; import okhttp3.Credentials; import okhttp3.OkHttpClient; import okhttp3.OkHttpClient.Builder; @@ -16,12 +25,16 @@ import okhttp3.Response; import okhttp3.Route; public abstract class HttpClient { + private static final transient Logger LOG = LoggerFactory.getLogger(HttpClient.class); + protected OkHttpClient client; protected CookieJarImpl cookieJar = new CookieJarImpl(); protected boolean loggedIn = false; protected int loginTries = 0; + private String name; - protected HttpClient() { + protected HttpClient(String name) { + this.name = name; reconfigure(); } @@ -112,10 +125,23 @@ public abstract class HttpClient { } public void shutdown() { + persistCookies(); client.connectionPool().evictAll(); client.dispatcher().executorService().shutdown(); } + private void persistCookies() { + try { + Map> cookies = cookieJar.getCookies(); + Moshi moshi = new Moshi.Builder().add(Cookie.class, new CookieJsonAdapter()).build(); + @SuppressWarnings("rawtypes") + JsonAdapter adapter = moshi.adapter(Map.class).indent(" "); + String json = adapter.toJson(cookies); + } catch (Exception e) { + LOG.error("Couldn't persist cookies for {}", name, e); + } + } + private okhttp3.Authenticator createHttpProxyAuthenticator(String username, String password) { return new okhttp3.Authenticator() { @Override diff --git a/src/main/java/ctbrec/recorder/server/RecorderHttpClient.java b/src/main/java/ctbrec/recorder/server/RecorderHttpClient.java index 22027ba9..7b3170e7 100644 --- a/src/main/java/ctbrec/recorder/server/RecorderHttpClient.java +++ b/src/main/java/ctbrec/recorder/server/RecorderHttpClient.java @@ -6,6 +6,10 @@ import ctbrec.io.HttpClient; public class RecorderHttpClient extends HttpClient { + public RecorderHttpClient() { + super("recorder"); + } + @Override public boolean login() throws IOException { return false; diff --git a/src/main/java/ctbrec/sites/bonga/BongaCamsHttpClient.java b/src/main/java/ctbrec/sites/bonga/BongaCamsHttpClient.java index 6d0a23dd..26e08381 100644 --- a/src/main/java/ctbrec/sites/bonga/BongaCamsHttpClient.java +++ b/src/main/java/ctbrec/sites/bonga/BongaCamsHttpClient.java @@ -26,6 +26,10 @@ public class BongaCamsHttpClient extends HttpClient { private static final transient Logger LOG = LoggerFactory.getLogger(BongaCamsHttpClient.class); private int userId = 0; + public BongaCamsHttpClient() { + super("bongacams"); + } + @Override public synchronized boolean login() throws IOException { if(loggedIn) { diff --git a/src/main/java/ctbrec/sites/cam4/Cam4HttpClient.java b/src/main/java/ctbrec/sites/cam4/Cam4HttpClient.java index 3a40c555..f6434401 100644 --- a/src/main/java/ctbrec/sites/cam4/Cam4HttpClient.java +++ b/src/main/java/ctbrec/sites/cam4/Cam4HttpClient.java @@ -23,6 +23,10 @@ public class Cam4HttpClient extends HttpClient { private static final transient Logger LOG = LoggerFactory.getLogger(Cam4HttpClient.class); + public Cam4HttpClient() { + super("cam4"); + } + @Override public synchronized boolean login() throws IOException { if(loggedIn) { diff --git a/src/main/java/ctbrec/sites/camsoda/CamsodaHttpClient.java b/src/main/java/ctbrec/sites/camsoda/CamsodaHttpClient.java index 9ab57b9e..b6148863 100644 --- a/src/main/java/ctbrec/sites/camsoda/CamsodaHttpClient.java +++ b/src/main/java/ctbrec/sites/camsoda/CamsodaHttpClient.java @@ -29,6 +29,10 @@ public class CamsodaHttpClient extends HttpClient { private static final transient Logger LOG = LoggerFactory.getLogger(CamsodaHttpClient.class); private String csrfToken = null; + public CamsodaHttpClient() { + super("camsoda"); + } + @Override public boolean login() throws IOException { if(loggedIn) { diff --git a/src/main/java/ctbrec/sites/chaturbate/ChaturbateHttpClient.java b/src/main/java/ctbrec/sites/chaturbate/ChaturbateHttpClient.java index 33cdbcd8..06ce6262 100644 --- a/src/main/java/ctbrec/sites/chaturbate/ChaturbateHttpClient.java +++ b/src/main/java/ctbrec/sites/chaturbate/ChaturbateHttpClient.java @@ -20,6 +20,10 @@ public class ChaturbateHttpClient extends HttpClient { private static final transient Logger LOG = LoggerFactory.getLogger(ChaturbateHttpClient.class); protected String token; + public ChaturbateHttpClient() { + super("chaturbate"); + } + private void extractCsrfToken(Request request) { try { Cookie csrfToken = cookieJar.getCookie(request.url(), "csrftoken"); diff --git a/src/main/java/ctbrec/sites/mfc/MyFreeCamsHttpClient.java b/src/main/java/ctbrec/sites/mfc/MyFreeCamsHttpClient.java index 762d3dd6..7d49237b 100644 --- a/src/main/java/ctbrec/sites/mfc/MyFreeCamsHttpClient.java +++ b/src/main/java/ctbrec/sites/mfc/MyFreeCamsHttpClient.java @@ -24,6 +24,10 @@ public class MyFreeCamsHttpClient extends HttpClient { private static final transient Logger LOG = LoggerFactory.getLogger(MyFreeCamsHttpClient.class); + public MyFreeCamsHttpClient() { + super("myfreecams"); + } + @Override public boolean login() throws IOException { if(loggedIn) { diff --git a/src/main/java/ctbrec/ui/CamrecApplication.java b/src/main/java/ctbrec/ui/CamrecApplication.java index 59faff75..5856873e 100644 --- a/src/main/java/ctbrec/ui/CamrecApplication.java +++ b/src/main/java/ctbrec/ui/CamrecApplication.java @@ -200,7 +200,7 @@ public class CamrecApplication extends Application { } private void createHttpClient() { - httpClient = new HttpClient() { + httpClient = new HttpClient("camrec") { @Override public boolean login() throws IOException { return false;