Fixes from audit

git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1213 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
mguessan 2010-07-20 09:10:39 +00:00
parent fbfa09cba9
commit 0eeefb9098
13 changed files with 76 additions and 109 deletions

View File

@ -258,13 +258,12 @@ public class CaldavConnection extends AbstractConnection {
sendHttpResponse(itemResult.status, buildEtagHeader(itemResult.etag), null, "", true);
} else if (request.isDelete()) {
int status;
if (request.getFolderPath().endsWith("inbox")) {
status = session.processItem(request.getFolderPath(), lastPath);
session.processItem(request.getFolderPath(), lastPath);
} else {
status = session.deleteItem(request.getFolderPath(), lastPath);
session.deleteItem(request.getFolderPath(), lastPath);
}
sendHttpResponse(status);
sendHttpResponse(HttpStatus.SC_OK);
} else if (request.isGet()) {
if (request.path.endsWith("/")) {
// GET request on a folder => build ics content of all folder events
@ -1410,9 +1409,8 @@ public class CaldavConnection extends AbstractConnection {
* Get request folder path.
*
* @return exchange folder path
* @throws IOException on error
*/
public String getFolderPath() throws IOException {
public String getFolderPath() {
return getFolderPath(null);
}

View File

@ -2580,17 +2580,16 @@ public abstract class ExchangeSession {
* @return HTTP status
* @throws IOException on error
*/
public abstract int deleteItem(String folderPath, String itemName) throws IOException;
public abstract void deleteItem(String folderPath, String itemName) throws IOException;
/**
* Mark event processed named eventName in folder
*
* @param folderPath Exchange folder path
* @param itemName item name
* @return HTTP status
* @throws IOException on error
*/
public abstract int processItem(String folderPath, String itemName) throws IOException;
public abstract void processItem(String folderPath, String itemName) throws IOException;
private static int dumpIndex;

View File

@ -1278,13 +1278,13 @@ public class DavExchangeSession extends ExchangeSession {
}
@Override
public int deleteItem(String folderPath, String itemName) throws IOException {
public void deleteItem(String folderPath, String itemName) throws IOException {
String eventPath = URIUtil.encodePath(getFolderPath(folderPath) + '/' + convertItemNameToEML(itemName));
return DavGatewayHttpClientFacade.executeDeleteMethod(httpClient, eventPath);
DavGatewayHttpClientFacade.executeDeleteMethod(httpClient, eventPath);
}
@Override
public int processItem(String folderPath, String itemName) throws IOException {
public void processItem(String folderPath, String itemName) throws IOException {
String eventPath = URIUtil.encodePath(getFolderPath(folderPath) + '/' + convertItemNameToEML(itemName));
// do not delete calendar messages, mark read and processed
ArrayList<DavConstants> list = new ArrayList<DavConstants>();
@ -1292,7 +1292,6 @@ public class DavExchangeSession extends ExchangeSession {
list.add(Field.createDavProperty("read", "1"));
PropPatchMethod patchMethod = new PropPatchMethod(eventPath, list);
DavGatewayHttpClientFacade.executeMethod(httpClient, patchMethod);
return HttpStatus.SC_OK;
}
/**

View File

@ -487,23 +487,23 @@ public class EwsExchangeSession extends ExchangeSession {
protected static final HashSet<FieldURI> FOLDER_PROPERTIES = new HashSet<FieldURI>();
static {
FOLDER_PROPERTIES.add(ExtendedFieldURI.PR_URL_COMP_NAME);
FOLDER_PROPERTIES.add(ExtendedFieldURI.PR_LAST_MODIFICATION_TIME);
FOLDER_PROPERTIES.add(ExtendedFieldURI.PR_CONTAINER_CLASS);
FOLDER_PROPERTIES.add(ExtendedFieldURI.PR_LOCAL_COMMIT_TIME_MAX);
FOLDER_PROPERTIES.add(ExtendedFieldURI.PR_CONTENT_UNREAD);
FOLDER_PROPERTIES.add(ExtendedFieldURI.PR_SUBFOLDERS);
FOLDER_PROPERTIES.add(Field.get("urlcompname"));
FOLDER_PROPERTIES.add(Field.get("lastmodified"));
FOLDER_PROPERTIES.add(Field.get("folderclass"));
FOLDER_PROPERTIES.add(Field.get("ctag"));
FOLDER_PROPERTIES.add(Field.get("unread"));
FOLDER_PROPERTIES.add(Field.get("hassubs"));
}
protected Folder buildFolder(EWSMethod.Item item) {
Folder folder = new Folder();
folder.folderId = new FolderId(item);
folder.displayName = item.get(ExtendedFieldURI.PR_URL_COMP_NAME.getResponseName());
folder.folderClass = item.get(ExtendedFieldURI.PR_CONTAINER_CLASS.getResponseName());
folder.etag = item.get(ExtendedFieldURI.PR_LAST_MODIFICATION_TIME.getResponseName());
folder.ctag = item.get(ExtendedFieldURI.PR_LOCAL_COMMIT_TIME_MAX.getResponseName());
folder.unreadCount = item.getInt(ExtendedFieldURI.PR_CONTENT_UNREAD.getResponseName());
folder.hasChildren = item.getBoolean(ExtendedFieldURI.PR_SUBFOLDERS.getResponseName());
folder.displayName = item.get(Field.get("urlcompname").getResponseName());
folder.folderClass = item.get(Field.get("folderclass").getResponseName());
folder.etag = item.get(Field.get("lastmodified").getResponseName());
folder.ctag = item.get(Field.get("ctag").getResponseName());
folder.unreadCount = item.getInt(Field.get("unread").getResponseName());
folder.hasChildren = item.getBoolean(Field.get("hassubs").getResponseName());
// noInferiors not implemented
return folder;
}
@ -534,11 +534,11 @@ public class EwsExchangeSession extends ExchangeSession {
for (EWSMethod.Item item : findFolderMethod.getResponseItems()) {
Folder folder = buildFolder(item);
if (parentFolderPath.length() > 0) {
folder.folderPath = parentFolderPath + '/' + item.get(ExtendedFieldURI.PR_URL_COMP_NAME.getResponseName());
folder.folderPath = parentFolderPath + '/' + item.get(Field.get("urlcompname").getResponseName());
} else if (folderIdMap.get(folder.folderId.value) != null) {
folder.folderPath = folderIdMap.get(folder.folderId.value);
} else {
folder.folderPath = item.get(ExtendedFieldURI.PR_URL_COMP_NAME.getResponseName());
folder.folderPath = item.get(Field.get("urlcompname").getResponseName());
}
folders.add(folder);
if (recursive && folder.hasChildren) {
@ -629,7 +629,7 @@ public class EwsExchangeSession extends ExchangeSession {
// rename folder
if (!path.folderName.equals(targetPath.folderName)) {
Set<FieldUpdate> updates = new HashSet<FieldUpdate>();
updates.add(new FieldUpdate(UnindexedFieldURI.FOLDER_DISPLAYNAME, targetPath.folderName));
updates.add(new FieldUpdate(Field.get("folderDisplayName"), targetPath.folderName));
UpdateFolderMethod updateFolderMethod = new UpdateFolderMethod(folderId, updates);
executeMethod(updateFolderMethod);
}
@ -982,18 +982,17 @@ public class EwsExchangeSession extends ExchangeSession {
}
@Override
public int deleteItem(String folderPath, String itemName) throws IOException {
public void deleteItem(String folderPath, String itemName) throws IOException {
String urlcompname = convertItemNameToEML(itemName);
List<EWSMethod.Item> responses = searchItems(folderPath, EVENT_REQUEST_PROPERTIES, equals("urlcompname", urlcompname), FolderQueryTraversal.SHALLOW);
if (!responses.isEmpty()) {
DeleteItemMethod deleteItemMethod = new DeleteItemMethod(new ItemId(responses.get(0)), DeleteType.HardDelete);
executeMethod(deleteItemMethod);
}
return HttpStatus.SC_OK;
}
@Override
public int processItem(String folderPath, String itemName) throws IOException {
public void processItem(String folderPath, String itemName) throws IOException {
String urlcompname = convertItemNameToEML(itemName);
List<EWSMethod.Item> responses = searchItems(folderPath, EVENT_REQUEST_PROPERTIES, equals("urlcompname", urlcompname), FolderQueryTraversal.SHALLOW);
if (!responses.isEmpty()) {
@ -1006,7 +1005,6 @@ public class EwsExchangeSession extends ExchangeSession {
new ItemId(responses.get(0)), buildProperties(localProperties));
executeMethod(updateItemMethod);
}
return HttpStatus.SC_OK;
}
@Override
@ -1101,7 +1099,7 @@ public class EwsExchangeSession extends ExchangeSession {
parentFolderId,
FOLDER_PROPERTIES,
new TwoOperandExpression(TwoOperandExpression.Operator.IsEqualTo,
ExtendedFieldURI.PR_URL_COMP_NAME, folderName)
Field.get("urlcompname"), folderName)
);
executeMethod(findFolderMethod);
EWSMethod.Item item = findFolderMethod.getResponseItem();
@ -1111,15 +1109,13 @@ public class EwsExchangeSession extends ExchangeSession {
return folderId;
}
protected int executeMethod(EWSMethod ewsMethod) throws IOException {
int status;
protected void executeMethod(EWSMethod ewsMethod) throws IOException {
try {
status = httpClient.executeMethod(ewsMethod);
httpClient.executeMethod(ewsMethod);
ewsMethod.checkSuccess();
} finally {
ewsMethod.releaseConnection();
}
return status;
}
protected String convertDate(String exchangeDateValue) throws DavMailException {

View File

@ -22,12 +22,15 @@ package davmail.exchange.ews;
* Extended MAPI property.
*/
public class ExtendedFieldURI implements FieldURI {
@SuppressWarnings({"UnusedDeclaration"})
protected enum PropertyType {
ApplicationTime, ApplicationTimeArray, Binary, BinaryArray, Boolean, CLSID, CLSIDArray, Currency, CurrencyArray,
Double, DoubleArray, Error, Float, FloatArray, Integer, IntegerArray, Long, LongArray, Null, Object,
ObjectArray, Short, ShortArray, SystemTime, SystemTimeArray, String, StringArray
}
@SuppressWarnings({"UnusedDeclaration"})
protected static enum DistinguishedPropertySetType {
Meeting, Appointment, Common, PublicStrings, Address, InternetHeaders, CalendarAssistant, UnifiedMessaging, Task
}
@ -81,6 +84,7 @@ public class ExtendedFieldURI implements FieldURI {
*
* @param distinguishedPropertySetId distinguished property set id
* @param propertyName property name
* @param propertyType property type
*/
public ExtendedFieldURI(DistinguishedPropertySetType distinguishedPropertySetId, String propertyName, PropertyType propertyType) {
this.distinguishedPropertySetId = distinguishedPropertySetId;
@ -158,23 +162,5 @@ public class ExtendedFieldURI implements FieldURI {
}
}
public static final ExtendedFieldURI PR_INSTANCE_KEY = new ExtendedFieldURI(0xff6, PropertyType.Binary);
public static final ExtendedFieldURI PR_MESSAGE_SIZE = new ExtendedFieldURI(0xe08, PropertyType.Integer);
public static final ExtendedFieldURI PR_INTERNET_ARTICLE_NUMBER = new ExtendedFieldURI(0xe23, PropertyType.Integer);
public static final ExtendedFieldURI JUNK_FLAG = new ExtendedFieldURI(0x1083, PropertyType.Integer);
public static final ExtendedFieldURI PR_FLAG_STATUS = new ExtendedFieldURI(0x1090, PropertyType.Integer);
public static final ExtendedFieldURI PR_MESSAGE_FLAGS = new ExtendedFieldURI(0x0e07, PropertyType.Integer);
public static final ExtendedFieldURI PR_ACTION_FLAG = new ExtendedFieldURI(0x1081, PropertyType.Integer);
public static final ExtendedFieldURI PR_URL_COMP_NAME = new ExtendedFieldURI(0x10f3, PropertyType.String);
public static final ExtendedFieldURI PR_CONTAINER_CLASS = new ExtendedFieldURI(0x3613, PropertyType.String);
public static final ExtendedFieldURI PR_LAST_MODIFICATION_TIME = new ExtendedFieldURI(0x3008, PropertyType.SystemTime);
public static final ExtendedFieldURI PR_LOCAL_COMMIT_TIME_MAX = new ExtendedFieldURI(0x670a, PropertyType.SystemTime);
public static final ExtendedFieldURI PR_SUBFOLDERS = new ExtendedFieldURI(0x360a, PropertyType.Boolean);
public static final ExtendedFieldURI PR_CONTENT_UNREAD = new ExtendedFieldURI(0x3603, PropertyType.Integer);
// message properties
public static final ExtendedFieldURI PR_READ = new ExtendedFieldURI(0xe69, PropertyType.Boolean);
}

View File

@ -37,6 +37,12 @@ public class Field {
FIELD_MAP.put("urlcompname", new ExtendedFieldURI(0x10f3, ExtendedFieldURI.PropertyType.String));
FIELD_MAP.put("lastmodified", new ExtendedFieldURI(0x3008, ExtendedFieldURI.PropertyType.SystemTime));
// folder
FIELD_MAP.put("ctag", new ExtendedFieldURI(0x670a, ExtendedFieldURI.PropertyType.SystemTime)); // PR_LOCAL_COMMIT_TIME_MAX
FIELD_MAP.put("unread", new ExtendedFieldURI(0x3603, ExtendedFieldURI.PropertyType.Integer)); // PR_CONTENT_UNREAD
FIELD_MAP.put("hassubs", new ExtendedFieldURI(0x360a, ExtendedFieldURI.PropertyType.Boolean)); // PR_SUBFOLDERS
FIELD_MAP.put("folderDisplayName", new UnindexedFieldURI("folder:DisplayName"));
FIELD_MAP.put("permanenturl", new ExtendedFieldURI(0x670E, ExtendedFieldURI.PropertyType.String)); //PR_FLAT_URL_NAME
FIELD_MAP.put("instancetype", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.PublicStrings, "urn:schemas:calendar:instancetype"));

View File

@ -34,5 +34,6 @@ public final class FolderQueryTraversal extends AttributeOption {
/**
* Recursive search.
*/
@SuppressWarnings({"UnusedDeclaration"})
public static final FolderQueryTraversal DEEP = new FolderQueryTraversal("Deep");
}

View File

@ -28,17 +28,6 @@ public class ItemId {
protected final String id;
protected final String changeKey;
/**
* Create Item id.
*
* @param id item id
* @param changeKey item change key
*/
public ItemId(String id, String changeKey) {
this.id = id;
this.changeKey = changeKey;
}
/**
* Build Item id from response item.
*

View File

@ -72,7 +72,4 @@ public class UnindexedFieldURI implements FieldURI {
return fieldName;
}
public static final UnindexedFieldURI DATE_TIME_SENT = new UnindexedFieldURI("item:DateTimeSent");
public static final UnindexedFieldURI FOLDER_DISPLAYNAME = new UnindexedFieldURI("folder:DisplayName");
}

View File

@ -332,10 +332,9 @@ public final class DavGatewayHttpClientFacade {
*
* @param httpClient Http client instance
* @param path Path to be deleted
* @return Http status
* @throws IOException on error
*/
public static int executeDeleteMethod(HttpClient httpClient, String path) throws IOException {
public static void executeDeleteMethod(HttpClient httpClient, String path) throws IOException {
DeleteMethod deleteMethod = new DeleteMethod(path);
deleteMethod.setFollowRedirects(false);
@ -344,7 +343,6 @@ public final class DavGatewayHttpClientFacade {
if (status != HttpStatus.SC_OK && status != HttpStatus.SC_NOT_FOUND) {
throw DavGatewayHttpClientFacade.buildHttpException(deleteMethod);
}
return HttpStatus.SC_OK;
}
/**
@ -413,12 +411,13 @@ public final class DavGatewayHttpClientFacade {
/**
* Enable NTLM authentication on http client
*
* @param httpClient HttpClient instance
*/
public static void addNTLM(HttpClient httpClient) {
// register the jcifs based NTLMv2 implementation
AuthPolicy.registerAuthScheme(AuthPolicy.NTLM, NTLMv2Scheme.class);
ArrayList<String> authPrefs = new ArrayList<String>();
authPrefs.add(AuthPolicy.NTLM);
authPrefs.add(AuthPolicy.DIGEST);
@ -453,7 +452,7 @@ public final class DavGatewayHttpClientFacade {
acceptNTLM = true;
}
if ("Basic realm".equalsIgnoreCase(headerElement.getName())) {
acceptBasic = true;
acceptBasic = true;
}
}
return acceptNTLM && !acceptBasic;
@ -490,10 +489,9 @@ public final class DavGatewayHttpClientFacade {
* @param httpClient Http client instance
* @param method Http method
* @param followRedirects Follow redirects flag
* @return Http status
* @throws IOException on error
*/
public static int executeGetMethod(HttpClient httpClient, GetMethod method, boolean followRedirects) throws IOException {
public static void executeGetMethod(HttpClient httpClient, GetMethod method, boolean followRedirects) throws IOException {
// do not follow redirects in expired sessions
method.setFollowRedirects(followRedirects);
int status = httpClient.executeMethod(method);
@ -517,7 +515,6 @@ public final class DavGatewayHttpClientFacade {
throw DavGatewayHttpClientFacade.buildHttpException(method);
}
}
return status;
}
private static void resetMethod(HttpMethod method) {

View File

@ -1498,7 +1498,7 @@ public class LdapConnection extends AbstractConnection {
String value = person.get(contactAttribute);
if (value != null) {
if (ldapAttribute.startsWith("birth")) {
SimpleDateFormat parser = session.getZuluDateFormat();
SimpleDateFormat parser = ExchangeSession.getZuluDateFormat();
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(parser.parse(value));

View File

@ -18,6 +18,7 @@
*/
package davmail.exchange;
import davmail.util.IOUtil;
import org.apache.commons.codec.binary.Base64;
import java.io.ByteArrayOutputStream;
@ -32,31 +33,6 @@ import java.util.UUID;
@SuppressWarnings({"UseOfSystemOutOrSystemErr"})
public class TestExchangeSessionContact extends AbstractExchangeSessionTestCase {
static String itemName;
/*
public void testSearchContacts() throws IOException {
List<ExchangeSession.Contact> contacts = session.searchContacts(ExchangeSession.CONTACTS, ExchangeSession.CONTACT_ATTRIBUTES, null);
for (ExchangeSession.Contact contact : contacts) {
System.out.println(session.getItem(ExchangeSession.CONTACTS, contact.getName()));
}
}
public void testSearchContactsUidOnly() throws IOException {
Set<String> attributes = new HashSet<String>();
attributes.add("uid");
List<ExchangeSession.Contact> contacts = session.searchContacts(ExchangeSession.CONTACTS, attributes, null);
for (ExchangeSession.Contact contact : contacts) {
System.out.println(contact);
}
}
public void testSearchContactsByUid() throws IOException {
Set<String> attributes = new HashSet<String>();
attributes.add("uid");
List<ExchangeSession.Contact> contacts = session.searchContacts(ExchangeSession.CONTACTS, attributes, null);
for (ExchangeSession.Contact contact : contacts) {
System.out.println(session.searchContacts(ExchangeSession.CONTACTS, attributes, session.equals("uid", contact.get("uid"))));
}
} */
public void testCreateFolder() throws IOException {
// recreate empty folder
@ -110,12 +86,8 @@ public class TestExchangeSessionContact extends AbstractExchangeSessionTestCase
// add photo
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream partInputStream = new FileInputStream("src/data/anonymous.jpg");
byte[] bytes = new byte[8192];
int length;
while ((length = partInputStream.read(bytes)) > 0) {
baos.write(bytes, 0, length);
}
InputStream fileInputStream = new FileInputStream("src/data/anonymous.jpg");
IOUtil.write(fileInputStream, baos);
vCardWriter.appendProperty("PHOTO;ENCODING=b;TYPE=JPEG", new String(Base64.encodeBase64(baos.toByteArray())));
vCardWriter.endCard();

View File

@ -21,7 +21,9 @@ package davmail.exchange;
import davmail.Settings;
import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Test contact search.
@ -47,4 +49,29 @@ public class TestExchangeSessionSearchContact extends AbstractExchangeSessionTes
}
}
public void testSearchContacts() throws IOException {
List<ExchangeSession.Contact> contacts = session.searchContacts(ExchangeSession.CONTACTS, ExchangeSession.CONTACT_ATTRIBUTES, null);
for (ExchangeSession.Contact contact : contacts) {
System.out.println(session.getItem(ExchangeSession.CONTACTS, contact.getName()));
}
}
public void testSearchContactsUidOnly() throws IOException {
Set<String> attributes = new HashSet<String>();
attributes.add("uid");
List<ExchangeSession.Contact> contacts = session.searchContacts(ExchangeSession.CONTACTS, attributes, null);
for (ExchangeSession.Contact contact : contacts) {
System.out.println(contact);
}
}
public void testSearchContactsByUid() throws IOException {
Set<String> attributes = new HashSet<String>();
attributes.add("uid");
List<ExchangeSession.Contact> contacts = session.searchContacts(ExchangeSession.CONTACTS, attributes, null);
for (ExchangeSession.Contact contact : contacts) {
System.out.println(session.searchContacts(ExchangeSession.CONTACTS, attributes, session.equals("uid", contact.get("uid"))));
}
}
}