This commit is contained in:
Kovid Goyal 2016-12-24 13:44:37 +05:30
parent fb60925df3
commit 0c8af8c6b6
9 changed files with 32 additions and 31 deletions

View File

@ -165,20 +165,15 @@ def render_html_data(path_to_html, width, height):
def render_html(path_to_html, width=590, height=750, as_xhtml=True): def render_html(path_to_html, width=590, height=750, as_xhtml=True):
from PyQt5.QtWebKitWidgets import QWebPage from PyQt5.QtWebKitWidgets import QWebPage
from PyQt5.QtWebKit import QWebSettings
from PyQt5.Qt import QEventLoop, QPalette, Qt, QUrl, QSize from PyQt5.Qt import QEventLoop, QPalette, Qt, QUrl, QSize
from calibre.gui2 import is_ok_to_use_qt from calibre.gui2 import is_ok_to_use_qt, secure_web_page
if not is_ok_to_use_qt(): if not is_ok_to_use_qt():
return None return None
path_to_html = os.path.abspath(path_to_html) path_to_html = os.path.abspath(path_to_html)
with CurrentDir(os.path.dirname(path_to_html)): with CurrentDir(os.path.dirname(path_to_html)):
page = QWebPage() page = QWebPage()
settings = page.settings() settings = page.settings()
settings.setAttribute(QWebSettings.JavaEnabled, False) secure_web_page(settings)
settings.setAttribute(QWebSettings.PluginsEnabled, False)
settings.setAttribute(QWebSettings.JavascriptCanOpenWindows, False)
settings.setAttribute(QWebSettings.JavascriptCanAccessClipboard, False)
settings.setAttribute(QWebSettings.LocalContentCanAccessFileUrls, False) # ensure javascript cannot read from local files
pal = page.palette() pal = page.palette()
pal.setBrush(QPalette.Background, Qt.white) pal.setBrush(QPalette.Background, Qt.white)
page.setPalette(pal) page.setPalette(pal)

View File

