mirror of
https://github.com/moparisthebest/davmail
synced 2024-10-31 15:35:05 -04:00
Caldav: set CALDAV:process-state on calendarmessages instead of moveToTrash and merge login with constructor
git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@478 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
parent
bac51a25a0
commit
285c543d6b
@ -115,8 +115,82 @@ public class ExchangeSession {
|
|||||||
*
|
*
|
||||||
* @param poolKey session pool key
|
* @param poolKey session pool key
|
||||||
*/
|
*/
|
||||||
ExchangeSession(ExchangeSessionFactory.PoolKey poolKey) {
|
ExchangeSession(ExchangeSessionFactory.PoolKey poolKey) throws IOException {
|
||||||
this.poolKey = poolKey;
|
this.poolKey = poolKey;
|
||||||
|
try {
|
||||||
|
boolean isBasicAuthentication = isBasicAuthentication(poolKey.url);
|
||||||
|
|
||||||
|
// get proxy configuration from setttings properties
|
||||||
|
URL urlObject = new URL(poolKey.url);
|
||||||
|
// webdavresource is unable to create the correct url type
|
||||||
|
HttpURL httpURL;
|
||||||
|
if (poolKey.url.startsWith("http://")) {
|
||||||
|
httpURL = new HttpURL(poolKey.userName, poolKey.password,
|
||||||
|
urlObject.getHost(), urlObject.getPort());
|
||||||
|
} else if (poolKey.url.startsWith("https://")) {
|
||||||
|
httpURL = new HttpsURL(poolKey.userName, poolKey.password,
|
||||||
|
urlObject.getHost(), urlObject.getPort());
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Invalid URL: " + poolKey.url);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
httpClient = DavGatewayHttpClientFacade.getInstance(httpURL);
|
||||||
|
|
||||||
|
// get webmail root url
|
||||||
|
// providing credentials
|
||||||
|
// manually follow redirect
|
||||||
|
HttpMethod method = DavGatewayHttpClientFacade.executeFollowRedirects(httpClient, poolKey.url);
|
||||||
|
|
||||||
|
if (!isBasicAuthentication) {
|
||||||
|
method = formLogin(httpClient, method, poolKey.userName, poolKey.password);
|
||||||
|
}
|
||||||
|
int status = method.getStatusCode();
|
||||||
|
|
||||||
|
if (status == HttpStatus.SC_UNAUTHORIZED) {
|
||||||
|
throw new AuthenticationException("Authentication failed: invalid user or password");
|
||||||
|
} else if (status != HttpStatus.SC_OK) {
|
||||||
|
throw DavGatewayHttpClientFacade.buildHttpException(method);
|
||||||
|
}
|
||||||
|
// test form based authentication
|
||||||
|
String queryString = method.getQueryString();
|
||||||
|
if (queryString != null && queryString.contains("reason=2")) {
|
||||||
|
method.releaseConnection();
|
||||||
|
if (poolKey.userName != null && poolKey.userName.contains("\\")) {
|
||||||
|
throw new AuthenticationException("Authentication failed: invalid user or password");
|
||||||
|
} else {
|
||||||
|
throw new AuthenticationException("Authentication failed: invalid user or password, " +
|
||||||
|
"retry with domain\\user");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildMailPath(method);
|
||||||
|
|
||||||
|
// got base http mailbox http url
|
||||||
|
getWellKnownFolders();
|
||||||
|
|
||||||
|
} catch (AuthenticationException exc) {
|
||||||
|
LOGGER.error(exc.toString());
|
||||||
|
throw exc;
|
||||||
|
} catch (IOException exc) {
|
||||||
|
StringBuffer message = new StringBuffer();
|
||||||
|
message.append("DavMail login exception: ");
|
||||||
|
if (exc.getMessage() != null) {
|
||||||
|
message.append(exc.getMessage());
|
||||||
|
} else if (exc instanceof HttpException) {
|
||||||
|
message.append(((HttpException) exc).getReasonCode());
|
||||||
|
String httpReason = ((HttpException) exc).getReason();
|
||||||
|
if (httpReason != null) {
|
||||||
|
message.append(" ");
|
||||||
|
message.append(httpReason);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
message.append(exc);
|
||||||
|
}
|
||||||
|
|
||||||
|
LOGGER.error(message.toString());
|
||||||
|
throw new IOException(message.toString());
|
||||||
|
}
|
||||||
LOGGER.debug("Session " + this + " created");
|
LOGGER.debug("Session " + this + " created");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -324,84 +398,6 @@ public class ExchangeSession {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void login() throws IOException {
|
|
||||||
LOGGER.debug("Session " + this + " login");
|
|
||||||
try {
|
|
||||||
boolean isBasicAuthentication = isBasicAuthentication(poolKey.url);
|
|
||||||
|
|
||||||
// get proxy configuration from setttings properties
|
|
||||||
URL urlObject = new URL(poolKey.url);
|
|
||||||
// webdavresource is unable to create the correct url type
|
|
||||||
HttpURL httpURL;
|
|
||||||
if (poolKey.url.startsWith("http://")) {
|
|
||||||
httpURL = new HttpURL(poolKey.userName, poolKey.password,
|
|
||||||
urlObject.getHost(), urlObject.getPort());
|
|
||||||
} else if (poolKey.url.startsWith("https://")) {
|
|
||||||
httpURL = new HttpsURL(poolKey.userName, poolKey.password,
|
|
||||||
urlObject.getHost(), urlObject.getPort());
|
|
||||||
} else {
|
|
||||||
throw new IllegalArgumentException("Invalid URL: " + poolKey.url);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
httpClient = DavGatewayHttpClientFacade.getInstance(httpURL);
|
|
||||||
|
|
||||||
// get webmail root url
|
|
||||||
// providing credentials
|
|
||||||
// manually follow redirect
|
|
||||||
HttpMethod method = DavGatewayHttpClientFacade.executeFollowRedirects(httpClient, poolKey.url);
|
|
||||||
|
|
||||||
if (!isBasicAuthentication) {
|
|
||||||
method = formLogin(httpClient, method, poolKey.userName, poolKey.password);
|
|
||||||
}
|
|
||||||
int status = method.getStatusCode();
|
|
||||||
|
|
||||||
if (status == HttpStatus.SC_UNAUTHORIZED) {
|
|
||||||
throw new AuthenticationException("Authentication failed: invalid user or password");
|
|
||||||
} else if (status != HttpStatus.SC_OK) {
|
|
||||||
throw DavGatewayHttpClientFacade.buildHttpException(method);
|
|
||||||
}
|
|
||||||
// test form based authentication
|
|
||||||
String queryString = method.getQueryString();
|
|
||||||
if (queryString != null && queryString.contains("reason=2")) {
|
|
||||||
method.releaseConnection();
|
|
||||||
if (poolKey.userName != null && poolKey.userName.contains("\\")) {
|
|
||||||
throw new AuthenticationException("Authentication failed: invalid user or password");
|
|
||||||
} else {
|
|
||||||
throw new AuthenticationException("Authentication failed: invalid user or password, " +
|
|
||||||
"retry with domain\\user");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
buildMailPath(method);
|
|
||||||
|
|
||||||
// got base http mailbox http url
|
|
||||||
getWellKnownFolders();
|
|
||||||
|
|
||||||
} catch (AuthenticationException exc) {
|
|
||||||
LOGGER.error(exc.toString());
|
|
||||||
throw exc;
|
|
||||||
} catch (IOException exc) {
|
|
||||||
StringBuffer message = new StringBuffer();
|
|
||||||
message.append("DavMail login exception: ");
|
|
||||||
if (exc.getMessage() != null) {
|
|
||||||
message.append(exc.getMessage());
|
|
||||||
} else if (exc instanceof HttpException) {
|
|
||||||
message.append(((HttpException) exc).getReasonCode());
|
|
||||||
String httpReason = ((HttpException) exc).getReason();
|
|
||||||
if (httpReason != null) {
|
|
||||||
message.append(" ");
|
|
||||||
message.append(httpReason);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
message.append(exc);
|
|
||||||
}
|
|
||||||
|
|
||||||
LOGGER.error(message.toString());
|
|
||||||
throw new IOException(message.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void getWellKnownFolders() throws IOException {
|
protected void getWellKnownFolders() throws IOException {
|
||||||
// Retrieve well known URLs
|
// Retrieve well known URLs
|
||||||
Enumeration foldersEnum = DavGatewayHttpClientFacade.executePropFindMethod(
|
Enumeration foldersEnum = DavGatewayHttpClientFacade.executePropFindMethod(
|
||||||
@ -1171,6 +1167,7 @@ public class ExchangeSession {
|
|||||||
String searchQuery = "Select \"DAV:getetag\"" +
|
String searchQuery = "Select \"DAV:getetag\"" +
|
||||||
" FROM Scope('SHALLOW TRAVERSAL OF \"" + folderUrl + "\"')\n" +
|
" FROM Scope('SHALLOW TRAVERSAL OF \"" + folderUrl + "\"')\n" +
|
||||||
" WHERE \"DAV:contentclass\" = 'urn:content-classes:calendarmessage'\n" +
|
" WHERE \"DAV:contentclass\" = 'urn:content-classes:calendarmessage'\n" +
|
||||||
|
" AND (NOT \"CALDAV:schedule-state\" = 'CALDAV:schedule-processed')\n" +
|
||||||
" ORDER BY \"urn:schemas:calendar:dtstart\" DESC\n";
|
" ORDER BY \"urn:schemas:calendar:dtstart\" DESC\n";
|
||||||
return getEvents(folderUrl, searchQuery);
|
return getEvents(folderUrl, searchQuery);
|
||||||
}
|
}
|
||||||
@ -1568,8 +1565,11 @@ public class ExchangeSession {
|
|||||||
public int deleteEvent(String principal, String path, String eventName) throws IOException {
|
public int deleteEvent(String principal, String path, String eventName) throws IOException {
|
||||||
int status;
|
int status;
|
||||||
if (path.startsWith("INBOX")) {
|
if (path.startsWith("INBOX")) {
|
||||||
// do not delete calendar messages, move to trash
|
// do not delete calendar messages, mark read and processed
|
||||||
moveToTrash(URIUtil.encodePath(replacePrincipal(getFolderPath(URIUtil.decode(path)), principal)), eventName);
|
PropPatchMethod patchMethod = new PropPatchMethod(URIUtil.encodePath(replacePrincipal(getFolderPath(URIUtil.decode(path)), principal)) + "/" + eventName);
|
||||||
|
patchMethod.addPropertyToSet("schedule-state", "CALDAV:schedule-processed", "C", "CALDAV:");
|
||||||
|
patchMethod.addPropertyToSet("read", "1", "e", "urn:schemas:httpmail:");
|
||||||
|
DavGatewayHttpClientFacade.executeMethod(httpClient, patchMethod);
|
||||||
status = HttpStatus.SC_OK;
|
status = HttpStatus.SC_OK;
|
||||||
} else {
|
} else {
|
||||||
status = DavGatewayHttpClientFacade.executeDeleteMethod(httpClient,
|
status = DavGatewayHttpClientFacade.executeDeleteMethod(httpClient,
|
||||||
|
@ -81,7 +81,6 @@ public final class ExchangeSessionFactory {
|
|||||||
|
|
||||||
if (session == null) {
|
if (session == null) {
|
||||||
session = new ExchangeSession(poolKey);
|
session = new ExchangeSession(poolKey);
|
||||||
session.login();
|
|
||||||
ExchangeSession.LOGGER.debug("Created new session: " + session);
|
ExchangeSession.LOGGER.debug("Created new session: " + session);
|
||||||
}
|
}
|
||||||
// successfull login, put session in cache
|
// successfull login, put session in cache
|
||||||
|
Loading…
Reference in New Issue
Block a user