--- a/WebBrowser/WebBrowserPage.py Sun Jul 30 19:56:04 2017 +0200 +++ b/WebBrowser/WebBrowserPage.py Fri Aug 04 18:38:45 2017 +0200 @@ -14,12 +14,15 @@ except NameError: pass -from PyQt5.QtCore import pyqtSlot, QUrl, QTimer, QEventLoop, QPoint, QPointF +from PyQt5.QtCore import pyqtSlot, pyqtSignal, QUrl, QTimer, QEventLoop, \ + QPoint, QPointF from PyQt5.QtGui import QDesktopServices from PyQt5.QtWebEngineWidgets import QWebEnginePage, QWebEngineSettings, \ QWebEngineScript from PyQt5.QtWebChannel import QWebChannel +from E5Gui import E5MessageBox + from WebBrowser.WebBrowserWindow import WebBrowserWindow from .JavaScript.ExternalJsObject import ExternalJsObject @@ -33,6 +36,11 @@ class WebBrowserPage(QWebEnginePage): """ Class implementing an enhanced web page. + + @signal safeBrowsingAbort() emitted to indicate an abort due to a safe + browsing event + @signal safeBrowsingBad(threatType, threatMessages) emitted to indicate a + malicious web site as determined by safe browsing """ if qVersionTuple() >= (5, 7, 0): # SafeJsWorld = QWebEngineScript.ApplicationWorld @@ -40,6 +48,9 @@ else: SafeJsWorld = QWebEngineScript.MainWorld + safeBrowsingAbort = pyqtSignal() + safeBrowsingBad = pyqtSignal(str, str) + def __init__(self, parent=None): """ Constructor @@ -65,6 +76,7 @@ self.urlChanged.connect(self.__urlChanged) self.__printer = None + self.__badSite = False def acceptNavigationRequest(self, url, type_, isMainFrame): """ @@ -96,6 +108,33 @@ WebBrowserWindow.greaseMonkeyManager().downloadScript(url) return False + # Safe Browsing + self.__badSite = False + if url.scheme() not in \ + WebBrowserWindow.safeBrowsingManager().getIgnoreSchemes(): + threatLists = WebBrowserWindow.safeBrowsingManager().lookupUrl(url) + if threatLists: + threatMessages = WebBrowserWindow.safeBrowsingManager()\ + .getThreatMessages(threatLists) + res = E5MessageBox.warning( + WebBrowserWindow.getWindow(), + self.tr("Suspicuous URL detected"), + self.tr("<p>The URL <b>{0}</b> was found in the Safe" + " Browsing database.</p>{1}").format( + url.toString(), "".join(threatMessages)), + E5MessageBox.StandardButtons( + E5MessageBox.Abort | + E5MessageBox.Ignore), + E5MessageBox.Abort) + if res == E5MessageBox.Abort: + self.safeBrowsingAbort.emit() + return False + + self.__badSite = True + threatType = WebBrowserWindow.safeBrowsingManager()\ + .getThreatType(threatLists[0]) + self.safeBrowsingBad.emit(threatType, "".join(threatMessages)) + return QWebEnginePage.acceptNavigationRequest(self, url, type_, isMainFrame) @@ -374,6 +413,19 @@ self.view().mainWindow().javascriptConsole().javaScriptConsoleMessage( level, message, lineNumber, sourceId) + ########################################################################### + ## Methods below implement safe browsing related functions + ########################################################################### + + def getSafeBrowsingStatus(self): + """ + Public method to get the safe browsing status of the current page. + + @return flag indicating a safe site + @rtype bool + """ + return not self.__badSite + ################################################## ## Methods below implement compatibility functions ##################################################