浏览代码

Added support for TLS client certificates

Using the new `AdvancedX509KeyManager` class from the `nextcloud-android-library` to add support for servers that require a TLS client certificate to connect.

Signed-off-by: Elv1zz <elv1zz.git@gmail.com>
Elv1zz 2 年之前
父节点
当前提交
45e369bae8
共有 1 个文件被更改,包括 22 次插入0 次删除
  1. 22 0
      app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java

+ 22 - 0
app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java

@@ -66,6 +66,7 @@ import android.util.AndroidRuntimeException;
 import android.view.KeyEvent;
 import android.view.View;
 import android.view.inputmethod.EditorInfo;
+import android.webkit.ClientCertRequest;
 import android.webkit.CookieManager;
 import android.webkit.CookieSyncManager;
 import android.webkit.WebResourceRequest;
@@ -102,6 +103,7 @@ import com.owncloud.android.lib.common.OwnCloudCredentialsFactory;
 import com.owncloud.android.lib.common.UserInfo;
 import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException;
 import com.owncloud.android.lib.common.accounts.AccountUtils.Constants;
+import com.owncloud.android.lib.common.network.AdvancedX509KeyManager;
 import com.owncloud.android.lib.common.network.CertificateCombinedException;
 import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
 import com.owncloud.android.lib.common.operations.RemoteOperation;
@@ -132,6 +134,8 @@ import com.owncloud.android.utils.theme.CapabilityUtils;
 import com.owncloud.android.utils.theme.ViewThemeUtils;
 
 import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.net.URLDecoder;
 import java.util.HashMap;
 import java.util.Locale;
@@ -472,6 +476,7 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
                 }
             }
 
+            @Override
             public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                 accountSetupWebviewBinding.loginWebviewProgressBar.setVisibility(View.GONE);
                 accountSetupWebviewBinding.loginWebview.setVisibility(View.VISIBLE);
@@ -482,7 +487,24 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
                 if (!customError.isEmpty()) {
                     accountSetupWebviewBinding.loginWebview.loadData(customError, "text/html; charset=UTF-8", null);
                 }
+
+                if (errorCode >= 400 && errorCode < 500) {
+                    Log_OC.w(TAG, "WebView failed with error code " + errorCode + "; remove key chain aliases");
+                    // chosen client certificate alias does not seem to work -> discard it
+                    try {
+                        URL url = new URL(failingUrl);
+                        new AdvancedX509KeyManager(getApplicationContext()).removeKeys(url.getHost(), url.getPort());
+                    } catch (MalformedURLException e) {
+                        Log_OC.e(TAG, "Malformed URL: " + failingUrl);
+                    }
+                }
             }
+
+            @Override
+            public void onReceivedClientCertRequest(WebView view, ClientCertRequest request) {
+                new AdvancedX509KeyManager(getApplicationContext()).handleWebViewClientCertRequest(request);
+            }
+
         });
     }