@ -19,6 +19,7 @@ class HTMLTableRenderer(QObject):
`width, height`: page width and height in pixels `width, height`: page width and height in pixels
`base_dir`: The directory in which the HTML file that contains the table resides `base_dir`: The directory in which the HTML file that contains the table resides
''' '''
from calibre.gui2 import secure_web_page
QObject.__init__(self) QObject.__init__(self)
self.app = None self.app = None
@ -28,6 +29,7 @@ class HTMLTableRenderer(QObject):
self.tdir = tempfile.mkdtemp(prefix='calibre_render_table') self.tdir = tempfile.mkdtemp(prefix='calibre_render_table')
self.loop = QEventLoop() self.loop = QEventLoop()
self.page = QWebPage() self.page = QWebPage()
secure_web_page(self.page.settings())
self.page.loadFinished.connect(self.render_html) self.page.loadFinished.connect(self.render_html)
self.page.mainFrame().setTextSizeMultiplier(factor) self.page.mainFrame().setTextSizeMultiplier(factor)
self.page.mainFrame().setHtml(html, self.page.mainFrame().setHtml(html,

View File

@ -65,6 +65,7 @@ def get_page_size(opts, for_comic=False): # {{{
class Page(QWebPage): # {{{ class Page(QWebPage): # {{{
def __init__(self, opts, log): def __init__(self, opts, log):
from calibre.gui2 import secure_web_page
self.log = log self.log = log
QWebPage.__init__(self) QWebPage.__init__(self)
settings = self.settings() settings = self.settings()
@ -74,11 +75,7 @@ class Page(QWebPage): # {{{
opts.pdf_mono_font_size) opts.pdf_mono_font_size)
settings.setFontSize(QWebSettings.MinimumLogicalFontSize, 8) settings.setFontSize(QWebSettings.MinimumLogicalFontSize, 8)
settings.setFontSize(QWebSettings.MinimumFontSize, 8) settings.setFontSize(QWebSettings.MinimumFontSize, 8)
settings.setAttribute(QWebSettings.JavaEnabled, False) secure_web_page(settings)
settings.setAttribute(QWebSettings.PluginsEnabled, False)
settings.setAttribute(QWebSettings.JavascriptCanOpenWindows, False)
settings.setAttribute(QWebSettings.JavascriptCanAccessClipboard, False)
settings.setAttribute(QWebSettings.LocalContentCanAccessFileUrls, False) # ensure javascript cannot read from local files
std = {'serif':opts.pdf_serif_family, 'sans':opts.pdf_sans_family, std = {'serif':opts.pdf_serif_family, 'sans':opts.pdf_sans_family,
'mono':opts.pdf_mono_family}.get(opts.pdf_standard_font, 'mono':opts.pdf_mono_family}.get(opts.pdf_standard_font,

View File

@ -106,9 +106,11 @@ def draw_image_page(printer, painter, p, preserve_aspect_ratio=True):
class Page(QWebPage): # {{{ class Page(QWebPage): # {{{
def __init__(self, opts, log): def __init__(self, opts, log):
from calibre.gui2 import secure_web_page
self.log = log self.log = log
QWebPage.__init__(self) QWebPage.__init__(self)
settings = self.settings() settings = self.settings()
secure_web_page(settings)
settings.setFontSize(QWebSettings.DefaultFontSize, settings.setFontSize(QWebSettings.DefaultFontSize,
opts.pdf_default_font_size) opts.pdf_default_font_size)
settings.setFontSize(QWebSettings.DefaultFixedFontSize, settings.setFontSize(QWebSettings.DefaultFixedFontSize,
@ -396,5 +398,3 @@ class ImagePDFWriter(object): # {{{
painter.end() painter.end()
# }}} # }}}

View File

@ -1401,3 +1401,16 @@ def event_type_name(ev_or_etype):
if num == etype: if num == etype:
return name return name
return 'UnknownEventType' return 'UnknownEventType'
def secure_web_page(qwebpage_or_qwebsettings):
from PyQt5.QtWebKit import QWebSettings
settings = qwebpage_or_qwebsettings if isinstance(qwebpage_or_qwebsettings, QWebSettings) else qwebpage_or_qwebsettings.settings()
settings.setAttribute(QWebSettings.JavaEnabled, False)
settings.setAttribute(QWebSettings.PluginsEnabled, False)
settings.setAttribute(QWebSettings.JavascriptCanOpenWindows, False)
settings.setAttribute(QWebSettings.JavascriptCanAccessClipboard, False)
settings.setAttribute(QWebSettings.LocalContentCanAccessFileUrls, False) # ensure javascript cannot read from local files
settings.setAttribute(QWebSettings.NotificationsEnabled, False)
settings.setThirdPartyCookiePolicy(QWebSettings.AlwaysBlockThirdPartyCookies)
return settings

View File

@ -19,7 +19,7 @@ from PyQt5.QtWebKitWidgets import QWebView, QWebPage
from calibre.ebooks.chardet import xml_to_unicode from calibre.ebooks.chardet import xml_to_unicode
from calibre import xml_replace_entities, prepare_string_for_xml from calibre import xml_replace_entities, prepare_string_for_xml
from calibre.gui2 import open_url, error_dialog, choose_files, gprefs, NO_URL_FORMATTING from calibre.gui2 import open_url, error_dialog, choose_files, gprefs, NO_URL_FORMATTING, secure_web_page
from calibre.utils.soupparser import fromstring from calibre.utils.soupparser import fromstring
from calibre.utils.config import tweaks from calibre.utils.config import tweaks
from calibre.utils.imghdr import what from calibre.utils.imghdr import what
@ -171,6 +171,7 @@ class EditorWidget(QWebView): # {{{
self.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks) self.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
self.page().linkClicked.connect(self.link_clicked) self.page().linkClicked.connect(self.link_clicked)
secure_web_page(self.page().settings())
self.setHtml('') self.setHtml('')
self.set_readonly(False) self.set_readonly(False)
@ -412,6 +413,8 @@ class EditorWidget(QWebView): # {{{
# }}} # }}}
# Highlighter {{{ # Highlighter {{{
State_Text = -1 State_Text = -1
State_DocType = 0 State_DocType = 0
State_Comment = 1 State_Comment = 1
@ -791,6 +794,7 @@ class Editor(QWidget): # {{{
# }}} # }}}
if __name__ == '__main__': if __name__ == '__main__':
app = QApplication([]) app = QApplication([])
w = Editor() w = Editor()

View File

@ -17,7 +17,7 @@ from PyQt5.QtWebKitWidgets import QWebView, QWebPage
from PyQt5.QtWebKit import QWebElement from PyQt5.QtWebKit import QWebElement
from calibre.ebooks.oeb.display.webview import load_html from calibre.ebooks.oeb.display.webview import load_html
from calibre.gui2 import error_dialog, question_dialog, gprefs from calibre.gui2 import error_dialog, question_dialog, gprefs, secure_web_page
from calibre.utils.logging import default_log from calibre.utils.logging import default_log
@ -28,6 +28,7 @@ class Page(QWebPage): # {{{
def __init__(self): def __init__(self):
self.log = default_log self.log = default_log
QWebPage.__init__(self) QWebPage.__init__(self)
secure_web_page(self.settings())
self.js = None self.js = None
self.evaljs = self.mainFrame().evaluateJavaScript self.evaljs = self.mainFrame().evaluateJavaScript
self.bridge_value = None self.bridge_value = None

View File

@ -25,7 +25,7 @@ from calibre import prints
from calibre.constants import FAKE_PROTOCOL, FAKE_HOST from calibre.constants import FAKE_PROTOCOL, FAKE_HOST
from calibre.ebooks.oeb.polish.parsing import parse from calibre.ebooks.oeb.polish.parsing import parse
from calibre.ebooks.oeb.base import serialize, OEB_DOCS from calibre.ebooks.oeb.base import serialize, OEB_DOCS
from calibre.gui2 import error_dialog, open_url, NO_URL_FORMATTING from calibre.gui2 import error_dialog, open_url, NO_URL_FORMATTING, secure_web_page
from calibre.gui2.tweak_book import current_container, editors, tprefs, actions, TOP from calibre.gui2.tweak_book import current_container, editors, tprefs, actions, TOP
from calibre.gui2.viewer.documentview import apply_settings from calibre.gui2.viewer.documentview import apply_settings
from calibre.gui2.viewer.config import config from calibre.gui2.viewer.config import config
@ -262,12 +262,8 @@ class WebPage(QWebPage):
settings = self.settings() settings = self.settings()
apply_settings(settings, config().parse()) apply_settings(settings, config().parse())
settings.setMaximumPagesInCache(0) settings.setMaximumPagesInCache(0)
settings.setAttribute(settings.JavaEnabled, False) secure_web_page(settings)
settings.setAttribute(settings.PluginsEnabled, False)
settings.setAttribute(settings.PrivateBrowsingEnabled, True) settings.setAttribute(settings.PrivateBrowsingEnabled, True)
settings.setAttribute(settings.JavascriptCanOpenWindows, False)
settings.setAttribute(settings.JavascriptCanAccessClipboard, False)
settings.setAttribute(settings.LocalContentCanAccessFileUrls, False) # ensure javascript cannot read from local files
settings.setAttribute(settings.LinksIncludedInFocusChain, False) settings.setAttribute(settings.LinksIncludedInFocusChain, False)
settings.setAttribute(settings.DeveloperExtrasEnabled, True) settings.setAttribute(settings.DeveloperExtrasEnabled, True)
settings.setDefaultTextEncoding('utf-8') settings.setDefaultTextEncoding('utf-8')

View File

@ -18,7 +18,7 @@ from PyQt5.QtWebKit import QWebSettings, QWebElement
from calibre.gui2.viewer.flip import SlideFlip from calibre.gui2.viewer.flip import SlideFlip
from calibre.gui2.shortcuts import Shortcuts from calibre.gui2.shortcuts import Shortcuts
from calibre.gui2 import open_url from calibre.gui2 import open_url, secure_web_page
from calibre import prints from calibre import prints
from calibre.customize.ui import all_viewer_plugins from calibre.customize.ui import all_viewer_plugins
from calibre.gui2.viewer.keys import SHORTCUTS from calibre.gui2.viewer.keys import SHORTCUTS
@ -48,16 +48,9 @@ def apply_settings(settings, opts):
def apply_basic_settings(settings): def apply_basic_settings(settings):
# Security secure_web_page(settings)
settings.setAttribute(QWebSettings.JavaEnabled, False)
settings.setAttribute(QWebSettings.PluginsEnabled, False)
settings.setAttribute(QWebSettings.JavascriptCanOpenWindows, False)
settings.setAttribute(QWebSettings.JavascriptCanAccessClipboard, False)
settings.setAttribute(QWebSettings.LocalContentCanAccessFileUrls, False) # ensure javascript cannot read from local files
# PrivateBrowsing disables console messages # PrivateBrowsing disables console messages
# settings.setAttribute(QWebSettings.PrivateBrowsingEnabled, True) # settings.setAttribute(QWebSettings.PrivateBrowsingEnabled, True)
settings.setAttribute(QWebSettings.NotificationsEnabled, False)
settings.setThirdPartyCookiePolicy(QWebSettings.AlwaysBlockThirdPartyCookies)
# Miscellaneous # Miscellaneous
settings.setAttribute(QWebSettings.LinksIncludedInFocusChain, True) settings.setAttribute(QWebSettings.LinksIncludedInFocusChain, True)