diff -r 90939b08da20 -r 8b75b1668583 eric7/WebBrowser/AdBlock/AdBlockSubscription.py --- a/eric7/WebBrowser/AdBlock/AdBlockSubscription.py Mon Jun 20 13:25:14 2022 +0200 +++ b/eric7/WebBrowser/AdBlock/AdBlockSubscription.py Mon Jun 20 19:47:39 2022 +0200 @@ -14,7 +14,7 @@ from PyQt6.QtCore import ( pyqtSignal, Qt, QObject, QByteArray, QDateTime, QUrl, QUrlQuery, - QCryptographicHash, QFile, QIODevice, QTextStream, QDate, QTime + QCryptographicHash, QDate, QTime ) from PyQt6.QtNetwork import QNetworkReply, QNetworkRequest @@ -278,64 +278,69 @@ Private method to load the rules of the subscription. """ fileName = self.rulesFileName() - f = QFile(fileName) - if f.exists(): - if not f.open(QIODevice.OpenModeFlag.ReadOnly): + if os.path.exists(fileName): + try: + with open(fileName, "r", encoding="utf-8") as f: + header = f.readline().strip() + if not header.startswith("[Adblock"): + EricMessageBox.warning( + None, + self.tr("Load subscription rules"), + self.tr("""AdBlock file '{0}' does not start""" + """ with [Adblock.""") + .format(fileName)) + f.close() + os.unlink(fileName) + self.__lastUpdate = QDateTime() + else: + from .AdBlockRule import AdBlockRule + + self.__updatePeriod = 0 + self.__remoteModified = QDateTime() + self.__rules = [] + self.__rules.append(AdBlockRule(header, self)) + for line in f.readlines(): + line = line.strip() + if not line: + continue + self.__rules.append(AdBlockRule(line, self)) + expires = self.__expiresRe.search(line) + if expires: + period, kind = expires.groups() + if kind: + # hours + self.__updatePeriod = int(period) + else: + # days + self.__updatePeriod = int(period) * 24 + remoteModified = self.__remoteModifiedRe.search( + line) + if remoteModified: + day, month, year, time, hour, minute = ( + remoteModified.groups() + ) + self.__remoteModified.setDate( + QDate(int(year), + self.__monthNameToNumber[month], + int(day)) + ) + if time: + self.__remoteModified.setTime( + QTime(int(hour), int(minute))) + else: + # no time given, set it to 23:59 + self.__remoteModified.setTime( + QTime(23, 59)) + self.changed.emit() + except OSError as err: EricMessageBox.warning( None, self.tr("Load subscription rules"), self.tr( - """Unable to open AdBlock file '{0}' for reading.""") - .format(fileName)) - else: - textStream = QTextStream(f) - header = textStream.readLine(1024) - if not header.startswith("[Adblock"): - EricMessageBox.warning( - None, - self.tr("Load subscription rules"), - self.tr("""AdBlock file '{0}' does not start""" - """ with [Adblock.""") - .format(fileName)) - f.close() - f.remove() - self.__lastUpdate = QDateTime() - else: - from .AdBlockRule import AdBlockRule - - self.__updatePeriod = 0 - self.__remoteModified = QDateTime() - self.__rules = [] - self.__rules.append(AdBlockRule(header, self)) - while not textStream.atEnd(): - line = textStream.readLine() - self.__rules.append(AdBlockRule(line, self)) - expires = self.__expiresRe.search(line) - if expires: - period, kind = expires.groups() - if kind: - # hours - self.__updatePeriod = int(period) - else: - # days - self.__updatePeriod = int(period) * 24 - remoteModified = self.__remoteModifiedRe.search(line) - if remoteModified: - day, month, year, time, hour, minute = ( - remoteModified.groups() - ) - self.__remoteModified.setDate( - QDate(int(year), - self.__monthNameToNumber[month], - int(day)) - ) - if time: - self.__remoteModified.setTime( - QTime(int(hour), int(minute))) - else: - # no time given, set it to 23:59 - self.__remoteModified.setTime(QTime(23, 59)) - self.changed.emit() + """Unable to read AdBlock file '{0}'\nReason: {1}.""") + .format(fileName, str(err)) + ) + elif not fileName.endswith("_custom"): self.__lastUpdate = QDateTime() @@ -389,7 +394,7 @@ @param reply reference to the network reply @type QNetworkReply """ - response = reply.readAll() + response = bytes(reply.readAll()) reply.close() self.__downloading = None @@ -408,7 +413,7 @@ self.__defaultSubscription = False return - if response.isEmpty(): + if not response: EricMessageBox.warning( None, self.tr("Downloading subscription rules"), @@ -416,47 +421,46 @@ return fileName = self.rulesFileName() - QFile.remove(fileName) - f = QFile(fileName) - if not f.open(QIODevice.OpenModeFlag.ReadWrite): + try: + with open(fileName, "wb") as f: + from WebBrowser.WebBrowserWindow import WebBrowserWindow + if ( + WebBrowserWindow.adBlockManager().useLimitedEasyList() and + self.url().toString().startswith( + WebBrowserWindow.adBlockManager() + .getDefaultSubscriptionUrl()) + ): + limited = True + # ignore Third-party advertisers rules for performance + # whitelist rules at the end will be used + index = response.find( + b"!---------------------------" + b"Third-party advertisers" + b"---------------------------!") + part1 = response[:index] + index = response.find( + b"!-----------------------" + b"Whitelists to fix broken sites" + b"------------------------!") + part2 = response[index:] + f.write(part1) + f.write(part2) + else: + limited = False + f.write(response) + f.close() + self.__lastUpdate = QDateTime.currentDateTime() + + if limited or self.__validateCheckSum(fileName): + self.__loadRules() + else: + os.unlink(fileName) + except OSError: EricMessageBox.warning( None, self.tr("Downloading subscription rules"), - self.tr( - """Unable to open AdBlock file '{0}' for writing.""") + self.tr("""Unable to write to AdBlock file '{0}'.""") .file(fileName)) - return - - from WebBrowser.WebBrowserWindow import WebBrowserWindow - if ( - WebBrowserWindow.adBlockManager().useLimitedEasyList() and - self.url().toString().startswith( - WebBrowserWindow.adBlockManager().getDefaultSubscriptionUrl()) - ): - limited = True - # ignore Third-party advertisers rules for performance - # whitelist rules at the end will be used - index = response.indexOf( - b"!---------------------------" - b"Third-party advertisers" - b"---------------------------!") - part1 = response.left(index) - index = response.indexOf( - b"!-----------------------" - b"Whitelists to fix broken sites" - b"------------------------!") - part2 = response.mid(index) - f.write(part1) - f.write(part2) - else: - limited = False - f.write(response) - f.close() - self.__lastUpdate = QDateTime.currentDateTime() - if limited or self.__validateCheckSum(fileName): - self.__loadRules() - else: - QFile.remove(fileName) self.__downloading = None reply.deleteLater() @@ -520,22 +524,18 @@ if not fileName: return - f = QFile(fileName) - if not f.open(QIODevice.OpenModeFlag.ReadWrite | - QIODevice.OpenModeFlag.Truncate): + try: + with open(fileName, "w", encoding="utf-8") as f: + if not self.__rules or not self.__rules[0].isHeader(): + f.write("[Adblock Plus 2.0]\n") + for rule in self.__rules: + f.write(rule.filter() + "\n") + except OSError: EricMessageBox.warning( None, self.tr("Saving subscription rules"), - self.tr( - """Unable to open AdBlock file '{0}' for writing.""") + self.tr("""Unable to write to AdBlock file '{0}'.""") .format(fileName)) - return - - textStream = QTextStream(f) - if not self.__rules or not self.__rules[0].isHeader(): - textStream << "[Adblock Plus 1.1.1]\n" - for rule in self.__rules: - textStream << rule.filter() << "\n" def rule(self, offset): """