1
0
mirror of https://github.com/moparisthebest/davmail synced 2024-12-13 19:22:22 -05:00

EWS: implement failover on OWA authentication failure (e.g. with outlook.com)

git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1521 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
mguessan 2010-10-30 19:13:46 +00:00
parent 18584e259d
commit c0abc93ac5
2 changed files with 47 additions and 15 deletions

View File

@ -119,7 +119,7 @@ public abstract class ExchangeSession {
protected String currentMailboxPath; protected String currentMailboxPath;
protected final HttpClient httpClient; protected final HttpClient httpClient;
private final String userName; protected final String userName;
protected String serverVersion; protected String serverVersion;
@ -429,15 +429,7 @@ public abstract class ExchangeSession {
return logonMethod; return logonMethod;
} }
protected HttpMethod formLogin(HttpClient httpClient, HttpMethod initmethod, String userName, String password) throws IOException { protected HttpMethod postLogonMethod(HttpClient httpClient, HttpMethod logonMethod, String userName, String password) throws IOException {
LOGGER.debug("Form based authentication detected");
HttpMethod logonMethod = buildLogonMethod(httpClient, initmethod);
if (logonMethod == null) {
LOGGER.debug("Authentication form not found at " + initmethod.getURI() + ", trying default url");
logonMethod = new PostMethod("/owa/auth/owaauth.dll");
}
// make sure username and password fields are empty // make sure username and password fields are empty
((PostMethod) logonMethod).removeParameter(userNameInput); ((PostMethod) logonMethod).removeParameter(userNameInput);
((PostMethod) logonMethod).removeParameter(passwordInput); ((PostMethod) logonMethod).removeParameter(passwordInput);
@ -480,6 +472,18 @@ public abstract class ExchangeSession {
// need to submit form // need to submit form
logonMethod = submitLanguageSelectionForm(logonMethod); logonMethod = submitLanguageSelectionForm(logonMethod);
} }
return logonMethod;
}
protected HttpMethod formLogin(HttpClient httpClient, HttpMethod initmethod, String userName, String password) throws IOException {
LOGGER.debug("Form based authentication detected");
HttpMethod logonMethod = buildLogonMethod(httpClient, initmethod);
if (logonMethod == null) {
LOGGER.debug("Authentication form not found at " + initmethod.getURI() + ", trying default url");
logonMethod = new PostMethod("/owa/auth/owaauth.dll");
}
logonMethod = postLogonMethod(httpClient, logonMethod, userName, password);
return logonMethod; return logonMethod;
} }

View File

@ -79,6 +79,21 @@ public class EwsExchangeSession extends ExchangeSession {
super(url, userName, password); super(url, userName, password);
} }
@Override
protected HttpMethod formLogin(HttpClient httpClient, HttpMethod initmethod, String userName, String password) throws IOException {
LOGGER.debug("Form based authentication detected");
HttpMethod logonMethod = buildLogonMethod(httpClient, initmethod);
if (logonMethod == null) {
LOGGER.debug("Authentication form not found at " + initmethod.getURI() + ", will try direct EWS access");
} else {
logonMethod = postLogonMethod(httpClient, logonMethod, userName, password);
}
return logonMethod;
}
/** /**
* Check endpoint url. * Check endpoint url.
* *
@ -90,7 +105,9 @@ public class EwsExchangeSession extends ExchangeSession {
getMethod.setFollowRedirects(false); getMethod.setFollowRedirects(false);
try { try {
int status = DavGatewayHttpClientFacade.executeNoRedirect(httpClient, getMethod); int status = DavGatewayHttpClientFacade.executeNoRedirect(httpClient, getMethod);
if (status != HttpStatus.SC_MOVED_TEMPORARILY) { if (status == HttpStatus.SC_UNAUTHORIZED) {
throw new DavMailAuthenticationException("EXCEPTION_AUTHENTICATION_FAILED");
} else if (status != HttpStatus.SC_MOVED_TEMPORARILY) {
throw DavGatewayHttpClientFacade.buildHttpException(getMethod); throw DavGatewayHttpClientFacade.buildHttpException(getMethod);
} }
// check Location // check Location
@ -109,10 +126,19 @@ public class EwsExchangeSession extends ExchangeSession {
@Override @Override
protected void buildSessionInfo(HttpMethod method) throws DavMailException { protected void buildSessionInfo(HttpMethod method) throws DavMailException {
// no need to check logon method body // no need to check logon method body
method.releaseConnection(); if (method != null) {
method.releaseConnection();
// need to retrieve email and alias
getEmailAndAliasFromOptions();
} else {
// OWA authentication failed, get email address from login
if (userName.indexOf('@') >= 0) {
// userName is email address
email = userName;
alias = userName.substring(0, userName.indexOf('@'));
}
}
// also need to retrieve email and alias
getEmailAndAliasFromOptions();
if (email == null || alias == null) { if (email == null || alias == null) {
throw new DavMailAuthenticationException("EXCEPTION_EWS_NOT_AVAILABLE"); throw new DavMailAuthenticationException("EXCEPTION_EWS_NOT_AVAILABLE");
} }
@ -122,6 +148,8 @@ public class EwsExchangeSession extends ExchangeSession {
// check EWS access // check EWS access
try { try {
checkEndPointUrl("/ews/exchange.asmx"); checkEndPointUrl("/ews/exchange.asmx");
} catch (DavMailAuthenticationException e) {
throw e;
} catch (IOException e) { } catch (IOException e) {
try { try {
// failover, try to retrieve EWS url from autodiscover // failover, try to retrieve EWS url from autodiscover
@ -1273,7 +1301,7 @@ public class EwsExchangeSession extends ExchangeSession {
event.getEventContent(); event.getEventContent();
events.add(event); events.add(event);
} catch (HttpException e) { } catch (HttpException e) {
LOGGER.warn("Ignore invalid event "+event.getHref()); LOGGER.warn("Ignore invalid event " + event.getHref());
} }
} else { } else {
events.add(event); events.add(event);