package org.jabref.shared.prefs; import java.io.UnsupportedEncodingException; import java.security.GeneralSecurityException; import java.util.Optional; import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; import org.jabref.JabRefMain; import org.jabref.gui.shared.ConnectToSharedDatabaseDialog; import org.jabref.shared.DBMSConnectionProperties; import org.jabref.shared.security.Password; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * Stores and reads persistent data for {@link ConnectToSharedDatabaseDialog}. */ public class SharedDatabasePreferences { private static final Log LOGGER = LogFactory.getLog(SharedDatabasePreferences.class); private static final String DEFAULT_NODE = "default"; private static final String PARENT_NODE = "jabref-shared"; private static final String SHARED_DATABASE_TYPE = "sharedDatabaseType"; private static final String SHARED_DATABASE_HOST = "sharedDatabaseHost"; private static final String SHARED_DATABASE_PORT = "sharedDatabasePort"; private static final String SHARED_DATABASE_NAME = "sharedDatabaseName"; private static final String SHARED_DATABASE_USER = "sharedDatabaseUser"; private static final String SHARED_DATABASE_PASSWORD = "sharedDatabasePassword"; private static final String SHARED_DATABASE_REMEMBER_PASSWORD = "sharedDatabaseRememberPassword"; // This {@link Preferences} is used only for things which should not appear in real JabRefPreferences due to security reasons. private final Preferences internalPrefs; public SharedDatabasePreferences() { this(DEFAULT_NODE); } public SharedDatabasePreferences(String sharedDatabaseID) { internalPrefs = Preferences.userNodeForPackage(JabRefMain.class).parent().node(PARENT_NODE).node(sharedDatabaseID); } public Optional<String> getType() { return getOptionalValue(SHARED_DATABASE_TYPE); } public Optional<String> getHost() { return getOptionalValue(SHARED_DATABASE_HOST); } public Optional<String> getPort() { return getOptionalValue(SHARED_DATABASE_PORT); } public Optional<String> getName() { return getOptionalValue(SHARED_DATABASE_NAME); } public Optional<String> getUser() { return getOptionalValue(SHARED_DATABASE_USER); } public Optional<String> getPassword() { return getOptionalValue(SHARED_DATABASE_PASSWORD); } public boolean getRememberPassword() { return internalPrefs.getBoolean(SHARED_DATABASE_REMEMBER_PASSWORD, false); } public void setType(String type) { internalPrefs.put(SHARED_DATABASE_TYPE, type); } public void setHost(String host) { internalPrefs.put(SHARED_DATABASE_HOST, host); } public void setPort(String port) { internalPrefs.put(SHARED_DATABASE_PORT, port); } public void setName(String name) { internalPrefs.put(SHARED_DATABASE_NAME, name); } public void setUser(String user) { internalPrefs.put(SHARED_DATABASE_USER, user); } public void setPassword(String password) { internalPrefs.put(SHARED_DATABASE_PASSWORD, password); } public void setRememberPassword(boolean rememberPassword) { internalPrefs.putBoolean(SHARED_DATABASE_REMEMBER_PASSWORD, rememberPassword); } public void clearPassword() { internalPrefs.remove(SHARED_DATABASE_PASSWORD); } public void clear() throws BackingStoreException { internalPrefs.clear(); } private Optional<String> getOptionalValue(String key) { return Optional.ofNullable(internalPrefs.get(key, null)); } public static void clearAll() throws BackingStoreException { Preferences.userNodeForPackage(JabRefMain.class).parent().node(PARENT_NODE).clear(); } public void putAllDBMSConnectionProperties(DBMSConnectionProperties properties) { assert (properties.isValid()); setType(properties.getType().toString()); setHost(properties.getHost()); setPort(String.valueOf(properties.getPort())); setName(properties.getDatabase()); setUser(properties.getUser()); try { setPassword(new Password(properties.getPassword().toCharArray(), properties.getUser()).encrypt()); } catch (GeneralSecurityException | UnsupportedEncodingException e) { LOGGER.error("Could not store the password due to encryption problems.", e); } } }