package org.jabref.shared; import java.io.UnsupportedEncodingException; import java.security.GeneralSecurityException; import java.util.Objects; import java.util.Optional; import org.jabref.shared.prefs.SharedDatabasePreferences; import org.jabref.shared.security.Password; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * Keeps all essential data for establishing a new connection to a DBMS using {@link DBMSConnection}. */ public class DBMSConnectionProperties { private static final Log LOGGER = LogFactory.getLog(DBMSConnectionProperties.class); private DBMSType type; private String host; private int port; private String database; private String user; private String password; public DBMSConnectionProperties() { // no data } public DBMSConnectionProperties(SharedDatabasePreferences prefs) { setFromPreferences(prefs); } public DBMSConnectionProperties(DBMSType type, String host, int port, String database, String user, String password) { this.type = type; this.host = host; this.port = port; this.database = database; this.user = user; this.password = password; } public DBMSType getType() { return type; } public void setType(DBMSType type) { this.type = type; } public String getHost() { return host; } public void setHost(String host) { this.host = host; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } public String getDatabase() { return database; } public void setDatabase(String database) { this.database = database; } public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } /** * Compares all properties except the password. */ public boolean equals(DBMSConnectionProperties properties) { return this.type.equals(properties.getType()) && this.host.equalsIgnoreCase(properties.getHost()) && (this.port == properties.getPort()) && this.database.equals(properties.getDatabase()) && this.user.equals(properties.getUser()); } /** * Gets all required data from {@link SharedDatabasePreferences} and sets them if present. */ private void setFromPreferences(SharedDatabasePreferences prefs) { if (prefs.getType().isPresent()) { Optional<DBMSType> dbmsType = DBMSType.fromString(prefs.getType().get()); if (dbmsType.isPresent()) { this.type = dbmsType.get(); } } prefs.getHost().ifPresent(theHost -> this.host = theHost); prefs.getPort().ifPresent(thePort -> this.port = Integer.parseInt(thePort)); prefs.getName().ifPresent(theDatabase -> this.database = theDatabase); if (prefs.getUser().isPresent()) { this.user = prefs.getUser().get(); if (prefs.getPassword().isPresent()) { try { this.password = new Password(prefs.getPassword().get().toCharArray(), prefs.getUser().get()).decrypt(); } catch (UnsupportedEncodingException | GeneralSecurityException e) { LOGGER.error("Could not decrypt password", e); } } } if (!prefs.getPassword().isPresent()) { // Some DBMS require a non-null value as a password (in case of using an empty string). this.password = ""; } } public boolean isValid() { return Objects.nonNull(type) && Objects.nonNull(host) && Objects.nonNull(port) && Objects.nonNull(database) && Objects.nonNull(user) && Objects.nonNull(password); } }