From 4e651066fb3713e5376789724adeb82968523d66 Mon Sep 17 00:00:00 2001 From: seven332 Date: Tue, 26 Jan 2016 20:37:44 +0800 Subject: [PATCH] Fix domain error in CookieStore --- .../hippo/ehviewer/client/EhCookieStore.java | 3 +- .../main/java/com/hippo/okhttp/CookieDB.java | 33 +---- .../java/com/hippo/okhttp/CookieDBStore.java | 135 ++++++++++-------- 3 files changed, 75 insertions(+), 96 deletions(-) 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 7f6004471..d3132df53 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhCookieStore.java +++ b/app/src/main/java/com/hippo/ehviewer/client/EhCookieStore.java @@ -16,7 +16,6 @@ package com.hippo.ehviewer.client; -import com.hippo.okhttp.CookieDB; import com.hippo.okhttp.CookieDBStore; import java.util.ArrayList; @@ -71,7 +70,7 @@ public class EhCookieStore extends CookieDBStore { if (EhUrl.DOMAIN_E.equals(cookie.domain()) && (KEY_IPD_MEMBER_ID.equals(cookie.name()) || KEY_IPD_PASS_HASH.equals(cookie.name()))) { - cs.add(newCookie(cookie, CookieDB.cookiesDomain(EhUrl.DOMAIN_EX))); + cs.add(newCookie(cookie, EhUrl.DOMAIN_EX)); } } diff --git a/app/src/main/java/com/hippo/okhttp/CookieDB.java b/app/src/main/java/com/hippo/okhttp/CookieDB.java index d24cb301e..ea1f9e6c0 100644 --- a/app/src/main/java/com/hippo/okhttp/CookieDB.java +++ b/app/src/main/java/com/hippo/okhttp/CookieDB.java @@ -18,14 +18,12 @@ package com.hippo.okhttp; import android.content.Context; import android.database.sqlite.SQLiteDatabase; -import android.text.TextUtils; import com.hippo.okhttp.dao.DaoMaster; import com.hippo.okhttp.dao.DaoSession; import com.hippo.okhttp.dao.OkHttp3CookieDao; import com.hippo.okhttp.dao.OkHttp3CookieRaw; -import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -58,31 +56,6 @@ public class CookieDB { sDaoSession = daoMaster.newSession(); } - public static String cookiesDomain(URL url) { - return cookiesDomain(url.getHost()); - } - - // FIXME It is not right to store like this - public static String cookiesDomain(String domain) { - if (TextUtils.isEmpty(domain)) { - return ""; - } - - int count = 0; - for (int i = domain.length() - 1; i >= 0; i--) { - char ch = domain.charAt(i); - if (ch == '.') { - count++; - } - - if (count == 2) { - return domain.substring(i + 1); - } - } - - return domain; - } - public static Map> getAllCookies() { OkHttp3CookieDao dao = sDaoSession.getOkHttp3CookieDao(); List list = dao.queryBuilder().list(); @@ -122,12 +95,10 @@ public class CookieDB { builder.httpOnly(); } - String cookiesDomain = cookiesDomain(domain); - - List cookies = result.get(cookiesDomain); + List cookies = result.get(domain); if (cookies == null) { cookies = new ArrayList<>(); - result.put(cookiesDomain, cookies); + result.put(domain, cookies); } cookies.add(new CookieWithID(raw.getId(), builder.build())); diff --git a/app/src/main/java/com/hippo/okhttp/CookieDBStore.java b/app/src/main/java/com/hippo/okhttp/CookieDBStore.java index 17891542b..214f17e32 100644 --- a/app/src/main/java/com/hippo/okhttp/CookieDBStore.java +++ b/app/src/main/java/com/hippo/okhttp/CookieDBStore.java @@ -35,20 +35,23 @@ public class CookieDBStore implements CookieJar { map = CookieDB.getAllCookies(); } - private boolean hasExpired(Cookie cookie) { + private static boolean hasExpired(Cookie cookie) { return cookie.expiresAt() < System.currentTimeMillis(); } - private static CookieWithID removeCookie(List list, Cookie cookie) { - for (int i = 0, n = list.size(); i < n; i++) { - CookieWithID cwi = list.get(i); - if (cwi.cookie.name().equals(cookie.name())) { - list.remove(i); - return cwi; - } + public boolean domainMatch(Cookie cookie, String urlHost) { + return cookie.hostOnly() + ? urlHost.equals(cookie.domain()) + : domainMatch(urlHost, cookie.domain()); + } + + private static boolean domainMatch(String urlHost, String cookieDomain) { + if (urlHost.equals(cookieDomain)) { + return true; // As in 'example.com' matching 'example.com'. } - return null; + return urlHost.endsWith(cookieDomain) + && urlHost.charAt(urlHost.length() - cookieDomain.length() - 1) == '.'; } private static CookieWithID removeCookie(List list, String name) { @@ -63,12 +66,22 @@ public class CookieDBStore implements CookieJar { return null; } - private boolean containInternal(String domain, String name) { - List cookies = map.get(domain); - if (cookies != null) { - for (int i = 0, n = cookies.size(); i < n; i++) { - CookieWithID cwi = cookies.get(i); - if (cwi.cookie.name().equals(name)) { + private boolean containInternal(String host, String name, List cookies) { + for (int i = 0, n = cookies.size(); i < n; i++) { + Cookie cookie = cookies.get(i).cookie; + if (domainMatch(cookie, host) && cookie.name().equals(name)) { + return true; + } + } + return false; + } + + public boolean contain(String host, String name) { + for (String key : map.keySet()) { + if (domainMatch(host, key)) { + List cookies = map.get(key); + // cookies can not be null + if (containInternal(host, name, cookies)) { return true; } } @@ -76,11 +89,12 @@ public class CookieDBStore implements CookieJar { return false; } - private synchronized void removeInternal(String domain, Cookie cookie) { + private synchronized void removeInternal(Cookie cookie) { + String domain = cookie.domain(); List cookies = map.get(domain); if (cookies != null) { // Remove from list - CookieWithID cwi = removeCookie(cookies, cookie); + CookieWithID cwi = removeCookie(cookies, cookie.name()); if (cwi != null) { // Remove from DB CookieDB.removeCookie(cwi.id); @@ -88,34 +102,37 @@ public class CookieDBStore implements CookieJar { } } - private synchronized void removeInternal(String domain, String name) { - List cookies = map.get(domain); - if (cookies != null) { - // Remove from list - CookieWithID cwi = removeCookie(cookies, name); - if (cwi != null) { + private void removeInternal(String host, List cookies) { + for (Iterator i = cookies.iterator(); i.hasNext();) { + CookieWithID cwi = i.next(); + Cookie cookie = cwi.cookie; + // Check match host or has expired + if (domainMatch(cookie, host) || hasExpired(cookie)) { + // Remove from list + i.remove(); // Remove from DB CookieDB.removeCookie(cwi.id); } } } - private synchronized void removeInternal(String domain) { - // Remove all cookies of the domain from map - List cookies = map.remove(domain); - if (cookies != null) { - for (CookieWithID cwi : cookies) { - // Remove from DB - CookieDB.removeCookie(cwi.id); + public void remove(String host) { + for (String key : map.keySet()) { + if (domainMatch(host, key)) { + List cookies = map.get(key); + // cookies can not be null + removeInternal(host, cookies); } - cookies.clear(); } } - private synchronized void addInternal(String domain, Cookie cookie) { + + public void add(Cookie cookie) { + String domain = cookie.domain(); + // Check expired if (hasExpired(cookie)) { - removeInternal(domain, cookie); + removeInternal(cookie); return; } @@ -124,8 +141,9 @@ public class CookieDBStore implements CookieJar { cookies = new ArrayList<>(); map.put(domain, cookies); } else { + // Remove old cookie // Remove from list - CookieWithID cwi = removeCookie(cookies, cookie); + CookieWithID cwi = removeCookie(cookies, cookie.name()); if (cwi != null) { // Remove from DB CookieDB.removeCookie(cwi.id); @@ -138,40 +156,31 @@ public class CookieDBStore implements CookieJar { cookies.add(new CookieWithID(id, cookie)); } - public boolean contain(String url, String name) { - return containInternal(CookieDB.cookiesDomain(url), name); - } - - public void remove(String url, String name) { - removeInternal(CookieDB.cookiesDomain(url), name); - } - - public void remove(String url) { - removeInternal(CookieDB.cookiesDomain(url)); - } - - public void add(Cookie cookie) { - addInternal(CookieDB.cookiesDomain(cookie.domain()), cookie); + private void getInternal(HttpUrl url, List cookies, List result) { + 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.matches(url)) { + result.add(cookie); + } + } } public List get(HttpUrl url) { List result = new ArrayList<>(); - String domain = CookieDB.cookiesDomain(url.url()); - List cookies = map.get(domain); - if (cookies != null) { - 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.matches(url)) { - result.add(cookie); - } + String host = url.host(); + for (String key : map.keySet()) { + if (domainMatch(host, key)) { + List cookies = map.get(key); + // cookies can not be null + getInternal(url, cookies, result); } }