use of android.webkit.ClientCertRequest in project SmartMesh_Android by SmartMeshFoundation.
the class AdvancedWebView method init.
@SuppressLint({ "SetJavaScriptEnabled" })
protected void init(final Context context) {
if (context instanceof Activity) {
mActivity = new WeakReference<Activity>((Activity) context);
}
mLanguageIso3 = getLanguageIso3();
setFocusable(true);
setFocusableInTouchMode(true);
setSaveEnabled(true);
final String filesDir = context.getFilesDir().getPath();
final String databaseDir = filesDir.substring(0, filesDir.lastIndexOf("/")) + DATABASES_SUB_FOLDER;
final WebSettings webSettings = getSettings();
webSettings.setAllowFileAccess(false);
setAllowAccessFromFileUrls(webSettings, true);
webSettings.setBuiltInZoomControls(false);
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
if (Build.VERSION.SDK_INT < 18) {
webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
}
webSettings.setDatabaseEnabled(true);
if (Build.VERSION.SDK_INT < 19) {
webSettings.setDatabasePath(databaseDir);
}
setMixedContentAllowed(webSettings, true);
setThirdPartyCookiesEnabled(true);
super.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
if (!hasError()) {
if (mListener != null) {
mListener.onPageStarted(url, favicon);
}
}
if (mCustomWebViewClient != null) {
mCustomWebViewClient.onPageStarted(view, url, favicon);
}
}
@Override
public void onPageFinished(WebView view, String url) {
if (!hasError()) {
if (mListener != null) {
mListener.onPageFinished(url);
}
}
if (mCustomWebViewClient != null) {
mCustomWebViewClient.onPageFinished(view, url);
}
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
setLastError();
if (mListener != null) {
mListener.onPageError(errorCode, description, failingUrl);
}
if (mCustomWebViewClient != null) {
mCustomWebViewClient.onReceivedError(view, errorCode, description, failingUrl);
}
}
@Override
public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
if (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("www.")) {
return super.shouldOverrideUrlLoading(view, url);
} else {
return true;
}
}
@Override
public void onLoadResource(WebView view, String url) {
if (mCustomWebViewClient != null) {
mCustomWebViewClient.onLoadResource(view, url);
} else {
super.onLoadResource(view, url);
}
}
@SuppressLint("NewApi")
@SuppressWarnings("all")
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
if (Build.VERSION.SDK_INT >= 11) {
if (mCustomWebViewClient != null) {
return mCustomWebViewClient.shouldInterceptRequest(view, url);
} else {
return super.shouldInterceptRequest(view, url);
}
} else {
return null;
}
}
@SuppressLint("NewApi")
@SuppressWarnings("all")
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
if (Build.VERSION.SDK_INT >= 21) {
if (mCustomWebViewClient != null) {
return mCustomWebViewClient.shouldInterceptRequest(view, request);
} else {
return super.shouldInterceptRequest(view, request);
}
} else {
return null;
}
}
@Override
public void onFormResubmission(WebView view, Message dontResend, Message resend) {
if (mCustomWebViewClient != null) {
mCustomWebViewClient.onFormResubmission(view, dontResend, resend);
} else {
super.onFormResubmission(view, dontResend, resend);
}
}
@Override
public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
if (mCustomWebViewClient != null) {
mCustomWebViewClient.doUpdateVisitedHistory(view, url, isReload);
} else {
super.doUpdateVisitedHistory(view, url, isReload);
}
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
if (mCustomWebViewClient != null) {
mCustomWebViewClient.onReceivedSslError(view, handler, error);
} else {
super.onReceivedSslError(view, handler, error);
}
}
@SuppressLint("NewApi")
@SuppressWarnings("all")
public void onReceivedClientCertRequest(WebView view, ClientCertRequest request) {
if (Build.VERSION.SDK_INT >= 21) {
if (mCustomWebViewClient != null) {
mCustomWebViewClient.onReceivedClientCertRequest(view, request);
} else {
super.onReceivedClientCertRequest(view, request);
}
}
}
@Override
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
if (mCustomWebViewClient != null) {
mCustomWebViewClient.onReceivedHttpAuthRequest(view, handler, host, realm);
} else {
super.onReceivedHttpAuthRequest(view, handler, host, realm);
}
}
@Override
public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
if (mCustomWebViewClient != null) {
return mCustomWebViewClient.shouldOverrideKeyEvent(view, event);
} else {
return super.shouldOverrideKeyEvent(view, event);
}
}
@Override
public void onUnhandledKeyEvent(WebView view, KeyEvent event) {
if (mCustomWebViewClient != null) {
mCustomWebViewClient.onUnhandledKeyEvent(view, event);
} else {
super.onUnhandledKeyEvent(view, event);
}
}
@SuppressLint("NewApi")
@SuppressWarnings("all")
public void onUnhandledInputEvent(WebView view, InputEvent event) {
if (Build.VERSION.SDK_INT >= 21) {
if (mCustomWebViewClient != null) {
mCustomWebViewClient.onUnhandledInputEvent(view, event);
} else {
super.onUnhandledInputEvent(view, event);
}
}
}
@Override
public void onScaleChanged(WebView view, float oldScale, float newScale) {
if (mCustomWebViewClient != null) {
mCustomWebViewClient.onScaleChanged(view, oldScale, newScale);
} else {
super.onScaleChanged(view, oldScale, newScale);
}
}
@SuppressLint("NewApi")
@SuppressWarnings("all")
public void onReceivedLoginRequest(WebView view, String realm, String account, String args) {
if (Build.VERSION.SDK_INT >= 12) {
if (mCustomWebViewClient != null) {
mCustomWebViewClient.onReceivedLoginRequest(view, realm, account, args);
} else {
super.onReceivedLoginRequest(view, realm, account, args);
}
}
}
});
super.setWebChromeClient(new WebChromeClient() {
// file upload callback (Android 2.2 (API level 8) -- Android 2.3 (API level 10)) (hidden method)
@SuppressWarnings("unused")
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
openFileChooser(uploadMsg, null);
}
// file upload callback (Android 3.0 (API level 11) -- Android 4.0 (API level 15)) (hidden method)
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
openFileChooser(uploadMsg, acceptType, null);
}
// file upload callback (Android 4.1 (API level 16) -- Android 4.3 (API level 18)) (hidden method)
@SuppressWarnings("unused")
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
openFileInput(uploadMsg, null);
}
// file upload callback (Android 5.0 (API level 21) -- current) (public method)
@SuppressWarnings("all")
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
openFileInput(null, filePathCallback);
return true;
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (mCustomWebChromeClient != null) {
mCustomWebChromeClient.onProgressChanged(view, newProgress);
} else {
super.onProgressChanged(view, newProgress);
}
}
@Override
public void onReceivedTitle(WebView view, String title) {
if (mCustomWebChromeClient != null) {
mCustomWebChromeClient.onReceivedTitle(view, title);
} else {
super.onReceivedTitle(view, title);
}
}
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
if (mCustomWebChromeClient != null) {
mCustomWebChromeClient.onReceivedIcon(view, icon);
} else {
super.onReceivedIcon(view, icon);
}
}
@Override
public void onReceivedTouchIconUrl(WebView view, String url, boolean precomposed) {
if (mCustomWebChromeClient != null) {
mCustomWebChromeClient.onReceivedTouchIconUrl(view, url, precomposed);
} else {
super.onReceivedTouchIconUrl(view, url, precomposed);
}
}
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
if (mCustomWebChromeClient != null) {
mCustomWebChromeClient.onShowCustomView(view, callback);
} else {
super.onShowCustomView(view, callback);
}
}
@SuppressLint("NewApi")
@SuppressWarnings("all")
public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) {
if (Build.VERSION.SDK_INT >= 14) {
if (mCustomWebChromeClient != null) {
mCustomWebChromeClient.onShowCustomView(view, requestedOrientation, callback);
} else {
super.onShowCustomView(view, requestedOrientation, callback);
}
}
}
@Override
public void onHideCustomView() {
if (mCustomWebChromeClient != null) {
mCustomWebChromeClient.onHideCustomView();
} else {
super.onHideCustomView();
}
}
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
if (mCustomWebChromeClient != null) {
return mCustomWebChromeClient.onCreateWindow(view, isDialog, isUserGesture, resultMsg);
} else {
return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg);
}
}
@Override
public void onRequestFocus(WebView view) {
if (mCustomWebChromeClient != null) {
mCustomWebChromeClient.onRequestFocus(view);
} else {
super.onRequestFocus(view);
}
}
@Override
public void onCloseWindow(WebView window) {
if (mCustomWebChromeClient != null) {
mCustomWebChromeClient.onCloseWindow(window);
} else {
super.onCloseWindow(window);
}
}
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
if (mCustomWebChromeClient != null) {
return mCustomWebChromeClient.onJsAlert(view, url, message, result);
} else {
return super.onJsAlert(view, url, message, result);
}
}
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
if (mCustomWebChromeClient != null) {
return mCustomWebChromeClient.onJsConfirm(view, url, message, result);
} else {
return super.onJsConfirm(view, url, message, result);
}
}
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
if (mCustomWebChromeClient != null) {
return mCustomWebChromeClient.onJsPrompt(view, url, message, defaultValue, result);
} else {
return super.onJsPrompt(view, url, message, defaultValue, result);
}
}
@Override
public boolean onJsBeforeUnload(WebView view, String url, String message, JsResult result) {
if (mCustomWebChromeClient != null) {
return mCustomWebChromeClient.onJsBeforeUnload(view, url, message, result);
} else {
return super.onJsBeforeUnload(view, url, message, result);
}
}
@Override
public void onGeolocationPermissionsShowPrompt(String origin, Callback callback) {
if (mGeolocationEnabled) {
callback.invoke(origin, true, false);
} else {
if (mCustomWebChromeClient != null) {
mCustomWebChromeClient.onGeolocationPermissionsShowPrompt(origin, callback);
} else {
super.onGeolocationPermissionsShowPrompt(origin, callback);
}
}
}
@Override
public void onGeolocationPermissionsHidePrompt() {
if (mCustomWebChromeClient != null) {
mCustomWebChromeClient.onGeolocationPermissionsHidePrompt();
} else {
super.onGeolocationPermissionsHidePrompt();
}
}
@SuppressLint("NewApi")
@SuppressWarnings("all")
public void onPermissionRequest(PermissionRequest request) {
if (Build.VERSION.SDK_INT >= 21) {
if (mCustomWebChromeClient != null) {
mCustomWebChromeClient.onPermissionRequest(request);
} else {
super.onPermissionRequest(request);
}
}
}
@SuppressLint("NewApi")
@SuppressWarnings("all")
public void onPermissionRequestCanceled(PermissionRequest request) {
if (Build.VERSION.SDK_INT >= 21) {
if (mCustomWebChromeClient != null) {
mCustomWebChromeClient.onPermissionRequestCanceled(request);
} else {
super.onPermissionRequestCanceled(request);
}
}
}
@Override
public boolean onJsTimeout() {
if (mCustomWebChromeClient != null) {
return mCustomWebChromeClient.onJsTimeout();
} else {
return super.onJsTimeout();
}
}
@Override
public void onConsoleMessage(String message, int lineNumber, String sourceID) {
if (mCustomWebChromeClient != null) {
mCustomWebChromeClient.onConsoleMessage(message, lineNumber, sourceID);
} else {
super.onConsoleMessage(message, lineNumber, sourceID);
}
}
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
if (mCustomWebChromeClient != null) {
return mCustomWebChromeClient.onConsoleMessage(consoleMessage);
} else {
return super.onConsoleMessage(consoleMessage);
}
}
@Override
public Bitmap getDefaultVideoPoster() {
if (mCustomWebChromeClient != null) {
return mCustomWebChromeClient.getDefaultVideoPoster();
} else {
return super.getDefaultVideoPoster();
}
}
@Override
public View getVideoLoadingProgressView() {
if (mCustomWebChromeClient != null) {
return mCustomWebChromeClient.getVideoLoadingProgressView();
} else {
return super.getVideoLoadingProgressView();
}
}
@Override
public void getVisitedHistory(ValueCallback<String[]> callback) {
if (mCustomWebChromeClient != null) {
mCustomWebChromeClient.getVisitedHistory(callback);
} else {
super.getVisitedHistory(callback);
}
}
@Override
public void onExceededDatabaseQuota(String url, String databaseIdentifier, long quota, long estimatedDatabaseSize, long totalQuota, QuotaUpdater quotaUpdater) {
if (mCustomWebChromeClient != null) {
mCustomWebChromeClient.onExceededDatabaseQuota(url, databaseIdentifier, quota, estimatedDatabaseSize, totalQuota, quotaUpdater);
} else {
super.onExceededDatabaseQuota(url, databaseIdentifier, quota, estimatedDatabaseSize, totalQuota, quotaUpdater);
}
}
@Override
public void onReachedMaxAppCacheSize(long requiredStorage, long quota, QuotaUpdater quotaUpdater) {
if (mCustomWebChromeClient != null) {
mCustomWebChromeClient.onReachedMaxAppCacheSize(requiredStorage, quota, quotaUpdater);
} else {
super.onReachedMaxAppCacheSize(requiredStorage, quota, quotaUpdater);
}
}
});
setDownloadListener(new DownloadListener() {
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
if (mListener != null) {
mListener.onDownloadRequested(url, userAgent, contentDisposition, mimetype, contentLength);
}
}
});
}
use of android.webkit.ClientCertRequest in project talk-android by nextcloud.
the class WebViewLoginController method onViewBound.
@Override
protected void onViewBound(@NonNull View view) {
super.onViewBound(view);
NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this);
if (getActivity() != null) {
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
if (getActionBar() != null) {
getActionBar().hide();
}
assembledPrefix = getResources().getString(R.string.nc_talk_login_scheme) + PROTOCOL_SUFFIX + "login/";
webView.getSettings().setAllowFileAccess(false);
webView.getSettings().setAllowFileAccessFromFileURLs(false);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(false);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setUserAgentString(getWebLoginUserAgent());
webView.getSettings().setSaveFormData(false);
webView.getSettings().setSavePassword(false);
webView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
webView.clearCache(true);
webView.clearFormData();
webView.clearHistory();
CookieSyncManager.createInstance(getActivity());
android.webkit.CookieManager.getInstance().removeAllCookies(null);
Map<String, String> headers = new HashMap<>();
headers.put("OCS-APIRequest", "true");
webView.setWebViewClient(new WebViewClient() {
private boolean basePageLoaded;
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith(assembledPrefix)) {
parseAndLoginFromWebView(url);
return true;
}
return false;
}
@Override
public void onPageFinished(WebView view, String url) {
loginStep++;
if (!basePageLoaded) {
if (progressBar != null) {
progressBar.setVisibility(View.GONE);
}
if (webView != null) {
webView.setVisibility(View.VISIBLE);
}
basePageLoaded = true;
}
if (!TextUtils.isEmpty(username) && !TextUtils.isEmpty(password)) {
if (loginStep == 1) {
webView.loadUrl("javascript: {document.getElementsByClassName('login')[0].click(); };");
} else if (!automatedLoginAttempted) {
automatedLoginAttempted = true;
webView.loadUrl("javascript: {" + "document.getElementById('user').value = '" + username + "';" + "document.getElementById('password').value = '" + password + "';" + "document.getElementById('submit').click(); };");
}
}
super.onPageFinished(view, url);
}
@Override
public void onReceivedClientCertRequest(WebView view, ClientCertRequest request) {
String host = null;
try {
URL url = new URL(webView.getUrl());
host = url.getHost();
} catch (MalformedURLException e) {
Log.d(TAG, "Failed to create url");
}
KeyChain.choosePrivateKeyAlias(getActivity(), alias -> {
try {
if (alias != null) {
PrivateKey privateKey = KeyChain.getPrivateKey(getActivity(), alias);
X509Certificate[] certificates = KeyChain.getCertificateChain(getActivity(), alias);
request.proceed(privateKey, certificates);
} else {
request.cancel();
}
} catch (KeyChainException e) {
Log.e(TAG, "Failed to get keys via keychain exception");
request.cancel();
} catch (InterruptedException e) {
Log.e(TAG, "Failed to get keys due to interruption");
request.cancel();
}
}, new String[] { "RSA" }, null, host, -1, null);
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
try {
SslCertificate sslCertificate = error.getCertificate();
Field f = sslCertificate.getClass().getDeclaredField("mX509Certificate");
f.setAccessible(true);
X509Certificate cert = (X509Certificate) f.get(sslCertificate);
if (cert == null) {
handler.cancel();
} else {
try {
magicTrustManager.checkServerTrusted(new X509Certificate[] { cert }, "generic");
handler.proceed();
} catch (CertificateException exception) {
eventBus.post(new CertificateEvent(cert, magicTrustManager, handler));
}
}
} catch (Exception exception) {
handler.cancel();
}
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
}
});
webView.loadUrl(baseUrl + "/index.php/login/flow", headers);
}
Aggregations