mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	Add "cef/" prefix for CEF #includes in libcef/ directory. Sort #includes by following https://google.github.io/styleguide/cppguide.html#Names_and_Order_of_Includes
		
			
				
	
	
		
			130 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright 2022 The Chromium Embedded Framework Authors. All rights reserved.
 | |
| // Use of this source code is governed by a BSD-style license that can be found
 | |
| // in the LICENSE file.
 | |
| 
 | |
| #include "cef/libcef/browser/certificate_query.h"
 | |
| 
 | |
| #include "base/functional/callback.h"
 | |
| #include "base/functional/callback_helpers.h"
 | |
| #include "base/logging.h"
 | |
| #include "cef/include/cef_request_handler.h"
 | |
| #include "cef/libcef/browser/browser_host_base.h"
 | |
| #include "cef/libcef/browser/ssl_info_impl.h"
 | |
| #include "cef/libcef/browser/thread_util.h"
 | |
| #include "content/public/browser/web_contents.h"
 | |
| #include "net/ssl/ssl_info.h"
 | |
| #include "url/gurl.h"
 | |
| 
 | |
| namespace certificate_query {
 | |
| 
 | |
| namespace {
 | |
| 
 | |
| class CefAllowCertificateErrorCallbackImpl : public CefCallback {
 | |
|  public:
 | |
|   using CallbackType = CertificateErrorCallback;
 | |
| 
 | |
|   explicit CefAllowCertificateErrorCallbackImpl(CallbackType callback)
 | |
|       : callback_(std::move(callback)) {}
 | |
| 
 | |
|   CefAllowCertificateErrorCallbackImpl(
 | |
|       const CefAllowCertificateErrorCallbackImpl&) = delete;
 | |
|   CefAllowCertificateErrorCallbackImpl& operator=(
 | |
|       const CefAllowCertificateErrorCallbackImpl&) = delete;
 | |
| 
 | |
|   ~CefAllowCertificateErrorCallbackImpl() override {
 | |
|     if (!callback_.is_null()) {
 | |
|       // The callback is still pending. Cancel it now.
 | |
|       if (CEF_CURRENTLY_ON_UIT()) {
 | |
|         RunNow(std::move(callback_), false);
 | |
|       } else {
 | |
|         CEF_POST_TASK(
 | |
|             CEF_UIT,
 | |
|             base::BindOnce(&CefAllowCertificateErrorCallbackImpl::RunNow,
 | |
|                            std::move(callback_), false));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void Continue() override { ContinueNow(true); }
 | |
| 
 | |
|   void Cancel() override { ContinueNow(false); }
 | |
| 
 | |
|   [[nodiscard]] CallbackType Disconnect() { return std::move(callback_); }
 | |
| 
 | |
|  private:
 | |
|   void ContinueNow(bool allow) {
 | |
|     if (CEF_CURRENTLY_ON_UIT()) {
 | |
|       if (!callback_.is_null()) {
 | |
|         RunNow(std::move(callback_), allow);
 | |
|       }
 | |
|     } else {
 | |
|       CEF_POST_TASK(
 | |
|           CEF_UIT,
 | |
|           base::BindOnce(&CefAllowCertificateErrorCallbackImpl::ContinueNow,
 | |
|                          this, allow));
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   static void RunNow(CallbackType callback, bool allow) {
 | |
|     CEF_REQUIRE_UIT();
 | |
|     std::move(callback).Run(
 | |
|         allow ? content::CERTIFICATE_REQUEST_RESULT_TYPE_CONTINUE
 | |
|               : content::CERTIFICATE_REQUEST_RESULT_TYPE_DENY);
 | |
|   }
 | |
| 
 | |
|   CallbackType callback_;
 | |
| 
 | |
|   IMPLEMENT_REFCOUNTING(CefAllowCertificateErrorCallbackImpl);
 | |
| };
 | |
| 
 | |
| }  // namespace
 | |
| 
 | |
| CertificateErrorCallback AllowCertificateError(
 | |
|     content::WebContents* web_contents,
 | |
|     int cert_error,
 | |
|     const net::SSLInfo& ssl_info,
 | |
|     const GURL& request_url,
 | |
|     bool is_main_frame_request,
 | |
|     bool strict_enforcement,
 | |
|     CertificateErrorCallback callback,
 | |
|     bool default_disallow) {
 | |
|   CEF_REQUIRE_UIT();
 | |
| 
 | |
|   if (!is_main_frame_request) {
 | |
|     // A sub-resource has a certificate error. The user doesn't really
 | |
|     // have a context for making the right decision, so block the request
 | |
|     // hard.
 | |
|     std::move(callback).Run(content::CERTIFICATE_REQUEST_RESULT_TYPE_DENY);
 | |
|     return base::NullCallback();
 | |
|   }
 | |
| 
 | |
|   if (auto browser = CefBrowserHostBase::GetBrowserForContents(web_contents)) {
 | |
|     if (auto client = browser->GetClient()) {
 | |
|       if (auto handler = client->GetRequestHandler()) {
 | |
|         CefRefPtr<CefSSLInfo> sslInfo(new CefSSLInfoImpl(ssl_info));
 | |
|         CefRefPtr<CefAllowCertificateErrorCallbackImpl> callbackImpl(
 | |
|             new CefAllowCertificateErrorCallbackImpl(std::move(callback)));
 | |
| 
 | |
|         bool proceed = handler->OnCertificateError(
 | |
|             browser.get(), static_cast<cef_errorcode_t>(cert_error),
 | |
|             request_url.spec(), sslInfo, callbackImpl.get());
 | |
|         if (!proceed) {
 | |
|           callback = callbackImpl->Disconnect();
 | |
|           LOG_IF(ERROR, callback.is_null())
 | |
|               << "Should return true from OnCertificateError when executing "
 | |
|                  "the callback";
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (!callback.is_null() && default_disallow) {
 | |
|     std::move(callback).Run(content::CERTIFICATE_REQUEST_RESULT_TYPE_DENY);
 | |
|     return base::NullCallback();
 | |
|   }
 | |
| 
 | |
|   return callback;
 | |
| }
 | |
| 
 | |
| }  // namespace certificate_query
 |