diff --git a/app/src/main/java/com/hippo/ehviewer/EhApplication.java b/app/src/main/java/com/hippo/ehviewer/EhApplication.java index 7a871fc7b..af4d51c1a 100644 --- a/app/src/main/java/com/hippo/ehviewer/EhApplication.java +++ b/app/src/main/java/com/hippo/ehviewer/EhApplication.java @@ -34,6 +34,7 @@ import com.hippo.conaco.Conaco; import com.hippo.ehviewer.client.EhClient; import com.hippo.ehviewer.client.EhCookieStore; import com.hippo.ehviewer.client.EhEngine; +import com.hippo.ehviewer.client.EhUrl; import com.hippo.ehviewer.client.data.GalleryDetail; import com.hippo.ehviewer.download.DownloadManager; import com.hippo.ehviewer.spider.SpiderDen; @@ -55,6 +56,8 @@ import java.util.List; import java.util.WeakHashMap; import java.util.concurrent.TimeUnit; +import okhttp3.Cookie; +import okhttp3.HttpUrl; import okhttp3.OkHttpClient; public class EhApplication extends SceneApplication implements Thread.UncaughtExceptionHandler { @@ -142,6 +145,29 @@ public class EhApplication extends SceneApplication implements Thread.UncaughtEx if (version < 52) { Settings.putGuideGallery(true); } + if (version < 56) { // Make cookie long live + HttpUrl eUrl = HttpUrl.parse(EhUrl.HOST_E); + HttpUrl exUrl = HttpUrl.parse(EhUrl.HOST_EX); + EhCookieStore cookieStore = getEhCookieStore(this); + + Cookie c; + c = cookieStore.get(eUrl, EhCookieStore.KEY_IPD_MEMBER_ID); + if (null != c) { + cookieStore.add(EhCookieStore.newCookie(c, c.domain(), true, true, true)); + } + c = cookieStore.get(eUrl, EhCookieStore.KEY_IPD_PASS_HASH); + if (null != c) { + cookieStore.add(EhCookieStore.newCookie(c, c.domain(), true, true, true)); + } + c = cookieStore.get(exUrl, EhCookieStore.KEY_IPD_MEMBER_ID); + if (null != c) { + cookieStore.add(EhCookieStore.newCookie(c, c.domain(), true, true, true)); + } + c = cookieStore.get(exUrl, EhCookieStore.KEY_IPD_PASS_HASH); + if (null != c) { + cookieStore.add(EhCookieStore.newCookie(c, c.domain(), true, true, true)); + } + } } public void clearMemoryCache() { diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhCookieStore.java b/app/src/main/java/com/hippo/ehviewer/client/EhCookieStore.java index 7c97b0704..716a93448 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhCookieStore.java +++ b/app/src/main/java/com/hippo/ehviewer/client/EhCookieStore.java @@ -49,11 +49,15 @@ public class EhCookieStore extends CookieDBStore { contain(EhUrl.DOMAIN_EX, KEY_IPD_PASS_HASH); } - public static Cookie newCookie(Cookie cookie, String newDomain, boolean forcePersistent, boolean forceNotHostOnly) { + public static Cookie newCookie(Cookie cookie, String newDomain, boolean forcePersistent, + boolean forceLongLive, boolean forceNotHostOnly) { Cookie.Builder builder = new Cookie.Builder(); builder.name(cookie.name()); builder.value(cookie.value()); - if (cookie.persistent()) { + + if (forceLongLive) { + builder.expiresAt(Long.MAX_VALUE); + } else if (cookie.persistent()) { builder.expiresAt(cookie.expiresAt()); } else if (forcePersistent) { builder.expiresAt(Long.MAX_VALUE); @@ -125,7 +129,9 @@ public class EhCookieStore extends CookieDBStore { // Save id and hash for exhentai if (KEY_IPD_MEMBER_ID.equals(cookie.name()) || KEY_IPD_PASS_HASH.equals(cookie.name())) { - result.add(newCookie(cookie, EhUrl.DOMAIN_EX, false, false)); + result.add(newCookie(cookie, EhUrl.DOMAIN_E, true, true, true)); + result.add(newCookie(cookie, EhUrl.DOMAIN_EX, true, true, true)); + continue; } } diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhUrl.java b/app/src/main/java/com/hippo/ehviewer/client/EhUrl.java index 180661173..e5fdca554 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhUrl.java +++ b/app/src/main/java/com/hippo/ehviewer/client/EhUrl.java @@ -31,6 +31,7 @@ public class EhUrl { public static final String DOMAIN_G = "g.e-hentai.org"; public static final String DOMAIN_LOFI = "lofi.e-hentai.org"; + public static final String HOST_E = "http://" + DOMAIN_E + "/"; public static final String HOST_EX = "http://" + DOMAIN_EX + "/"; public static final String HOST_G = "http://" + DOMAIN_G + "/"; diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/WebViewSignInScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/WebViewSignInScene.java index d6e302c2e..bc99e13c1 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/WebViewSignInScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/WebViewSignInScene.java @@ -121,7 +121,7 @@ public class WebViewSignInScene extends BaseScene { } private void addCookie(Context context, String domain, Cookie cookie) { - EhApplication.getEhCookieStore(context).add(EhCookieStore.newCookie(cookie, domain, true, true)); + EhApplication.getEhCookieStore(context).add(EhCookieStore.newCookie(cookie, domain, true, true, true)); } @Override diff --git a/app/src/main/java/com/hippo/okhttp/CookieDBStore.java b/app/src/main/java/com/hippo/okhttp/CookieDBStore.java index 115b68a54..a6104d2c6 100644 --- a/app/src/main/java/com/hippo/okhttp/CookieDBStore.java +++ b/app/src/main/java/com/hippo/okhttp/CookieDBStore.java @@ -16,6 +16,8 @@ package com.hippo.okhttp; +import android.support.annotation.Nullable; + import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; @@ -176,6 +178,35 @@ public class CookieDBStore implements CookieJar { } } + private Cookie getInternal(HttpUrl url, String name, List cookies) { + for (Iterator i = cookies.iterator(); i.hasNext();) { + CookieWithID cwi = i.next(); + Cookie cookie = cwi.cookie; + // Check expired + if (hasExpired(cookie)) { + // Remove from list + i.remove(); + // Remove from DB + CookieDB.removeCookie(cwi.id); + } else if (cookie.name().equals(name) && cookie.matches(url)) { + return cookie; + } + } + return null; + } + + @Nullable + public synchronized Cookie get(HttpUrl url, String name) { + String host = url.host(); + for (String key : map.keySet()) { + if (domainMatch(host, key)) { + List cookies = map.get(key); + return getInternal(url, name, cookies); + } + } + return null; + } + public synchronized List get(HttpUrl url) { List result = new ArrayList<>(); @@ -185,6 +216,7 @@ public class CookieDBStore implements CookieJar { List cookies = map.get(key); // cookies can not be null getInternal(url, cookies, result); + break; } }