diff --git a/bazaar/ChromiumBrowser/ChromiumBrowser.cpp b/bazaar/ChromiumBrowser/ChromiumBrowser.cpp index 17bb233d2..e89ba2557 100644 --- a/bazaar/ChromiumBrowser/ChromiumBrowser.cpp +++ b/bazaar/ChromiumBrowser/ChromiumBrowser.cpp @@ -148,7 +148,7 @@ void ChromiumBrowser::AfterInit() WhenGotFocus = LAMBDA(){ SetFocus(); }; handler = new ClientHandler(WhenUrlChange, WhenStatus, WhenMessage, WhenTakeFocus, - WhenGotFocus, WhenKeyboard, WhenConsoleMessage); + WhenGotFocus, WhenKeyboard, WhenConsoleMessage, WhenCertificateError); CefBrowserSettings br_settings; br_settings.file_access_from_file_urls = STATE_DISABLED; diff --git a/bazaar/ChromiumBrowser/ChromiumBrowser.h b/bazaar/ChromiumBrowser/ChromiumBrowser.h index 39bec3f39..6742e1c31 100644 --- a/bazaar/ChromiumBrowser/ChromiumBrowser.h +++ b/bazaar/ChromiumBrowser/ChromiumBrowser.h @@ -30,12 +30,13 @@ public: ~ChromiumBrowser(); static const char * const JSFunctions[]; - Callback1 WhenUrlChange; - Callback3 WhenStatus; - Callback2&> WhenMessage; - Callback WhenTakeFocus; - Callback1 WhenKeyboard; - Callback3 WhenConsoleMessage; + Callback1 WhenUrlChange; + Callback3 WhenStatus; + Callback2&> WhenMessage; + Callback WhenTakeFocus; + Callback1 WhenKeyboard; + Callback3 WhenConsoleMessage; + Gate1 WhenCertificateError; static void ChildProcess(); static bool IsChildProcess(); diff --git a/bazaar/ChromiumBrowser/ClientHandler.cpp b/bazaar/ChromiumBrowser/ClientHandler.cpp index 9d197d2ce..b5f00379a 100644 --- a/bazaar/ChromiumBrowser/ClientHandler.cpp +++ b/bazaar/ChromiumBrowser/ClientHandler.cpp @@ -34,7 +34,7 @@ bool ClientHandler::OnBeforePopup(CefRefPtr browser, CefRefPtr frame, const CefString& target_url, const CefString& target_frame_name, - WindowOpenDisposition target_disposition, + CefLifeSpanHandler::WindowOpenDisposition target_disposition, bool user_gesture, const CefPopupFeatures& popupFeatures, CefWindowInfo& windowInfo, @@ -54,7 +54,7 @@ void ClientHandler::OnLoadError(CefRefPtr browser, const CefString& errorText, const CefString& failedUrl) { - frame->LoadString("

Page not found

", failedUrl); + frame->LoadString("

Page not found

", failedUrl); } @@ -144,3 +144,57 @@ bool ClientHandler::OnJSDialog(CefRefPtr browser, const CefString& o RLOG(message_text.ToString().c_str()); return false; } + + +static Upp::String GetCefTimeString(const CefTime& v) { + if (v.GetTimeT() == 0) return "Unspecified"; + + Upp::Time t; + t.year = v.year; + t.month = v.month; + t.day = v.day_of_month; + t.hour = v.hour; + t.minute= v.minute; + t.second= v.second; + + return Upp::FormatTime(t, "YYYY-MM-DD hh:mm:ss"); +} + + +bool ClientHandler::OnCertificateError(CefRefPtr browser, ErrorCode cert_error, + const CefString& request_url, CefRefPtr ssl_info, + CefRefPtr callback) +{ + ASSERT(CefCurrentlyOn(TID_UI)); + + bool cont = WhenCertificateError(request_url.ToString()); + + if (!cont){ + CefRefPtr subject = ssl_info->GetSubject(); + CefRefPtr issuer = ssl_info->GetIssuer(); + + // Build a table showing certificate information. + Upp::String ss; + ss << "" + "

Page certificate is not trusted

" + "
Certificate Information:" + "" + "" + "" + "" + "" + "
FieldValue
Subject" << + (subject.get() ? subject->GetDisplayName().ToString().c_str() : " ") << + "
Issuer" << + (issuer.get() ? issuer->GetDisplayName().ToString().c_str() : " ") << + "
Valid Start" << + GetCefTimeString(ssl_info->GetValidStart()) << "
Valid Expiry" << + GetCefTimeString(ssl_info->GetValidExpiry()) << "
" + ""; + + browser->GetMainFrame()->LoadString(~ss, request_url); + } + + callback->Continue(cont); + return cont; +} diff --git a/bazaar/ChromiumBrowser/ClientHandler.h b/bazaar/ChromiumBrowser/ClientHandler.h index b2a83fdd5..8035a48c5 100644 --- a/bazaar/ChromiumBrowser/ClientHandler.h +++ b/bazaar/ChromiumBrowser/ClientHandler.h @@ -18,7 +18,7 @@ class ClientHandler : public CefClient, public CefLifeSpanHandler, public CefDisplayHandler, public CefLoadHandler, public CefFocusHandler, public CefContextMenuHandler, - public CefJSDialogHandler + public CefJSDialogHandler, public CefRequestHandler { public: @@ -30,9 +30,11 @@ public: Upp::Callback & tf, Upp::Callback & gf, Upp::Callback1 & wk, - Upp::Callback3 & wcm): + Upp::Callback3 & wcm, + Upp::Gate1 & wce): browser(nullptr), WhenUrlChange(wuc), WhenStateChange(wsc), WhenMessage(wm), - WhenTakeFocus(tf), WhenGotFocus(gf), WhenKeyboard(wk), WhenConsoleMessage(wcm) { } + WhenTakeFocus(tf), WhenGotFocus(gf), WhenKeyboard(wk), WhenConsoleMessage(wcm), + WhenCertificateError(wce) { } ~ClientHandler() { } @@ -43,6 +45,7 @@ public: const Upp::Callback & WhenGotFocus; const Upp::Callback1 & WhenKeyboard; const Upp::Callback3 & WhenConsoleMessage; + const Upp::Gate1 & WhenCertificateError; void WhenMessageWrapper(Upp::String name, Upp::Vector * par); @@ -52,12 +55,13 @@ public: virtual CefRefPtr GetLoadHandler() OVERRIDE { return this; } virtual CefRefPtr GetContextMenuHandler() OVERRIDE { return this; } virtual CefRefPtr GetJSDialogHandler() OVERRIDE { return this; } + virtual CefRefPtr GetRequestHandler() OVERRIDE { return this; } virtual bool OnBeforePopup(CefRefPtr browser, CefRefPtr frame, const CefString& target_url, const CefString& target_frame_name, - WindowOpenDisposition target_disposition, + CefLifeSpanHandler::WindowOpenDisposition target_disposition, bool user_gesture, const CefPopupFeatures& popupFeatures, CefWindowInfo& windowInfo, @@ -106,6 +110,13 @@ public: CefRefPtr callback, bool& suppress_message) OVERRIDE; + virtual bool OnCertificateError(CefRefPtr browser, + ErrorCode cert_error, + const CefString& request_url, + CefRefPtr ssl_info, + CefRefPtr callback) OVERRIDE; + + CefRefPtr GetBrowser() { return browser; } protected: diff --git a/bazaar/ChromiumBrowser/src.tpp/ChromiumBrowser$en-us.tpp b/bazaar/ChromiumBrowser/src.tpp/ChromiumBrowser$en-us.tpp index 12ad06fe8..d12dc89bd 100644 --- a/bazaar/ChromiumBrowser/src.tpp/ChromiumBrowser$en-us.tpp +++ b/bazaar/ChromiumBrowser/src.tpp/ChromiumBrowser$en-us.tpp @@ -341,6 +341,12 @@ third `- message itself&] [s2; &] [s3;%- &] [s4;%- &] +[s5;:Upp`:`:ChromiumBrowser`:`:WhenCertificateError:%- [_^Upp`:`:Gate1^ Gate1]<[_^Upp`:`:String^ S +tring]>_[* WhenCertificateError]&] +[s2; Called when server certificate is not trusted. Gate should return +true if you want to ignore the warning and load the page&] +[s3;%- &] +[s4;%- &] [s5;:ChromiumBrowser`:`:IsChildProcess`(`):%- [@(0.0.255) static] [@(0.0.255) bool]_[* IsCh ildProcess]()&] [s2; This function should be called from the application GUI`_APP`_MAIN diff --git a/bazaar/ChromiumBrowserExample/ChromiumBrowserExample.h b/bazaar/ChromiumBrowserExample/ChromiumBrowserExample.h index 9c22a421e..067ca115a 100644 --- a/bazaar/ChromiumBrowserExample/ChromiumBrowserExample.h +++ b/bazaar/ChromiumBrowserExample/ChromiumBrowserExample.h @@ -18,6 +18,7 @@ private: void OnMessage(String name, const Vector& par); void OnStatus(bool loading, bool back, bool forward); void OnConsoleMessage(String url, int line, String msg); + bool OnCertificateError(String url); public: typedef ChromiumBrowserExample CLASSNAME; diff --git a/bazaar/ChromiumBrowserExample/main.cpp b/bazaar/ChromiumBrowserExample/main.cpp index 1d5d0950c..619e8c5b6 100644 --- a/bazaar/ChromiumBrowserExample/main.cpp +++ b/bazaar/ChromiumBrowserExample/main.cpp @@ -44,6 +44,7 @@ ChromiumBrowserExample::ChromiumBrowserExample() Browser.WhenKeyboard = STDBACK(::ShowKeyboard); Browser.WhenConsoleMessage = THISBACK(OnConsoleMessage); Browser.WhenMessage = THISBACK(OnMessage); + Browser.WhenCertificateError = THISBACK(OnCertificateError); Back.WhenAction = callback(&Browser, &ChromiumBrowser::GoBack); Forward.WhenAction = callback(&Browser, &ChromiumBrowser::GoForward); @@ -90,6 +91,13 @@ void ChromiumBrowserExample::OnMessage(String name, const Vector& par) } +bool ChromiumBrowserExample::OnCertificateError(String url) +{ + //return true to load page with invalid certificate + return PromptOKCancel(Format(t_("Connection to '%s' is untrusted&Load page anyway?"), DeQtfLf(url))); +} + + GUI_APP_MAIN { StdLogSetup(LOG_FILE | LOG_CERR | LOG_TIMESTAMP | LOG_APPEND);