package org.limewire.ui.swing.friends.settings;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.Icon;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.limewire.io.UnresolvedIpPort;
import org.limewire.logging.Log;
import org.limewire.logging.LogFactory;
import org.limewire.core.settings.FacebookSettings;
import org.mozilla.browser.XPCOMUtils;
import org.mozilla.interfaces.nsICookie;
import org.mozilla.interfaces.nsICookieManager;
import org.mozilla.interfaces.nsISimpleEnumerator;
public class FacebookFriendAccountConfigurationImpl extends FriendAccountConfigurationImpl implements FacebookFriendAccountConfiguration {
private static Log LOG = LogFactory.getLog(FacebookFriendAccountConfigurationImpl.class);
private final FriendAccountConfigurationManager configurationManager;
public FacebookFriendAccountConfigurationImpl(boolean requireDomain, String serviceName, String label, Icon icon, Icon largeIcon, String resource, List<UnresolvedIpPort> defaultServers, Type type, FriendAccountConfigurationManager configurationManager) {
super(requireDomain, serviceName, label, icon, largeIcon, resource, defaultServers, type);
this.configurationManager = configurationManager;
loadCookies();
for(Object key : FacebookSettings.ATTRIBUTES.get().keySet()) {
setAttribute((String) key, FacebookSettings.ATTRIBUTES.get().get(key));
}
}
@Override
public void loadCookies() {
nsICookieManager cookieService = XPCOMUtils.getServiceProxy("@mozilla.org/cookiemanager;1",
nsICookieManager.class);
nsISimpleEnumerator enumerator = cookieService.getEnumerator();
List<Cookie> cookiesCopy = new ArrayList<Cookie>();
Cookie login = null;
while(enumerator.hasMoreElements()) {
nsICookie cookie = XPCOMUtils.proxy(enumerator.getNext(), nsICookie.class);
if(cookie.getHost() != null && cookie.getHost().endsWith(".facebook.com")) {
LOG.debugf("adding cookie {0} = {1} for host {2}", cookie.getName(), cookie.getValue(), cookie.getHost());
BasicClientCookie copy = new BasicClientCookie(cookie.getName(), cookie.getValue());
copy.setDomain(cookie.getHost());
double expiry = cookie.getExpires();
if(expiry != 0 && expiry != 1) {
long expiryMillis = (long) expiry * 1000;
copy.setExpiryDate(new Date(expiryMillis));
}
copy.setPath(cookie.getPath());
copy.setSecure(cookie.getIsSecure());
// TODO copy.setVersion();
cookiesCopy.add(copy);
if(copy.getName().equals("lxe")) {
login = copy;
}
} else {
LOG.debugf("dropping cookie {0} = {1} for host {2}", cookie.getName(), cookie.getValue(), cookie.getHost());
}
}
setAttribute("cookie", cookiesCopy);
setUsername(login);
}
@Override
public void clearCookies() {
nsICookieManager cookieService = XPCOMUtils.getServiceProxy("@mozilla.org/cookiemanager;1",
nsICookieManager.class);
nsISimpleEnumerator enumerator = cookieService.getEnumerator();
while(enumerator.hasMoreElements()) {
nsICookie cookie = XPCOMUtils.proxy(enumerator.getNext(), nsICookie.class);
if(cookie.getHost().equals(".facebook.com")) {
cookieService.remove(cookie.getHost(), cookie.getName(), cookie.getPath(), false);
}
}
}
@Override
public void setAutoLogin(boolean autoLogin) {
configurationManager.setAutoLoginConfig(autoLogin ? this : null);
if(autoLogin) {
FacebookSettings.ATTRIBUTES.get().put("session_key", getAttribute("session_key"));
FacebookSettings.ATTRIBUTES.get().put("secret", getAttribute("secret"));
FacebookSettings.ATTRIBUTES.get().put("uid", getAttribute("uid"));
} else {
FacebookSettings.ATTRIBUTES.get().remove("session_key");
FacebookSettings.ATTRIBUTES.get().remove("secret");
FacebookSettings.ATTRIBUTES.get().remove("uid");
}
FacebookSettings.ATTRIBUTES.set(FacebookSettings.ATTRIBUTES.get());
}
@Override
public boolean isAutologin() {
return configurationManager.getAutoLoginConfig() == this;
}
private void setUsername(Cookie login_x) {
if(login_x != null) {
try {
String value = URLDecoder.decode(login_x.getValue(), "UTF-8");
setUsername(value);
} catch (UnsupportedEncodingException e) {
LOG.debugf(e, "failed to decode {0}", login_x.getValue());
}
}
}
@Override
public boolean storePassword() {
return false;
}
}