emit verify-certificate event for handling verification

This commit is contained in:
Robo 2015-11-13 01:25:23 +05:30
parent d072e61282
commit 37e6e6fab7
8 changed files with 313 additions and 93 deletions

View file

@ -239,12 +239,24 @@ void SetProxyInIO(net::URLRequestContextGetter* getter,
RunCallbackInUI(callback);
}
void PassVerificationResult(
scoped_refptr<AtomCertVerifier::CertVerifyRequest> request,
bool success) {
int result = net::OK;
if (!success)
result = net::ERR_FAILED;
request->ContinueWithResult(result);
}
} // namespace
Session::Session(AtomBrowserContext* browser_context)
: browser_context_(browser_context) {
AttachAsUserData(browser_context);
// Observe Browser to get certificate verification notification.
Browser::Get()->AddObserver(this);
// Observe DownloadManger to get download notifications.
content::BrowserContext::GetDownloadManager(browser_context)->
AddObserver(this);
@ -253,9 +265,22 @@ Session::Session(AtomBrowserContext* browser_context)
Session::~Session() {
content::BrowserContext::GetDownloadManager(browser_context())->
RemoveObserver(this);
Browser::Get()->RemoveObserver(this);
Destroy();
}
void Session::OnCertVerification(
const scoped_refptr<AtomCertVerifier::CertVerifyRequest>& request) {
bool prevent_default = Emit(
"verify-certificate",
request->hostname(),
request->certificate(),
base::Bind(&PassVerificationResult, request));
if (!prevent_default)
request->ContinueWithResult(net::ERR_IO_PENDING);
}
void Session::OnDownloadCreated(content::DownloadManager* manager,
content::DownloadItem* item) {
auto web_contents = item->GetWebContents();
@ -367,7 +392,6 @@ v8::Local<v8::Value> Session::Cookies(v8::Isolate* isolate) {
mate::ObjectTemplateBuilder Session::GetObjectTemplateBuilder(
v8::Isolate* isolate) {
auto browser = base::Unretained(Browser::Get());
return mate::ObjectTemplateBuilder(isolate)
.SetMethod("resolveProxy", &Session::ResolveProxy)
.SetMethod("clearCache", &Session::ClearCache)
@ -376,10 +400,6 @@ mate::ObjectTemplateBuilder Session::GetObjectTemplateBuilder(
.SetMethod("setDownloadPath", &Session::SetDownloadPath)
.SetMethod("enableNetworkEmulation", &Session::EnableNetworkEmulation)
.SetMethod("disableNetworkEmulation", &Session::DisableNetworkEmulation)
.SetMethod("setCertificateVerifier",
base::Bind(&Browser::SetCertificateVerifier, browser))
.SetMethod("removeCertificateVerifier",
base::Bind(&Browser::RemoveCertificateVerifier, browser))
.SetProperty("cookies", &Session::Cookies);
}

View file

@ -8,6 +8,8 @@
#include <string>
#include "atom/browser/api/trackable_object.h"
#include "atom/browser/atom_cert_verifier.h"
#include "atom/browser/browser_observer.h"
#include "content/public/browser/download_manager.h"
#include "native_mate/handle.h"
#include "net/base/completion_callback.h"
@ -34,6 +36,7 @@ class AtomBrowserContext;
namespace api {
class Session: public mate::TrackableObject<Session>,
public BrowserObserver,
public content::DownloadManager::Observer {
public:
using ResolveProxyCallback = base::Callback<void(std::string)>;
@ -52,6 +55,10 @@ class Session: public mate::TrackableObject<Session>,
explicit Session(AtomBrowserContext* browser_context);
~Session();
// BrowserObserver:
void OnCertVerification(
const scoped_refptr<AtomCertVerifier::CertVerifyRequest>&) override;
// content::DownloadManager::Observer:
void OnDownloadCreated(content::DownloadManager* manager,
content::DownloadItem* item) override;