From 932bc7468cea2082cf9de3b93e763dfe2611dfa9 Mon Sep 17 00:00:00 2001 From: mguessan Date: Mon, 1 Dec 2008 12:38:49 +0000 Subject: [PATCH] Refactor form based authentication : parse html content with htmlcleaner-2.1 git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@185 3d1905a2-6b24-0410-a738-b14d5a86fcbd --- davmail.jsmooth | 1 + davmailconsole.jsmooth | 1 + lib/htmlcleaner-2.1.jar | Bin 0 -> 60146 bytes pom.xml | 5 + .../davmail/exchange/ExchangeSession.java | 131 ++++++++---------- .../http/DavGatewayHttpClientFacade.java | 6 +- 6 files changed, 71 insertions(+), 73 deletions(-) create mode 100644 lib/htmlcleaner-2.1.jar diff --git a/davmail.jsmooth b/davmail.jsmooth index 43118344..bc2fc2df 100644 --- a/davmail.jsmooth +++ b/davmail.jsmooth @@ -18,6 +18,7 @@ dist\lib\saxpath-1.0-FCS.jar dist\lib\slide-webdavlib-2.1.jar dist\lib\swt-3.3-win32-x86.jar +dist\lib\htmlcleaner-2.1.jar dist\davmail.jar false dist\davmail.exe diff --git a/davmailconsole.jsmooth b/davmailconsole.jsmooth index 2627683b..a747f260 100644 --- a/davmailconsole.jsmooth +++ b/davmailconsole.jsmooth @@ -18,6 +18,7 @@ dist\lib\saxpath-1.0-FCS.jar dist\lib\slide-webdavlib-2.1.jar dist\lib\swt-3.3-win32-x86.jar +dist\lib\htmlcleaner-2.1.jar dist\davmail.jar false dist\davmailconsole.exe diff --git a/lib/htmlcleaner-2.1.jar b/lib/htmlcleaner-2.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..ca14f056d1b9e797f524e2712b8fa7a456cd36e0 GIT binary patch literal 60146 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 literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index ec9d00fe..d363d222 100644 --- a/pom.xml +++ b/pom.xml @@ -107,6 +107,11 @@ servlet-api 2.4 + + htmlcleaner + htmlcleaner + 2.1 + src/java diff --git a/src/java/davmail/exchange/ExchangeSession.java b/src/java/davmail/exchange/ExchangeSession.java index 768594de..f28a0298 100644 --- a/src/java/davmail/exchange/ExchangeSession.java +++ b/src/java/davmail/exchange/ExchangeSession.java @@ -13,6 +13,8 @@ import org.apache.webdav.lib.Property; import org.apache.webdav.lib.ResponseEntity; import org.apache.webdav.lib.WebdavResource; import org.apache.webdav.lib.methods.SearchMethod; +import org.htmlcleaner.HtmlCleaner; +import org.htmlcleaner.TagNode; import javax.mail.internet.MimeUtility; import javax.xml.stream.XMLInputFactory; @@ -100,88 +102,73 @@ public class ExchangeSession { * Try to find logon method path from logon form body. * * @param initmethod form body http method - * @return logon method path + * @return logon method */ - protected String getLogonMethodPathAndBaseUrl(HttpMethod initmethod) { - // default logon method path - String logonMethodPath = "/exchweb/bin/auth/owaauth.dll"; + protected PostMethod buildLogonMethod(HttpClient httpClient, HttpMethod initmethod) throws IOException { + + PostMethod logonMethod = null; + + // create an instance of HtmlCleaner + HtmlCleaner cleaner = new HtmlCleaner(); - // try to parse login form to determine logon url and destination - BufferedReader loginFormReader = null; try { - loginFormReader = new BufferedReader(new InputStreamReader(initmethod.getResponseBodyAsStream())); - String line; - // skip to form action - final String FORM_ACTION = "
forms = node.getElementListByName("form", true); + if (forms.size() == 1) { + TagNode form = forms.get(0); + String logonMethodPath = form.getAttributeByName("action"); + + // allow relative URLs + if (!logonMethodPath.startsWith("/")) { + String path = initmethod.getPath(); + int end = path.lastIndexOf('/'); + if (end >= 0) { + logonMethodPath = path.substring(0, end + 1) + logonMethodPath; + } } - if (line != null) { - start = line.indexOf(DESTINATION_INPUT) + DESTINATION_INPUT.length(); - end = line.indexOf("\"", start); - baseUrl = line.substring(start, end); + logonMethod = new PostMethod(logonMethodPath); + + List inputList = form.getElementListByName("input", true); + for (TagNode input : inputList) { + String type = input.getAttributeByName("type"); + String name = input.getAttributeByName("name"); + String value = input.getAttributeByName("value"); + if ("hidden".equalsIgnoreCase(type) && name != null && value != null) { + logonMethod.addParameter(name, value); + } } - } - // allow relative URLs - if (!logonMethodPath.startsWith("/")) { - String path = initmethod.getPath(); - int end = path.lastIndexOf('/'); - if (end >= 0) { - logonMethodPath = path.substring(0, end + 1) + logonMethodPath; + } else { + List frameList = node.getElementListByName("frame", true); + if (frameList.size() == 1) { + String src = frameList.get(0).getAttributeByName("src"); + if (src != null) { + LOGGER.debug("Frames detected in form page, try frame content"); + initmethod.releaseConnection(); + HttpMethod newInitMethod = DavGatewayHttpClientFacade.executeFollowRedirects(httpClient, src); + logonMethod = buildLogonMethod(httpClient, newInitMethod); + } } } } catch (IOException e) { - LOGGER.error("Error parsing login form at " + initmethod.getPath()); + LOGGER.error("Error parsing login form at " + initmethod.getURI()); } finally { - if (loginFormReader != null) { - try { - loginFormReader.close(); - } catch (IOException e) { - LOGGER.error("Error parsing login form at " + initmethod.getPath()); - } - } initmethod.releaseConnection(); } - return logonMethodPath; + + if (logonMethod == null) { + throw new IOException("Authentication form not found at " + initmethod.getURI() + ", retry with " + initmethod.getURI() + "exchange"); + } + return logonMethod; } - protected void formLogin(HttpClient httpClient, HttpMethod initmethod, String userName, String password) throws IOException { + protected HttpMethod formLogin(HttpClient httpClient, HttpMethod initmethod, String userName, String password) throws IOException { LOGGER.debug("Form based authentication detected"); - // get logon method path and actual destination (baseUrl) - String logonMethodPath = getLogonMethodPathAndBaseUrl(initmethod); - - PostMethod logonMethod = new PostMethod( - logonMethodPath + "?ForcedBasic=false&Basic=false&Private=true&Language=No_Value" - ); - logonMethod.addParameter("destination", baseUrl); - logonMethod.addParameter("flags", "4"); -// logonMethod.addParameter("visusername", userName.substring(userName.lastIndexOf('\\'))); - logonMethod.addParameter("username", userName); - logonMethod.addParameter("password", password); -// logonMethod.addParameter("SubmitCreds", "Log On"); -// logonMethod.addParameter("forcedownlevel", "0"); - logonMethod.addParameter("trusted", "4"); - - try { - httpClient.executeMethod(logonMethod); - } finally { - logonMethod.releaseConnection(); - } - Header locationHeader = logonMethod.getResponseHeader("Location"); - - if (logonMethod.getStatusCode() != HttpURLConnection.HTTP_MOVED_TEMP || - locationHeader == null || - !baseUrl.equals(locationHeader.getValue())) { - throw new HttpException("Authentication failed"); - } + // build logon method with actual destination (baseUrl) + HttpMethod logonMethod = buildLogonMethod(httpClient, initmethod); + ((PostMethod) logonMethod).addParameter("username", userName); + ((PostMethod) logonMethod).addParameter("password", password); + logonMethod = DavGatewayHttpClientFacade.executeFollowRedirects(httpClient, logonMethod); + return logonMethod; } protected String getMailPath(HttpMethod method) { @@ -255,13 +242,13 @@ public class ExchangeSession { HttpMethod method = DavGatewayHttpClientFacade.executeFollowRedirects(httpClient, baseUrl); if (!isBasicAuthentication) { - formLogin(httpClient, method, userName, password); + method = formLogin(httpClient, method, userName, password); // reexecute method with new base URL - method = DavGatewayHttpClientFacade.executeFollowRedirects(httpClient, baseUrl); +// method = DavGatewayHttpClientFacade.executeFollowRedirects(httpClient, baseUrl); } + int status = method.getStatusCode(); // User may be authenticated, get various session information - int status = method.getStatusCode(); if (status != HttpStatus.SC_OK) { HttpException ex = new HttpException(); ex.setReasonCode(status); @@ -270,7 +257,7 @@ public class ExchangeSession { } // test form based authentication String queryString = method.getQueryString(); - if (queryString != null && queryString.endsWith("reason=2")) { + if (queryString != null && queryString.contains("reason=2")) { method.releaseConnection(); if (userName != null && userName.contains("\\")) { throw new HttpException("Authentication failed: invalid user or password"); diff --git a/src/java/davmail/http/DavGatewayHttpClientFacade.java b/src/java/davmail/http/DavGatewayHttpClientFacade.java index af523dee..e7a8099a 100644 --- a/src/java/davmail/http/DavGatewayHttpClientFacade.java +++ b/src/java/davmail/http/DavGatewayHttpClientFacade.java @@ -121,8 +121,12 @@ public class DavGatewayHttpClientFacade { */ public static HttpMethod executeFollowRedirects(HttpClient httpClient, String url) throws IOException { HttpMethod method = new GetMethod(url); + method.setFollowRedirects(false); + return executeFollowRedirects(httpClient, method); + } + + public static HttpMethod executeFollowRedirects(HttpClient httpClient, HttpMethod method) throws IOException { try { - method.setFollowRedirects(false); httpClient.executeMethod(method); Header location = method.getResponseHeader("Location"); int redirectCount = 0;