1
0
mirror of https://github.com/etesync/android synced 2024-12-23 23:18:46 +00:00

Upgrade to okhttp/3.1.2 + tests

This commit is contained in:
Ricki Hirner 2016-02-19 13:16:34 +01:00
parent 814abc60ed
commit 940d622402
8 changed files with 57 additions and 22 deletions

View File

@ -69,7 +69,7 @@ dependencies {
compile project(':MemorizingTrustManager') compile project(':MemorizingTrustManager')
androidTestCompile 'com.squareup.okhttp3:mockwebserver:3.0.1+' androidTestCompile 'com.squareup.okhttp3:mockwebserver:3.1.2'
compile 'dnsjava:dnsjava:2.1.7' compile 'dnsjava:dnsjava:2.1.7'
compile 'org.apache.commons:commons-lang3:3.4' compile 'org.apache.commons:commons-lang3:3.4'
compile 'org.slf4j:slf4j-android:1.7.13' compile 'org.slf4j:slf4j-android:1.7.13'

View File

@ -9,6 +9,7 @@
package at.bitfire.davdroid; package at.bitfire.davdroid;
import android.os.Build; import android.os.Build;
import android.test.InstrumentationTestCase;
import junit.framework.TestCase; import junit.framework.TestCase;
@ -17,15 +18,18 @@ import java.net.Socket;
import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocket;
import de.duenndns.ssl.MemorizingTrustManager;
import okhttp3.OkHttpClient;
import okhttp3.mockwebserver.MockWebServer; import okhttp3.mockwebserver.MockWebServer;
public class SSLSocketFactoryCompatTest extends TestCase { public class SSLSocketFactoryCompatTest extends InstrumentationTestCase {
SSLSocketFactoryCompat factory = new SSLSocketFactoryCompat(null); SSLSocketFactoryCompat factory;
MockWebServer server = new MockWebServer(); MockWebServer server = new MockWebServer();
@Override @Override
protected void setUp() throws Exception { protected void setUp() throws Exception {
factory = new SSLSocketFactoryCompat(new MemorizingTrustManager(getInstrumentation().getTargetContext().getApplicationContext()));
server.start(); server.start();
} }

View File

@ -8,6 +8,7 @@ import at.bitfire.dav4android.exception.DavException;
import at.bitfire.dav4android.exception.HttpException; import at.bitfire.dav4android.exception.HttpException;
import at.bitfire.davdroid.Constants; import at.bitfire.davdroid.Constants;
import at.bitfire.davdroid.ui.setup.DavResourceFinder; import at.bitfire.davdroid.ui.setup.DavResourceFinder;
import at.bitfire.davdroid.ui.setup.LoginCredentialsFragment;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.MockWebServer; import okhttp3.mockwebserver.MockWebServer;
@ -29,11 +30,11 @@ public class DavResourceFinderTest extends InstrumentationTestCase {
public void testGetCurrentUserPrincipal() throws IOException, HttpException, DavException { public void testGetCurrentUserPrincipal() throws IOException, HttpException, DavException {
HttpUrl url = server.url("/dav"); HttpUrl url = server.url("/dav");
ServerInfo serverInfo = new ServerInfo(url.uri(), "admin", "12345", true); LoginCredentialsFragment.LoginCredentials credentials = new LoginCredentialsFragment.LoginCredentials(url.uri(), "admin", "12345", true);
DavResourceFinder finder = new DavResourceFinder(Constants.log, getInstrumentation().getTargetContext().getApplicationContext(), serverInfo); DavResourceFinder finder = new DavResourceFinder(getInstrumentation().getTargetContext().getApplicationContext(), credentials);
// positive test case // positive test case
server.enqueue(new MockResponse() server.enqueue(new MockResponse() // PROPFIND response
.setResponseCode(207) .setResponseCode(207)
.setHeader("Content-Type", "application/xml;charset=utf-8") .setHeader("Content-Type", "application/xml;charset=utf-8")
.setBody("<multistatus xmlns='DAV:'>" + .setBody("<multistatus xmlns='DAV:'>" +
@ -47,10 +48,13 @@ public class DavResourceFinderTest extends InstrumentationTestCase {
" </propstat>" + " </propstat>" +
" </response>" + " </response>" +
"</multistatus>")); "</multistatus>"));
HttpUrl principal = finder.getCurrentUserPrincipal(url); server.enqueue(new MockResponse() // OPTIONS response
.setResponseCode(200)
.setHeader("DAV", "addressbook"));
HttpUrl principal = finder.getCurrentUserPrincipal(url, DavResourceFinder.Service.CARDDAV);
assertEquals(url.resolve("/principals/myself"), principal); assertEquals(url.resolve("/principals/myself"), principal);
// negative test case // negative test case: no current-user-principal
server.enqueue(new MockResponse() server.enqueue(new MockResponse()
.setResponseCode(207) .setResponseCode(207)
.setHeader("Content-Type", "application/xml;charset=utf-8") .setHeader("Content-Type", "application/xml;charset=utf-8")
@ -60,7 +64,27 @@ public class DavResourceFinderTest extends InstrumentationTestCase {
" <status>HTTP/1.0 200 OK</status>" + " <status>HTTP/1.0 200 OK</status>" +
" </response>" + " </response>" +
"</multistatus>")); "</multistatus>"));
assertNull(finder.getCurrentUserPrincipal(url)); assertNull(finder.getCurrentUserPrincipal(url, DavResourceFinder.Service.CARDDAV));
// negative test case: requested service not available
server.enqueue(new MockResponse() // PROPFIND response
.setResponseCode(207)
.setHeader("Content-Type", "application/xml;charset=utf-8")
.setBody("<multistatus xmlns='DAV:'>" +
" <response>" +
" <href>/dav</href>" +
" <propstat>" +
" <prop>" +
" <current-user-principal><href>/principals/myself</href></current-user-principal>" +
" </prop>" +
" <status>HTTP/1.0 200 OK</status>" +
" </propstat>" +
" </response>" +
"</multistatus>"));
server.enqueue(new MockResponse() // OPTIONS response
.setResponseCode(200)
.setHeader("DAV", "addressbook"));
assertNull(finder.getCurrentUserPrincipal(url, DavResourceFinder.Service.CALDAV));
} }
} }

View File

@ -25,14 +25,16 @@ import java.util.Locale;
import javax.net.ssl.SSLContext; import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager; import javax.net.ssl.X509TrustManager;
import de.duenndns.ssl.MemorizingTrustManager; import de.duenndns.ssl.MemorizingTrustManager;
import lombok.Cleanup; import lombok.Cleanup;
import lombok.NonNull;
public class SSLSocketFactoryCompat extends SSLSocketFactory { public class SSLSocketFactoryCompat extends SSLSocketFactory {
private SSLSocketFactory defaultFactory; private SSLSocketFactory delegate;
// Android 5.0+ (API level21) provides reasonable default settings // Android 5.0+ (API level21) provides reasonable default settings
// but it still allows SSLv3 // but it still allows SSLv3
@ -99,11 +101,11 @@ public class SSLSocketFactoryCompat extends SSLSocketFactory {
} }
} }
public SSLSocketFactoryCompat(MemorizingTrustManager mtm) { public SSLSocketFactoryCompat(@NonNull MemorizingTrustManager mtm) {
try { try {
SSLContext sslContext = SSLContext.getInstance("TLS"); SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, (mtm != null) ? new X509TrustManager[] { mtm } : null, null); sslContext.init(null, new X509TrustManager[] { mtm }, null);
defaultFactory = sslContext.getSocketFactory(); delegate = sslContext.getSocketFactory();
} catch (GeneralSecurityException e) { } catch (GeneralSecurityException e) {
throw new AssertionError(); // The system has no TLS. Just give up. throw new AssertionError(); // The system has no TLS. Just give up.
} }
@ -134,7 +136,7 @@ public class SSLSocketFactoryCompat extends SSLSocketFactory {
@Override @Override
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
Socket ssl = defaultFactory.createSocket(s, host, port, autoClose); Socket ssl = delegate.createSocket(s, host, port, autoClose);
if (ssl instanceof SSLSocket) if (ssl instanceof SSLSocket)
upgradeTLS((SSLSocket)ssl); upgradeTLS((SSLSocket)ssl);
return ssl; return ssl;
@ -142,7 +144,7 @@ public class SSLSocketFactoryCompat extends SSLSocketFactory {
@Override @Override
public Socket createSocket(String host, int port) throws IOException, UnknownHostException { public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
Socket ssl = defaultFactory.createSocket(host, port); Socket ssl = delegate.createSocket(host, port);
if (ssl instanceof SSLSocket) if (ssl instanceof SSLSocket)
upgradeTLS((SSLSocket)ssl); upgradeTLS((SSLSocket)ssl);
return ssl; return ssl;
@ -150,7 +152,7 @@ public class SSLSocketFactoryCompat extends SSLSocketFactory {
@Override @Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException { public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
Socket ssl = defaultFactory.createSocket(host, port, localHost, localPort); Socket ssl = delegate.createSocket(host, port, localHost, localPort);
if (ssl instanceof SSLSocket) if (ssl instanceof SSLSocket)
upgradeTLS((SSLSocket)ssl); upgradeTLS((SSLSocket)ssl);
return ssl; return ssl;
@ -158,7 +160,7 @@ public class SSLSocketFactoryCompat extends SSLSocketFactory {
@Override @Override
public Socket createSocket(InetAddress host, int port) throws IOException { public Socket createSocket(InetAddress host, int port) throws IOException {
Socket ssl = defaultFactory.createSocket(host, port); Socket ssl = delegate.createSocket(host, port);
if (ssl instanceof SSLSocket) if (ssl instanceof SSLSocket)
upgradeTLS((SSLSocket)ssl); upgradeTLS((SSLSocket)ssl);
return ssl; return ssl;
@ -166,7 +168,7 @@ public class SSLSocketFactoryCompat extends SSLSocketFactory {
@Override @Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
Socket ssl = defaultFactory.createSocket(address, port, localAddress, localPort); Socket ssl = delegate.createSocket(address, port, localAddress, localPort);
if (ssl instanceof SSLSocket) if (ssl instanceof SSLSocket)
upgradeTLS((SSLSocket)ssl); upgradeTLS((SSLSocket)ssl);
return ssl; return ssl;

View File

@ -55,7 +55,7 @@ import okhttp3.HttpUrl;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
public class DavResourceFinder { public class DavResourceFinder {
protected enum Service { public enum Service {
CALDAV("caldav"), CALDAV("caldav"),
CARDDAV("carddav"); CARDDAV("carddav");
@ -314,7 +314,7 @@ public class DavResourceFinder {
* @param service required service (may be null, in which case no service check is done) * @param service required service (may be null, in which case no service check is done)
* @return current-user-principal URL that provides required service, or null if none * @return current-user-principal URL that provides required service, or null if none
*/ */
protected HttpUrl getCurrentUserPrincipal(HttpUrl url, Service service) throws IOException, HttpException, DavException { public HttpUrl getCurrentUserPrincipal(HttpUrl url, Service service) throws IOException, HttpException, DavException {
DavResource dav = new DavResource(log, httpClient, url); DavResource dav = new DavResource(log, httpClient, url);
dav.propfind(0, CurrentUserPrincipal.NAME); dav.propfind(0, CurrentUserPrincipal.NAME);
CurrentUserPrincipal currentUserPrincipal = (CurrentUserPrincipal) dav.properties.get(CurrentUserPrincipal.NAME); CurrentUserPrincipal currentUserPrincipal = (CurrentUserPrincipal) dav.properties.get(CurrentUserPrincipal.NAME);

View File

@ -0,0 +1,5 @@
<vector android:alpha="0.54" android:height="24dp"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M12,4V1L8,5l4,4V6c3.31,0 6,2.69 6,6 0,1.01 -0.25,1.97 -0.7,2.8l1.46,1.46C19.54,15.03 20,13.57 20,12c0,-4.42 -3.58,-8 -8,-8zm0,14c-3.31,0 -6,-2.69 -6,-6 0,-1.01 0.25,-1.97 0.7,-2.8L5.24,7.74C4.46,8.97 4,10.43 4,12c0,4.42 3.58,8 8,8v3l4,-4 -4,-4v3z"/>
</vector>

@ -1 +1 @@
Subproject commit 67a8b968f9ed565d2091f78f252cd0475247bf6e Subproject commit 519decc0aa66a5f7d828fd5741b5250649f9a85a

@ -1 +1 @@
Subproject commit 6e9ab8680d27a9be7fb677c3b755c4550bc3e80a Subproject commit 13ee3ada06635814c80f00b67339a5d51275fe20