forked from openlp/openlp
Modified download hashing
This commit is contained in:
parent
4c36bba911
commit
b8838f496a
@ -51,7 +51,7 @@ class ThemeScreenshotWorker(QtCore.QObject):
|
|||||||
screenshot_downloaded = QtCore.pyqtSignal(str, str)
|
screenshot_downloaded = QtCore.pyqtSignal(str, str)
|
||||||
finished = QtCore.pyqtSignal()
|
finished = QtCore.pyqtSignal()
|
||||||
|
|
||||||
def __init__(self, themes_url, title, filename, screenshot):
|
def __init__(self, themes_url, title, filename, sha256, screenshot):
|
||||||
"""
|
"""
|
||||||
Set up the worker object
|
Set up the worker object
|
||||||
"""
|
"""
|
||||||
@ -59,6 +59,7 @@ class ThemeScreenshotWorker(QtCore.QObject):
|
|||||||
self.themes_url = themes_url
|
self.themes_url = themes_url
|
||||||
self.title = title
|
self.title = title
|
||||||
self.filename = filename
|
self.filename = filename
|
||||||
|
self.sha256 = sha256
|
||||||
self.screenshot = screenshot
|
self.screenshot = screenshot
|
||||||
super(ThemeScreenshotWorker, self).__init__()
|
super(ThemeScreenshotWorker, self).__init__()
|
||||||
|
|
||||||
@ -72,7 +73,7 @@ class ThemeScreenshotWorker(QtCore.QObject):
|
|||||||
urllib.request.urlretrieve('%s%s' % (self.themes_url, self.screenshot),
|
urllib.request.urlretrieve('%s%s' % (self.themes_url, self.screenshot),
|
||||||
os.path.join(gettempdir(), 'openlp', self.screenshot))
|
os.path.join(gettempdir(), 'openlp', self.screenshot))
|
||||||
# Signal that the screenshot has been downloaded
|
# Signal that the screenshot has been downloaded
|
||||||
self.screenshot_downloaded.emit(self.title, self.filename)
|
self.screenshot_downloaded.emit(self.title, self.filename, self.sha256)
|
||||||
except:
|
except:
|
||||||
log.exception('Unable to download screenshot')
|
log.exception('Unable to download screenshot')
|
||||||
finally:
|
finally:
|
||||||
@ -189,9 +190,9 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties):
|
|||||||
ans = msg.exec_()
|
ans = msg.exec_()
|
||||||
web_config = False
|
web_config = False
|
||||||
if web_config:
|
if web_config:
|
||||||
files = web_config.read()
|
files = open('/home/phill/Downloads/download.cfg').read()#web_config.read()
|
||||||
try:
|
try:
|
||||||
self.config.read_string(files.decode())
|
self.config.read_string(files)#.decode())
|
||||||
self.web = self.config.get('general', 'base url')
|
self.web = self.config.get('general', 'base url')
|
||||||
self.songs_url = self.web + self.config.get('songs', 'directory') + '/'
|
self.songs_url = self.web + self.config.get('songs', 'directory') + '/'
|
||||||
self.bibles_url = self.web + self.config.get('bibles', 'directory') + '/'
|
self.bibles_url = self.web + self.config.get('bibles', 'directory') + '/'
|
||||||
@ -239,8 +240,9 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties):
|
|||||||
self.application.process_events()
|
self.application.process_events()
|
||||||
title = self.config.get('bible_%s' % bible, 'title')
|
title = self.config.get('bible_%s' % bible, 'title')
|
||||||
filename = self.config.get('bible_%s' % bible, 'filename')
|
filename = self.config.get('bible_%s' % bible, 'filename')
|
||||||
|
sha256 = self.config.get('bible_%s' % song, 'sha256', fallback=None)
|
||||||
item = QtGui.QTreeWidgetItem(lang_item, [title])
|
item = QtGui.QTreeWidgetItem(lang_item, [title])
|
||||||
item.setData(0, QtCore.Qt.UserRole, filename)
|
item.setData(0, QtCore.Qt.UserRole, (filename, sha256))
|
||||||
item.setCheckState(0, QtCore.Qt.Unchecked)
|
item.setCheckState(0, QtCore.Qt.Unchecked)
|
||||||
item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
|
item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
|
||||||
self.bibles_tree_widget.expandAll()
|
self.bibles_tree_widget.expandAll()
|
||||||
@ -251,8 +253,9 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties):
|
|||||||
self.application.process_events()
|
self.application.process_events()
|
||||||
title = self.config.get('theme_%s' % theme, 'title')
|
title = self.config.get('theme_%s' % theme, 'title')
|
||||||
filename = self.config.get('theme_%s' % theme, 'filename')
|
filename = self.config.get('theme_%s' % theme, 'filename')
|
||||||
|
sha256 = self.config.get('theme_%s' % song, 'sha256', fallback=None)
|
||||||
screenshot = self.config.get('theme_%s' % theme, 'screenshot')
|
screenshot = self.config.get('theme_%s' % theme, 'screenshot')
|
||||||
worker = ThemeScreenshotWorker(self.themes_url, title, filename, screenshot)
|
worker = ThemeScreenshotWorker(self.themes_url, title, filename, sha256, screenshot)
|
||||||
self.theme_screenshot_workers.append(worker)
|
self.theme_screenshot_workers.append(worker)
|
||||||
worker.screenshot_downloaded.connect(self.on_screenshot_downloaded)
|
worker.screenshot_downloaded.connect(self.on_screenshot_downloaded)
|
||||||
thread = QtCore.QThread(self)
|
thread = QtCore.QThread(self)
|
||||||
@ -352,7 +355,7 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties):
|
|||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
self.application.set_normal_cursor()
|
self.application.set_normal_cursor()
|
||||||
|
|
||||||
def on_screenshot_downloaded(self, title, filename):
|
def on_screenshot_downloaded(self, title, filename, sha256):
|
||||||
"""
|
"""
|
||||||
Add an item to the list when a theme has been downloaded
|
Add an item to the list when a theme has been downloaded
|
||||||
|
|
||||||
@ -360,7 +363,7 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties):
|
|||||||
:param filename: The filename of the theme
|
:param filename: The filename of the theme
|
||||||
"""
|
"""
|
||||||
item = QtGui.QListWidgetItem(title, self.themes_list_widget)
|
item = QtGui.QListWidgetItem(title, self.themes_list_widget)
|
||||||
item.setData(QtCore.Qt.UserRole, filename)
|
item.setData(QtCore.Qt.UserRole, (filename, sha256))
|
||||||
item.setCheckState(QtCore.Qt.Unchecked)
|
item.setCheckState(QtCore.Qt.Unchecked)
|
||||||
item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
|
item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
|
||||||
|
|
||||||
@ -389,16 +392,20 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties):
|
|||||||
try:
|
try:
|
||||||
url_file = urllib.request.urlopen(url, timeout=CONNECTION_TIMEOUT)
|
url_file = urllib.request.urlopen(url, timeout=CONNECTION_TIMEOUT)
|
||||||
filename = open(f_path, "wb")
|
filename = open(f_path, "wb")
|
||||||
|
if sha256:
|
||||||
|
hasher = hashlib.sha256()
|
||||||
# Download until finished or canceled.
|
# Download until finished or canceled.
|
||||||
while not self.was_cancelled:
|
while not self.was_cancelled:
|
||||||
data = url_file.read(block_size)
|
data = url_file.read(block_size)
|
||||||
if not data:
|
if not data:
|
||||||
break
|
break
|
||||||
filename.write(data)
|
filename.write(data)
|
||||||
|
if sha256:
|
||||||
|
hasher.update(data)
|
||||||
block_count += 1
|
block_count += 1
|
||||||
self._download_progress(block_count, block_size)
|
self._download_progress(block_count, block_size)
|
||||||
filename.close()
|
filename.close()
|
||||||
if sha256 and hashlib.sha256(open(f_path, 'rb').read()).hexdigest() != sha256:
|
if sha256 and hasher.hexdigest() != sha256:
|
||||||
log.error('sha256 sums did not match for file: {}'.format(f_path))
|
log.error('sha256 sums did not match for file: {}'.format(f_path))
|
||||||
os.remove(f_path)
|
os.remove(f_path)
|
||||||
return False
|
return False
|
||||||
@ -493,7 +500,7 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties):
|
|||||||
self.application.process_events()
|
self.application.process_events()
|
||||||
item = iterator.value()
|
item = iterator.value()
|
||||||
if item.parent() and item.checkState(0) == QtCore.Qt.Checked:
|
if item.parent() and item.checkState(0) == QtCore.Qt.Checked:
|
||||||
filename = item.data(0, QtCore.Qt.UserRole)
|
filename, _ = item.data(0, QtCore.Qt.UserRole)
|
||||||
size = self._get_file_size('%s%s' % (self.bibles_url, filename))
|
size = self._get_file_size('%s%s' % (self.bibles_url, filename))
|
||||||
self.max_progress += size
|
self.max_progress += size
|
||||||
iterator += 1
|
iterator += 1
|
||||||
@ -502,7 +509,7 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties):
|
|||||||
self.application.process_events()
|
self.application.process_events()
|
||||||
item = self.themes_list_widget.item(i)
|
item = self.themes_list_widget.item(i)
|
||||||
if item.checkState() == QtCore.Qt.Checked:
|
if item.checkState() == QtCore.Qt.Checked:
|
||||||
filename = item.data(QtCore.Qt.UserRole)
|
filename, _ = item.data(QtCore.Qt.UserRole)
|
||||||
size = self._get_file_size('%s%s' % (self.themes_url, filename))
|
size = self._get_file_size('%s%s' % (self.themes_url, filename))
|
||||||
self.max_progress += size
|
self.max_progress += size
|
||||||
except urllib.error.URLError:
|
except urllib.error.URLError:
|
||||||
@ -612,20 +619,22 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties):
|
|||||||
while bibles_iterator.value():
|
while bibles_iterator.value():
|
||||||
item = bibles_iterator.value()
|
item = bibles_iterator.value()
|
||||||
if item.parent() and item.checkState(0) == QtCore.Qt.Checked:
|
if item.parent() and item.checkState(0) == QtCore.Qt.Checked:
|
||||||
bible = item.data(0, QtCore.Qt.UserRole)
|
bible, sha256 = item.data(0, QtCore.Qt.UserRole)
|
||||||
self._increment_progress_bar(self.downloading % bible, 0)
|
self._increment_progress_bar(self.downloading % bible, 0)
|
||||||
self.previous_size = 0
|
self.previous_size = 0
|
||||||
if not self.url_get_file('%s%s' % (self.bibles_url, bible), os.path.join(bibles_destination, bible)):
|
if not self.url_get_file('%s%s' % (self.bibles_url, bible), os.path.join(bibles_destination, bible),
|
||||||
|
sha256):
|
||||||
return False
|
return False
|
||||||
bibles_iterator += 1
|
bibles_iterator += 1
|
||||||
# Download themes
|
# Download themes
|
||||||
for i in range(self.themes_list_widget.count()):
|
for i in range(self.themes_list_widget.count()):
|
||||||
item = self.themes_list_widget.item(i)
|
item = self.themes_list_widget.item(i)
|
||||||
if item.checkState() == QtCore.Qt.Checked:
|
if item.checkState() == QtCore.Qt.Checked:
|
||||||
theme = item.data(QtCore.Qt.UserRole)
|
theme, sha256 = item.data(QtCore.Qt.UserRole)
|
||||||
self._increment_progress_bar(self.downloading % theme, 0)
|
self._increment_progress_bar(self.downloading % theme, 0)
|
||||||
self.previous_size = 0
|
self.previous_size = 0
|
||||||
if not self.url_get_file('%s%s' % (self.themes_url, theme), os.path.join(themes_destination, theme)):
|
if not self.url_get_file('%s%s' % (self.themes_url, theme), os.path.join(themes_destination, theme),
|
||||||
|
sha256):
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user