From 897ede75821cf8028c46e16a10368053bb32070e Mon Sep 17 00:00:00 2001 From: R Hirner Date: Sun, 28 Dec 2014 16:33:45 +0100 Subject: [PATCH] TLS/SNI support, proxy support * SNI now works for proxied connections, too * "Cannot verify hostname" message removed and split into two localized messages: one for unknown certificates, the other for hostname mismatch --- AndroidManifest.xml | 79 -- .../QueryServerDialogFragment.java | 14 +- .../davdroid/webdav/TlsSniSocketFactory.java | 173 ++-- app/src/main/res/values-de/strings.xml | 4 +- app/src/main/res/values/strings.xml | 4 +- import-summary.txt | 741 ------------------ 6 files changed, 114 insertions(+), 901 deletions(-) delete mode 100644 AndroidManifest.xml delete mode 100644 import-summary.txt diff --git a/AndroidManifest.xml b/AndroidManifest.xml deleted file mode 100644 index dfa974cc..00000000 --- a/AndroidManifest.xml +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/QueryServerDialogFragment.java b/app/src/main/java/at/bitfire/davdroid/syncadapter/QueryServerDialogFragment.java index df5efc82..756850ef 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/QueryServerDialogFragment.java +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/QueryServerDialogFragment.java @@ -20,11 +20,17 @@ import android.view.ViewGroup; import android.widget.ProgressBar; import android.widget.Toast; +import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.http.HttpException; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; +import java.security.cert.CertPathValidatorException; +import java.security.cert.CertificateException; + +import javax.net.ssl.SSLHandshakeException; +import javax.net.ssl.SSLPeerUnverifiedException; import at.bitfire.davdroid.R; import at.bitfire.davdroid.resource.DavResourceFinder; @@ -113,8 +119,14 @@ public class QueryServerDialogFragment extends DialogFragment implements LoaderC finder.findResources(serverInfo); } catch (URISyntaxException e) { serverInfo.setErrorMessage(getContext().getString(R.string.exception_uri_syntax, e.getMessage())); - } catch (IOException e) { + } catch (IOException e) { + // general message serverInfo.setErrorMessage(getContext().getString(R.string.exception_io, e.getLocalizedMessage())); + // overwrite by more specific message, if possible + if (ExceptionUtils.indexOfType(e, CertPathValidatorException.class) != -1) + serverInfo.setErrorMessage(getContext().getString(R.string.exception_cert_path_validation, e.getMessage())); + else if (ExceptionUtils.indexOfType(e, SSLPeerUnverifiedException.class) != -1) + serverInfo.setErrorMessage(getContext().getString(R.string.exception_peer_unverified, e.getMessage())); } catch (HttpException e) { Log.e(TAG, "HTTP error while querying server info", e); serverInfo.setErrorMessage(getContext().getString(R.string.exception_http, e.getLocalizedMessage())); diff --git a/app/src/main/java/at/bitfire/davdroid/webdav/TlsSniSocketFactory.java b/app/src/main/java/at/bitfire/davdroid/webdav/TlsSniSocketFactory.java index 99af712f..2cff28ed 100644 --- a/app/src/main/java/at/bitfire/davdroid/webdav/TlsSniSocketFactory.java +++ b/app/src/main/java/at/bitfire/davdroid/webdav/TlsSniSocketFactory.java @@ -13,6 +13,7 @@ import android.net.SSLCertificateSocketFactory; import android.os.Build; import android.util.Log; +import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.apache.http.HttpHost; import org.apache.http.conn.socket.LayeredConnectionSocketFactory; @@ -23,129 +24,128 @@ import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; import java.net.UnknownHostException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertPathValidatorException; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import javax.net.ssl.HandshakeCompletedEvent; +import javax.net.ssl.HandshakeCompletedListener; import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLPeerUnverifiedException; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.X509TrustManager; public class TlsSniSocketFactory implements LayeredConnectionSocketFactory { private static final String TAG = "davdroid.SNISocketFactory"; public final static TlsSniSocketFactory INSTANCE = new TlsSniSocketFactory(); - - private final static SSLCertificateSocketFactory sslSocketFactory = - (SSLCertificateSocketFactory)SSLCertificateSocketFactory.getDefault(0); - private final static HostnameVerifier hostnameVerifier = new BrowserCompatHostnameVerifierHC4(); + + private final static SSLSocketFactory sslSocketFactory = (SSLSocketFactory)SSLSocketFactory.getDefault(); + private final static HostnameVerifier hostnameVerifier = HttpsURLConnection.getDefaultHostnameVerifier(); /* - For SSL connections without HTTP(S) proxy: - 1) createSocket() is called - 2) connectSocket() is called which creates a new SSL connection - 2a) SNI is set up, and then - 2b) the connection is established, hands are shaken and certificate/host name are verified + For TLS connections without HTTPS (CONNECT) proxy: + 1) socket = createSocket() is called + 2) connectSocket(socket) is called which creates a new TLS connection (but no handshake yet) + 3) reasonable encryption settings are applied to socket + 4) SNI is set up for socket + 5) handshake and certificate/host name verification - Layered sockets are used with HTTP(S) proxies: - 1) a new plain socket is created by the HTTP library + Layered sockets are used with HTTPS (CONNECT) proxies: + 1) plain = createSocket() is called 2) the plain socket is connected to http://proxy:8080 3) a CONNECT request is sent to the proxy and the response is parsed - 4) now, createLayeredSocket() is called which wraps an SSL socket around the proxy connection, - doing all the set-up and verfication - 4a) Because SSLSocket.createSocket(socket, ...) always does a handshake without allowing - to set up SNI before, *** SNI is not available for layered connections *** (unless - active by Android's defaults, which it isn't at the moment). + 4) socket = createLayeredSocket(plain) is called to "upgrade" the plain connection to a TLS connection (but no handshake yet) + 5) SNI is set up for socket + 6) handshake and certificate/host name verification */ - @Override public Socket createSocket(HttpContext context) throws IOException { - SSLSocket ssl = (SSLSocket)sslSocketFactory.createSocket(); - setReasonableEncryption(ssl); - return ssl; + return sslSocketFactory.createSocket(); } @Override - public Socket connectSocket(int timeout, Socket plain, HttpHost host, InetSocketAddress remoteAddr, InetSocketAddress localAddr, HttpContext context) throws IOException { - Log.d(TAG, "Preparing direct SSL connection (without proxy) to " + host); - - // we'll rather use an SSLSocket directly - plain.close(); - - // create a plain SSL socket, but don't do hostname/certificate verification yet - SSLSocket ssl = (SSLSocket)sslSocketFactory.createSocket(remoteAddr.getAddress(), host.getPort()); - setReasonableEncryption(ssl); - - // connect, set SNI, shake hands, verify, print connection info - connectWithSNI(ssl, host.getHostName()); - - return ssl; + public Socket connectSocket(int timeout, Socket sock, HttpHost host, InetSocketAddress remoteAddr, InetSocketAddress localAddr, HttpContext context) throws IOException { + Log.d(TAG, "Preparing direct TLS connection to " + host); + final SSLSocket socket = (SSLSocket)((sock != null) ? sock : createSocket(context)); + connectAndVerify(socket, host.getHostName()); + return socket; } @Override - public Socket createLayeredSocket(Socket plain, String host, int port, HttpContext context) throws IOException, UnknownHostException { - Log.d(TAG, "Preparing layered SSL connection (over proxy) to " + host); - - // create a layered SSL socket, but don't do hostname/certificate verification yet - SSLSocket ssl = (SSLSocket)sslSocketFactory.createSocket(plain, host, port, true); - setReasonableEncryption(ssl); - - // already connected, but verify host name again and print some connection info - Log.w(TAG, "Setting SNI/TLSv1.2 will silently fail because the handshake is already done"); - connectWithSNI(ssl, host); - - return ssl; + public Socket createLayeredSocket(Socket plain, String host, int port, HttpContext context) throws IOException { + Log.d(TAG, "Preparing proxied TLS connection to " + host); + final SSLSocket socket = (SSLSocket)sslSocketFactory.createSocket(plain, host, port, true); + connectAndVerify(socket, host); + return socket; } - - - @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) - private void connectWithSNI(SSLSocket ssl, String host) throws SSLPeerUnverifiedException { - // - set SNI host name - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - Log.d(TAG, "Using documented SNI with host name " + host); - sslSocketFactory.setHostname(ssl, host); - } else { - Log.d(TAG, "No documented SNI support on Android <4.2, trying with reflection"); - try { - java.lang.reflect.Method setHostnameMethod = ssl.getClass().getMethod("setHostname", String.class); - setHostnameMethod.invoke(ssl, host); - } catch (Exception e) { - Log.w(TAG, "SNI not useable", e); - } - } - + + + /** + * Establishes a connection to an unconnected SSLSocket: + * - prepare socket + * - set SNI host name + * - verify host name + * - verify certificate + * @param socket unconnected SSLSocket + * @param host host name for SNI + * @throws SSLPeerUnverifiedException + */ + private void connectAndVerify(SSLSocket socket, String host) throws IOException, SSLPeerUnverifiedException { + // prepare socket (set encryption etc.) + prepareSSLSocket(socket); + + // set SNI hostname + setSniHostname(socket, host); + + // TLS handshake + socket.startHandshake(); + // verify hostname and certificate - SSLSession session = ssl.getSession(); + SSLSession session = socket.getSession(); if (!hostnameVerifier.verify(host, session)) - throw new SSLPeerUnverifiedException("Cannot verify hostname: " + host); + throw new SSLPeerUnverifiedException(host); Log.d(TAG, "Established " + session.getProtocol() + " connection with " + session.getPeerHost() + " using " + session.getCipherSuite()); } - - + + + /** + * Prepares a TLS/SSL connetion socket by: + * - setting the default TrustManager (as we have created an "insecure" connection to avoid handshake problems before) + * - setting reasonable TLS protocol versions + * - setting reasonable cipher suites (if required) + * @param socket unconnected SSLSocket to prepare + */ @SuppressLint("DefaultLocale") - private void setReasonableEncryption(SSLSocket ssl) { - // set reasonable SSL/TLS settings before the handshake - + private void prepareSSLSocket(SSLSocket socket) { // Android 5.0+ (API level21) provides reasonable default settings // but it still allows SSLv3 // https://developer.android.com/about/versions/android-5.0-changes.html#ssl - // - enable all supported protocols (enables TLSv1.1 and TLSv1.2 on Android <5.0, if available) + /* set reasonable protocol versions */ + // - enable all supported protocols (enables TLSv1.1 and TLSv1.2 on Android <5.0) // - remove all SSL versions (especially SSLv3) because they're insecure now List protocols = new LinkedList(); - for (String protocol : ssl.getSupportedProtocols()) + for (String protocol : socket.getSupportedProtocols()) if (!protocol.toUpperCase().contains("SSL")) protocols.add(protocol); Log.v(TAG, "Setting allowed TLS protocols: " + StringUtils.join(protocols, ", ")); - ssl.setEnabledProtocols(protocols.toArray(new String[0])); + socket.setEnabledProtocols(protocols.toArray(new String[0])); - if (android.os.Build.VERSION.SDK_INT < 21) { + /* set reasonable cipher suites */ + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { // choose secure cipher suites List allowedCiphers = Arrays.asList(new String[] { // allowed secure ciphers according to NIST.SP.800-52r1.pdf Section 3.3.1 (see docs directory) @@ -168,7 +168,7 @@ public class TlsSniSocketFactory implements LayeredConnectionSocketFactory { "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", }); - List availableCiphers = Arrays.asList(ssl.getSupportedCipherSuites()); + List availableCiphers = Arrays.asList(socket.getSupportedCipherSuites()); // preferred ciphers = allowed Ciphers \ availableCiphers HashSet preferredCiphers = new HashSet(allowedCiphers); @@ -179,10 +179,27 @@ public class TlsSniSocketFactory implements LayeredConnectionSocketFactory { // but I guess for the security level of DAVdroid, disabling of insecure // ciphers should be a server-side task HashSet enabledCiphers = preferredCiphers; - enabledCiphers.addAll(new HashSet(Arrays.asList(ssl.getEnabledCipherSuites()))); + enabledCiphers.addAll(new HashSet(Arrays.asList(socket.getEnabledCipherSuites()))); Log.v(TAG, "Setting allowed TLS ciphers: " + StringUtils.join(enabledCiphers, ", ")); - ssl.setEnabledCipherSuites(enabledCiphers.toArray(new String[0])); + socket.setEnabledCipherSuites(enabledCiphers.toArray(new String[0])); + } + } + + @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) + private void setSniHostname(SSLSocket socket, String hostName) { + // set SNI host name + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && sslSocketFactory instanceof SSLCertificateSocketFactory) { + Log.d(TAG, "Using documented SNI with host name " + hostName); + ((SSLCertificateSocketFactory)sslSocketFactory).setHostname(socket, hostName); + } else { + Log.d(TAG, "No documented SNI support on Android <4.2, trying reflection method with host name " + hostName); + try { + java.lang.reflect.Method setHostnameMethod = socket.getClass().getMethod("setHostname", String.class); + setHostnameMethod.invoke(socket, hostName); + } catch (Exception e) { + Log.w(TAG, "SNI not useable", e); + } } } diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index d2252f15..f51f36a8 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -5,10 +5,12 @@ DAVdroid-Website Weiter Hilfe - + + Nicht vertrauenswürdiges Zertifikat in der Zertifikatskette (siehe FAQ) HTTP-Fehler: %s Fehlende Server-Unterstützung: %s E/A-Fehler: %s + Zertifikat ist nicht für \"%s\" ausgestellt URI ungültig: %s diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2625b1af..dcfa1682 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,10 +7,12 @@ DAVdroid Web site Next Help - + + Untrusted certificate in certificate path. See FAQ for more info. HTTP error: %s Missing capabilities: %s I/O error: %s + Certificate not issued for \"%s\" Invalid URI: %s diff --git a/import-summary.txt b/import-summary.txt deleted file mode 100644 index 78d25e5f..00000000 --- a/import-summary.txt +++ /dev/null @@ -1,741 +0,0 @@ -ECLIPSE ANDROID PROJECT IMPORT SUMMARY -====================================== - -Ignored Files: --------------- -The following files were *not* copied into the new Gradle project; you -should evaluate whether these are still needed in your project and if -so manually move them: - -* .gitignore -* .idea/ -* .idea/.name -* .idea/compiler.xml -* .idea/copyright/ -* .idea/copyright/profiles_settings.xml -* .idea/davdroid.iml -* .idea/encodings.xml -* .idea/misc.xml -* .idea/modules.xml -* .idea/scopes/ -* .idea/scopes/scope_settings.xml -* .idea/vcs.xml -* .idea/workspace.xml -* CONTRIBUTING.md -* COPYING -* README.md -* build.xml -* compile-libs/ -* compile-libs/lombok.jar -* doc/ -* doc/NIST.SP.800-52r1.pdf -* doc/how_davdroid_works.svgz -* doc/javadoc/ -* doc/javadoc/allclasses-frame.html -* doc/javadoc/allclasses-noframe.html -* doc/javadoc/at/ -* doc/javadoc/at/bitfire/ -* doc/javadoc/at/bitfire/davdroid/ -* doc/javadoc/at/bitfire/davdroid/ArrayUtils.html -* doc/javadoc/at/bitfire/davdroid/Constants.html -* doc/javadoc/at/bitfire/davdroid/MainActivity.html -* doc/javadoc/at/bitfire/davdroid/URIUtils.html -* doc/javadoc/at/bitfire/davdroid/class-use/ -* doc/javadoc/at/bitfire/davdroid/class-use/ArrayUtils.html -* doc/javadoc/at/bitfire/davdroid/class-use/Constants.html -* doc/javadoc/at/bitfire/davdroid/class-use/MainActivity.html -* doc/javadoc/at/bitfire/davdroid/class-use/URIUtils.html -* doc/javadoc/at/bitfire/davdroid/package-frame.html -* doc/javadoc/at/bitfire/davdroid/package-summary.html -* doc/javadoc/at/bitfire/davdroid/package-tree.html -* doc/javadoc/at/bitfire/davdroid/package-use.html -* doc/javadoc/at/bitfire/davdroid/resource/ -* doc/javadoc/at/bitfire/davdroid/resource/CalDavCalendar.html -* doc/javadoc/at/bitfire/davdroid/resource/CardDavAddressBook.html -* doc/javadoc/at/bitfire/davdroid/resource/Contact.html -* doc/javadoc/at/bitfire/davdroid/resource/Event.html -* doc/javadoc/at/bitfire/davdroid/resource/InvalidResourceException.html -* doc/javadoc/at/bitfire/davdroid/resource/LocalAddressBook.html -* doc/javadoc/at/bitfire/davdroid/resource/LocalCalendar.html -* doc/javadoc/at/bitfire/davdroid/resource/LocalCollection.html -* doc/javadoc/at/bitfire/davdroid/resource/LocalStorageException.html -* doc/javadoc/at/bitfire/davdroid/resource/RecordNotFoundException.html -* doc/javadoc/at/bitfire/davdroid/resource/RemoteCollection.html -* doc/javadoc/at/bitfire/davdroid/resource/Resource.html -* doc/javadoc/at/bitfire/davdroid/resource/class-use/ -* doc/javadoc/at/bitfire/davdroid/resource/class-use/CalDavCalendar.html -* doc/javadoc/at/bitfire/davdroid/resource/class-use/CardDavAddressBook.html -* doc/javadoc/at/bitfire/davdroid/resource/class-use/Contact.html -* doc/javadoc/at/bitfire/davdroid/resource/class-use/Event.html -* doc/javadoc/at/bitfire/davdroid/resource/class-use/InvalidResourceException.html -* doc/javadoc/at/bitfire/davdroid/resource/class-use/LocalAddressBook.html -* doc/javadoc/at/bitfire/davdroid/resource/class-use/LocalCalendar.html -* doc/javadoc/at/bitfire/davdroid/resource/class-use/LocalCollection.html -* doc/javadoc/at/bitfire/davdroid/resource/class-use/LocalStorageException.html -* doc/javadoc/at/bitfire/davdroid/resource/class-use/RecordNotFoundException.html -* doc/javadoc/at/bitfire/davdroid/resource/class-use/RemoteCollection.html -* doc/javadoc/at/bitfire/davdroid/resource/class-use/Resource.html -* doc/javadoc/at/bitfire/davdroid/resource/package-frame.html -* doc/javadoc/at/bitfire/davdroid/resource/package-summary.html -* doc/javadoc/at/bitfire/davdroid/resource/package-tree.html -* doc/javadoc/at/bitfire/davdroid/resource/package-use.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/ -* doc/javadoc/at/bitfire/davdroid/syncadapter/AccountAuthenticatorService.AccountAuthenticator.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/AccountAuthenticatorService.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/AccountDetailsFragment.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/AccountSettings.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/AddAccountActivity.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/CalendarsSyncAdapterService.SyncAdapter.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/CalendarsSyncAdapterService.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/ContactsSyncAdapterService.ContactsSyncAdapter.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/ContactsSyncAdapterService.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/DavSyncAdapter.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/EnterCredentialsFragment.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/GeneralSettingsActivity.GeneralSettingsFragment.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/GeneralSettingsActivity.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/QueryServerDialogFragment.ServerInfoLoader.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/QueryServerDialogFragment.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/SelectCollectionsAdapter.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/SelectCollectionsFragment.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/ServerInfo.ResourceInfo.Type.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/ServerInfo.ResourceInfo.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/ServerInfo.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/SyncManager.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/WebDavResourceAdapter.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/ -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/AccountAuthenticatorService.AccountAuthenticator.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/AccountAuthenticatorService.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/AccountDetailsFragment.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/AccountSettings.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/AddAccountActivity.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/CalendarsSyncAdapterService.SyncAdapter.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/CalendarsSyncAdapterService.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/ContactsSyncAdapterService.ContactsSyncAdapter.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/ContactsSyncAdapterService.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/DavSyncAdapter.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/EnterCredentialsFragment.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/GeneralSettingsActivity.GeneralSettingsFragment.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/GeneralSettingsActivity.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/QueryServerDialogFragment.ServerInfoLoader.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/QueryServerDialogFragment.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/SelectCollectionsAdapter.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/SelectCollectionsFragment.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/ServerInfo.ResourceInfo.Type.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/ServerInfo.ResourceInfo.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/ServerInfo.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/SyncManager.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/class-use/WebDavResourceAdapter.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/package-frame.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/package-summary.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/package-tree.html -* doc/javadoc/at/bitfire/davdroid/syncadapter/package-use.html -* doc/javadoc/at/bitfire/davdroid/webdav/ -* doc/javadoc/at/bitfire/davdroid/webdav/DavAddressbookMultiget.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavCalendarMultiget.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavException.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavHref.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavHttpClient.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavHttpRequestRetryHandler.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavIncapableException.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavMultiget.Type.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavMultiget.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavMultistatus.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavNoContentException.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavNoMultiStatusException.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavAddressbookHomeSet.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavCalendarHomeSet.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavCurrentUserPrincipal.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavPropAddressData.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavPropAddressbookDescription.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavPropCalendarColor.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavPropCalendarData.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavPropCalendarDescription.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavPropCalendarTimezone.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavPropComp.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavPropDisplayName.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavPropGetCTag.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavPropGetETag.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavPropPrivilege.PrivAll.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavPropPrivilege.PrivBind.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavPropPrivilege.PrivUnbind.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavPropPrivilege.PrivWrite.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavPropPrivilege.PrivWriteContent.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavPropPrivilege.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavPropResourceType.Addressbook.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavPropResourceType.Calendar.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.DavPropResourceType.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavProp.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavPropfind.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavPropstat.html -* doc/javadoc/at/bitfire/davdroid/webdav/DavResponse.html -* doc/javadoc/at/bitfire/davdroid/webdav/HttpException.html -* doc/javadoc/at/bitfire/davdroid/webdav/HttpPropfind.Mode.html -* doc/javadoc/at/bitfire/davdroid/webdav/HttpPropfind.html -* doc/javadoc/at/bitfire/davdroid/webdav/HttpReport.html -* doc/javadoc/at/bitfire/davdroid/webdav/NotFoundException.html -* doc/javadoc/at/bitfire/davdroid/webdav/PreconditionFailedException.html -* doc/javadoc/at/bitfire/davdroid/webdav/TlsSniSocketFactory.html -* doc/javadoc/at/bitfire/davdroid/webdav/WebDavResource.Property.html -* doc/javadoc/at/bitfire/davdroid/webdav/WebDavResource.PutMode.html -* doc/javadoc/at/bitfire/davdroid/webdav/WebDavResource.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/ -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavAddressbookMultiget.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavCalendarMultiget.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavException.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavHref.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavHttpClient.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavHttpRequestRetryHandler.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavIncapableException.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavMultiget.Type.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavMultiget.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavMultistatus.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavNoContentException.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavNoMultiStatusException.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavAddressbookHomeSet.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavCalendarHomeSet.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavCurrentUserPrincipal.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavPropAddressData.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavPropAddressbookDescription.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavPropCalendarColor.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavPropCalendarData.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavPropCalendarDescription.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavPropCalendarTimezone.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavPropComp.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavPropDisplayName.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavPropGetCTag.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavPropGetETag.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavPropPrivilege.PrivAll.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavPropPrivilege.PrivBind.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavPropPrivilege.PrivUnbind.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavPropPrivilege.PrivWrite.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavPropPrivilege.PrivWriteContent.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavPropPrivilege.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavPropResourceType.Addressbook.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavPropResourceType.Calendar.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.DavPropResourceType.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavProp.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavPropfind.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavPropstat.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/DavResponse.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/HttpException.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/HttpPropfind.Mode.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/HttpPropfind.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/HttpReport.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/NotFoundException.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/PreconditionFailedException.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/TlsSniSocketFactory.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/WebDavResource.Property.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/WebDavResource.PutMode.html -* doc/javadoc/at/bitfire/davdroid/webdav/class-use/WebDavResource.html -* doc/javadoc/at/bitfire/davdroid/webdav/package-frame.html -* doc/javadoc/at/bitfire/davdroid/webdav/package-summary.html -* doc/javadoc/at/bitfire/davdroid/webdav/package-tree.html -* doc/javadoc/at/bitfire/davdroid/webdav/package-use.html -* doc/javadoc/constant-values.html -* doc/javadoc/deprecated-list.html -* doc/javadoc/help-doc.html -* doc/javadoc/index-files/ -* doc/javadoc/index-files/index-1.html -* doc/javadoc/index-files/index-10.html -* doc/javadoc/index-files/index-11.html -* doc/javadoc/index-files/index-12.html -* doc/javadoc/index-files/index-13.html -* doc/javadoc/index-files/index-14.html -* doc/javadoc/index-files/index-15.html -* doc/javadoc/index-files/index-16.html -* doc/javadoc/index-files/index-17.html -* doc/javadoc/index-files/index-18.html -* doc/javadoc/index-files/index-19.html -* doc/javadoc/index-files/index-2.html -* doc/javadoc/index-files/index-20.html -* doc/javadoc/index-files/index-21.html -* doc/javadoc/index-files/index-22.html -* doc/javadoc/index-files/index-23.html -* doc/javadoc/index-files/index-24.html -* doc/javadoc/index-files/index-3.html -* doc/javadoc/index-files/index-4.html -* doc/javadoc/index-files/index-5.html -* doc/javadoc/index-files/index-6.html -* doc/javadoc/index-files/index-7.html -* doc/javadoc/index-files/index-8.html -* doc/javadoc/index-files/index-9.html -* doc/javadoc/index.html -* doc/javadoc/overview-frame.html -* doc/javadoc/overview-summary.html -* doc/javadoc/overview-tree.html -* doc/javadoc/package-list -* doc/javadoc/resources/ -* doc/javadoc/resources/background.gif -* doc/javadoc/resources/tab.gif -* doc/javadoc/resources/titlebar.gif -* doc/javadoc/resources/titlebar_end.gif -* doc/javadoc/serialized-form.html -* doc/javadoc/stylesheet.css -* doc/rfc3744-webdav-access-control-protocol.txt -* doc/rfc4791-caldav.txt -* doc/rfc4918-webdav.txt -* doc/rfc5397-webdav-current-principal-extension.txt -* doc/rfc5785-well-known-uris.txt -* doc/rfc6352-carddav.txt -* doc/rfc6764-caldav-carddav-service-discovery.txt -* eclipse-libs/ -* eclipse-libs/lombok-api.jar -* private/ -* private/contacts2.db -* proguard-project.txt -* proguard/ -* proguard/dump.txt -* proguard/mapping.txt -* proguard/seeds.txt -* proguard/usage.txt -* target/ -* target/davdroid-0.1.apk -* target/davdroid-0.2-alpha.apk -* target/davdroid-0.3-alpha.apk -* target/davdroid_0_3_3_alpha.apk -* target/davdroid_0_3_4_alpha.apk -* target/davdroid_0_3_5_alpha.apk -* target/davdroid_0_3_6_alpha.apk -* target/davdroid_0_3_7_alpha.apk -* target/davdroid_0_3_8_alpha.apk -* target/davdroid_0_4_1_alpha.apk -* target/davdroid_0_4_2_alpha.apk -* target/davdroid_0_4_3_alpha.apk -* target/davdroid_0_4_4_alpha.apk -* target/davdroid_0_4_alpha.apk -* target/davdroid_0_5_10.apk -* target/davdroid_0_5_10_1.apk -* target/davdroid_0_5_10_2.apk -* target/davdroid_0_5_11.apk -* target/davdroid_0_5_12.apk -* target/davdroid_0_5_13.apk -* target/davdroid_0_5_14.apk -* target/davdroid_0_5_1_alpha.apk -* target/davdroid_0_5_2_alpha.apk -* target/davdroid_0_5_3_alpha.apk -* target/davdroid_0_5_4_alpha.apk -* target/davdroid_0_5_5_alpha.apk -* target/davdroid_0_5_6_alpha.apk -* target/davdroid_0_5_7_alpha.apk -* target/davdroid_0_5_8.apk -* target/davdroid_0_5_8_1.apk -* target/davdroid_0_5_9.apk -* target/davdroid_0_5_alpha.apk -* target/davdroid_0_6.apk -* target/davdroid_0_6_1.apk -* target/davdroid_0_6_2.apk -* target/davdroid_0_6_3.apk -* target/davdroid_0_6_4.apk -* target/davdroid_0_6_5.apk -* target/davdroid_0_6_6.apk -* target/davdroid_0_6_7.apk -* target/davdroid_0_6_7_1.apk -* target/davdroid_0_6_8.apk -* test/ -* test/.classpath -* test/.project -* test/.settings/ -* test/.settings/org.eclipse.jdt.core.prefs -* test/assets/ -* test/assets/all-day-0sec.ics -* test/assets/all-day-10days.ics -* test/assets/all-day-1day.ics -* test/assets/event-on-that-day.ics -* test/assets/impp.vcf -* test/assets/invalid-unknown-properties.vcf -* test/assets/reference.vcf -* test/assets/test.random -* test/assets/vcard3-sample1.vcf -* test/assets/vienna-evolution.ics -* test/bin/ -* test/bin/AndroidManifest.xml -* test/bin/classes.dex -* test/bin/classes/ -* test/bin/classes/at/ -* test/bin/classes/at/bitfire/ -* test/bin/classes/at/bitfire/davdroid/ -* test/bin/classes/at/bitfire/davdroid/resource/ -* test/bin/classes/at/bitfire/davdroid/resource/test/ -* test/bin/classes/at/bitfire/davdroid/resource/test/ContactTest.class -* test/bin/classes/at/bitfire/davdroid/resource/test/EventTest.class -* test/bin/classes/at/bitfire/davdroid/resource/test/LocalCalendarTest.class -* test/bin/classes/at/bitfire/davdroid/syncadapter/ -* test/bin/classes/at/bitfire/davdroid/syncadapter/DavResourceFinderTest.class -* test/bin/classes/at/bitfire/davdroid/test/ -* test/bin/classes/at/bitfire/davdroid/test/ArrayUtilsTest.class -* test/bin/classes/at/bitfire/davdroid/test/BuildConfig.class -* test/bin/classes/at/bitfire/davdroid/test/Constants.class -* test/bin/classes/at/bitfire/davdroid/test/ContactTest.class -* test/bin/classes/at/bitfire/davdroid/test/R$attr.class -* test/bin/classes/at/bitfire/davdroid/test/R$drawable.class -* test/bin/classes/at/bitfire/davdroid/test/R$string.class -* test/bin/classes/at/bitfire/davdroid/test/R.class -* test/bin/classes/at/bitfire/davdroid/test/URLUtilsTest.class -* test/bin/classes/at/bitfire/davdroid/webdav/ -* test/bin/classes/at/bitfire/davdroid/webdav/DavRedirectStrategyTest.class -* test/bin/classes/at/bitfire/davdroid/webdav/TlsSniSocketFactoryTest.class -* test/bin/classes/at/bitfire/davdroid/webdav/WebDavResourceTest.class -* test/bin/davdroidTest.apk -* test/bin/res/ -* test/bin/res/crunch/ -* test/bin/res/crunch/drawable-hdpi/ -* test/bin/res/crunch/drawable-hdpi/ic_launcher.png -* test/bin/res/crunch/drawable-ldpi/ -* test/bin/res/crunch/drawable-ldpi/ic_launcher.png -* test/bin/res/crunch/drawable-mdpi/ -* test/bin/res/crunch/drawable-mdpi/ic_launcher.png -* test/bin/res/crunch/drawable-xhdpi/ -* test/bin/res/crunch/drawable-xhdpi/ic_launcher.png -* test/bin/resources.ap_ -* test/gen/ -* test/gen/at/ -* test/gen/at/bitfire/ -* test/gen/at/bitfire/davdroid/ -* test/gen/at/bitfire/davdroid/test/ -* test/gen/at/bitfire/davdroid/test/BuildConfig.java -* test/gen/at/bitfire/davdroid/test/R.java -* test/proguard-project.txt -* test/project.properties -* test/robohydra/ -* test/robohydra/.gitignore -* test/robohydra/davdroid.conf -* test/robohydra/node_modules/ -* test/robohydra/node_modules/.bin/ -* test/robohydra/node_modules/robohydra/ -* test/robohydra/node_modules/robohydra/.npmignore -* test/robohydra/node_modules/robohydra/ChangeLog -* test/robohydra/node_modules/robohydra/LICENSE -* test/robohydra/node_modules/robohydra/README.md -* test/robohydra/node_modules/robohydra/bin/ -* test/robohydra/node_modules/robohydra/bin/robohydra.js -* test/robohydra/node_modules/robohydra/bin/robohydra.js -* test/robohydra/node_modules/robohydra/examples/ -* test/robohydra/node_modules/robohydra/examples/README.md -* test/robohydra/node_modules/robohydra/examples/custom-types.conf -* test/robohydra/node_modules/robohydra/examples/delayed-proxy.conf -* test/robohydra/node_modules/robohydra/examples/empty-https.conf -* test/robohydra/node_modules/robohydra/examples/empty.conf -* test/robohydra/node_modules/robohydra/examples/external-scenarios.conf -* test/robohydra/node_modules/robohydra/examples/just-scenarios.conf -* test/robohydra/node_modules/robohydra/examples/plugins/ -* test/robohydra/node_modules/robohydra/examples/plugins/basic-scenario/ -* test/robohydra/node_modules/robohydra/examples/plugins/basic-scenario/index.js -* test/robohydra/node_modules/robohydra/examples/plugins/custom-types/ -* test/robohydra/node_modules/robohydra/examples/plugins/custom-types/index.js -* test/robohydra/node_modules/robohydra/examples/plugins/delayed-proxy/ -* test/robohydra/node_modules/robohydra/examples/plugins/delayed-proxy/index.js -* test/robohydra/node_modules/robohydra/examples/plugins/external-scenarios/ -* test/robohydra/node_modules/robohydra/examples/plugins/external-scenarios/fixtures/ -* test/robohydra/node_modules/robohydra/examples/plugins/external-scenarios/fixtures/etc/ -* test/robohydra/node_modules/robohydra/examples/plugins/external-scenarios/fixtures/etc/passwd -* test/robohydra/node_modules/robohydra/examples/plugins/external-scenarios/fixtures/tada.png -* test/robohydra/node_modules/robohydra/examples/plugins/external-scenarios/index.js -* test/robohydra/node_modules/robohydra/examples/plugins/external-scenarios/scenarios/ -* test/robohydra/node_modules/robohydra/examples/plugins/external-scenarios/scenarios/externalScenarioExample.js -* test/robohydra/node_modules/robohydra/examples/plugins/request-finder/ -* test/robohydra/node_modules/robohydra/examples/plugins/request-finder/index.js -* test/robohydra/node_modules/robohydra/examples/plugins/simple-filtering/ -* test/robohydra/node_modules/robohydra/examples/plugins/simple-filtering/index.js -* test/robohydra/node_modules/robohydra/examples/plugins/simple-i18n/ -* test/robohydra/node_modules/robohydra/examples/plugins/simple-i18n/index.js -* test/robohydra/node_modules/robohydra/examples/plugins/simple-streaming/ -* test/robohydra/node_modules/robohydra/examples/plugins/simple-streaming/index.js -* test/robohydra/node_modules/robohydra/examples/plugins/simple-summoner/ -* test/robohydra/node_modules/robohydra/examples/plugins/simple-summoner/index.js -* test/robohydra/node_modules/robohydra/examples/request-finder.conf -* test/robohydra/node_modules/robohydra/examples/simple-filtering.conf -* test/robohydra/node_modules/robohydra/examples/simple-i18n.conf -* test/robohydra/node_modules/robohydra/examples/simple-i18n/ -* test/robohydra/node_modules/robohydra/examples/simple-i18n/foo.en.html -* test/robohydra/node_modules/robohydra/examples/simple-i18n/foo.es.html -* test/robohydra/node_modules/robohydra/examples/simple-i18n/foo.html -* test/robohydra/node_modules/robohydra/examples/simple-i18n/just-french.fr.html -* test/robohydra/node_modules/robohydra/examples/simple-streaming.conf -* test/robohydra/node_modules/robohydra/examples/simple-summoner.conf -* test/robohydra/node_modules/robohydra/examples/test-cert.pem -* test/robohydra/node_modules/robohydra/examples/test-key.pem -* test/robohydra/node_modules/robohydra/lib/ -* test/robohydra/node_modules/robohydra/lib/exceptions.js -* test/robohydra/node_modules/robohydra/lib/heads.js -* test/robohydra/node_modules/robohydra/lib/plugins/ -* test/robohydra/node_modules/robohydra/lib/plugins/admin.js -* test/robohydra/node_modules/robohydra/lib/plugins/static/ -* test/robohydra/node_modules/robohydra/lib/plugins/static/css/ -* test/robohydra/node_modules/robohydra/lib/plugins/static/css/lipstick.css -* test/robohydra/node_modules/robohydra/lib/plugins/static/css/robohydra.css -* test/robohydra/node_modules/robohydra/lib/plugins/static/favicon.ico -* test/robohydra/node_modules/robohydra/lib/plugins/static/img/ -* test/robohydra/node_modules/robohydra/lib/plugins/static/img/glyphicons-halflings-white.png -* test/robohydra/node_modules/robohydra/lib/plugins/static/img/glyphicons-halflings.png -* test/robohydra/node_modules/robohydra/lib/plugins/static/img/robohydra.png -* test/robohydra/node_modules/robohydra/lib/plugins/static/js/ -* test/robohydra/node_modules/robohydra/lib/plugins/static/js/robohydra.js -* test/robohydra/node_modules/robohydra/lib/plugins/templates/ -* test/robohydra/node_modules/robohydra/lib/plugins/templates/_header.ejs -* test/robohydra/node_modules/robohydra/lib/plugins/templates/_scenario-result.ejs -* test/robohydra/node_modules/robohydra/lib/plugins/templates/index.ejs -* test/robohydra/node_modules/robohydra/lib/plugins/templates/layout-main.ejs -* test/robohydra/node_modules/robohydra/lib/plugins/templates/scenario-instructions.ejs -* test/robohydra/node_modules/robohydra/lib/plugins/templates/scenarios.ejs -* test/robohydra/node_modules/robohydra/lib/robohydra.js -* test/robohydra/node_modules/robohydra/lib/robohydrasummoner.js -* test/robohydra/node_modules/robohydra/lib/utils.js -* test/robohydra/node_modules/robohydra/node_modules/ -* test/robohydra/node_modules/robohydra/node_modules/.bin/ -* test/robohydra/node_modules/robohydra/node_modules/commander/ -* test/robohydra/node_modules/robohydra/node_modules/commander/Readme.md -* test/robohydra/node_modules/robohydra/node_modules/commander/index.js -* test/robohydra/node_modules/robohydra/node_modules/commander/package.json -* test/robohydra/node_modules/robohydra/node_modules/ejs/ -* test/robohydra/node_modules/robohydra/node_modules/ejs/.gitmodules -* test/robohydra/node_modules/robohydra/node_modules/ejs/.npmignore -* test/robohydra/node_modules/robohydra/node_modules/ejs/.travis.yml -* test/robohydra/node_modules/robohydra/node_modules/ejs/History.md -* test/robohydra/node_modules/robohydra/node_modules/ejs/Makefile -* test/robohydra/node_modules/robohydra/node_modules/ejs/Readme.md -* test/robohydra/node_modules/robohydra/node_modules/ejs/benchmark.js -* test/robohydra/node_modules/robohydra/node_modules/ejs/ejs.js -* test/robohydra/node_modules/robohydra/node_modules/ejs/ejs.min.js -* test/robohydra/node_modules/robohydra/node_modules/ejs/examples/ -* test/robohydra/node_modules/robohydra/node_modules/ejs/examples/client.html -* test/robohydra/node_modules/robohydra/node_modules/ejs/examples/functions.ejs -* test/robohydra/node_modules/robohydra/node_modules/ejs/examples/functions.js -* test/robohydra/node_modules/robohydra/node_modules/ejs/examples/list.ejs -* test/robohydra/node_modules/robohydra/node_modules/ejs/examples/list.js -* test/robohydra/node_modules/robohydra/node_modules/ejs/index.js -* test/robohydra/node_modules/robohydra/node_modules/ejs/lib/ -* test/robohydra/node_modules/robohydra/node_modules/ejs/lib/ejs.js -* test/robohydra/node_modules/robohydra/node_modules/ejs/lib/filters.js -* test/robohydra/node_modules/robohydra/node_modules/ejs/lib/utils.js -* test/robohydra/node_modules/robohydra/node_modules/ejs/package.json -* test/robohydra/node_modules/robohydra/node_modules/ejs/support/ -* test/robohydra/node_modules/robohydra/node_modules/ejs/support/compile.js -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/ -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/ejs.js -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/ -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/backslash.ejs -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/backslash.html -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/comments.ejs -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/comments.html -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/double-quote.ejs -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/double-quote.html -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/error.ejs -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/error.out -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/fail.ejs -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/include.css.ejs -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/include.css.html -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/include.ejs -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/include.html -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/includes/ -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/includes/menu-item.ejs -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/includes/menu/ -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/includes/menu/item.ejs -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/menu.ejs -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/menu.html -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/messed.ejs -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/messed.html -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/newlines.ejs -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/newlines.html -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/no.newlines.ejs -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/no.newlines.html -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/para.ejs -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/pet.ejs -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/single-quote.ejs -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/single-quote.html -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/style.css -* test/robohydra/node_modules/robohydra/node_modules/ejs/test/fixtures/user.ejs -* test/robohydra/node_modules/robohydra/node_modules/markdown/ -* test/robohydra/node_modules/robohydra/node_modules/markdown/.npmignore -* test/robohydra/node_modules/robohydra/node_modules/markdown/.travis.yml -* test/robohydra/node_modules/robohydra/node_modules/markdown/Changes.markdown -* test/robohydra/node_modules/robohydra/node_modules/markdown/README.markdown -* test/robohydra/node_modules/robohydra/node_modules/markdown/bin/ -* test/robohydra/node_modules/robohydra/node_modules/markdown/bin/md2html.js -* test/robohydra/node_modules/robohydra/node_modules/markdown/bin/md2html.js -* test/robohydra/node_modules/robohydra/node_modules/markdown/lib/ -* test/robohydra/node_modules/robohydra/node_modules/markdown/lib/index.js -* test/robohydra/node_modules/robohydra/node_modules/markdown/lib/markdown.js -* test/robohydra/node_modules/robohydra/node_modules/markdown/markdown-js.sublime-project -* test/robohydra/node_modules/robohydra/node_modules/markdown/markdown-js.sublime-workspace -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/ -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/.bin/ -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/nopt/ -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/nopt/.npmignore -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/nopt/LICENSE -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/nopt/README.md -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/nopt/bin/ -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/nopt/bin/nopt.js -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/nopt/bin/nopt.js -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/nopt/examples/ -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/nopt/examples/my-program.js -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/nopt/lib/ -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/nopt/lib/nopt.js -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/nopt/node_modules/ -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/nopt/node_modules/abbrev/ -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/nopt/node_modules/abbrev/LICENSE -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/nopt/node_modules/abbrev/README.md -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/nopt/node_modules/abbrev/lib/ -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/nopt/node_modules/abbrev/lib/abbrev.js -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/nopt/node_modules/abbrev/package.json -* test/robohydra/node_modules/robohydra/node_modules/markdown/node_modules/nopt/package.json -* test/robohydra/node_modules/robohydra/node_modules/markdown/package.json -* test/robohydra/node_modules/robohydra/node_modules/markdown/seed.yml -* test/robohydra/node_modules/robohydra/node_modules/mime/ -* test/robohydra/node_modules/robohydra/node_modules/mime/LICENSE -* test/robohydra/node_modules/robohydra/node_modules/mime/README.md -* test/robohydra/node_modules/robohydra/node_modules/mime/mime.js -* test/robohydra/node_modules/robohydra/node_modules/mime/package.json -* test/robohydra/node_modules/robohydra/node_modules/mime/test.js -* test/robohydra/node_modules/robohydra/node_modules/mime/types/ -* test/robohydra/node_modules/robohydra/node_modules/mime/types/mime.types -* test/robohydra/node_modules/robohydra/node_modules/mime/types/node.types -* test/robohydra/node_modules/robohydra/node_modules/qs/ -* test/robohydra/node_modules/robohydra/node_modules/qs/.gitmodules -* test/robohydra/node_modules/robohydra/node_modules/qs/.npmignore -* test/robohydra/node_modules/robohydra/node_modules/qs/Readme.md -* test/robohydra/node_modules/robohydra/node_modules/qs/index.js -* test/robohydra/node_modules/robohydra/node_modules/qs/package.json -* test/robohydra/node_modules/robohydra/package.json -* test/robohydra/node_modules/robohydra/plugins/ -* test/robohydra/node_modules/robohydra/plugins/README.md -* test/robohydra/node_modules/robohydra/plugins/frontend-dev-proxy/ -* test/robohydra/node_modules/robohydra/plugins/frontend-dev-proxy/index.js -* test/robohydra/node_modules/robohydra/plugins/logger/ -* test/robohydra/node_modules/robohydra/plugins/logger/index.js -* test/robohydra/node_modules/robohydra/plugins/no-caching/ -* test/robohydra/node_modules/robohydra/plugins/no-caching/index.js -* test/robohydra/node_modules/robohydra/plugins/replayer/ -* test/robohydra/node_modules/robohydra/plugins/replayer/index.js -* test/robohydra/node_modules/robohydra/test/ -* test/robohydra/node_modules/robohydra/test/adminhead-test.js -* test/robohydra/node_modules/robohydra/test/buster.js -* test/robohydra/node_modules/robohydra/test/fixture-module-fs/ -* test/robohydra/node_modules/robohydra/test/fixture-module-fs/usr/ -* test/robohydra/node_modules/robohydra/test/fixture-module-fs/usr/local/ -* test/robohydra/node_modules/robohydra/test/fixture-module-fs/usr/local/share/ -* test/robohydra/node_modules/robohydra/test/fixture-module-fs/usr/local/share/robohydra/ -* test/robohydra/node_modules/robohydra/test/fixture-module-fs/usr/local/share/robohydra/plugins/ -* test/robohydra/node_modules/robohydra/test/fixture-module-fs/usr/local/share/robohydra/plugins/simple-fixtures/ -* test/robohydra/node_modules/robohydra/test/fixture-module-fs/usr/local/share/robohydra/plugins/simple-fixtures/fixtures/ -* test/robohydra/node_modules/robohydra/test/fixture-module-fs/usr/local/share/robohydra/plugins/simple-fixtures/fixtures/basic.txt -* test/robohydra/node_modules/robohydra/test/fixture-module-fs/usr/local/share/robohydra/plugins/simple-fixtures/fixtures/etc/ -* test/robohydra/node_modules/robohydra/test/fixture-module-fs/usr/local/share/robohydra/plugins/simple-fixtures/fixtures/etc/passwd -* test/robohydra/node_modules/robohydra/test/fixture-module-fs/usr/local/share/robohydra/plugins/simple-fixtures/fixtures/non-ascii.txt -* test/robohydra/node_modules/robohydra/test/fixture-module-fs/usr/local/share/robohydra/plugins/simple-fixtures/index.js -* test/robohydra/node_modules/robohydra/test/fixture-module-fs/usr/local/share/robohydra/plugins/simple-fixtures/tests/ -* test/robohydra/node_modules/robohydra/test/fixture-module-fs/usr/local/share/robohydra/plugins/simple-fixtures/tests/fixtureLoader.js -* test/robohydra/node_modules/robohydra/test/head-test.js -* test/robohydra/node_modules/robohydra/test/helpers.js -* test/robohydra/node_modules/robohydra/test/plugin-fs/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/opt/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/opt/project/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/opt/project/robohydra-plugins/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/opt/project/robohydra-plugins/definedtwice/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/opt/project/robohydra-plugins/definedtwice/index.js -* test/robohydra/node_modules/robohydra/test/plugin-fs/opt/robohydra/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/opt/robohydra/plugins/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/opt/robohydra/plugins/customloadpath/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/opt/robohydra/plugins/customloadpath/index.js -* test/robohydra/node_modules/robohydra/test/plugin-fs/opt/robohydra/plugins/definedtwice/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/opt/robohydra/plugins/definedtwice/index.js -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/local/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/local/share/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/local/share/robohydra/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/local/share/robohydra/plugins/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/local/share/robohydra/plugins/definedtwice/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/local/share/robohydra/plugins/definedtwice/index.js -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/share/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/share/robohydra/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/share/robohydra/plugins/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/share/robohydra/plugins/definedtwice/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/share/robohydra/plugins/definedtwice/index.js -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/share/robohydra/plugins/right-robohydra-test/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/share/robohydra/plugins/right-robohydra-test/index.js -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/share/robohydra/plugins/simple-authenticator/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/share/robohydra/plugins/simple-authenticator/index.js -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/share/robohydra/plugins/simple/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/share/robohydra/plugins/simple/index.js -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/share/robohydra/plugins/url-query-authenticator/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/share/robohydra/plugins/url-query-authenticator/index.js -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/share/robohydra/plugins/wrong-fixed-picker/ -* test/robohydra/node_modules/robohydra/test/plugin-fs/usr/share/robohydra/plugins/wrong-fixed-picker/index.js -* test/robohydra/node_modules/robohydra/test/plugins/ -* test/robohydra/node_modules/robohydra/test/plugins/external-scenarios-conflicting-names/ -* test/robohydra/node_modules/robohydra/test/plugins/external-scenarios-conflicting-names/index.js -* test/robohydra/node_modules/robohydra/test/plugins/external-scenarios-conflicting-names/scenarios/ -* test/robohydra/node_modules/robohydra/test/plugins/external-scenarios-conflicting-names/scenarios/duplicateTestName.js -* test/robohydra/node_modules/robohydra/test/plugins/external-scenarios-headless/ -* test/robohydra/node_modules/robohydra/test/plugins/external-scenarios-headless/index.js -* test/robohydra/node_modules/robohydra/test/plugins/external-scenarios-headless/scenarios/ -* test/robohydra/node_modules/robohydra/test/plugins/external-scenarios-headless/scenarios/firstTest.js -* test/robohydra/node_modules/robohydra/test/plugins/external-scenarios-headless/scenarios/secondTest.js -* test/robohydra/node_modules/robohydra/test/plugins/external-scenarios-mixed/ -* test/robohydra/node_modules/robohydra/test/plugins/external-scenarios-mixed/index.js -* test/robohydra/node_modules/robohydra/test/plugins/external-scenarios-mixed/scenarios/ -* test/robohydra/node_modules/robohydra/test/plugins/external-scenarios-mixed/scenarios/external.js -* test/robohydra/node_modules/robohydra/test/plugins/external-scenarios-simple/ -* test/robohydra/node_modules/robohydra/test/plugins/external-scenarios-simple/index.js -* test/robohydra/node_modules/robohydra/test/plugins/external-scenarios-simple/scenarios/ -* test/robohydra/node_modules/robohydra/test/plugins/external-scenarios-simple/scenarios/firstScenario.js -* test/robohydra/node_modules/robohydra/test/plugins/simple-fixtures/ -* test/robohydra/node_modules/robohydra/test/plugins/simple-fixtures/fixtures/ -* test/robohydra/node_modules/robohydra/test/plugins/simple-fixtures/fixtures/basic.txt -* test/robohydra/node_modules/robohydra/test/plugins/simple-fixtures/fixtures/etc/ -* test/robohydra/node_modules/robohydra/test/plugins/simple-fixtures/fixtures/etc/passwd -* test/robohydra/node_modules/robohydra/test/plugins/simple-fixtures/fixtures/non-ascii.txt -* test/robohydra/node_modules/robohydra/test/plugins/simple-fixtures/index.js -* test/robohydra/node_modules/robohydra/test/plugins/simple-fixtures/scenarios/ -* test/robohydra/node_modules/robohydra/test/plugins/simple-fixtures/scenarios/fixtureLoader.js -* test/robohydra/node_modules/robohydra/test/robohydra-test.js -* test/robohydra/node_modules/robohydra/test/robohydrasummoner-test.js -* test/robohydra/plugins/ -* test/robohydra/plugins/assets/ -* test/robohydra/plugins/assets/index.js -* test/robohydra/plugins/dav-invalid/ -* test/robohydra/plugins/dav-invalid/index.js -* test/robohydra/plugins/dav/ -* test/robohydra/plugins/dav/index.js -* test/robohydra/plugins/headdav.js -* test/robohydra/plugins/redirect/ -* test/robohydra/plugins/redirect/index.js -* test/robohydra/plugins/simple.js -* test/robohydra/run.sh - -Moved Files: ------------- -Android Gradle projects use a different directory structure than ADT -Eclipse projects. Here's how the projects were restructured: - -* AndroidManifest.xml => app/src/main/AndroidManifest.xml -* assets/ => app/src/main/assets/ -* libs/backport-util-concurrent-3.1.jar => app/libs/backport-util-concurrent-3.1.jar -* libs/commons-codec-1.8.jar => app/libs/commons-codec-1.8.jar -* libs/commons-io-2.4.jar => app/libs/commons-io-2.4.jar -* libs/commons-lang-2.6.jar => app/libs/commons-lang-2.6.jar -* libs/commons-logging-1.1.3.jar => app/libs/commons-logging-1.1.3.jar -* libs/ez-vcard-0.9.6.jar => app/libs/ez-vcard-0.9.6.jar -* libs/httpclientandroidlib-1.2.1.jar => app/libs/httpclientandroidlib-1.2.1.jar -* libs/ical4j-1.0.6-davdroid141027.jar => app/libs/ical4j-1.0.6-davdroid141027.jar -* libs/org.xbill.dns_2.1.6.jar => app/libs/org.xbill.dns_2.1.6.jar -* libs/simple-xml-2.7.jar => app/libs/simple-xml-2.7.jar -* lint.xml => app/lint.xml -* res/ => app/src/main/res/ -* src/ => app/src/main/java/ -* test/res/ => app/src/androidTest/res/ -* test/src/ => app/src/androidTest/java/ - -Next Steps: ------------ -You can now build the project. The Gradle project needs network -connectivity to download dependencies. - -Bugs: ------ -If for some reason your project does not build, and you determine that -it is due to a bug or limitation of the Eclipse to Gradle importer, -please file a bug at http://b.android.com with category -Component-Tools. - -(This import summary is for your information only, and can be deleted -after import once you are satisfied with the results.)