mirror of
https://github.com/moparisthebest/davmail
synced 2024-12-13 19:22:22 -05:00
EWS: implement autodiscover to find actual EWS endpoint url
git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1390 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
parent
7a2c601859
commit
f8975c9767
@ -27,9 +27,10 @@ import davmail.http.DavGatewayHttpClientFacade;
|
|||||||
import davmail.util.IOUtil;
|
import davmail.util.IOUtil;
|
||||||
import davmail.util.StringUtil;
|
import davmail.util.StringUtil;
|
||||||
import org.apache.commons.codec.binary.Base64;
|
import org.apache.commons.codec.binary.Base64;
|
||||||
import org.apache.commons.httpclient.HttpMethod;
|
import org.apache.commons.httpclient.*;
|
||||||
import org.apache.commons.httpclient.HttpStatus;
|
import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
|
||||||
import org.apache.commons.httpclient.methods.GetMethod;
|
import org.apache.commons.httpclient.methods.GetMethod;
|
||||||
|
import org.apache.commons.httpclient.methods.PostMethod;
|
||||||
|
|
||||||
import javax.mail.MessagingException;
|
import javax.mail.MessagingException;
|
||||||
import javax.mail.internet.MimeMessage;
|
import javax.mail.internet.MimeMessage;
|
||||||
@ -80,6 +81,13 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void buildSessionInfo(HttpMethod method) throws DavMailException {
|
protected void buildSessionInfo(HttpMethod method) throws DavMailException {
|
||||||
|
// also need to retrieve email and alias
|
||||||
|
getEmailAndAliasFromOptions();
|
||||||
|
if (email == null || alias == null) {
|
||||||
|
throw new DavMailAuthenticationException("EXCEPTION_EWS_NOT_AVAILABLE");
|
||||||
|
}
|
||||||
|
currentMailboxPath = "/users/" + email.toLowerCase();
|
||||||
|
|
||||||
// nothing to do, mailPath not used in EWS mode
|
// nothing to do, mailPath not used in EWS mode
|
||||||
// check EWS access
|
// check EWS access
|
||||||
HttpMethod getMethod = new GetMethod("/ews/exchange.asmx");
|
HttpMethod getMethod = new GetMethod("/ews/exchange.asmx");
|
||||||
@ -90,19 +98,21 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
throw DavGatewayHttpClientFacade.buildHttpException(getMethod);
|
throw DavGatewayHttpClientFacade.buildHttpException(getMethod);
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOGGER.error(e.getMessage());
|
LOGGER.debug(e.getMessage());
|
||||||
throw new DavMailAuthenticationException("EXCEPTION_EWS_NOT_AVAILABLE");
|
try {
|
||||||
|
// failover, try to retrieve EWS url from autodiscover
|
||||||
|
getMethod.releaseConnection();
|
||||||
|
getMethod = new GetMethod(getEwsUrlFromAutoDiscover());
|
||||||
|
getMethod.setFollowRedirects(false);
|
||||||
|
} catch (IOException e2) {
|
||||||
|
LOGGER.error(e2.getMessage());
|
||||||
|
throw new DavMailAuthenticationException("EXCEPTION_EWS_NOT_AVAILABLE");
|
||||||
|
}
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
getMethod.releaseConnection();
|
getMethod.releaseConnection();
|
||||||
}
|
}
|
||||||
|
|
||||||
// also need to retrieve email and alias
|
|
||||||
getEmailAndAliasFromOptions();
|
|
||||||
if (email == null || alias == null) {
|
|
||||||
throw new DavMailAuthenticationException("EXCEPTION_EWS_NOT_AVAILABLE");
|
|
||||||
}
|
|
||||||
currentMailboxPath = "/users/" + email.toLowerCase();
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
folderIdMap = new HashMap<String, String>();
|
folderIdMap = new HashMap<String, String>();
|
||||||
// load actual well known folder ids
|
// load actual well known folder ids
|
||||||
@ -121,6 +131,72 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static class AutoDiscoverMethod extends PostMethod {
|
||||||
|
AutoDiscoverMethod(String userEmail) {
|
||||||
|
super("/autodiscover/autodiscover.xml");
|
||||||
|
String body = "<Autodiscover xmlns=\"http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006\">" +
|
||||||
|
"<Request>" +
|
||||||
|
"<EMailAddress>" + userEmail + "</EMailAddress>" +
|
||||||
|
"<AcceptableResponseSchema>http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a</AcceptableResponseSchema>" +
|
||||||
|
"</Request>" +
|
||||||
|
"</Autodiscover>";
|
||||||
|
setRequestEntity(new ByteArrayRequestEntity(body.getBytes(), "text/xml"));
|
||||||
|
}
|
||||||
|
|
||||||
|
String ewsUrl;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void processResponseBody(HttpState httpState, HttpConnection httpConnection) {
|
||||||
|
Header contentTypeHeader = getResponseHeader("Content-Type");
|
||||||
|
if (contentTypeHeader != null && "text/xml; charset=utf-8".equals(contentTypeHeader.getValue())) {
|
||||||
|
BufferedReader autodiscoverReader = null;
|
||||||
|
try {
|
||||||
|
autodiscoverReader = new BufferedReader(new InputStreamReader(getResponseBodyAsStream()));
|
||||||
|
String line;
|
||||||
|
// find ews url
|
||||||
|
while ((line = autodiscoverReader.readLine()) != null
|
||||||
|
&& (line.indexOf("<EwsUrl>") == -1)
|
||||||
|
&& (line.indexOf("</EwsUrl>") == -1)) {
|
||||||
|
}
|
||||||
|
if (line != null) {
|
||||||
|
ewsUrl = line.substring(line.indexOf("<EwsUrl>") + 8, line.indexOf("</EwsUrl>"));
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOGGER.debug(e);
|
||||||
|
} finally {
|
||||||
|
if (autodiscoverReader != null) {
|
||||||
|
try {
|
||||||
|
autodiscoverReader.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOGGER.debug(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getEwsUrlFromAutoDiscover() throws DavMailAuthenticationException {
|
||||||
|
String ewsUrl;
|
||||||
|
AutoDiscoverMethod autoDiscoverMethod = new AutoDiscoverMethod(email);
|
||||||
|
try {
|
||||||
|
int status = DavGatewayHttpClientFacade.executeNoRedirect(httpClient, autoDiscoverMethod);
|
||||||
|
if (status != HttpStatus.SC_OK) {
|
||||||
|
throw DavGatewayHttpClientFacade.buildHttpException(autoDiscoverMethod);
|
||||||
|
}
|
||||||
|
ewsUrl = autoDiscoverMethod.ewsUrl;
|
||||||
|
if (ewsUrl == null) {
|
||||||
|
throw new IOException("Ews url not found");
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOGGER.error(e.getMessage());
|
||||||
|
throw new DavMailAuthenticationException("EXCEPTION_EWS_NOT_AVAILABLE");
|
||||||
|
} finally {
|
||||||
|
autoDiscoverMethod.releaseConnection();
|
||||||
|
}
|
||||||
|
return ewsUrl;
|
||||||
|
}
|
||||||
|
|
||||||
class Message extends ExchangeSession.Message {
|
class Message extends ExchangeSession.Message {
|
||||||
// message item id
|
// message item id
|
||||||
ItemId itemId;
|
ItemId itemId;
|
||||||
@ -172,7 +248,7 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
public void createMessage(String folderPath, String messageName, HashMap<String, String> properties, MimeMessage mimeMessage) throws IOException {
|
public void createMessage(String folderPath, String messageName, HashMap<String, String> properties, MimeMessage mimeMessage) throws IOException {
|
||||||
EWSMethod.Item item = new EWSMethod.Item();
|
EWSMethod.Item item = new EWSMethod.Item();
|
||||||
item.type = "Message";
|
item.type = "Message";
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
try {
|
try {
|
||||||
mimeMessage.writeTo(baos);
|
mimeMessage.writeTo(baos);
|
||||||
} catch (MessagingException e) {
|
} catch (MessagingException e) {
|
||||||
|
Loading…
Reference in New Issue
Block a user