WebBrowser/WebBrowserPage.py

branch
safe_browsing
changeset 5829
d3448873ced3
parent 5785
7c7c5f9e4fad
child 6048
82ad8ec9548c
--- 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
     ##################################################

eric ide

mercurial