diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index 914b9e512..e6f019f1c 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -51,7 +51,7 @@ class ThemeScreenshotWorker(QtCore.QObject): screenshot_downloaded = QtCore.pyqtSignal(str, str) 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 """ @@ -59,6 +59,7 @@ class ThemeScreenshotWorker(QtCore.QObject): self.themes_url = themes_url self.title = title self.filename = filename + self.sha256 = sha256 self.screenshot = screenshot super(ThemeScreenshotWorker, self).__init__() @@ -72,7 +73,7 @@ class ThemeScreenshotWorker(QtCore.QObject): urllib.request.urlretrieve('%s%s' % (self.themes_url, self.screenshot), os.path.join(gettempdir(), 'openlp', self.screenshot)) # 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: log.exception('Unable to download screenshot') finally: @@ -189,9 +190,9 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties): ans = msg.exec_() web_config = False if web_config: - files = web_config.read() + files = open('/home/phill/Downloads/download.cfg').read()#web_config.read() try: - self.config.read_string(files.decode()) + self.config.read_string(files)#.decode()) self.web = self.config.get('general', 'base url') self.songs_url = self.web + self.config.get('songs', '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() title = self.config.get('bible_%s' % bible, 'title') 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.setData(0, QtCore.Qt.UserRole, filename) + item.setData(0, QtCore.Qt.UserRole, (filename, sha256)) item.setCheckState(0, QtCore.Qt.Unchecked) item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable) self.bibles_tree_widget.expandAll() @@ -251,8 +253,9 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties): self.application.process_events() title = self.config.get('theme_%s' % theme, 'title') 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') - worker = ThemeScreenshotWorker(self.themes_url, title, filename, screenshot) + worker = ThemeScreenshotWorker(self.themes_url, title, filename, sha256, screenshot) self.theme_screenshot_workers.append(worker) worker.screenshot_downloaded.connect(self.on_screenshot_downloaded) thread = QtCore.QThread(self) @@ -352,7 +355,7 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties): time.sleep(0.1) 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 @@ -360,7 +363,7 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties): :param filename: The filename of the theme """ 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.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable) @@ -389,16 +392,20 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties): try: url_file = urllib.request.urlopen(url, timeout=CONNECTION_TIMEOUT) filename = open(f_path, "wb") + if sha256: + hasher = hashlib.sha256() # Download until finished or canceled. while not self.was_cancelled: data = url_file.read(block_size) if not data: break filename.write(data) + if sha256: + hasher.update(data) block_count += 1 self._download_progress(block_count, block_size) 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)) os.remove(f_path) return False @@ -493,7 +500,7 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties): self.application.process_events() item = iterator.value() 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)) self.max_progress += size iterator += 1 @@ -502,7 +509,7 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties): self.application.process_events() item = self.themes_list_widget.item(i) 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)) self.max_progress += size except urllib.error.URLError: @@ -612,20 +619,22 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties): while bibles_iterator.value(): item = bibles_iterator.value() 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.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 bibles_iterator += 1 # Download themes for i in range(self.themes_list_widget.count()): item = self.themes_list_widget.item(i) 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.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 True