package org.limewire.ui.swing.friends.settings; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.Icon; import org.jdesktop.application.Resource; import org.limewire.core.api.xmpp.XMPPResourceFactory; import org.limewire.core.settings.FacebookSettings; import org.limewire.friend.api.Network; import org.limewire.friend.api.PasswordManager; import org.limewire.inject.LazySingleton; import org.limewire.io.UnresolvedIpPort; import org.limewire.io.UnresolvedIpPortImpl; import org.limewire.ui.swing.settings.SwingUiSettings; import org.limewire.ui.swing.util.GuiUtils; import org.mozilla.browser.MozillaInitialization; import com.google.inject.Inject; @LazySingleton public class FriendAccountConfigurationManagerImpl implements FriendAccountConfigurationManager { private final PasswordManager passwordManager; private final Map<String, FriendAccountConfiguration> configs; // Indexed by label private final String resource; private FriendAccountConfiguration autoLoginConfig = null; /** * If the login configs have been loaded yet. */ private boolean loaded = false; @Resource private Icon gmailIconLarge; @Resource private Icon gmailIconSmall; @Resource private Icon ljIconLarge; @Resource private Icon ljIconSmall; @Resource private Icon facebookIconLarge; @Resource private Icon facebookIconSmall; @Resource private Icon otherIconLarge; @Resource private Icon otherIconSmall; @Inject public FriendAccountConfigurationManagerImpl(PasswordManager passwordManager, XMPPResourceFactory xmppResourceFactory) { GuiUtils.assignResources(this); this.passwordManager = passwordManager; configs = new HashMap<String, FriendAccountConfiguration>(); resource = xmppResourceFactory.getResource(); } /** * Loads the configs for the servers on demand. */ private void init() { loadWellKnownServers(); loadCustomServer(); loadAutoLoginAccount(); loaded = true; } /** * Used to get the config map, loading it if necessary. */ private Map<String, FriendAccountConfiguration> getRawConfigs() { if (!loaded) { init(); } return configs; } private void loadCustomServer() { String custom = SwingUiSettings.USER_DEFINED_JABBER_SERVICENAME.get(); FriendAccountConfigurationImpl customConfig = new FriendAccountConfigurationImpl(custom, "Jabber", resource, Network.Type.XMPP, otherIconSmall, otherIconLarge); configs.put(customConfig.getLabel(), customConfig); } private void loadAutoLoginAccount() { String autoLogin = SwingUiSettings.XMPP_AUTO_LOGIN.get(); if(!autoLogin.equals("")) { int comma = autoLogin.indexOf(','); try { String label = autoLogin.substring(0, comma); String username = autoLogin.substring(comma + 1); FriendAccountConfiguration config = configs.get(label); if(config != null) { config.setUsername(username); if(config.storePassword()) { String password = passwordManager.loadPassword(username); config.setPassword(password); } autoLoginConfig = config; } } catch(IndexOutOfBoundsException ignored) { // Malformed string - no soup for you! } catch(IllegalArgumentException ignored) { // Empty username - no soup for you! } catch(IOException ignored) { // Error decrypting password - no soup for you! } } } private void loadWellKnownServers() { if(MozillaInitialization.isInitialized() && FacebookSettings.FACEBOOK_ENABLED.get()) { FriendAccountConfiguration facebook = new FacebookFriendAccountConfigurationImpl(true, "facebook.com", "Facebook", facebookIconSmall, facebookIconLarge, resource, getGTalkServers(), Network.Type.FACEBOOK, this); configs.put(facebook.getLabel(), facebook); } FriendAccountConfiguration gmail = new FriendAccountConfigurationImpl(true, "gmail.com", "Gmail", gmailIconSmall, gmailIconLarge, resource, getGTalkServers(), Network.Type.XMPP); configs.put(gmail.getLabel(), gmail); FriendAccountConfiguration livejournal = new FriendAccountConfigurationImpl(false, "livejournal.com", "LiveJournal", ljIconSmall, ljIconLarge, resource, getLiveJournalServers(), Network.Type.XMPP); configs.put(livejournal.getLabel(), livejournal); } private List<UnresolvedIpPort> getLiveJournalServers() { List<UnresolvedIpPort> defaultServers = new ArrayList<UnresolvedIpPort>(1); defaultServers.add(new UnresolvedIpPortImpl("xmpp.services.livejournal.com", 5222)); return defaultServers; } private List<UnresolvedIpPort> getGTalkServers() { List<UnresolvedIpPort> defaultServers = new ArrayList<UnresolvedIpPort>(5); defaultServers.add(new UnresolvedIpPortImpl("talk.1.google.com", 5222)); defaultServers.add(new UnresolvedIpPortImpl("talk1.1.google.com", 5222)); defaultServers.add(new UnresolvedIpPortImpl("talk2.1.google.com", 5222)); defaultServers.add(new UnresolvedIpPortImpl("talk3.1.google.com", 5222)); defaultServers.add(new UnresolvedIpPortImpl("talk4.1.google.com", 5222)); return defaultServers; } @Override public FriendAccountConfiguration getConfig(String label) { return getRawConfigs().get(label); } @Override public List<FriendAccountConfiguration> getConfigurations() { ArrayList<FriendAccountConfiguration> configurations = new ArrayList<FriendAccountConfiguration>(getRawConfigs().values()); Collections.sort(configurations, new Comparator<FriendAccountConfiguration>() { @Override public int compare(FriendAccountConfiguration o1, FriendAccountConfiguration o2) { return o1.getLabel().compareToIgnoreCase(o2.getLabel()); } }); return configurations; } @Override public List<String> getLabels() { ArrayList<String> labels = new ArrayList<String>(); for(FriendAccountConfiguration config : getRawConfigs().values()) labels.add(config.getLabel()); Collections.sort(labels); return labels; } @Override public FriendAccountConfiguration getAutoLoginConfig() { if (!loaded) { init(); } return autoLoginConfig; } @Override public void setAutoLoginConfig(FriendAccountConfiguration config) { // Remove the old configuration, if there is one if(autoLoginConfig != null) { passwordManager.removePassword(autoLoginConfig.getUserInputLocalID()); SwingUiSettings.XMPP_AUTO_LOGIN.set(""); SwingUiSettings.USER_DEFINED_JABBER_SERVICENAME.set(""); autoLoginConfig = null; } // Store the new configuration, if there is one if(config != null) { try { if(config.storePassword()) { passwordManager.storePassword(config.getUserInputLocalID(), config.getPassword()); } SwingUiSettings.XMPP_AUTO_LOGIN.set(config.getLabel() + "," + config.getUserInputLocalID()); if(config.getLabel().equals("Jabber")) SwingUiSettings.USER_DEFINED_JABBER_SERVICENAME.set(config.getServiceName()); autoLoginConfig = config; } catch (IllegalArgumentException ignored) { // Empty username or password - no soup for you! } catch (IOException ignored) { // Error encrypting password - no more Soup Nazi jokes for you! } } } }