/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.mail;
import java.io.File;
import java.io.IOException;
import jodd.mail.EmailAddress;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.map.ObjectMapper;
import de.rcenvironment.core.configuration.ConfigurationException;
import de.rcenvironment.core.configuration.ConfigurationSegment;
import de.rcenvironment.core.configuration.ConfigurationService;
import de.rcenvironment.core.mail.internal.MailFilterInformation;
import de.rcenvironment.core.mail.internal.PasswordObfuscationHelper;
import de.rcenvironment.core.utils.common.JsonUtils;
/**
* Class providing the configuration of the mail bundle.
*
* @author Tobias Rodehutskors
*/
public class SMTPServerConfiguration {
/**
* The path in the configuration file to the SMTP server configuration.
*/
public static final String CONFIGURATION_PATH = "smtpServer";
/**
* If implicit encryption mode is specified, an SSL/TLS connection should be opened to the SMTP server.
*/
public static final String IMPLICIT_ENCRYPTION = "implicit";
/**
* If explicit encryption mode is specified, a plain text connection should be opened to the SMTP server and upgraded to a secured
* connection using the STARTTLS command.
*/
public static final String EXPLICIT_ENCRYPTION = "explicit";
/**
* Configuration key for the host element.
*/
public static final String CONFIG_KEY_HOST = "host";
/**
* Configuration key for the port element.
*/
public static final String CONFIG_KEY_PORT = "port";
/**
* Configuration key for the username element.
*/
public static final String CONFIG_KEY_USERNAME = "username";
/**
* Configuration key for the password element.
*/
public static final String CONFIG_KEY_PASSWORD = "password";
/**
* Configuration key for the sender element.
*/
public static final String CONFIG_KEY_SENDER = "sender";
/**
* Configuration key for the encryption element.
*/
public static final String CONFIG_KEY_ENCRYPTION = "encryption";
private static final int LARGEST_ALLOWED_PORT_NUMBER = 65535;
private static final String EXTRAS_MAIL_FILTER = "extras" + File.separatorChar + "mail" + File.separatorChar + "filter.json";
private static Log log = LogFactory.getLog(SMTPServerConfiguration.class);
private String host;
private int port;
private String encryption;
private String username;
private String password;
private EmailAddress sender;
private MailFilterInformation filter;
/**
* @param configurationSegment
* @param filter The filter to validated the given username against. If this field is null, the given username is not checked against a
* filter.
*/
public SMTPServerConfiguration(ConfigurationSegment configurationSegment, MailFilterInformation filter) {
if (configurationSegment != null) {
host = configurationSegment.getString(CONFIG_KEY_HOST);
port = configurationSegment.getInteger(CONFIG_KEY_PORT, 0);
username = configurationSegment.getString(CONFIG_KEY_USERNAME);
password = configurationSegment.getString(CONFIG_KEY_PASSWORD);
password = PasswordObfuscationHelper.deobfuscate(password);
encryption = configurationSegment.getString(CONFIG_KEY_ENCRYPTION);
String senderAsString = configurationSegment.getString(CONFIG_KEY_SENDER);
if (senderAsString != null) {
sender = new EmailAddress(senderAsString);
}
}
this.filter = filter;
}
/**
* Checks if the current configuration is valid.
*
* @return True, if the configuration is valid.
* @throws ConfigurationException thrown if the configuration is invalid.
*/
public boolean isValid() throws ConfigurationException {
if (host == null || host.isEmpty()) {
throw new ConfigurationException("You need to specify the host.");
}
if (port < 1 || port > LARGEST_ALLOWED_PORT_NUMBER) {
throw new ConfigurationException("Invalid port number.");
}
if (username == null || username.isEmpty()) {
throw new ConfigurationException("You need to specify the user you want to use for authenticating.");
}
// throw a ConfigurationException if the host name matches a given regex and the username does not match another given regex
if (filter != null && host.matches(filter.getHostRegex()) && !username.matches(filter.getUsernameRegex())) {
throw new ConfigurationException(filter.getErrorMessage());
}
if (password == null || password.isEmpty()) {
throw new ConfigurationException("You need to specify the password you want to use for authenticating.");
}
if (sender == null || !sender.isValid()) {
throw new ConfigurationException("You need to specify a valid email address as a sender address.");
}
// encryption either has to be explicit or implicit
if (encryption == null || !(EXPLICIT_ENCRYPTION.equals(encryption) || IMPLICIT_ENCRYPTION.equals(encryption))) {
throw new ConfigurationException("You need to specify if you want to use explicit or implicit encryption.");
}
return true;
}
public String getHost() {
return host;
}
public int getPort() {
return port;
}
public String getEncryption() {
return encryption;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public EmailAddress getSender() {
return sender;
}
public String getSenderAsString() {
return sender.getInternetAddress().toString();
}
/**
* Helper function to load MailFilterInformation from a file.
*
* @param configurationService The ConfigurationService of the RCE instance.
* @return A {@link MailFilterInformation} object if the defining filter.json file was found or otherwise null.
*/
public static MailFilterInformation getMailFilterInformation(ConfigurationService configurationService) {
File installationDataRoot =
configurationService.getConfigurablePath(ConfigurationService.ConfigurablePathId.INSTALLATION_DATA_ROOT);
File filterFile = new File(installationDataRoot, EXTRAS_MAIL_FILTER);
if (filterFile != null && filterFile.exists()) {
ObjectMapper mapper = JsonUtils.getDefaultObjectMapper();
try {
return mapper.readValue(filterFile, MailFilterInformation.class);
} catch (IOException e) {
log.error("IOException while reading the MailFilterInformation from the file.", e);
return null;
}
} else {
log.debug("Cannot find a file to read the MailFilterInformation from.");
return null;
}
}
}