Bläddra i källkod

add FIDO U2F support using WebViewFidoBridge

Signed-off-by: Dominik Schürmann <dominik@schuermann.eu>
Dominik Schürmann 5 år sedan
förälder
incheckning
ee44394268

+ 10 - 0
app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java

@@ -37,6 +37,7 @@ import autodagger.AutoInjector;
 import com.facebook.cache.disk.DiskCacheConfig;
 import com.facebook.cache.disk.DiskCacheConfig;
 import com.facebook.drawee.backends.pipeline.Fresco;
 import com.facebook.drawee.backends.pipeline.Fresco;
 import com.facebook.imagepipeline.core.ImagePipelineConfig;
 import com.facebook.imagepipeline.core.ImagePipelineConfig;
+import com.nextcloud.talk.BuildConfig;
 import com.nextcloud.talk.components.filebrowser.webdav.DavUtils;
 import com.nextcloud.talk.components.filebrowser.webdav.DavUtils;
 import com.nextcloud.talk.dagger.modules.BusModule;
 import com.nextcloud.talk.dagger.modules.BusModule;
 import com.nextcloud.talk.dagger.modules.ContextModule;
 import com.nextcloud.talk.dagger.modules.ContextModule;
@@ -56,6 +57,9 @@ import com.nextcloud.talk.utils.singletons.MerlinTheWizard;
 import com.nextcloud.talk.webrtc.MagicWebRTCUtils;
 import com.nextcloud.talk.webrtc.MagicWebRTCUtils;
 import com.vanniktech.emoji.EmojiManager;
 import com.vanniktech.emoji.EmojiManager;
 import com.vanniktech.emoji.googlecompat.GoogleCompatEmojiProvider;
 import com.vanniktech.emoji.googlecompat.GoogleCompatEmojiProvider;
+
+import de.cotech.hw.SecurityKeyManager;
+import de.cotech.hw.SecurityKeyManagerConfig;
 import okhttp3.OkHttpClient;
 import okhttp3.OkHttpClient;
 import org.conscrypt.Conscrypt;
 import org.conscrypt.Conscrypt;
 import org.webrtc.PeerConnectionFactory;
 import org.webrtc.PeerConnectionFactory;
@@ -124,6 +128,12 @@ public class NextcloudTalkApplication extends MultiDexApplication implements Lif
 
 
         sharedApplication = this;
         sharedApplication = this;
 
 
+        SecurityKeyManager securityKeyManager = SecurityKeyManager.getInstance();
+        SecurityKeyManagerConfig securityKeyConfig = new SecurityKeyManagerConfig.Builder()
+                .setEnableDebugLogging(BuildConfig.DEBUG)
+                .build();
+        securityKeyManager.init(this, securityKeyConfig);
+
         initializeWebRtc();
         initializeWebRtc();
         DisplayUtils.useCompatVectorIfNeeded();
         DisplayUtils.useCompatVectorIfNeeded();
         buildComponent();
         buildComponent();

+ 20 - 0
app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.java

@@ -22,6 +22,7 @@ package com.nextcloud.talk.controllers;
 
 
 import android.annotation.SuppressLint;
 import android.annotation.SuppressLint;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ActivityInfo;
+import android.graphics.Bitmap;
 import android.net.http.SslCertificate;
 import android.net.http.SslCertificate;
 import android.net.http.SslError;
 import android.net.http.SslError;
 import android.os.Build;
 import android.os.Build;
@@ -35,6 +36,7 @@ import android.view.ViewGroup;
 import android.webkit.*;
 import android.webkit.*;
 import android.widget.ProgressBar;
 import android.widget.ProgressBar;
 import androidx.annotation.NonNull;
 import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
 import androidx.work.OneTimeWorkRequest;
 import androidx.work.OneTimeWorkRequest;
 import androidx.work.WorkManager;
 import androidx.work.WorkManager;
 import autodagger.AutoInjector;
 import autodagger.AutoInjector;
@@ -53,6 +55,8 @@ import com.nextcloud.talk.utils.database.user.UserUtils;
 import com.nextcloud.talk.utils.preferences.AppPreferences;
 import com.nextcloud.talk.utils.preferences.AppPreferences;
 import com.nextcloud.talk.utils.singletons.ApplicationWideMessageHolder;
 import com.nextcloud.talk.utils.singletons.ApplicationWideMessageHolder;
 import com.nextcloud.talk.utils.ssl.MagicTrustManager;
 import com.nextcloud.talk.utils.ssl.MagicTrustManager;
+
+import de.cotech.hw.fido.WebViewFidoBridge;
 import io.reactivex.android.schedulers.AndroidSchedulers;
 import io.reactivex.android.schedulers.AndroidSchedulers;
 import io.reactivex.disposables.Disposable;
 import io.reactivex.disposables.Disposable;
 import io.reactivex.schedulers.Schedulers;
 import io.reactivex.schedulers.Schedulers;
@@ -112,6 +116,8 @@ public class WebViewLoginController extends BaseController {
 
 
     private boolean automatedLoginAttempted = false;
     private boolean automatedLoginAttempted = false;
 
 
+    private WebViewFidoBridge webViewFidoBridge;
+
     public WebViewLoginController(String baseUrl, boolean isPasswordUpdate) {
     public WebViewLoginController(String baseUrl, boolean isPasswordUpdate) {
         this.baseUrl = baseUrl;
         this.baseUrl = baseUrl;
         this.isPasswordUpdate = isPasswordUpdate;
         this.isPasswordUpdate = isPasswordUpdate;
@@ -169,6 +175,8 @@ public class WebViewLoginController extends BaseController {
         webView.clearHistory();
         webView.clearHistory();
         WebView.clearClientCertPreferences(null);
         WebView.clearClientCertPreferences(null);
 
 
+        webViewFidoBridge = WebViewFidoBridge.createInstanceForWebView((AppCompatActivity) getActivity(), webView);
+
         CookieSyncManager.createInstance(getActivity());
         CookieSyncManager.createInstance(getActivity());
         android.webkit.CookieManager.getInstance().removeAllCookies(null);
         android.webkit.CookieManager.getInstance().removeAllCookies(null);
 
 
@@ -178,6 +186,18 @@ public class WebViewLoginController extends BaseController {
         webView.setWebViewClient(new WebViewClient() {
         webView.setWebViewClient(new WebViewClient() {
             private boolean basePageLoaded;
             private boolean basePageLoaded;
 
 
+            @Override
+            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
+                webViewFidoBridge.delegateShouldInterceptRequest(view, request);
+                return super.shouldInterceptRequest(view, request);
+            }
+
+            @Override
+            public void onPageStarted(WebView view, String url, Bitmap favicon) {
+                super.onPageStarted(view, url, favicon);
+                webViewFidoBridge.delegateOnPageStarted(view, url, favicon);
+            }
+
             @Override
             @Override
             public boolean shouldOverrideUrlLoading(WebView view, String url) {
             public boolean shouldOverrideUrlLoading(WebView view, String url) {
                 if (url.startsWith(assembledPrefix)) {
                 if (url.startsWith(assembledPrefix)) {