From 2598a3726834ce6a53fd1251dd8e910823e709fc Mon Sep 17 00:00:00 2001 From: Muhammad Ndako Date: Thu, 20 Feb 2025 04:26:07 +0100 Subject: [PATCH] fix: grant camera permission base on origin for android --- .../webview/RNCWebViewManager.java | 30 +++++++++---------- src/WebView.android.tsx | 2 -- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManager.java b/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManager.java index ba83d12fa..f4297eba3 100644 --- a/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManager.java +++ b/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManager.java @@ -226,14 +226,14 @@ private String getLackPermissionToDownloadMessage() { return mDownloadingMessage == null ? DEFAULT_LACK_PERMISSION_TO_DOWNLOAD_MESSAGE : mLackPermissionToDownloadMessage; } - @ReactProp(name = "cameraPermissionWhitelist") - public void setCameraPermissionWhitelist(RNCWebView webView, ReadableArray whitelist) { + @ReactProp(name = "cameraPermissionOriginWhitelist") + public void setCameraPermissionOriginWhitelist(RNCWebView webView, ReadableArray whitelist) { Set whitelistSet = new HashSet<>(); for (int i = 0; i < whitelist.size(); i++) { whitelistSet.add(whitelist.getString(i)); } - mWebChromeClient.setCameraPermissionWhitelist(whitelistSet); + mWebChromeClient.setCameraPermissionOriginWhitelist(whitelistSet); } @ReactProp(name = "javaScriptEnabled") @@ -1002,15 +1002,15 @@ protected static class RNCWebChromeClient extends WebChromeClient implements Lif // True if protected media should be allowed, false otherwise protected boolean mAllowsProtectedMedia = false; - private Set cameraPermissionWhitelist = new HashSet<>(); + private Set cameraPermissionOriginWhitelist = new HashSet<>(); public RNCWebChromeClient(ReactContext reactContext, WebView webView) { this.mReactContext = reactContext; this.mWebView = webView; } - public void setCameraPermissionWhitelist(Set whitelist) { - this.cameraPermissionWhitelist = whitelist; + public void setCameraPermissionOriginWhitelist(Set whitelist) { + this.cameraPermissionOriginWhitelist = whitelist; } @Override @@ -1074,21 +1074,19 @@ public void onPermissionRequest(final PermissionRequest request) { grantedPermissions = new ArrayList<>(); ArrayList requestedAndroidPermissions = new ArrayList<>(); - String originUrl = request.getOrigin().toString(); - String originHost; - - try { - URL url = new URL(originUrl); - originHost = url.getHost(); - } catch (MalformedURLException e) { - request.deny(); - return; + final Uri originUri = request.getOrigin(); + final String scheme = originUri.getScheme(); + final int port = originUri.getPort(); + String origin = scheme + "://" + port; + + if (port > 0 && ((scheme == "http" && port != 80) || (scheme == "https" && port != 443))) { + origin += ":" + port; } for (String requestedResource : request.getResources()) { String androidPermission = null; - if (this.cameraPermissionWhitelist.contains(originHost)) { + if (this.cameraPermissionOriginWhitelist.contains(origin)) { if (requestedResource.equals(PermissionRequest.RESOURCE_VIDEO_CAPTURE)) { androidPermission = Manifest.permission.CAMERA; } else if (requestedResource.equals(PermissionRequest.RESOURCE_AUDIO_CAPTURE)) { diff --git a/src/WebView.android.tsx b/src/WebView.android.tsx index 46de03db7..969ed1dfc 100644 --- a/src/WebView.android.tsx +++ b/src/WebView.android.tsx @@ -67,7 +67,6 @@ const WebViewComponent = forwardRef<{}, AndroidWebViewProps>((props, ref) => { scalesPageToFit = true, saveFormDataDisabled = false, cacheEnabled = true, - cameraPermissionWhitelist = [], androidHardwareAccelerationDisabled = false, androidLayerType = "none", originWhitelist = defaultOriginWhitelist, @@ -208,7 +207,6 @@ const WebViewComponent = forwardRef<{}, AndroidWebViewProps>((props, ref) => { const webView =