feat: route deprecated sync clipboard read through permission checks (#45471)
* feat: route deprecated clipboard commands through permission checks Co-authored-by: deepak1556 <hop2deep@gmail.com> * docs: address review feedback Co-authored-by: deepak1556 <hop2deep@gmail.com> * fix: enable checks for child windows Co-authored-by: deepak1556 <hop2deep@gmail.com> --------- Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: deepak1556 <hop2deep@gmail.com>
This commit is contained in:
		
					parent
					
						
							
								51170c3652
							
						
					
				
			
			
				commit
				
					
						46c9ed61da
					
				
			
		
					 30 changed files with 441 additions and 35 deletions
				
			
		| 
						 | 
				
			
			@ -6,15 +6,19 @@
 | 
			
		|||
 | 
			
		||||
#include <utility>
 | 
			
		||||
 | 
			
		||||
#include "content/public/browser/browser_context.h"
 | 
			
		||||
#include "content/public/browser/permission_controller.h"
 | 
			
		||||
#include "content/public/browser/render_frame_host.h"
 | 
			
		||||
#include "content/public/browser/render_process_host.h"
 | 
			
		||||
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
 | 
			
		||||
#include "shell/browser/web_contents_permission_helper.h"
 | 
			
		||||
#include "third_party/blink/public/mojom/permissions/permission_status.mojom.h"
 | 
			
		||||
 | 
			
		||||
namespace electron {
 | 
			
		||||
ElectronWebContentsUtilityHandlerImpl::ElectronWebContentsUtilityHandlerImpl(
 | 
			
		||||
    content::RenderFrameHost* frame_host,
 | 
			
		||||
    mojo::PendingAssociatedReceiver<mojom::ElectronWebContentsUtility> receiver)
 | 
			
		||||
    : render_frame_host_id_(frame_host->GetGlobalId()) {
 | 
			
		||||
    : render_frame_host_token_(frame_host->GetGlobalFrameToken()) {
 | 
			
		||||
  content::WebContents* web_contents =
 | 
			
		||||
      content::WebContents::FromRenderFrameHost(frame_host);
 | 
			
		||||
  DCHECK(web_contents);
 | 
			
		||||
| 
						 | 
				
			
			@ -28,8 +32,11 @@ ElectronWebContentsUtilityHandlerImpl::ElectronWebContentsUtilityHandlerImpl(
 | 
			
		|||
ElectronWebContentsUtilityHandlerImpl::
 | 
			
		||||
    ~ElectronWebContentsUtilityHandlerImpl() = default;
 | 
			
		||||
 | 
			
		||||
void ElectronWebContentsUtilityHandlerImpl::WebContentsDestroyed() {
 | 
			
		||||
  delete this;
 | 
			
		||||
void ElectronWebContentsUtilityHandlerImpl::RenderFrameDeleted(
 | 
			
		||||
    content::RenderFrameHost* render_frame_host) {
 | 
			
		||||
  if (render_frame_host->GetGlobalFrameToken() == render_frame_host_token_) {
 | 
			
		||||
    delete this;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ElectronWebContentsUtilityHandlerImpl::OnConnectionError() {
 | 
			
		||||
| 
						 | 
				
			
			@ -59,9 +66,42 @@ void ElectronWebContentsUtilityHandlerImpl::DoGetZoomLevel(
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ElectronWebContentsUtilityHandlerImpl::CanAccessClipboardDeprecated(
 | 
			
		||||
    mojom::PermissionName name,
 | 
			
		||||
    const blink::LocalFrameToken& frame_token,
 | 
			
		||||
    CanAccessClipboardDeprecatedCallback callback) {
 | 
			
		||||
  if (render_frame_host_token_.frame_token == frame_token) {
 | 
			
		||||
    // Paste requires either (1) user activation, ...
 | 
			
		||||
    if (web_contents()->HasRecentInteraction()) {
 | 
			
		||||
      std::move(callback).Run(blink::mojom::PermissionStatus::GRANTED);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // (2) granted permission, ...
 | 
			
		||||
    content::RenderFrameHost* render_frame_host = GetRenderFrameHost();
 | 
			
		||||
    content::BrowserContext* browser_context =
 | 
			
		||||
        render_frame_host->GetBrowserContext();
 | 
			
		||||
    content::PermissionController* permission_controller =
 | 
			
		||||
        browser_context->GetPermissionController();
 | 
			
		||||
    blink::PermissionType permission;
 | 
			
		||||
    if (name == mojom::PermissionName::DEPRECATED_SYNC_CLIPBOARD_READ) {
 | 
			
		||||
      permission = blink::PermissionType::DEPRECATED_SYNC_CLIPBOARD_READ;
 | 
			
		||||
    } else {
 | 
			
		||||
      std::move(callback).Run(blink::mojom::PermissionStatus::DENIED);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    blink::mojom::PermissionStatus status =
 | 
			
		||||
        permission_controller->GetPermissionStatusForCurrentDocument(
 | 
			
		||||
            permission, render_frame_host);
 | 
			
		||||
    std::move(callback).Run(status);
 | 
			
		||||
  } else {
 | 
			
		||||
    std::move(callback).Run(blink::mojom::PermissionStatus::DENIED);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
content::RenderFrameHost*
 | 
			
		||||
ElectronWebContentsUtilityHandlerImpl::GetRenderFrameHost() {
 | 
			
		||||
  return content::RenderFrameHost::FromID(render_frame_host_id_);
 | 
			
		||||
  return content::RenderFrameHost::FromFrameToken(render_frame_host_token_);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// static
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue