1
0
mirror of https://github.com/etesync/android synced 2024-11-14 03:39:52 +00:00

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
This commit is contained in:
R Hirner 2014-12-28 16:33:45 +01:00
parent 6f5748c464
commit 897ede7582
6 changed files with 114 additions and 901 deletions

View File

@ -1,79 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="at.bitfire.davdroid"
android:versionCode="47"
android:versionName="0.6.8" android:installLocation="internalOnly">
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:process=":sync" >
<service
android:name=".syncadapter.AccountAuthenticatorService"
android:exported="false" >
<intent-filter>
<action android:name="android.accounts.AccountAuthenticator" />
</intent-filter>
<meta-data
android:name="android.accounts.AccountAuthenticator"
android:resource="@xml/account_authenticator" />
</service>
<service
android:name=".syncadapter.ContactsSyncAdapterService"
android:exported="true" >
<intent-filter>
<action android:name="android.content.SyncAdapter" />
</intent-filter>
<meta-data
android:name="android.content.SyncAdapter"
android:resource="@xml/sync_contacts" />
<meta-data
android:name="android.provider.CONTACTS_STRUCTURE"
android:resource="@xml/contacts" />
</service>
<service
android:name=".syncadapter.CalendarsSyncAdapterService"
android:exported="true" >
<intent-filter>
<action android:name="android.content.SyncAdapter" />
</intent-filter>
<meta-data
android:name="android.content.SyncAdapter"
android:resource="@xml/sync_calendars" />
</service>
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".syncadapter.AddAccountActivity"
android:excludeFromRecents="true" >
</activity>
<activity
android:name=".syncadapter.GeneralSettingsActivity" >
</activity>
</application>
</manifest>

View File

@ -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()));

View File

@ -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<String> protocols = new LinkedList<String>();
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<String> 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<String> availableCiphers = Arrays.asList(ssl.getSupportedCipherSuites());
List<String> availableCiphers = Arrays.asList(socket.getSupportedCipherSuites());
// preferred ciphers = allowed Ciphers \ availableCiphers
HashSet<String> preferredCiphers = new HashSet<String>(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<String> enabledCiphers = preferredCiphers;
enabledCiphers.addAll(new HashSet<String>(Arrays.asList(ssl.getEnabledCipherSuites())));
enabledCiphers.addAll(new HashSet<String>(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);
}
}
}

View File

@ -6,9 +6,11 @@
<string name="next">Weiter</string>
<string name="help">Hilfe</string>
<string name="exception_cert_path_validation">Nicht vertrauenswürdiges Zertifikat in der Zertifikatskette (siehe FAQ)</string>
<string name="exception_http">HTTP-Fehler: %s</string>
<string name="exception_incapable_resource">Fehlende Server-Unterstützung: %s</string>
<string name="exception_io">E/A-Fehler: %s</string>
<string name="exception_peer_unverified">Zertifikat ist nicht für \"%s\" ausgestellt</string>
<string name="exception_uri_syntax">URI ungültig: %s</string>
<!-- MainActivity -->

View File

@ -8,9 +8,11 @@
<string name="next">Next</string>
<string name="help">Help</string>
<string name="exception_cert_path_validation">Untrusted certificate in certificate path. See FAQ for more info.</string>
<string name="exception_http">HTTP error: %s</string>
<string name="exception_incapable_resource">Missing capabilities: %s</string>
<string name="exception_io">I/O error: %s</string>
<string name="exception_peer_unverified">Certificate not issued for \"%s\"</string>
<string name="exception_uri_syntax">Invalid URI: %s</string>
<!-- MainActivity -->

View File

@ -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.)