package org.anhonesteffort.flock.sync.key; import android.content.Context; import android.util.Log; import org.anhonesteffort.flock.util.guava.Optional; import org.anhonesteffort.flock.DavAccountHelper; import org.anhonesteffort.flock.auth.DavAccount; import org.anhonesteffort.flock.webdav.DavClient; import org.anhonesteffort.flock.webdav.PropertyParseException; import org.anhonesteffort.flock.webdav.WebDavConstants; import org.anhonesteffort.flock.webdav.caldav.CalDavCollection; import org.anhonesteffort.flock.webdav.caldav.CalDavConstants; import org.anhonesteffort.flock.webdav.caldav.CalDavStore; import org.apache.jackrabbit.webdav.DavException; import org.apache.jackrabbit.webdav.MultiStatus; import org.apache.jackrabbit.webdav.MultiStatusResponse; import org.apache.jackrabbit.webdav.client.methods.PropFindMethod; import org.apache.jackrabbit.webdav.property.DavPropertyNameSet; import java.io.IOException; import java.util.List; /** * rhodey */ public class DavKeyStore extends CalDavStore { private static final String TAG = "org.anhonesteffort.flock.sync.key.DavKeyStore"; public static final String PATH_KEY_COLLECTION = "key-material/"; public DavKeyStore(DavClient client, Optional<String> currentUserPrincipal, Optional<String> calendarHomeSet) { super(client, currentUserPrincipal, calendarHomeSet); } public static void createCollection(Context context, DavAccount account) throws PropertyParseException, DavException, IOException { Log.w(TAG, "creating key collection"); DavKeyStore store = DavAccountHelper.getDavKeyStore(context, account); try { Optional<String> calendarHomeSet = store.getCalendarHomeSet(); if (!calendarHomeSet.isPresent()) throw new PropertyParseException("No calendar-home-set property found for user.", store.getHostHREF(), CalDavConstants.PROPERTY_NAME_CALENDAR_HOME_SET); store.addCollection(calendarHomeSet.get().concat(PATH_KEY_COLLECTION)); } finally { store.closeHttpConnection(); } } public Optional<DavKeyCollection> getCollection() throws PropertyParseException, DavException, IOException { Optional<String> calendarHomeSet = getCalendarHomeSet(); if (!calendarHomeSet.isPresent()) throw new PropertyParseException("No calendar-home-set property found for user.", getHostHREF(), CalDavConstants.PROPERTY_NAME_CALENDAR_HOME_SET); String collectionPath = calendarHomeSet.get().concat(PATH_KEY_COLLECTION); DavKeyCollection targetCollection = new DavKeyCollection(this, collectionPath); DavPropertyNameSet collectionProps = targetCollection.getPropertyNamesForFetch(); PropFindMethod propFindMethod = new PropFindMethod(collectionPath, collectionProps, PropFindMethod.DEPTH_0); try { getClient().execute(propFindMethod); MultiStatus multiStatus = propFindMethod.getResponseBodyAsMultiStatus(); MultiStatusResponse[] responses = multiStatus.getResponses(); List<CalDavCollection> returnedCollections = getCollectionsFromMultiStatusResponses(this, responses); if (returnedCollections.size() == 0) Optional.absent(); return Optional.of( new DavKeyCollection(returnedCollections.get(0), returnedCollections.get(0).getPath()) ); } catch (DavException e) { if (e.getErrorCode() == WebDavConstants.SC_NOT_FOUND) return Optional.absent(); throw e; } finally { propFindMethod.releaseConnection(); } } }