ensured exchange autodiscovery is disabled for null and empty string

This commit is contained in:
2018-12-12 14:24:36 +01:00
parent 350d045eb0
commit 057dfd9c05

View File

@ -1,259 +1,259 @@
package de.muehlencord.shared.network.mail.exchange; package de.muehlencord.shared.network.mail.exchange;
import de.muehlencord.shared.network.mail.MailMessage; import de.muehlencord.shared.network.mail.MailMessage;
import de.muehlencord.shared.network.mail.MailReader; import de.muehlencord.shared.network.mail.MailReader;
import de.muehlencord.shared.network.mail.MailReaderConfiguration; import de.muehlencord.shared.network.mail.MailReaderConfiguration;
import de.muehlencord.shared.network.mail.MailReaderConnectionException; import de.muehlencord.shared.network.mail.MailReaderConnectionException;
import de.muehlencord.shared.network.mail.MailReaderException; import de.muehlencord.shared.network.mail.MailReaderException;
import java.net.URI; import java.net.URI;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import microsoft.exchange.webservices.data.autodiscover.IAutodiscoverRedirectionUrl; import microsoft.exchange.webservices.data.autodiscover.IAutodiscoverRedirectionUrl;
import microsoft.exchange.webservices.data.core.ExchangeService; import microsoft.exchange.webservices.data.core.ExchangeService;
import microsoft.exchange.webservices.data.core.PropertySet; import microsoft.exchange.webservices.data.core.PropertySet;
import microsoft.exchange.webservices.data.core.service.item.Item; import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion; import microsoft.exchange.webservices.data.core.enumeration.property.BasePropertySet;
import microsoft.exchange.webservices.data.core.enumeration.property.BasePropertySet; import microsoft.exchange.webservices.data.core.enumeration.property.WellKnownFolderName;
import microsoft.exchange.webservices.data.core.enumeration.property.WellKnownFolderName; import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException;
import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException; import microsoft.exchange.webservices.data.core.service.folder.Folder;
import microsoft.exchange.webservices.data.core.service.folder.Folder; import microsoft.exchange.webservices.data.core.service.item.Item;
import microsoft.exchange.webservices.data.core.service.schema.EmailMessageSchema; import microsoft.exchange.webservices.data.core.service.schema.EmailMessageSchema;
import microsoft.exchange.webservices.data.credential.ExchangeCredentials; import microsoft.exchange.webservices.data.credential.ExchangeCredentials;
import microsoft.exchange.webservices.data.credential.WebCredentials; import microsoft.exchange.webservices.data.credential.WebCredentials;
import microsoft.exchange.webservices.data.property.complex.InternetMessageHeaderCollection; import microsoft.exchange.webservices.data.property.complex.InternetMessageHeaderCollection;
import microsoft.exchange.webservices.data.search.FindFoldersResults; import microsoft.exchange.webservices.data.search.FindFoldersResults;
import microsoft.exchange.webservices.data.search.FindItemsResults; import microsoft.exchange.webservices.data.search.FindItemsResults;
import microsoft.exchange.webservices.data.search.FolderView; import microsoft.exchange.webservices.data.search.FolderView;
import microsoft.exchange.webservices.data.search.ItemView; import microsoft.exchange.webservices.data.search.ItemView;
import microsoft.exchange.webservices.data.search.filter.SearchFilter; import microsoft.exchange.webservices.data.search.filter.SearchFilter;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
/** /**
* *
* @author Joern Muehlencord <joern at muehlencord.de> * @author Joern Muehlencord <joern at muehlencord.de>
*/ */
public class ExchangeMailReader implements MailReader { public class ExchangeMailReader implements MailReader {
private static final Logger LOGGER = LoggerFactory.getLogger(ExchangeMailReader.class); private static final Logger LOGGER = LoggerFactory.getLogger(ExchangeMailReader.class);
private final MailReaderConfiguration configuration; private final MailReaderConfiguration configuration;
private ExchangeService service = null; private ExchangeService service = null;
public ExchangeMailReader(MailReaderConfiguration config) { public ExchangeMailReader(MailReaderConfiguration config) {
this.configuration = config; this.configuration = config;
} }
@Override @Override
public void connect() throws MailReaderConnectionException { public void connect() throws MailReaderConnectionException {
try { try {
String hostName = getConfiguration().getReaderHost(); String hostName = getConfiguration().getReaderHost();
String userName = getConfiguration().getUserName(); String userName = getConfiguration().getUserName();
String password = getConfiguration().getPassword(); String password = getConfiguration().getPassword();
String emailAddress = getConfiguration().getEmailAddress(); String emailAddress = getConfiguration().getEmailAddress();
service = new ExchangeService(ExchangeVersion.Exchange2010_SP2); service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
ExchangeCredentials credentials = new WebCredentials(userName, password); ExchangeCredentials credentials = new WebCredentials(userName, password);
service.setCredentials(credentials); service.setCredentials(credentials);
if (hostName == null) { if ((hostName == null) || (hostName.trim().equals (""))) {
service.autodiscoverUrl(emailAddress, new RedirectionUrlCallback()); service.autodiscoverUrl(emailAddress, new RedirectionUrlCallback());
} else { } else {
service.setUrl(new URI(hostName)); service.setUrl(new URI(hostName));
} }
LOGGER.info("Connected to " + getConnectionShortCut()); LOGGER.info("Connected to " + getConnectionShortCut());
} catch (Exception ex) { } catch (Exception ex) {
throw new MailReaderConnectionException(ex.getMessage(), ex); throw new MailReaderConnectionException(ex.getMessage(), ex);
} }
} }
@Override @Override
public void disconnect() { public void disconnect() {
if (service != null) { if (service != null) {
service.close(); service.close();
} }
} }
private Folder findFolderByName(String folderName) throws MailReaderException { private Folder findFolderByName(String folderName) throws MailReaderException {
String[] folderNameParts = folderName.split("/"); String[] folderNameParts = folderName.split("/");
try { try {
Folder inbox = Folder.bind(service, WellKnownFolderName.Inbox); Folder inbox = Folder.bind(service, WellKnownFolderName.Inbox);
int currentFolderPart = 0; int currentFolderPart = 0;
Folder currentFolder = inbox; Folder currentFolder = inbox;
while ((currentFolderPart < folderNameParts.length)) { while ((currentFolderPart < folderNameParts.length)) {
FindFoldersResults findResults = service.findFolders(currentFolder.getId(), new FolderView(Integer.MAX_VALUE)); FindFoldersResults findResults = service.findFolders(currentFolder.getId(), new FolderView(Integer.MAX_VALUE));
Iterator<Folder> it = findResults.getFolders().iterator(); Iterator<Folder> it = findResults.getFolders().iterator();
boolean nextFolderFound = false; boolean nextFolderFound = false;
while (it.hasNext() && !nextFolderFound) { while (it.hasNext() && !nextFolderFound) {
Folder nextFolder = it.next(); Folder nextFolder = it.next();
if (nextFolder.getDisplayName().equalsIgnoreCase(folderNameParts[currentFolderPart])) { if (nextFolder.getDisplayName().equalsIgnoreCase(folderNameParts[currentFolderPart])) {
// found next folder // found next folder
currentFolder = nextFolder; currentFolder = nextFolder;
currentFolderPart++; currentFolderPart++;
nextFolderFound = true; nextFolderFound = true;
} }
} }
// checked all sub folders // checked all sub folders
if (!nextFolderFound) { if (!nextFolderFound) {
throw new MailReaderException("Cannot find subfolder named " + folderNameParts[currentFolderPart] + " in folder " + currentFolder.getDisplayName()); throw new MailReaderException("Cannot find subfolder named " + folderNameParts[currentFolderPart] + " in folder " + currentFolder.getDisplayName());
} }
} }
return currentFolder; return currentFolder;
} catch (Exception ex) { } catch (Exception ex) {
throw new MailReaderException("Error while finding folder " + folderName + ". Reason: " + ex.getMessage(), ex); throw new MailReaderException("Error while finding folder " + folderName + ". Reason: " + ex.getMessage(), ex);
} }
} }
@Override @Override
public String getDefaultFolder() throws MailReaderException { public String getDefaultFolder() throws MailReaderException {
try { try {
Folder inbox = Folder.bind(service, WellKnownFolderName.Inbox); Folder inbox = Folder.bind(service, WellKnownFolderName.Inbox);
return inbox.getDisplayName(); return inbox.getDisplayName();
} catch (Exception ex) { } catch (Exception ex) {
throw new MailReaderException("Cannot bind inbox folder", ex); throw new MailReaderException("Cannot bind inbox folder", ex);
} }
} }
@Override @Override
public List<String> getSubFolder(String sourceFolder) throws MailReaderException { public List<String> getSubFolder(String sourceFolder) throws MailReaderException {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
} }
@Override @Override
public String getFolder(String folderPath) throws MailReaderException { public String getFolder(String folderPath) throws MailReaderException {
Folder folder = findFolderByName(folderPath); Folder folder = findFolderByName(folderPath);
try { try {
return folder.getDisplayName(); return folder.getDisplayName();
} catch (ServiceLocalException ex) { } catch (ServiceLocalException ex) {
throw new MailReaderException(ex.getMessage(), ex); throw new MailReaderException(ex.getMessage(), ex);
} }
} }
@Override @Override
public int getMessageCount(String holdFolder) throws MailReaderException { public int getMessageCount(String holdFolder) throws MailReaderException {
Folder folder = findFolderByName(holdFolder); Folder folder = findFolderByName(holdFolder);
try { try {
return folder.getTotalCount(); return folder.getTotalCount();
} catch (ServiceLocalException ex) { } catch (ServiceLocalException ex) {
throw new MailReaderException(ex.getMessage(), ex); throw new MailReaderException(ex.getMessage(), ex);
} }
} }
private List<MailMessage> getMessages(String folderName, ItemView view) throws MailReaderException { private List<MailMessage> getMessages(String folderName, ItemView view) throws MailReaderException {
List<MailMessage> returnValue = new ArrayList<>(); List<MailMessage> returnValue = new ArrayList<>();
try { try {
Folder folder = findFolderByName(folderName); Folder folder = findFolderByName(folderName);
FindItemsResults<Item> findResults = service.findItems(folder.getId(), view); FindItemsResults<Item> findResults = service.findItems(folder.getId(), view);
PropertySet propertySet = new PropertySet(BasePropertySet.FirstClassProperties, EmailMessageSchema.InternetMessageId); PropertySet propertySet = new PropertySet(BasePropertySet.FirstClassProperties, EmailMessageSchema.InternetMessageId);
service.loadPropertiesForItems(findResults, propertySet); service.loadPropertiesForItems(findResults, propertySet);
for (Item item : findResults.getItems()) { for (Item item : findResults.getItems()) {
String subject = item.getSubject(); String subject = item.getSubject();
String content = item.getBody().toString(); String content = item.getBody().toString();
InternetMessageHeaderCollection headers = item.getInternetMessageHeaders(); InternetMessageHeaderCollection headers = item.getInternetMessageHeaders();
String messageId = headers.find("Message-ID").getValue(); String messageId = headers.find("Message-ID").getValue();
MailMessage mailMessage = new MailMessage(subject, content, messageId); MailMessage mailMessage = new MailMessage(subject, content, messageId);
returnValue.add(mailMessage); returnValue.add(mailMessage);
} }
return returnValue; return returnValue;
} catch (Exception ex) { } catch (Exception ex) {
throw new MailReaderException(ex.getMessage(), ex); throw new MailReaderException(ex.getMessage(), ex);
} }
} }
@Override @Override
public List<MailMessage> getMessages(String folderName) throws MailReaderException { public List<MailMessage> getMessages(String folderName) throws MailReaderException {
ItemView view = new ItemView(Integer.MAX_VALUE); ItemView view = new ItemView(Integer.MAX_VALUE);
return getMessages(folderName, view); return getMessages(folderName, view);
} }
@Override @Override
public List<MailMessage> getMessages(String folderName, int start, int end) throws MailReaderException { public List<MailMessage> getMessages(String folderName, int start, int end) throws MailReaderException {
ItemView view = new ItemView(end - start); ItemView view = new ItemView(end - start);
view.setOffset(start); view.setOffset(start);
return getMessages(folderName, view); return getMessages(folderName, view);
} }
private Item findMessageByMessageId(String folderName, String messageId) throws MailReaderException { private Item findMessageByMessageId(String folderName, String messageId) throws MailReaderException {
try { try {
PropertySet propertySet = new PropertySet(BasePropertySet.FirstClassProperties, EmailMessageSchema.InternetMessageId); PropertySet propertySet = new PropertySet(BasePropertySet.FirstClassProperties, EmailMessageSchema.InternetMessageId);
Folder folder = findFolderByName(folderName); Folder folder = findFolderByName(folderName);
ItemView view = new ItemView(1); ItemView view = new ItemView(1);
view.setPropertySet(propertySet); view.setPropertySet(propertySet);
SearchFilter searchFilter = new SearchFilter.IsEqualTo(EmailMessageSchema.InternetMessageId, messageId); SearchFilter searchFilter = new SearchFilter.IsEqualTo(EmailMessageSchema.InternetMessageId, messageId);
FindItemsResults<Item> findResults = service.findItems(folder.getId(), searchFilter, view); FindItemsResults<Item> findResults = service.findItems(folder.getId(), searchFilter, view);
service.loadPropertiesForItems(findResults, propertySet); service.loadPropertiesForItems(findResults, propertySet);
if (findResults.getItems().isEmpty()) { if (findResults.getItems().isEmpty()) {
return null; return null;
} else { } else {
return findResults.getItems().get(0); return findResults.getItems().get(0);
} }
} catch (Exception ex) { } catch (Exception ex) {
throw new MailReaderException(ex.getMessage(), ex); throw new MailReaderException(ex.getMessage(), ex);
} }
} }
@Override @Override
public void copyMessage(MailMessage mm, String sourceFolder, String destFolder) throws MailReaderException { public void copyMessage(MailMessage mm, String sourceFolder, String destFolder) throws MailReaderException {
try { try {
Item message = findMessageByMessageId(sourceFolder, mm.getMessageId()); Item message = findMessageByMessageId(sourceFolder, mm.getMessageId());
Folder destination = findFolderByName(destFolder); Folder destination = findFolderByName(destFolder);
service.copyItem(message.getId(), destination.getId()); service.copyItem(message.getId(), destination.getId());
} catch (Exception ex) { } catch (Exception ex) {
throw new MailReaderException(ex.getMessage(), ex); throw new MailReaderException(ex.getMessage(), ex);
} }
} }
@Override @Override
public void moveMessage(MailMessage mm, String sourceFolder, String destFolder) throws MailReaderException { public void moveMessage(MailMessage mm, String sourceFolder, String destFolder) throws MailReaderException {
try { try {
Item message = findMessageByMessageId(sourceFolder, mm.getMessageId()); Item message = findMessageByMessageId(sourceFolder, mm.getMessageId());
Folder destination = findFolderByName(destFolder); Folder destination = findFolderByName(destFolder);
service.moveItem(message.getId(), destination.getId()); service.moveItem(message.getId(), destination.getId());
} catch (Exception ex) { } catch (Exception ex) {
throw new MailReaderException(ex.getMessage(), ex); throw new MailReaderException(ex.getMessage(), ex);
} }
} }
@Override @Override
public void setSeenFlag(String folder, MailMessage mm, boolean flagValue) throws MailReaderException { public void setSeenFlag(String folder, MailMessage mm, boolean flagValue) throws MailReaderException {
// FIXME - add implementation // FIXME - add implementation
} }
/** /**
* returns userName@hostname * returns userName@hostname
* *
* @return userName@hostname * @return userName@hostname
*/ */
private String getConnectionShortCut() { private String getConnectionShortCut() {
return getConfiguration().getUserName() + "@" + getConfiguration().getReaderHost(); return getConfiguration().getUserName() + "@" + getConfiguration().getReaderHost();
} }
/* *** getter / setter *** */ /* *** getter / setter *** */
public MailReaderConfiguration getConfiguration() { public MailReaderConfiguration getConfiguration() {
return configuration; return configuration;
} }
} }
class RedirectionUrlCallback implements IAutodiscoverRedirectionUrl { class RedirectionUrlCallback implements IAutodiscoverRedirectionUrl {
private static final Logger LOGGER = LoggerFactory.getLogger(RedirectionUrlCallback.class); private static final Logger LOGGER = LoggerFactory.getLogger(RedirectionUrlCallback.class);
@Override @Override
public boolean autodiscoverRedirectionUrlValidationCallback(String redirectionUrl) { public boolean autodiscoverRedirectionUrlValidationCallback(String redirectionUrl) {
if (LOGGER.isDebugEnabled()) { if (LOGGER.isDebugEnabled()) {
LOGGER.debug("redirectUrl found: {}", redirectionUrl); LOGGER.debug("redirectUrl found: {}", redirectionUrl);
} }
return redirectionUrl.toLowerCase().startsWith("https://"); return redirectionUrl.toLowerCase().startsWith("https://");
} }
} }