WebDavStorage: introduced possibility to accept validation errors
This commit is contained in:
		| @@ -13,24 +13,30 @@ import com.burgstaller.okhttp.basic.BasicAuthenticator; | |||||||
| import com.burgstaller.okhttp.digest.CachingAuthenticator; | import com.burgstaller.okhttp.digest.CachingAuthenticator; | ||||||
| import com.burgstaller.okhttp.digest.DigestAuthenticator; | import com.burgstaller.okhttp.digest.DigestAuthenticator; | ||||||
|  |  | ||||||
| import java.io.ByteArrayInputStream; |  | ||||||
| import java.io.ByteArrayOutputStream; |  | ||||||
| import java.io.FileNotFoundException; | import java.io.FileNotFoundException; | ||||||
| import java.io.InputStream; | import java.io.InputStream; | ||||||
| import java.io.StringReader; | import java.io.StringReader; | ||||||
| import java.io.UnsupportedEncodingException; | import java.io.UnsupportedEncodingException; | ||||||
| import java.net.URL; | import java.net.URL; | ||||||
| import java.text.ParseException; | import java.security.KeyManagementException; | ||||||
| import java.text.SimpleDateFormat; | import java.security.KeyStore; | ||||||
|  | import java.security.KeyStoreException; | ||||||
|  | import java.security.NoSuchAlgorithmException; | ||||||
|  | import java.security.cert.CertificateException; | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.Arrays; | import java.util.Arrays; | ||||||
| import java.util.Date; | import java.util.Date; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Locale; |  | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| import java.util.TimeZone; |  | ||||||
| import java.util.concurrent.ConcurrentHashMap; | import java.util.concurrent.ConcurrentHashMap; | ||||||
|  |  | ||||||
|  | import javax.net.ssl.SSLContext; | ||||||
|  | import javax.net.ssl.SSLSocketFactory; | ||||||
|  | import javax.net.ssl.TrustManager; | ||||||
|  | import javax.net.ssl.TrustManagerFactory; | ||||||
|  | import javax.net.ssl.X509TrustManager; | ||||||
|  |  | ||||||
|  | import keepass2android.javafilestorage.webdav.DecoratedTrustManager; | ||||||
| import keepass2android.javafilestorage.webdav.PropfindXmlParser; | import keepass2android.javafilestorage.webdav.PropfindXmlParser; | ||||||
| import keepass2android.javafilestorage.webdav.WebDavUtil; | import keepass2android.javafilestorage.webdav.WebDavUtil; | ||||||
| import okhttp3.MediaType; | import okhttp3.MediaType; | ||||||
| @@ -41,6 +47,14 @@ import okhttp3.Response; | |||||||
|  |  | ||||||
| public class WebDavStorage extends JavaFileStorageBase { | public class WebDavStorage extends JavaFileStorageBase { | ||||||
|  |  | ||||||
|  |     private final ICertificateErrorHandler mCertificateErrorHandler; | ||||||
|  |  | ||||||
|  |     public WebDavStorage(ICertificateErrorHandler certificateErrorHandler) | ||||||
|  |     { | ||||||
|  |  | ||||||
|  |         mCertificateErrorHandler = certificateErrorHandler; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public String buildFullPath(String url, String username, String password) throws UnsupportedEncodingException { |     public String buildFullPath(String url, String username, String password) throws UnsupportedEncodingException { | ||||||
|         String scheme = url.substring(0, url.indexOf("://")); |         String scheme = url.substring(0, url.indexOf("://")); | ||||||
|         url = url.substring(scheme.length() + 3); |         url = url.substring(scheme.length() + 3); | ||||||
| @@ -104,7 +118,8 @@ public class WebDavStorage extends JavaFileStorageBase { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private OkHttpClient getClient(ConnectionInfo ci) { |     private OkHttpClient getClient(ConnectionInfo ci) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException { | ||||||
|  |  | ||||||
|         OkHttpClient.Builder builder = new OkHttpClient.Builder(); |         OkHttpClient.Builder builder = new OkHttpClient.Builder(); | ||||||
|         final Map<String, CachingAuthenticator> authCache = new ConcurrentHashMap<>(); |         final Map<String, CachingAuthenticator> authCache = new ConcurrentHashMap<>(); | ||||||
|  |  | ||||||
| @@ -117,10 +132,28 @@ public class WebDavStorage extends JavaFileStorageBase { | |||||||
|                 .with("digest", digestAuthenticator) |                 .with("digest", digestAuthenticator) | ||||||
|                 .with("basic", basicAuthenticator) |                 .with("basic", basicAuthenticator) | ||||||
|                 .build(); |                 .build(); | ||||||
|         OkHttpClient client = builder |  | ||||||
|                 .authenticator(new CachingAuthenticatorDecorator(authenticator, authCache)) |         builder = builder.authenticator(new CachingAuthenticatorDecorator(authenticator, authCache)) | ||||||
|                 .addInterceptor(new AuthenticationCacheInterceptor(authCache)) |                 .addInterceptor(new AuthenticationCacheInterceptor(authCache)); | ||||||
|                 .build(); |         if ((mCertificateErrorHandler != null) && (mCertificateErrorHandler.alwaysFailOnValidationError())) { | ||||||
|  |             TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance( | ||||||
|  |                     TrustManagerFactory.getDefaultAlgorithm()); | ||||||
|  |             trustManagerFactory.init((KeyStore) null); | ||||||
|  |             TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); | ||||||
|  |             if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) { | ||||||
|  |                 throw new IllegalStateException("Unexpected default trust managers:" | ||||||
|  |                         + Arrays.toString(trustManagers)); | ||||||
|  |             } | ||||||
|  |             X509TrustManager trustManager = (X509TrustManager) trustManagers[0]; | ||||||
|  |             trustManager = new DecoratedTrustManager(trustManager, mCertificateErrorHandler); | ||||||
|  |             SSLContext sslContext = SSLContext.getInstance("TLS"); | ||||||
|  |             sslContext.init(null, new TrustManager[] { trustManager }, null); | ||||||
|  |             SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); | ||||||
|  |  | ||||||
|  |             builder = builder.sslSocketFactory(sslSocketFactory, trustManager); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         OkHttpClient client =  builder.build(); | ||||||
|         return client; |         return client; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -280,6 +313,7 @@ public class WebDavStorage extends JavaFileStorageBase { | |||||||
|         String username_enc = (userPwd.substring(0, userPwd.indexOf(":"))); |         String username_enc = (userPwd.substring(0, userPwd.indexOf(":"))); | ||||||
|         String password_enc = (userPwd.substring(userPwd.indexOf(":") + 1)); |         String password_enc = (userPwd.substring(userPwd.indexOf(":") + 1)); | ||||||
|  |  | ||||||
|  |  | ||||||
|         String host = filename.substring(filename.indexOf('@')+1); |         String host = filename.substring(filename.indexOf('@')+1); | ||||||
|         int firstSlashPos = host.indexOf("/"); |         int firstSlashPos = host.indexOf("/"); | ||||||
|         if (firstSlashPos >= 0) |         if (firstSlashPos >= 0) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Philipp Crocoll
					Philipp Crocoll