package org.limewire.xmpp.client.impl; import java.io.IOException; import java.security.GeneralSecurityException; import java.security.NoSuchAlgorithmException; import java.util.prefs.Preferences; import org.limewire.friend.api.PasswordManager; import org.limewire.inject.LazySingleton; import org.limewire.security.certificate.CipherProvider; import com.google.inject.Inject; /** * Stores passwords under a usernames in {@link Preferences} and also * allows for deletion and retrieval of passwords. */ @LazySingleton public class PasswordManagerImpl implements PasswordManager { static final String PREFERENCES_NODE = "/limewire/xmpp/auth"; private CipherProvider cipherProvider; @Inject public PasswordManagerImpl(CipherProvider cipherProvider) { this.cipherProvider = cipherProvider; } @Override public String loadPassword(String userName) throws IOException { if (userName == null || userName.isEmpty()) { throw new IllegalArgumentException("userName cannot be null or empty"); } String encryptedPassword = loadEncryptedPassword(userName); Password pwd = new Password(cipherProvider, encryptedPassword, true); // test to see if we can decrypt it without error try { return pwd.decryptPassword(); } catch (IOException e) { throw new IOException("Error decrypting password", e); } catch (GeneralSecurityException e) { throw new IOException("Error decrypting password", e); } } @Override public void storePassword(String userName, String rawPassword) throws IOException { if (userName == null || userName.isEmpty()) { throw new IllegalArgumentException("username cannot be null or empty"); } if (rawPassword == null || rawPassword.isEmpty()) { throw new IllegalArgumentException("password cannot be null or empty"); } Preferences prefs = getPreferences(); Password pwd = new Password(cipherProvider, rawPassword, false); try { prefs.put(userName, pwd.encryptPassword()); } catch (NoSuchAlgorithmException e) { throw new IOException("Error encrypting password", e); } catch (IOException e) { throw new IOException("Error encrypting password", e); } } @Override public void removePassword(String userName) { if (userName == null || userName.isEmpty()) { throw new IllegalArgumentException("userName must not be null or empty"); } Preferences prefs = getPreferences(); prefs.remove(userName); } private String loadEncryptedPassword(String userName) { Preferences prefs = getPreferences(); return prefs.get(userName, ""); } private Preferences getPreferences() { return Preferences.userRoot().node(PREFERENCES_NODE); } }