Major refactoring: replace deprecated jakarta slide with jackrabbit and upgrade httpclient
git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@488 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
parent
44998b5631
commit
4fe7ea1026
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,9 +1,8 @@
|
||||||
package davmail;
|
package davmail;
|
||||||
|
|
||||||
import davmail.exchange.ExchangeSession;
|
import davmail.exchange.ExchangeSession;
|
||||||
import davmail.exchange.ExchangeSessionFactory;
|
|
||||||
import davmail.tray.DavGatewayTray;
|
import davmail.tray.DavGatewayTray;
|
||||||
import org.apache.commons.httpclient.util.Base64;
|
import org.apache.commons.codec.binary.Base64;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
|
@ -166,10 +165,10 @@ public class AbstractConnection extends Thread {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected String base64Encode(String value) {
|
protected String base64Encode(String value) {
|
||||||
return new String(Base64.encode(value.getBytes()));
|
return new String(new Base64().encode(value.getBytes()));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected String base64Decode(String value) {
|
protected String base64Decode(String value) {
|
||||||
return new String(Base64.decode(value.getBytes()));
|
return new String(new Base64().decode(value.getBytes()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,12 +8,16 @@ import org.apache.commons.httpclient.methods.GetMethod;
|
||||||
import org.apache.commons.httpclient.methods.PostMethod;
|
import org.apache.commons.httpclient.methods.PostMethod;
|
||||||
import org.apache.commons.httpclient.methods.PutMethod;
|
import org.apache.commons.httpclient.methods.PutMethod;
|
||||||
import org.apache.commons.httpclient.util.URIUtil;
|
import org.apache.commons.httpclient.util.URIUtil;
|
||||||
|
import org.apache.jackrabbit.webdav.MultiStatusResponse;
|
||||||
|
import org.apache.jackrabbit.webdav.client.methods.CopyMethod;
|
||||||
|
import org.apache.jackrabbit.webdav.client.methods.MoveMethod;
|
||||||
|
import org.apache.jackrabbit.webdav.client.methods.PropPatchMethod;
|
||||||
|
import org.apache.jackrabbit.webdav.property.DavProperty;
|
||||||
|
import org.apache.jackrabbit.webdav.property.DavPropertyName;
|
||||||
|
import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
|
||||||
|
import org.apache.jackrabbit.webdav.property.DefaultDavProperty;
|
||||||
|
import org.apache.jackrabbit.webdav.xml.Namespace;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.apache.webdav.lib.Property;
|
|
||||||
import org.apache.webdav.lib.ResponseEntity;
|
|
||||||
import org.apache.webdav.lib.methods.CopyMethod;
|
|
||||||
import org.apache.webdav.lib.methods.MoveMethod;
|
|
||||||
import org.apache.webdav.lib.methods.PropPatchMethod;
|
|
||||||
import org.htmlcleaner.CommentToken;
|
import org.htmlcleaner.CommentToken;
|
||||||
import org.htmlcleaner.HtmlCleaner;
|
import org.htmlcleaner.HtmlCleaner;
|
||||||
import org.htmlcleaner.TagNode;
|
import org.htmlcleaner.TagNode;
|
||||||
|
@ -40,42 +44,43 @@ public class ExchangeSession {
|
||||||
|
|
||||||
protected static final int FREE_BUSY_INTERVAL = 15;
|
protected static final int FREE_BUSY_INTERVAL = 15;
|
||||||
|
|
||||||
protected static final Vector<String> EVENT_REQUEST_PROPERTIES = new Vector<String>();
|
protected static final DavPropertyNameSet EVENT_REQUEST_PROPERTIES = new DavPropertyNameSet();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
EVENT_REQUEST_PROPERTIES.add("DAV:getetag");
|
EVENT_REQUEST_PROPERTIES.add(DavPropertyName.GETETAG);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static final Vector<String> WELL_KNOWN_FOLDERS = new Vector<String>();
|
protected static final DavPropertyNameSet WELL_KNOWN_FOLDERS = new DavPropertyNameSet();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
WELL_KNOWN_FOLDERS.add("urn:schemas:httpmail:inbox");
|
Namespace httpmailNameSpace = Namespace.getNamespace("urn:schemas:httpmail:");
|
||||||
WELL_KNOWN_FOLDERS.add("urn:schemas:httpmail:deleteditems");
|
WELL_KNOWN_FOLDERS.add(DavPropertyName.create("inbox", httpmailNameSpace));
|
||||||
WELL_KNOWN_FOLDERS.add("urn:schemas:httpmail:sentitems");
|
WELL_KNOWN_FOLDERS.add(DavPropertyName.create("deleteditems", httpmailNameSpace));
|
||||||
WELL_KNOWN_FOLDERS.add("urn:schemas:httpmail:sendmsg");
|
WELL_KNOWN_FOLDERS.add(DavPropertyName.create("sentitems", httpmailNameSpace));
|
||||||
WELL_KNOWN_FOLDERS.add("urn:schemas:httpmail:drafts");
|
WELL_KNOWN_FOLDERS.add(DavPropertyName.create("sendmsg", httpmailNameSpace));
|
||||||
WELL_KNOWN_FOLDERS.add("urn:schemas:httpmail:calendar");
|
WELL_KNOWN_FOLDERS.add(DavPropertyName.create("drafts", httpmailNameSpace));
|
||||||
|
WELL_KNOWN_FOLDERS.add(DavPropertyName.create("calendar", httpmailNameSpace));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static final Vector<String> DISPLAY_NAME = new Vector<String>();
|
protected static final DavPropertyNameSet DISPLAY_NAME = new DavPropertyNameSet();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
DISPLAY_NAME.add("DAV:displayname");
|
DISPLAY_NAME.add(DavPropertyName.DISPLAYNAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static final Vector<String> FOLDER_PROPERTIES = new Vector<String>();
|
protected static final DavPropertyNameSet FOLDER_PROPERTIES = new DavPropertyNameSet();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
FOLDER_PROPERTIES.add("DAV:hassubs");
|
FOLDER_PROPERTIES.add(DavPropertyName.create("hassubs"));
|
||||||
FOLDER_PROPERTIES.add("DAV:nosubs");
|
FOLDER_PROPERTIES.add(DavPropertyName.create("nosubs"));
|
||||||
FOLDER_PROPERTIES.add("urn:schemas:httpmail:unreadcount");
|
FOLDER_PROPERTIES.add(DavPropertyName.create("unreadcount", Namespace.getNamespace("urn:schemas:httpmail:")));
|
||||||
FOLDER_PROPERTIES.add("http://schemas.microsoft.com/repl/contenttag");
|
FOLDER_PROPERTIES.add(DavPropertyName.create("contenttag", Namespace.getNamespace("http://schemas.microsoft.com/repl/")));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static final Vector<String> CONTENT_TAG = new Vector<String>();
|
protected static final DavPropertyNameSet CONTENT_TAG = new DavPropertyNameSet();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
CONTENT_TAG.add("http://schemas.microsoft.com/repl/contenttag");
|
CONTENT_TAG.add(DavPropertyName.create("contenttag", Namespace.getNamespace("http://schemas.microsoft.com/repl/")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -402,36 +407,34 @@ public class ExchangeSession {
|
||||||
|
|
||||||
protected void getWellKnownFolders() throws IOException {
|
protected void getWellKnownFolders() throws IOException {
|
||||||
// Retrieve well known URLs
|
// Retrieve well known URLs
|
||||||
Enumeration foldersEnum = DavGatewayHttpClientFacade.executePropFindMethod(
|
MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executePropFindMethod(
|
||||||
httpClient, URIUtil.encodePath(mailPath), 0, WELL_KNOWN_FOLDERS);
|
httpClient, URIUtil.encodePath(mailPath), 0, WELL_KNOWN_FOLDERS);
|
||||||
if (!foldersEnum.hasMoreElements()) {
|
if (responses.length == 0) {
|
||||||
throw new IOException("Unable to get mail folders");
|
throw new IOException("Unable to get mail folders");
|
||||||
}
|
}
|
||||||
ResponseEntity inboxResponse = (ResponseEntity) foldersEnum.
|
Iterator inboxPropsEnum = responses[0].getProperties(HttpStatus.SC_OK).iterator();
|
||||||
nextElement();
|
if (!inboxPropsEnum.hasNext()) {
|
||||||
Enumeration inboxPropsEnum = inboxResponse.getProperties();
|
|
||||||
if (!inboxPropsEnum.hasMoreElements()) {
|
|
||||||
throw new IOException("Unable to get mail folders");
|
throw new IOException("Unable to get mail folders");
|
||||||
}
|
}
|
||||||
while (inboxPropsEnum.hasMoreElements()) {
|
while (inboxPropsEnum.hasNext()) {
|
||||||
Property inboxProp = (Property) inboxPropsEnum.nextElement();
|
DavProperty inboxProp = (DavProperty) inboxPropsEnum.next();
|
||||||
if ("inbox".equals(inboxProp.getLocalName())) {
|
if ("inbox".equals(inboxProp.getName().getName())) {
|
||||||
inboxUrl = URIUtil.decode(inboxProp.getPropertyAsString());
|
inboxUrl = URIUtil.decode((String) inboxProp.getValue());
|
||||||
}
|
}
|
||||||
if ("deleteditems".equals(inboxProp.getLocalName())) {
|
if ("deleteditems".equals(inboxProp.getName().getName())) {
|
||||||
deleteditemsUrl = URIUtil.decode(inboxProp.getPropertyAsString());
|
deleteditemsUrl = URIUtil.decode((String) inboxProp.getValue());
|
||||||
}
|
}
|
||||||
if ("sentitems".equals(inboxProp.getLocalName())) {
|
if ("sentitems".equals(inboxProp.getName().getName())) {
|
||||||
sentitemsUrl = URIUtil.decode(inboxProp.getPropertyAsString());
|
sentitemsUrl = URIUtil.decode((String) inboxProp.getValue());
|
||||||
}
|
}
|
||||||
if ("sendmsg".equals(inboxProp.getLocalName())) {
|
if ("sendmsg".equals(inboxProp.getName().getName())) {
|
||||||
sendmsgUrl = URIUtil.decode(inboxProp.getPropertyAsString());
|
sendmsgUrl = URIUtil.decode((String) inboxProp.getValue());
|
||||||
}
|
}
|
||||||
if ("drafts".equals(inboxProp.getLocalName())) {
|
if ("drafts".equals(inboxProp.getName().getName())) {
|
||||||
draftsUrl = URIUtil.decode(inboxProp.getPropertyAsString());
|
draftsUrl = URIUtil.decode((String) inboxProp.getValue());
|
||||||
}
|
}
|
||||||
if ("calendar".equals(inboxProp.getLocalName())) {
|
if ("calendar".equals(inboxProp.getName().getName())) {
|
||||||
calendarUrl = URIUtil.decode(inboxProp.getPropertyAsString());
|
calendarUrl = URIUtil.decode((String) inboxProp.getValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LOGGER.debug("Inbox URL : " + inboxUrl +
|
LOGGER.debug("Inbox URL : " + inboxUrl +
|
||||||
|
@ -458,10 +461,9 @@ public class ExchangeSession {
|
||||||
PropPatchMethod patchMethod;
|
PropPatchMethod patchMethod;
|
||||||
// create the message first as draft
|
// create the message first as draft
|
||||||
if (properties.containsKey("draft")) {
|
if (properties.containsKey("draft")) {
|
||||||
patchMethod = new PropPatchMethod(messageUrl);
|
patchMethod = new PropPatchMethod(messageUrl, buildProperties(properties));
|
||||||
try {
|
try {
|
||||||
// update message with blind carbon copy and other flags
|
// update message with blind carbon copy and other flags
|
||||||
addProperties(patchMethod, properties);
|
|
||||||
int statusCode = httpClient.executeMethod(patchMethod);
|
int statusCode = httpClient.executeMethod(patchMethod);
|
||||||
if (statusCode != HttpStatus.SC_MULTI_STATUS) {
|
if (statusCode != HttpStatus.SC_MULTI_STATUS) {
|
||||||
throw new IOException("Unable to create message " + messageUrl + ": " + statusCode + " " + patchMethod.getStatusLine());
|
throw new IOException("Unable to create message " + messageUrl + ": " + statusCode + " " + patchMethod.getStatusLine());
|
||||||
|
@ -498,10 +500,9 @@ public class ExchangeSession {
|
||||||
|
|
||||||
// add bcc and other properties
|
// add bcc and other properties
|
||||||
if (properties.size() > 0) {
|
if (properties.size() > 0) {
|
||||||
patchMethod = new PropPatchMethod(messageUrl);
|
patchMethod = new PropPatchMethod(messageUrl, buildProperties(properties));
|
||||||
try {
|
try {
|
||||||
// update message with blind carbon copy and other flags
|
// update message with blind carbon copy and other flags
|
||||||
addProperties(patchMethod, properties);
|
|
||||||
int statusCode = httpClient.executeMethod(patchMethod);
|
int statusCode = httpClient.executeMethod(patchMethod);
|
||||||
if (statusCode != HttpStatus.SC_MULTI_STATUS) {
|
if (statusCode != HttpStatus.SC_MULTI_STATUS) {
|
||||||
throw new IOException("Unable to patch message " + messageUrl + ": " + statusCode + " " + patchMethod.getStatusLine());
|
throw new IOException("Unable to patch message " + messageUrl + ": " + statusCode + " " + patchMethod.getStatusLine());
|
||||||
|
@ -513,37 +514,37 @@ public class ExchangeSession {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Message buildMessage(ResponseEntity responseEntity) throws URIException {
|
protected Message buildMessage(MultiStatusResponse responseEntity) throws URIException {
|
||||||
Message message = new Message();
|
Message message = new Message();
|
||||||
message.messageUrl = URIUtil.decode(responseEntity.getHref());
|
message.messageUrl = URIUtil.decode(responseEntity.getHref());
|
||||||
Enumeration propertiesEnum = responseEntity.getProperties();
|
Iterator propertiesEnum = responseEntity.getProperties(HttpStatus.SC_OK).iterator();
|
||||||
while (propertiesEnum.hasMoreElements()) {
|
while (propertiesEnum.hasNext()) {
|
||||||
Property prop = (Property) propertiesEnum.nextElement();
|
DavProperty prop = (DavProperty) propertiesEnum.next();
|
||||||
String localName = prop.getLocalName();
|
String localName = prop.getName().getName();
|
||||||
|
|
||||||
if ("x0e080003".equals(localName)) {
|
if ("x0e080003".equals(localName)) {
|
||||||
message.size = Integer.parseInt(prop.getPropertyAsString());
|
message.size = Integer.parseInt((String) prop.getValue());
|
||||||
} else if ("uid".equals(localName)) {
|
} else if ("uid".equals(localName)) {
|
||||||
message.uid = prop.getPropertyAsString();
|
message.uid = (String) prop.getValue();
|
||||||
} else if ("x0e230003".equals(localName)) {
|
} else if ("x0e230003".equals(localName)) {
|
||||||
message.imapUid = Long.parseLong(prop.getPropertyAsString());
|
message.imapUid = Long.parseLong((String) prop.getValue());
|
||||||
} else if ("read".equals(localName)) {
|
} else if ("read".equals(localName)) {
|
||||||
message.read = "1".equals(prop.getPropertyAsString());
|
message.read = "1".equals(prop.getValue());
|
||||||
} else if ("x10830003".equals(localName)) {
|
} else if ("x10830003".equals(localName)) {
|
||||||
message.junk = "1".equals(prop.getPropertyAsString());
|
message.junk = "1".equals(prop.getValue());
|
||||||
} else if ("x10900003".equals(localName)) {
|
} else if ("x10900003".equals(localName)) {
|
||||||
message.flagged = "2".equals(prop.getPropertyAsString());
|
message.flagged = "2".equals(prop.getValue());
|
||||||
} else if ("x0E070003".equals(localName)) {
|
} else if ("x0E070003".equals(localName)) {
|
||||||
message.draft = "9".equals(prop.getPropertyAsString());
|
message.draft = "9".equals(prop.getValue());
|
||||||
} else if ("x10810003".equals(localName)) {
|
} else if ("x10810003".equals(localName)) {
|
||||||
message.answered = "102".equals(prop.getPropertyAsString()) || "103".equals(prop.getPropertyAsString());
|
message.answered = "102".equals(prop.getValue()) || "103".equals(prop.getValue());
|
||||||
message.forwarded = "104".equals(prop.getPropertyAsString());
|
message.forwarded = "104".equals(prop.getValue());
|
||||||
} else if ("date".equals(prop.getLocalName())) {
|
} else if ("date".equals(localName)) {
|
||||||
message.date = prop.getPropertyAsString();
|
message.date = (String) prop.getValue();
|
||||||
} else if ("isdeleted".equals(localName)) {
|
} else if ("isdeleted".equals(localName)) {
|
||||||
message.deleted = "1".equals(prop.getPropertyAsString());
|
message.deleted = "1".equals(prop.getValue());
|
||||||
} else if ("message-id".equals(prop.getLocalName())) {
|
} else if ("message-id".equals(localName)) {
|
||||||
message.messageId = prop.getPropertyAsString();
|
message.messageId = (String) prop.getValue();
|
||||||
if (message.messageId.startsWith("<") && message.messageId.endsWith(">")) {
|
if (message.messageId.startsWith("<") && message.messageId.endsWith(">")) {
|
||||||
message.messageId = message.messageId.substring(1, message.messageId.length() - 1);
|
message.messageId = message.messageId.substring(1, message.messageId.length() - 1);
|
||||||
}
|
}
|
||||||
|
@ -553,40 +554,41 @@ public class ExchangeSession {
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void addProperties(PropPatchMethod patchMethod, Map<String, String> properties) {
|
protected List<DavProperty> buildProperties(Map<String, String> properties) {
|
||||||
|
ArrayList<DavProperty> list = new ArrayList<DavProperty>();
|
||||||
for (Map.Entry<String, String> entry : properties.entrySet()) {
|
for (Map.Entry<String, String> entry : properties.entrySet()) {
|
||||||
if ("read".equals(entry.getKey())) {
|
if ("read".equals(entry.getKey())) {
|
||||||
patchMethod.addPropertyToSet("read", entry.getValue(), "e", "urn:schemas:httpmail:");
|
list.add(new DefaultDavProperty(DavPropertyName.create("read", Namespace.getNamespace("urn:schemas:httpmail:")), entry.getValue()));
|
||||||
} else if ("junk".equals(entry.getKey())) {
|
} else if ("junk".equals(entry.getKey())) {
|
||||||
patchMethod.addPropertyToSet("x10830003", entry.getValue(), "f", "http://schemas.microsoft.com/mapi/proptag/");
|
list.add(new DefaultDavProperty(DavPropertyName.create("x10830003", Namespace.getNamespace("http://schemas.microsoft.com/mapi/proptag/")), entry.getValue()));
|
||||||
} else if ("flagged".equals(entry.getKey())) {
|
} else if ("flagged".equals(entry.getKey())) {
|
||||||
patchMethod.addPropertyToSet("x10900003", entry.getValue(), "f", "http://schemas.microsoft.com/mapi/proptag/");
|
list.add(new DefaultDavProperty(DavPropertyName.create("x10900003", Namespace.getNamespace("http://schemas.microsoft.com/mapi/proptag/")), entry.getValue()));
|
||||||
} else if ("answered".equals(entry.getKey())) {
|
} else if ("answered".equals(entry.getKey())) {
|
||||||
patchMethod.addPropertyToSet("x10810003", entry.getValue(), "f", "http://schemas.microsoft.com/mapi/proptag/");
|
list.add(new DefaultDavProperty(DavPropertyName.create("x10810003", Namespace.getNamespace("http://schemas.microsoft.com/mapi/proptag/")), entry.getValue()));
|
||||||
if ("102".equals(entry.getValue())) {
|
if ("102".equals(entry.getValue())) {
|
||||||
patchMethod.addPropertyToSet("x10800003", "261", "f", "http://schemas.microsoft.com/mapi/proptag/");
|
list.add(new DefaultDavProperty(DavPropertyName.create("x10800003", Namespace.getNamespace("http://schemas.microsoft.com/mapi/proptag/")), "261"));
|
||||||
}
|
}
|
||||||
} else if ("forwarded".equals(entry.getKey())) {
|
} else if ("forwarded".equals(entry.getKey())) {
|
||||||
patchMethod.addPropertyToSet("x10810003", entry.getValue(), "f", "http://schemas.microsoft.com/mapi/proptag/");
|
list.add(new DefaultDavProperty(DavPropertyName.create("x10810003", Namespace.getNamespace("http://schemas.microsoft.com/mapi/proptag/")), entry.getValue()));
|
||||||
if ("104".equals(entry.getValue())) {
|
if ("104".equals(entry.getValue())) {
|
||||||
patchMethod.addPropertyToSet("x10800003", "262", "f", "http://schemas.microsoft.com/mapi/proptag/");
|
list.add(new DefaultDavProperty(DavPropertyName.create("x10800003", Namespace.getNamespace("http://schemas.microsoft.com/mapi/proptag/")), "262"));
|
||||||
}
|
}
|
||||||
} else if ("bcc".equals(entry.getKey())) {
|
} else if ("bcc".equals(entry.getKey())) {
|
||||||
patchMethod.addPropertyToSet("bcc", entry.getValue(), "b", "urn:schemas:mailheader:");
|
list.add(new DefaultDavProperty(DavPropertyName.create("bcc", Namespace.getNamespace("urn:schemas:mailheader:")), entry.getValue()));
|
||||||
} else if ("draft".equals(entry.getKey())) {
|
} else if ("draft".equals(entry.getKey())) {
|
||||||
patchMethod.addPropertyToSet("x0E070003", entry.getValue(), "f", "http://schemas.microsoft.com/mapi/proptag/");
|
list.add(new DefaultDavProperty(DavPropertyName.create("x0E070003", Namespace.getNamespace("http://schemas.microsoft.com/mapi/proptag/")), entry.getValue()));
|
||||||
} else if ("deleted".equals(entry.getKey())) {
|
} else if ("deleted".equals(entry.getKey())) {
|
||||||
patchMethod.addPropertyToSet("isdeleted", entry.getValue(), "d", "DAV:");
|
list.add(new DefaultDavProperty(DavPropertyName.create("isdeleted"), entry.getValue()));
|
||||||
} else if ("datereceived".equals(entry.getKey())) {
|
} else if ("datereceived".equals(entry.getKey())) {
|
||||||
patchMethod.addPropertyToSet("datereceived", entry.getValue(), "e", "urn:schemas:httpmail:");
|
list.add(new DefaultDavProperty(DavPropertyName.create("datereceived", Namespace.getNamespace("urn:schemas:httpmail:")), entry.getValue()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateMessage(Message message, Map<String, String> properties) throws IOException {
|
public void updateMessage(Message message, Map<String, String> properties) throws IOException {
|
||||||
PropPatchMethod patchMethod = new PropPatchMethod(URIUtil.encodePathQuery(message.messageUrl));
|
PropPatchMethod patchMethod = new PropPatchMethod(URIUtil.encodePathQuery(message.messageUrl), buildProperties(properties));
|
||||||
try {
|
try {
|
||||||
addProperties(patchMethod, properties);
|
|
||||||
int statusCode = httpClient.executeMethod(patchMethod);
|
int statusCode = httpClient.executeMethod(patchMethod);
|
||||||
if (statusCode != HttpStatus.SC_MULTI_STATUS) {
|
if (statusCode != HttpStatus.SC_MULTI_STATUS) {
|
||||||
throw new IOException("Unable to update message properties");
|
throw new IOException("Unable to update message properties");
|
||||||
|
@ -615,13 +617,11 @@ public class ExchangeSession {
|
||||||
searchRequest += conditions;
|
searchRequest += conditions;
|
||||||
}
|
}
|
||||||
searchRequest += " ORDER BY \"urn:schemas:httpmail:date\" ASC";
|
searchRequest += " ORDER BY \"urn:schemas:httpmail:date\" ASC";
|
||||||
Enumeration folderEnum = DavGatewayHttpClientFacade.executeSearchMethod(
|
MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executeSearchMethod(
|
||||||
httpClient, URIUtil.encodePath(folderUrl), searchRequest);
|
httpClient, URIUtil.encodePath(folderUrl), searchRequest);
|
||||||
|
|
||||||
while (folderEnum.hasMoreElements()) {
|
for (MultiStatusResponse response : responses) {
|
||||||
ResponseEntity entity = (ResponseEntity) folderEnum.nextElement();
|
Message message = buildMessage(response);
|
||||||
|
|
||||||
Message message = buildMessage(entity);
|
|
||||||
messages.add(message);
|
messages.add(message);
|
||||||
}
|
}
|
||||||
Collections.sort(messages);
|
Collections.sort(messages);
|
||||||
|
@ -636,33 +636,32 @@ public class ExchangeSession {
|
||||||
" FROM Scope('" + mode + " TRAVERSAL OF \"" + getFolderPath(folderName) + "\"')\n" +
|
" FROM Scope('" + mode + " TRAVERSAL OF \"" + getFolderPath(folderName) + "\"')\n" +
|
||||||
" WHERE \"DAV:ishidden\" = False AND \"DAV:isfolder\" = True \n" +
|
" WHERE \"DAV:ishidden\" = False AND \"DAV:isfolder\" = True \n" +
|
||||||
" AND (\"DAV:contentclass\"='urn:content-classes:mailfolder' OR \"DAV:contentclass\"='urn:content-classes:folder')";
|
" AND (\"DAV:contentclass\"='urn:content-classes:mailfolder' OR \"DAV:contentclass\"='urn:content-classes:folder')";
|
||||||
Enumeration folderEnum = DavGatewayHttpClientFacade.executeSearchMethod(
|
MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executeSearchMethod(
|
||||||
httpClient, URIUtil.encodePath(mailPath), searchRequest);
|
httpClient, URIUtil.encodePath(mailPath), searchRequest);
|
||||||
|
|
||||||
while (folderEnum.hasMoreElements()) {
|
for (MultiStatusResponse response : responses) {
|
||||||
ResponseEntity entity = (ResponseEntity) folderEnum.nextElement();
|
folders.add(buildFolder(response));
|
||||||
folders.add(buildFolder(entity));
|
|
||||||
}
|
}
|
||||||
return folders;
|
return folders;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Folder buildFolder(ResponseEntity entity) throws URIException {
|
protected Folder buildFolder(MultiStatusResponse entity) throws URIException {
|
||||||
String href = URIUtil.decode(entity.getHref());
|
String href = URIUtil.decode(entity.getHref());
|
||||||
Folder folder = new Folder();
|
Folder folder = new Folder();
|
||||||
Enumeration enumeration = entity.getProperties();
|
Iterator enumeration = entity.getProperties(HttpStatus.SC_OK).iterator();
|
||||||
while (enumeration.hasMoreElements()) {
|
while (enumeration.hasNext()) {
|
||||||
Property property = (Property) enumeration.nextElement();
|
DavProperty property = (DavProperty) enumeration.next();
|
||||||
if ("hassubs".equals(property.getLocalName())) {
|
if ("hassubs".equals(property.getName().getName())) {
|
||||||
folder.hasChildren = "1".equals(property.getPropertyAsString());
|
folder.hasChildren = "1".equals((String) property.getValue());
|
||||||
}
|
}
|
||||||
if ("nosubs".equals(property.getLocalName())) {
|
if ("nosubs".equals(property.getName().getName())) {
|
||||||
folder.noInferiors = "1".equals(property.getPropertyAsString());
|
folder.noInferiors = "1".equals((String) property.getValue());
|
||||||
}
|
}
|
||||||
if ("unreadcount".equals(property.getLocalName())) {
|
if ("unreadcount".equals(property.getName().getName())) {
|
||||||
folder.unreadCount = Integer.parseInt(property.getPropertyAsString());
|
folder.unreadCount = Integer.parseInt((String) property.getValue());
|
||||||
}
|
}
|
||||||
if ("contenttag".equals(property.getLocalName())) {
|
if ("contenttag".equals(property.getName().getName())) {
|
||||||
folder.contenttag = property.getPropertyAsString();
|
folder.contenttag = (String) property.getValue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (href.endsWith("/")) {
|
if (href.endsWith("/")) {
|
||||||
|
@ -720,12 +719,11 @@ public class ExchangeSession {
|
||||||
" FROM Scope('SHALLOW TRAVERSAL OF \"" + folderUrl + "\"')\n" +
|
" FROM Scope('SHALLOW TRAVERSAL OF \"" + folderUrl + "\"')\n" +
|
||||||
" WHERE \"DAV:isfolder\" = False\n" +
|
" WHERE \"DAV:isfolder\" = False\n" +
|
||||||
" AND \"DAV:getlastmodified\" < '" + formatDate(cal.getTime()) + "'\n";
|
" AND \"DAV:getlastmodified\" < '" + formatDate(cal.getTime()) + "'\n";
|
||||||
Enumeration folderEnum = DavGatewayHttpClientFacade.executeSearchMethod(
|
MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executeSearchMethod(
|
||||||
httpClient, URIUtil.encodePath(folderUrl), searchRequest);
|
httpClient, URIUtil.encodePath(folderUrl), searchRequest);
|
||||||
|
|
||||||
while (folderEnum.hasMoreElements()) {
|
for (MultiStatusResponse response : responses) {
|
||||||
ResponseEntity entity = (ResponseEntity) folderEnum.nextElement();
|
String messageUrl = response.getHref();
|
||||||
String messageUrl = entity.getHref();
|
|
||||||
|
|
||||||
LOGGER.debug("Delete " + messageUrl);
|
LOGGER.debug("Delete " + messageUrl);
|
||||||
DavGatewayHttpClientFacade.executeDeleteMethod(httpClient, messageUrl);
|
DavGatewayHttpClientFacade.executeDeleteMethod(httpClient, messageUrl);
|
||||||
|
@ -799,7 +797,7 @@ public class ExchangeSession {
|
||||||
|
|
||||||
// warning : slide library expects *unencoded* urls
|
// warning : slide library expects *unencoded* urls
|
||||||
String tempUrl = draftsUrl + "/" + messageName + ".EML";
|
String tempUrl = draftsUrl + "/" + messageName + ".EML";
|
||||||
MoveMethod method = new MoveMethod(URIUtil.encodePath(tempUrl), URIUtil.encodePath(sendmsgUrl));
|
MoveMethod method = new MoveMethod(URIUtil.encodePath(tempUrl), URIUtil.encodePath(sendmsgUrl), true);
|
||||||
int status = DavGatewayHttpClientFacade.executeHttpMethod(httpClient, method);
|
int status = DavGatewayHttpClientFacade.executeHttpMethod(httpClient, method);
|
||||||
if (status != HttpStatus.SC_OK) {
|
if (status != HttpStatus.SC_OK) {
|
||||||
throw DavGatewayHttpClientFacade.buildHttpException(method);
|
throw DavGatewayHttpClientFacade.buildHttpException(method);
|
||||||
|
@ -837,12 +835,11 @@ public class ExchangeSession {
|
||||||
* @throws IOException when unable to change folder
|
* @throws IOException when unable to change folder
|
||||||
*/
|
*/
|
||||||
public Folder getFolder(String folderName) throws IOException {
|
public Folder getFolder(String folderName) throws IOException {
|
||||||
Enumeration folderEnum = DavGatewayHttpClientFacade.executePropFindMethod(
|
MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executePropFindMethod(
|
||||||
httpClient, URIUtil.encodePath(getFolderPath(folderName)), 0, FOLDER_PROPERTIES);
|
httpClient, URIUtil.encodePath(getFolderPath(folderName)), 0, FOLDER_PROPERTIES);
|
||||||
Folder folder = null;
|
Folder folder = null;
|
||||||
if (folderEnum.hasMoreElements()) {
|
if (responses.length > 0) {
|
||||||
ResponseEntity entity = (ResponseEntity) folderEnum.nextElement();
|
folder = buildFolder(responses[0]);
|
||||||
folder = buildFolder(entity);
|
|
||||||
folder.folderName = folderName;
|
folder.folderName = folderName;
|
||||||
}
|
}
|
||||||
return folder;
|
return folder;
|
||||||
|
@ -871,12 +868,13 @@ public class ExchangeSession {
|
||||||
|
|
||||||
public void createFolder(String folderName) throws IOException {
|
public void createFolder(String folderName) throws IOException {
|
||||||
String folderPath = getFolderPath(folderName);
|
String folderPath = getFolderPath(folderName);
|
||||||
PropPatchMethod method = new PropPatchMethod(URIUtil.encodePath(folderPath)) {
|
ArrayList<DavProperty> list = new ArrayList<DavProperty>();
|
||||||
|
list.add(new DefaultDavProperty(DavPropertyName.create("outlookfolderclass", Namespace.getNamespace("http://schemas.microsoft.com/exchange/")), "IPF.Note"));
|
||||||
|
PropPatchMethod method = new PropPatchMethod(URIUtil.encodePath(folderPath), list) {
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return "MKCOL";
|
return "MKCOL";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
method.addPropertyToSet("outlookfolderclass", "IPF.Note", "ex", "http://schemas.microsoft.com/exchange/");
|
|
||||||
int status = DavGatewayHttpClientFacade.executeHttpMethod(httpClient, method);
|
int status = DavGatewayHttpClientFacade.executeHttpMethod(httpClient, method);
|
||||||
// ok or alredy exists
|
// ok or alredy exists
|
||||||
if (status != HttpStatus.SC_MULTI_STATUS && status != HttpStatus.SC_METHOD_NOT_ALLOWED) {
|
if (status != HttpStatus.SC_MULTI_STATUS && status != HttpStatus.SC_METHOD_NOT_ALLOWED) {
|
||||||
|
@ -887,8 +885,7 @@ public class ExchangeSession {
|
||||||
public void copyMessage(String messageUrl, String targetName) throws IOException {
|
public void copyMessage(String messageUrl, String targetName) throws IOException {
|
||||||
String targetPath = getFolderPath(targetName) + messageUrl.substring(messageUrl.lastIndexOf('/'));
|
String targetPath = getFolderPath(targetName) + messageUrl.substring(messageUrl.lastIndexOf('/'));
|
||||||
CopyMethod method = new CopyMethod(URIUtil.encodePath(messageUrl),
|
CopyMethod method = new CopyMethod(URIUtil.encodePath(messageUrl),
|
||||||
URIUtil.encodePath(targetPath));
|
URIUtil.encodePath(targetPath), false);
|
||||||
method.setOverwrite(false);
|
|
||||||
method.addRequestHeader("Allow-Rename", "t");
|
method.addRequestHeader("Allow-Rename", "t");
|
||||||
try {
|
try {
|
||||||
int statusCode = httpClient.executeMethod(method);
|
int statusCode = httpClient.executeMethod(method);
|
||||||
|
@ -906,8 +903,7 @@ public class ExchangeSession {
|
||||||
String folderPath = getFolderPath(folderName);
|
String folderPath = getFolderPath(folderName);
|
||||||
String targetPath = getFolderPath(targetName);
|
String targetPath = getFolderPath(targetName);
|
||||||
MoveMethod method = new MoveMethod(URIUtil.encodePath(folderPath),
|
MoveMethod method = new MoveMethod(URIUtil.encodePath(folderPath),
|
||||||
URIUtil.encodePath(targetPath));
|
URIUtil.encodePath(targetPath), false);
|
||||||
method.setOverwrite(false);
|
|
||||||
try {
|
try {
|
||||||
int statusCode = httpClient.executeMethod(method);
|
int statusCode = httpClient.executeMethod(method);
|
||||||
if (statusCode == HttpStatus.SC_PRECONDITION_FAILED) {
|
if (statusCode == HttpStatus.SC_PRECONDITION_FAILED) {
|
||||||
|
@ -924,8 +920,7 @@ public class ExchangeSession {
|
||||||
String source = encodedPath + "/" + encodedMessageName;
|
String source = encodedPath + "/" + encodedMessageName;
|
||||||
String destination = URIUtil.encodePath(deleteditemsUrl) + "/" + encodedMessageName;
|
String destination = URIUtil.encodePath(deleteditemsUrl) + "/" + encodedMessageName;
|
||||||
LOGGER.debug("Deleting : " + source + " to " + destination);
|
LOGGER.debug("Deleting : " + source + " to " + destination);
|
||||||
MoveMethod method = new MoveMethod(source, destination);
|
MoveMethod method = new MoveMethod(source, destination, false);
|
||||||
method.addRequestHeader("Overwrite", "f");
|
|
||||||
method.addRequestHeader("Allow-rename", "t");
|
method.addRequestHeader("Allow-rename", "t");
|
||||||
|
|
||||||
int status = DavGatewayHttpClientFacade.executeHttpMethod(httpClient, method);
|
int status = DavGatewayHttpClientFacade.executeHttpMethod(httpClient, method);
|
||||||
|
@ -1124,7 +1119,7 @@ public class ExchangeSession {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return (int)(imapUid ^ (imapUid >>> 32));
|
return (int) (imapUid ^ (imapUid >>> 32));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1249,9 +1244,9 @@ public class ExchangeSession {
|
||||||
|
|
||||||
public List<Event> getEvents(String path, String searchQuery) throws IOException {
|
public List<Event> getEvents(String path, String searchQuery) throws IOException {
|
||||||
List<Event> events = new ArrayList<Event>();
|
List<Event> events = new ArrayList<Event>();
|
||||||
Enumeration calendarEnum = DavGatewayHttpClientFacade.executeSearchMethod(httpClient, URIUtil.encodePath(path), searchQuery);
|
MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executeSearchMethod(httpClient, URIUtil.encodePath(path), searchQuery);
|
||||||
while (calendarEnum.hasMoreElements()) {
|
for (MultiStatusResponse response : responses) {
|
||||||
events.add(buildEvent((ResponseEntity) calendarEnum.nextElement()));
|
events.add(buildEvent(response));
|
||||||
}
|
}
|
||||||
return events;
|
return events;
|
||||||
}
|
}
|
||||||
|
@ -1259,23 +1254,22 @@ public class ExchangeSession {
|
||||||
public Event getEvent(String principal, String path, String eventName) throws IOException {
|
public Event getEvent(String principal, String path, String eventName) throws IOException {
|
||||||
String eventPath = URIUtil.encodePath(replacePrincipal(getFolderPath(path), principal)) + "/" + URIUtil.encodeWithinQuery(eventName);
|
String eventPath = URIUtil.encodePath(replacePrincipal(getFolderPath(path), principal)) + "/" + URIUtil.encodeWithinQuery(eventName);
|
||||||
LOGGER.debug("getEvent(" + eventPath + "/" + eventName + ")");
|
LOGGER.debug("getEvent(" + eventPath + "/" + eventName + ")");
|
||||||
Enumeration calendarEnum = DavGatewayHttpClientFacade.executePropFindMethod(httpClient, eventPath, 0, EVENT_REQUEST_PROPERTIES);
|
MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executePropFindMethod(httpClient, eventPath, 0, EVENT_REQUEST_PROPERTIES);
|
||||||
if (!calendarEnum.hasMoreElements()) {
|
if (responses.length == 0) {
|
||||||
throw new IOException("Unable to get calendar event");
|
throw new IOException("Unable to get calendar event");
|
||||||
}
|
}
|
||||||
return buildEvent((ResponseEntity) calendarEnum.
|
return buildEvent(responses[0]);
|
||||||
nextElement());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Event buildEvent(ResponseEntity calendarResponse) throws URIException {
|
protected Event buildEvent(MultiStatusResponse calendarResponse) throws URIException {
|
||||||
Event event = new Event();
|
Event event = new Event();
|
||||||
String href = calendarResponse.getHref();
|
String href = calendarResponse.getHref();
|
||||||
event.href = URIUtil.decode(href);
|
event.href = URIUtil.decode(href);
|
||||||
Enumeration propertiesEnumeration = calendarResponse.getProperties();
|
Iterator propertiesEnumeration = calendarResponse.getProperties(HttpStatus.SC_OK).iterator();
|
||||||
while (propertiesEnumeration.hasMoreElements()) {
|
while (propertiesEnumeration.hasNext()) {
|
||||||
Property property = (Property) propertiesEnumeration.nextElement();
|
DavProperty property = (DavProperty) propertiesEnumeration.next();
|
||||||
if ("getetag".equals(property.getLocalName())) {
|
if ("getetag".equals(property.getName().getName())) {
|
||||||
event.etag = property.getPropertyAsString();
|
event.etag = (String) property.getValue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return event;
|
return event;
|
||||||
|
@ -1413,17 +1407,6 @@ public class ExchangeSession {
|
||||||
}
|
}
|
||||||
String dateValue = line.substring(valueIndex + 1, valueEndIndex);
|
String dateValue = line.substring(valueIndex + 1, valueEndIndex);
|
||||||
String key = line.substring(0, Math.max(keyIndex, valueIndex));
|
String key = line.substring(0, Math.max(keyIndex, valueIndex));
|
||||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
|
|
||||||
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
|
|
||||||
Date date;
|
|
||||||
try {
|
|
||||||
date = dateFormat.parse(dateValue);
|
|
||||||
} catch (ParseException e) {
|
|
||||||
throw new IOException("Invalid ICS line: " + line);
|
|
||||||
}
|
|
||||||
if ("DTEND".equals(key)) {
|
|
||||||
date.setTime(date.getTime() - 1);
|
|
||||||
}
|
|
||||||
return key + ";VALUE=DATE:" + dateValue;
|
return key + ";VALUE=DATE:" + dateValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1439,7 +1422,7 @@ public class ExchangeSession {
|
||||||
if (status != HttpStatus.SC_CREATED) {
|
if (status != HttpStatus.SC_CREATED) {
|
||||||
return status;
|
return status;
|
||||||
} else {
|
} else {
|
||||||
MoveMethod method = new MoveMethod(URIUtil.encodePath(messageUrl), URIUtil.encodePath(sendmsgUrl));
|
MoveMethod method = new MoveMethod(URIUtil.encodePath(messageUrl), URIUtil.encodePath(sendmsgUrl), true);
|
||||||
status = DavGatewayHttpClientFacade.executeHttpMethod(httpClient, method);
|
status = DavGatewayHttpClientFacade.executeHttpMethod(httpClient, method);
|
||||||
if (status != HttpStatus.SC_OK) {
|
if (status != HttpStatus.SC_OK) {
|
||||||
throw DavGatewayHttpClientFacade.buildHttpException(method);
|
throw DavGatewayHttpClientFacade.buildHttpException(method);
|
||||||
|
@ -1619,9 +1602,10 @@ public class ExchangeSession {
|
||||||
int status;
|
int status;
|
||||||
if (path.startsWith("INBOX")) {
|
if (path.startsWith("INBOX")) {
|
||||||
// do not delete calendar messages, mark read and processed
|
// do not delete calendar messages, mark read and processed
|
||||||
PropPatchMethod patchMethod = new PropPatchMethod(URIUtil.encodePath(replacePrincipal(getFolderPath(URIUtil.decode(path)), principal)) + "/" + eventName);
|
ArrayList<DavProperty> list = new ArrayList<DavProperty>();
|
||||||
patchMethod.addPropertyToSet("schedule-state", "CALDAV:schedule-processed", "C", "CALDAV:");
|
list.add(new DefaultDavProperty(DavPropertyName.create("schedule-state", Namespace.getNamespace("CALDAV:")), "CALDAV:schedule-processed"));
|
||||||
patchMethod.addPropertyToSet("read", "1", "e", "urn:schemas:httpmail:");
|
list.add(new DefaultDavProperty(DavPropertyName.create("read", Namespace.getNamespace("urn:schemas:httpmail:")), "1"));
|
||||||
|
PropPatchMethod patchMethod = new PropPatchMethod(URIUtil.encodePath(replacePrincipal(getFolderPath(URIUtil.decode(path)), principal)) + "/" + eventName, list);
|
||||||
DavGatewayHttpClientFacade.executeMethod(httpClient, patchMethod);
|
DavGatewayHttpClientFacade.executeMethod(httpClient, patchMethod);
|
||||||
status = HttpStatus.SC_OK;
|
status = HttpStatus.SC_OK;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1641,21 +1625,17 @@ public class ExchangeSession {
|
||||||
|
|
||||||
public String getFolderCtag(String folderUrl) throws IOException {
|
public String getFolderCtag(String folderUrl) throws IOException {
|
||||||
String ctag = null;
|
String ctag = null;
|
||||||
Enumeration calendarEnum = DavGatewayHttpClientFacade.executePropFindMethod(
|
MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executePropFindMethod(
|
||||||
httpClient, URIUtil.encodePath(folderUrl), 0, CONTENT_TAG);
|
httpClient, URIUtil.encodePath(folderUrl), 0, CONTENT_TAG);
|
||||||
if (!calendarEnum.hasMoreElements()) {
|
if (responses.length == 0) {
|
||||||
throw new IOException("Unable to get folder object");
|
throw new IOException("Unable to get folder object");
|
||||||
}
|
}
|
||||||
while (calendarEnum.hasMoreElements()) {
|
MultiStatusResponse calendarResponse = responses[0];
|
||||||
ResponseEntity calendarResponse = (ResponseEntity) calendarEnum.
|
Iterator propertiesEnumeration = calendarResponse.getProperties(HttpStatus.SC_OK).iterator();
|
||||||
nextElement();
|
while (propertiesEnumeration.hasNext()) {
|
||||||
Enumeration propertiesEnumeration = calendarResponse.getProperties();
|
DavProperty property = (DavProperty) propertiesEnumeration.next();
|
||||||
while (propertiesEnumeration.hasMoreElements()) {
|
if ("contenttag".equals(property.getName().getName())) {
|
||||||
Property property = (Property) propertiesEnumeration.nextElement();
|
ctag = (String) property.getValue();
|
||||||
if ("http://schemas.microsoft.com/repl/".equals(property.getNamespaceURI())
|
|
||||||
&& "contenttag".equals(property.getLocalName())) {
|
|
||||||
ctag = property.getPropertyAsString();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ctag == null) {
|
if (ctag == null) {
|
||||||
|
@ -1666,22 +1646,19 @@ public class ExchangeSession {
|
||||||
|
|
||||||
public String getCalendarEtag() throws IOException {
|
public String getCalendarEtag() throws IOException {
|
||||||
String etag = null;
|
String etag = null;
|
||||||
Enumeration calendarEnum = DavGatewayHttpClientFacade.executePropFindMethod(
|
MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executePropFindMethod(
|
||||||
httpClient, URIUtil.encodePath(calendarUrl), 0, EVENT_REQUEST_PROPERTIES);
|
httpClient, URIUtil.encodePath(calendarUrl), 0, EVENT_REQUEST_PROPERTIES);
|
||||||
if (!calendarEnum.hasMoreElements()) {
|
if (responses.length == 0) {
|
||||||
throw new IOException("Unable to get calendar object");
|
throw new IOException("Unable to get calendar object");
|
||||||
}
|
}
|
||||||
while (calendarEnum.hasMoreElements()) {
|
MultiStatusResponse calendarResponse = responses[0];
|
||||||
ResponseEntity calendarResponse = (ResponseEntity) calendarEnum.
|
Iterator propertiesEnumeration = calendarResponse.getProperties(HttpStatus.SC_OK).iterator();
|
||||||
nextElement();
|
while (propertiesEnumeration.hasNext()) {
|
||||||
Enumeration propertiesEnumeration = calendarResponse.getProperties();
|
DavProperty property = (DavProperty) propertiesEnumeration.next();
|
||||||
while (propertiesEnumeration.hasMoreElements()) {
|
if ("getetag".equals(property.getName().getName())) {
|
||||||
Property property = (Property) propertiesEnumeration.nextElement();
|
etag = (String) property.getValue();
|
||||||
if ("getetag".equals(property.getLocalName())) {
|
|
||||||
etag = property.getPropertyAsString();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (etag == null) {
|
if (etag == null) {
|
||||||
throw new IOException("Unable to get calendar etag");
|
throw new IOException("Unable to get calendar etag");
|
||||||
}
|
}
|
||||||
|
@ -1726,21 +1703,19 @@ public class ExchangeSession {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
String alias = null;
|
String alias = null;
|
||||||
Enumeration folderEnum = DavGatewayHttpClientFacade.executePropFindMethod(
|
MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executePropFindMethod(
|
||||||
httpClient, URIUtil.encodePath(mailPath), 0, DISPLAY_NAME);
|
httpClient, URIUtil.encodePath(mailPath), 0, DISPLAY_NAME);
|
||||||
if (!folderEnum.hasMoreElements()) {
|
if (responses.length == 0) {
|
||||||
throw new IOException("Unable to get mail folder");
|
throw new IOException("Unable to get mail folder");
|
||||||
}
|
}
|
||||||
ResponseEntity mailboxResponse = (ResponseEntity) folderEnum.
|
Iterator mailboxPropsEnum = responses[0].getProperties(HttpStatus.SC_OK).iterator();
|
||||||
nextElement();
|
if (!mailboxPropsEnum.hasNext()) {
|
||||||
Enumeration mailboxPropsEnum = mailboxResponse.getProperties();
|
|
||||||
if (!mailboxPropsEnum.hasMoreElements()) {
|
|
||||||
throw new IOException("Unable to get mail folder");
|
throw new IOException("Unable to get mail folder");
|
||||||
}
|
}
|
||||||
while (mailboxPropsEnum.hasMoreElements()) {
|
while (mailboxPropsEnum.hasNext()) {
|
||||||
Property inboxProp = (Property) mailboxPropsEnum.nextElement();
|
DavProperty inboxProp = (DavProperty) mailboxPropsEnum.next();
|
||||||
if ("displayname".equals(inboxProp.getLocalName())) {
|
if ("displayname".equals(inboxProp.getName().getName())) {
|
||||||
alias = inboxProp.getPropertyAsString();
|
alias = (String) inboxProp.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,20 +3,26 @@ package davmail.http;
|
||||||
import davmail.Settings;
|
import davmail.Settings;
|
||||||
import davmail.tray.DavGatewayTray;
|
import davmail.tray.DavGatewayTray;
|
||||||
import org.apache.commons.httpclient.*;
|
import org.apache.commons.httpclient.*;
|
||||||
import org.apache.commons.httpclient.methods.GetMethod;
|
import org.apache.commons.httpclient.auth.AuthPolicy;
|
||||||
|
import org.apache.commons.httpclient.auth.AuthScope;
|
||||||
import org.apache.commons.httpclient.methods.DeleteMethod;
|
import org.apache.commons.httpclient.methods.DeleteMethod;
|
||||||
import org.apache.webdav.lib.methods.PropFindMethod;
|
import org.apache.commons.httpclient.methods.GetMethod;
|
||||||
import org.apache.webdav.lib.methods.SearchMethod;
|
import org.apache.commons.httpclient.methods.StringRequestEntity;
|
||||||
import org.apache.webdav.lib.methods.XMLResponseMethodBase;
|
import org.apache.commons.httpclient.params.HttpMethodParams;
|
||||||
|
import org.apache.jackrabbit.webdav.DavException;
|
||||||
|
import org.apache.jackrabbit.webdav.MultiStatusResponse;
|
||||||
|
import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
|
||||||
|
import org.apache.jackrabbit.webdav.client.methods.DavMethodBase;
|
||||||
|
import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Enumeration;
|
import java.util.ArrayList;
|
||||||
import java.util.Vector;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create HttpClient instance according to DavGateway Settings
|
* Create HttpClient instance according to DavGateway Settings
|
||||||
*/
|
*/
|
||||||
public final class DavGatewayHttpClientFacade {
|
public final class DavGatewayHttpClientFacade {
|
||||||
|
final static String IE_USER_AGENT = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)";
|
||||||
static MultiThreadedHttpConnectionManager multiThreadedHttpConnectionManager;
|
static MultiThreadedHttpConnectionManager multiThreadedHttpConnectionManager;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
@ -36,18 +42,20 @@ public final class DavGatewayHttpClientFacade {
|
||||||
public static HttpClient getInstance() {
|
public static HttpClient getInstance() {
|
||||||
// create an HttpClient instance
|
// create an HttpClient instance
|
||||||
HttpClient httpClient = new HttpClient();
|
HttpClient httpClient = new HttpClient();
|
||||||
|
httpClient.getParams().setParameter(HttpMethodParams.USER_AGENT, IE_USER_AGENT);
|
||||||
configureClient(httpClient);
|
configureClient(httpClient);
|
||||||
return httpClient;
|
return httpClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpClient getInstance(HttpURL httpURL) throws URIException {
|
public static HttpClient getInstance(HttpURL httpURL) throws URIException {
|
||||||
HttpClient httpClient = new HttpClient();
|
HttpClient httpClient = new HttpClient();
|
||||||
|
httpClient.getParams().setParameter(HttpMethodParams.USER_AGENT, IE_USER_AGENT);
|
||||||
HostConfiguration hostConfig = httpClient.getHostConfiguration();
|
HostConfiguration hostConfig = httpClient.getHostConfiguration();
|
||||||
hostConfig.setHost(httpURL);
|
hostConfig.setHost(httpURL);
|
||||||
UsernamePasswordCredentials hostCredentials =
|
UsernamePasswordCredentials hostCredentials =
|
||||||
new UsernamePasswordCredentials(httpURL.getUser(),
|
new UsernamePasswordCredentials(httpURL.getUser(),
|
||||||
httpURL.getPassword());
|
httpURL.getPassword());
|
||||||
httpClient.getState().setCredentials(null, httpURL.getHost(),
|
httpClient.getState().setCredentials(new AuthScope(httpURL.getHost(), httpURL.getPort(), AuthScope.ANY_REALM),
|
||||||
hostCredentials);
|
hostCredentials);
|
||||||
configureClient(httpClient);
|
configureClient(httpClient);
|
||||||
return httpClient;
|
return httpClient;
|
||||||
|
@ -79,20 +87,24 @@ public final class DavGatewayHttpClientFacade {
|
||||||
httpClient.getHostConfiguration().setProxy(proxyHost, proxyPort);
|
httpClient.getHostConfiguration().setProxy(proxyHost, proxyPort);
|
||||||
if (proxyUser != null && proxyUser.length() > 0) {
|
if (proxyUser != null && proxyUser.length() > 0) {
|
||||||
|
|
||||||
/* // Only available in newer HttpClient releases, not compatible with slide library
|
// Only available in newer HttpClient releases, not compatible with slide library
|
||||||
List authPrefs = new ArrayList();
|
ArrayList<String> authPrefs = new ArrayList<String>();
|
||||||
|
authPrefs.add(AuthPolicy.DIGEST);
|
||||||
authPrefs.add(AuthPolicy.BASIC);
|
authPrefs.add(AuthPolicy.BASIC);
|
||||||
httpClient.getParams().setParameter(AuthPolicy.AUTH_SCHEME_PRIORITY,authPrefs);
|
// exclude the NTLM authentication scheme
|
||||||
*/
|
httpClient.getParams().setParameter(AuthPolicy.AUTH_SCHEME_PRIORITY, authPrefs);
|
||||||
|
|
||||||
|
AuthScope authScope = new AuthScope(proxyHost, proxyPort, AuthScope.ANY_REALM);
|
||||||
|
|
||||||
// instead detect ntlm authentication (windows domain name in user name)
|
// instead detect ntlm authentication (windows domain name in user name)
|
||||||
int backslashindex = proxyUser.indexOf("\\");
|
int backslashindex = proxyUser.indexOf("\\");
|
||||||
if (backslashindex > 0) {
|
if (backslashindex > 0) {
|
||||||
httpClient.getState().setProxyCredentials(null, proxyHost,
|
httpClient.getState().setProxyCredentials(authScope,
|
||||||
new NTCredentials(proxyUser.substring(backslashindex + 1),
|
new NTCredentials(proxyUser.substring(backslashindex + 1),
|
||||||
proxyPassword, null,
|
proxyPassword, null,
|
||||||
proxyUser.substring(0, backslashindex)));
|
proxyUser.substring(0, backslashindex)));
|
||||||
} else {
|
} else {
|
||||||
httpClient.getState().setProxyCredentials(null, proxyHost,
|
httpClient.getState().setProxyCredentials(authScope,
|
||||||
new UsernamePasswordCredentials(proxyUser, proxyPassword));
|
new UsernamePasswordCredentials(proxyUser, proxyPassword));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -180,12 +192,22 @@ public final class DavGatewayHttpClientFacade {
|
||||||
* @return Responses enumeration
|
* @return Responses enumeration
|
||||||
* @throws IOException on error
|
* @throws IOException on error
|
||||||
*/
|
*/
|
||||||
public static Enumeration executeSearchMethod(HttpClient httpClient, String path, String searchRequest) throws IOException {
|
public static MultiStatusResponse[] executeSearchMethod(HttpClient httpClient, String path, String searchRequest) throws IOException {
|
||||||
String searchBody = "<?xml version=\"1.0\"?>\n" +
|
String searchBody = "<?xml version=\"1.0\"?>\n" +
|
||||||
"<d:searchrequest xmlns:d=\"DAV:\">\n" +
|
"<d:searchrequest xmlns:d=\"DAV:\">\n" +
|
||||||
" <d:sql>" + searchRequest.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">") + "</d:sql>\n" +
|
" <d:sql>" + searchRequest.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">") + "</d:sql>\n" +
|
||||||
"</d:searchrequest>";
|
"</d:searchrequest>";
|
||||||
SearchMethod searchMethod = new SearchMethod(path, searchBody);
|
DavMethodBase searchMethod = new DavMethodBase(path) {
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return "SEARCH";
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean isSuccess(int statusCode) {
|
||||||
|
return statusCode == 207;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
searchMethod.setRequestEntity(new StringRequestEntity(searchBody, "text/xml", "UTF-8"));
|
||||||
return executeMethod(httpClient, searchMethod);
|
return executeMethod(httpClient, searchMethod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,8 +221,8 @@ public final class DavGatewayHttpClientFacade {
|
||||||
* @return Responses enumeration
|
* @return Responses enumeration
|
||||||
* @throws IOException on error
|
* @throws IOException on error
|
||||||
*/
|
*/
|
||||||
public static Enumeration executePropFindMethod(HttpClient httpClient, String path, int depth, Vector properties) throws IOException {
|
public static MultiStatusResponse[] executePropFindMethod(HttpClient httpClient, String path, int depth, DavPropertyNameSet properties) throws IOException {
|
||||||
PropFindMethod propFindMethod = new PropFindMethod(path, depth, properties.elements());
|
PropFindMethod propFindMethod = new PropFindMethod(path, properties, depth);
|
||||||
return executeMethod(httpClient, propFindMethod);
|
return executeMethod(httpClient, propFindMethod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -223,20 +245,22 @@ public final class DavGatewayHttpClientFacade {
|
||||||
* @return Responses enumeration
|
* @return Responses enumeration
|
||||||
* @throws IOException on error
|
* @throws IOException on error
|
||||||
*/
|
*/
|
||||||
public static Enumeration executeMethod(HttpClient httpClient, XMLResponseMethodBase method) throws IOException {
|
public static MultiStatusResponse[] executeMethod(HttpClient httpClient, DavMethodBase method) throws IOException {
|
||||||
Enumeration responseEnumeration = null;
|
MultiStatusResponse[] responses = null;
|
||||||
try {
|
try {
|
||||||
int status = httpClient.executeMethod(method);
|
int status = httpClient.executeMethod(method);
|
||||||
|
|
||||||
if (status != HttpStatus.SC_MULTI_STATUS) {
|
if (status != HttpStatus.SC_MULTI_STATUS) {
|
||||||
throw buildHttpException(method);
|
throw buildHttpException(method);
|
||||||
}
|
}
|
||||||
responseEnumeration = method.getResponses();
|
responses = method.getResponseBodyAsMultiStatus().getResponses();
|
||||||
|
|
||||||
|
} catch (DavException e) {
|
||||||
|
throw new IOException(e.getMessage());
|
||||||
} finally {
|
} finally {
|
||||||
method.releaseConnection();
|
method.releaseConnection();
|
||||||
}
|
}
|
||||||
return responseEnumeration;
|
return responses;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int executeHttpMethod(HttpClient httpClient, HttpMethod method) throws IOException {
|
public static int executeHttpMethod(HttpClient httpClient, HttpMethod method) throws IOException {
|
||||||
|
|
|
@ -1,169 +0,0 @@
|
||||||
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
|
|
||||||
// Jad home page: http://kpdus.tripod.com/jad.html
|
|
||||||
// Decompiler options: packimports(3)
|
|
||||||
// Source File Name: HttpAuthenticator.java
|
|
||||||
|
|
||||||
package org.apache.commons.httpclient.auth;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.apache.commons.httpclient.*;
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
import org.apache.commons.logging.LogFactory;
|
|
||||||
|
|
||||||
// Referenced classes of package org.apache.commons.httpclient.auth:
|
|
||||||
// NTLMScheme, DigestScheme, BasicScheme, AuthenticationException,
|
|
||||||
// MalformedChallengeException, AuthChallengeParser, AuthScheme
|
|
||||||
|
|
||||||
public final class HttpAuthenticator {
|
|
||||||
|
|
||||||
public HttpAuthenticator() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public static AuthScheme selectAuthScheme(Header challenges[])
|
|
||||||
throws MalformedChallengeException {
|
|
||||||
LOG.trace("enter HttpAuthenticator.selectAuthScheme(Header[])");
|
|
||||||
if (challenges == null)
|
|
||||||
throw new IllegalArgumentException("Array of challenges may not be null");
|
|
||||||
if (challenges.length == 0)
|
|
||||||
throw new IllegalArgumentException("Array of challenges may not be empty");
|
|
||||||
String challenge = null;
|
|
||||||
Map challengemap = new HashMap(challenges.length);
|
|
||||||
for (int i = 0; i < challenges.length; i++) {
|
|
||||||
challenge = challenges[i].getValue();
|
|
||||||
String s = AuthChallengeParser.extractScheme(challenge);
|
|
||||||
challengemap.put(s, challenge);
|
|
||||||
}
|
|
||||||
|
|
||||||
challenge = (String) challengemap.get("digest");
|
|
||||||
if (challenge != null)
|
|
||||||
return new DigestScheme(challenge);
|
|
||||||
challenge = (String) challengemap.get("basic");
|
|
||||||
if (challenge != null)
|
|
||||||
return new BasicScheme(challenge);
|
|
||||||
// patch ntlm last priority
|
|
||||||
challenge = (String) challengemap.get("ntlm");
|
|
||||||
if (challenge != null)
|
|
||||||
return new NTLMScheme(challenge);
|
|
||||||
else
|
|
||||||
throw new UnsupportedOperationException("Authentication scheme(s) not supported: " + challengemap.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean doAuthenticateDefault(HttpMethod method, HttpConnection conn, HttpState state, boolean proxy)
|
|
||||||
throws AuthenticationException {
|
|
||||||
if (method == null)
|
|
||||||
throw new IllegalArgumentException("HTTP method may not be null");
|
|
||||||
if (state == null)
|
|
||||||
throw new IllegalArgumentException("HTTP state may not be null");
|
|
||||||
String host = null;
|
|
||||||
if (conn != null)
|
|
||||||
host = proxy ? conn.getProxyHost() : conn.getHost();
|
|
||||||
org.apache.commons.httpclient.Credentials credentials = proxy ? state.getProxyCredentials(null, host) : state.getCredentials(null, host);
|
|
||||||
if (credentials == null) {
|
|
||||||
if (LOG.isWarnEnabled())
|
|
||||||
LOG.warn("Default credentials for " + host + " not available");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!(credentials instanceof UsernamePasswordCredentials))
|
|
||||||
throw new AuthenticationException("Credentials cannot be used for basic authentication: " + credentials.toString());
|
|
||||||
String auth = BasicScheme.authenticate((UsernamePasswordCredentials) credentials);
|
|
||||||
if (auth != null) {
|
|
||||||
String s = proxy ? "Proxy-Authorization" : "Authorization";
|
|
||||||
method.setRequestHeader(s, auth);
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean authenticateDefault(HttpMethod method, HttpConnection conn, HttpState state)
|
|
||||||
throws AuthenticationException {
|
|
||||||
LOG.trace("enter HttpAuthenticator.authenticateDefault(HttpMethod, HttpConnection, HttpState)");
|
|
||||||
return doAuthenticateDefault(method, conn, state, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean authenticateProxyDefault(HttpMethod method, HttpConnection conn, HttpState state)
|
|
||||||
throws AuthenticationException {
|
|
||||||
LOG.trace("enter HttpAuthenticator.authenticateProxyDefault(HttpMethod, HttpState)");
|
|
||||||
return doAuthenticateDefault(method, conn, state, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean doAuthenticate(AuthScheme authscheme, HttpMethod method, HttpConnection conn, HttpState state, boolean proxy)
|
|
||||||
throws AuthenticationException {
|
|
||||||
if (authscheme == null)
|
|
||||||
throw new IllegalArgumentException("Authentication scheme may not be null");
|
|
||||||
if (method == null)
|
|
||||||
throw new IllegalArgumentException("HTTP method may not be null");
|
|
||||||
if (state == null)
|
|
||||||
throw new IllegalArgumentException("HTTP state may not be null");
|
|
||||||
String host = null;
|
|
||||||
if (conn != null)
|
|
||||||
if (proxy) {
|
|
||||||
host = conn.getProxyHost();
|
|
||||||
} else {
|
|
||||||
host = conn.getVirtualHost();
|
|
||||||
if (host == null)
|
|
||||||
host = conn.getHost();
|
|
||||||
}
|
|
||||||
String realm = authscheme.getRealm();
|
|
||||||
if (LOG.isDebugEnabled()) {
|
|
||||||
StringBuffer buffer = new StringBuffer();
|
|
||||||
buffer.append("Authenticating with the ");
|
|
||||||
if (realm == null) {
|
|
||||||
buffer.append("default");
|
|
||||||
} else {
|
|
||||||
buffer.append('\'');
|
|
||||||
buffer.append(realm);
|
|
||||||
buffer.append('\'');
|
|
||||||
}
|
|
||||||
buffer.append(" authentication realm at ");
|
|
||||||
buffer.append(host);
|
|
||||||
LOG.debug(buffer.toString());
|
|
||||||
}
|
|
||||||
if (realm == null)
|
|
||||||
realm = host;
|
|
||||||
org.apache.commons.httpclient.Credentials credentials = proxy ? state.getProxyCredentials(realm, host) : state.getCredentials(realm, host);
|
|
||||||
if (credentials == null)
|
|
||||||
throw new AuthenticationException("No credentials available for the '" + authscheme.getRealm() + "' authentication realm at " + host);
|
|
||||||
String auth = authscheme.authenticate(credentials, method.getName(), method.getPath());
|
|
||||||
if (auth != null) {
|
|
||||||
String s = proxy ? "Proxy-Authorization" : "Authorization";
|
|
||||||
method.setRequestHeader(s, auth);
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean authenticate(AuthScheme authscheme, HttpMethod method, HttpConnection conn, HttpState state)
|
|
||||||
throws AuthenticationException {
|
|
||||||
LOG.trace("enter HttpAuthenticator.authenticate(AuthScheme, HttpMethod, HttpConnection, HttpState)");
|
|
||||||
return doAuthenticate(authscheme, method, conn, state, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean authenticateProxy(AuthScheme authscheme, HttpMethod method, HttpConnection conn, HttpState state)
|
|
||||||
throws AuthenticationException {
|
|
||||||
LOG.trace("enter HttpAuthenticator.authenticateProxy(AuthScheme, HttpMethod, HttpState)");
|
|
||||||
return doAuthenticate(authscheme, method, conn, state, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Class _mthclass$(String x0) {
|
|
||||||
try {
|
|
||||||
return Class.forName(x0);
|
|
||||||
}
|
|
||||||
catch (ClassNotFoundException x1) {
|
|
||||||
throw new NoClassDefFoundError(x1.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final Log LOG;
|
|
||||||
public static final String WWW_AUTH = "WWW-Authenticate";
|
|
||||||
public static final String WWW_AUTH_RESP = "Authorization";
|
|
||||||
public static final String PROXY_AUTH = "Proxy-Authenticate";
|
|
||||||
public static final String PROXY_AUTH_RESP = "Proxy-Authorization";
|
|
||||||
|
|
||||||
static {
|
|
||||||
LOG = LogFactory.getLog(org.apache.commons.httpclient.auth.HttpAuthenticator.class);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue