package com.example.session;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.CookieStore;
import java.net.HttpCookie;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;
import android.util.Log;
public class SiCookieStore2 implements CookieStore {
private static final String LOG_TAG = "SICookieStore2";
private static final String COOKIE_PREFS = "com.orb.net.cookieprefs";
private static final String COOKIE_DOMAINS_STORE = "com.orb.net.CookieStore.domain";
private static final String COOKIE_DOMAIN_PREFIX = "com.orb.net.CookieStore.domain_";
private static final String COOKIE_NAME_PREFIX = "com.orb.net.CookieStore.cookie_";
private final CookieMap map;
private final SharedPreferences cookiePrefs;
public SiCookieStore2(Context context) {
cookiePrefs = context.getSharedPreferences(COOKIE_PREFS, 0);
map = new CookieMap();
String storedCookieDomains = cookiePrefs.getString(COOKIE_DOMAINS_STORE, null);
if (storedCookieDomains != null) {
String[] storedCookieDomainsArray = TextUtils.split(storedCookieDomains, ",");
for (String domain : storedCookieDomainsArray) {
String storedCookiesNames = cookiePrefs.getString(COOKIE_DOMAIN_PREFIX + domain,
null);
if (storedCookiesNames != null) {
String[] storedCookieNamesArray = TextUtils.split(storedCookiesNames, ",");
if (storedCookieNamesArray != null) {
List<HttpCookie> cookies = new ArrayList<HttpCookie>();
for (String cookieName : storedCookieNamesArray) {
String encCookie = cookiePrefs.getString(COOKIE_NAME_PREFIX + domain
+ cookieName, null);
if (encCookie != null)
cookies.add(decodeCookie(encCookie));
}
map.put(URI.create(domain), cookies);
}
}
}
}
}
public synchronized void add(URI uri, HttpCookie cookie) {
if (cookie == null) {
throw new NullPointerException("cookie == null");
}
uri = cookiesUri(uri);
List<HttpCookie> cookies = map.get(uri);
if (cookies == null) {
cookies = new ArrayList<HttpCookie>();
map.put(uri, cookies);
} else {
cookies.remove(cookie);
}
cookies.add(cookie);
SharedPreferences.Editor prefsWriter = cookiePrefs.edit();
prefsWriter.putString(COOKIE_DOMAINS_STORE, TextUtils.join(",", map.keySet()));
Set<String> names = new HashSet<String>();
for (HttpCookie cookie2 : cookies) {
names.add(cookie2.getName());
prefsWriter.putString(COOKIE_NAME_PREFIX + uri + cookie2.getName(),
encodeCookie(new SICookie2(cookie2)));
}
prefsWriter.putString(COOKIE_DOMAIN_PREFIX + uri, TextUtils.join(",", names));
prefsWriter.commit();
}
public synchronized List<HttpCookie> get(URI uri) {
if (uri == null) {
throw new NullPointerException("uri == null");
}
List<HttpCookie> result = new ArrayList<HttpCookie>();
List<HttpCookie> cookiesForUri = map.get(uri);
if (cookiesForUri != null) {
for (Iterator<HttpCookie> i = cookiesForUri.iterator(); i.hasNext();) {
HttpCookie cookie = i.next();
if (cookie.hasExpired()) {
i.remove();
} else {
result.add(cookie);
}
}
}
for (Map.Entry<URI, List<HttpCookie>> entry : map.entrySet()) {
if (uri.equals(entry.getKey())) {
continue;
}
List<HttpCookie> entryCookies = entry.getValue();
for (Iterator<HttpCookie> i = entryCookies.iterator(); i.hasNext();) {
HttpCookie cookie = i.next();
if (!HttpCookie.domainMatches(cookie.getDomain(), uri.getHost())) {
continue;
}
if (cookie.hasExpired()) {
i.remove();
} else if (!result.contains(cookie)) {
result.add(cookie);
}
}
}
return Collections.unmodifiableList(result);
}
public synchronized List<HttpCookie> getCookies() {
List<HttpCookie> result = new ArrayList<HttpCookie>();
for (List<HttpCookie> list : map.values()) {
for (Iterator<HttpCookie> i = list.iterator(); i.hasNext();) {
HttpCookie cookie = i.next();
if (cookie.hasExpired()) {
i.remove();
} else if (!result.contains(cookie)) {
result.add(cookie);
}
}
}
return Collections.unmodifiableList(result);
}
public synchronized List<URI> getURIs() {
List<URI> result = new ArrayList<URI>(map.getAllURIs());
result.remove(null);
return Collections.unmodifiableList(result);
}
public synchronized boolean remove(URI uri, HttpCookie cookie) {
if (cookie == null) {
throw new NullPointerException("cookie == null");
}
if (map.removeCookie(uri, cookie)) {
SharedPreferences.Editor prefsWriter = cookiePrefs.edit();
prefsWriter.putString(COOKIE_DOMAIN_PREFIX + uri,
TextUtils.join(",", map.getAllCookieNames(uri)));
prefsWriter.remove(COOKIE_NAME_PREFIX + uri + cookie.getName());
prefsWriter.apply();
return true;
}
return false;
}
public synchronized boolean removeAll() {
SharedPreferences.Editor prefsWriter = cookiePrefs.edit();
prefsWriter.clear();
prefsWriter.commit();
boolean result = !map.isEmpty();
map.clear();
return result;
}
protected String encodeCookie(SICookie2 cookie) {
if (cookie == null)
return null;
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
ObjectOutputStream outputStream = new ObjectOutputStream(os);
outputStream.writeObject(cookie);
} catch (IOException e) {
Log.e(LOG_TAG, "IOException in encodeCookie", e);
return null;
}
return byteArrayToHexString(os.toByteArray());
}
protected HttpCookie decodeCookie(String cookieString) {
byte[] bytes = hexStringToByteArray(cookieString);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
HttpCookie cookie = null;
try {
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
cookie = ((SICookie2) objectInputStream.readObject()).getCookie();
} catch (IOException e) {
Log.e(LOG_TAG, "IOException in decodeCookie", e);
} catch (ClassNotFoundException e) {
Log.e(LOG_TAG, "ClassNotFoundException in decodeCookie", e);
}
return cookie;
}
protected String byteArrayToHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder(bytes.length * 2);
for (byte element : bytes) {
int v = element & 0xff;
if (v < 16) {
sb.append('0');
}
sb.append(Integer.toHexString(v));
}
return sb.toString().toUpperCase(Locale.US);
}
protected byte[] hexStringToByteArray(String hexString) {
int len = hexString.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character
.digit(hexString.charAt(i + 1), 16));
}
return data;
}
private URI cookiesUri(URI uri) {
if (uri == null) {
return null;
}
try {
return new URI(uri.getScheme(), uri.getHost(), null, null);
} catch (URISyntaxException e) {
return uri;
}
}
private class CookieMap implements Map<URI, List<HttpCookie>> {
private final Map<URI, List<HttpCookie>> map;
public CookieMap() {
map = new HashMap<URI, List<HttpCookie>>();
}
@Override
public void clear() {
map.clear();
}
@Override
public boolean containsKey(Object key) {
return map.containsKey(key);
}
@Override
public boolean containsValue(Object value) {
return map.containsValue(value);
}
@Override
public Set<Entry<URI, List<HttpCookie>>> entrySet() {
return map.entrySet();
}
@Override
public List<HttpCookie> get(Object key) {
return map.get(key);
}
@Override
public boolean isEmpty() {
return map.isEmpty();
}
@Override
public Set<URI> keySet() {
return map.keySet();
}
@Override
public List<HttpCookie> put(URI key, List<HttpCookie> value) {
return map.put(key, value);
}
@Override
public void putAll(Map<? extends URI, ? extends List<HttpCookie>> map) {
this.map.putAll(map);
}
@Override
public List<HttpCookie> remove(Object key) {
return map.remove(key);
}
@Override
public int size() {
return map.size();
}
@Override
public Collection<List<HttpCookie>> values() {
return map.values();
}
public Collection<URI> getAllURIs() {
return map.keySet();
}
public Collection<String> getAllCookieNames(URI uri) {
List<HttpCookie> cookies = map.get(uri);
Set<String> cookieNames = new HashSet<String>();
for (HttpCookie cookie : cookies) {
cookieNames.add(cookie.getName());
}
return cookieNames;
}
public boolean removeCookie(URI uri, HttpCookie httpCookie) {
if (map.containsKey(uri)) {
return map.get(uri).remove(httpCookie);
} else {
return false;
}
}
}
}