Addon Manager: Don't crash on bad XML

Wrap all metadata reads in try/except blocks and gracefully bail out if the data is bad.
This commit is contained in:
Chris Hennes
2024-09-18 21:17:49 -05:00
parent 4e0a574141
commit 72c654df55
3 changed files with 48 additions and 11 deletions

View File

@@ -33,6 +33,7 @@ import stat
import threading
import time
from typing import List
import xml.etree.ElementTree
from PySide import QtCore
@@ -44,6 +45,7 @@ from AddonStats import AddonStats
import NetworkManager
from addonmanager_git import initialize_git, GitFailed
from addonmanager_metadata import MetadataReader, get_branch_from_metadata
import addonmanager_freecad_interface as fci
translate = FreeCAD.Qt.translate
@@ -193,10 +195,18 @@ class CreateAddonListWorker(QtCore.QThread):
repo = Addon(name, addon["url"], state, addon["branch"])
md_file = os.path.join(addondir, "package.xml")
if os.path.isfile(md_file):
repo.installed_metadata = MetadataReader.from_file(md_file)
repo.installed_version = repo.installed_metadata.version
repo.updated_timestamp = os.path.getmtime(md_file)
repo.verify_url_and_branch(addon["url"], addon["branch"])
try:
repo.installed_metadata = MetadataReader.from_file(md_file)
repo.installed_version = repo.installed_metadata.version
repo.updated_timestamp = os.path.getmtime(md_file)
repo.verify_url_and_branch(addon["url"], addon["branch"])
except xml.etree.ElementTree.ParseError:
fci.Console.PrintWarning(
"An invalid or corrupted package.xml file was installed for"
)
fci.Console.PrintWarning(
f" custom addon {self.name}... ignoring the bad data.\n"
)
self.addon_repo.emit(repo)
@@ -236,10 +246,16 @@ class CreateAddonListWorker(QtCore.QThread):
repo = Addon(name, url, state, branch)
md_file = os.path.join(addondir, "package.xml")
if os.path.isfile(md_file):
repo.installed_metadata = MetadataReader.from_file(md_file)
repo.installed_version = repo.installed_metadata.version
repo.updated_timestamp = os.path.getmtime(md_file)
repo.verify_url_and_branch(url, branch)
try:
repo.installed_metadata = MetadataReader.from_file(md_file)
repo.installed_version = repo.installed_metadata.version
repo.updated_timestamp = os.path.getmtime(md_file)
repo.verify_url_and_branch(url, branch)
except xml.etree.ElementTree.ParseError:
fci.Console.PrintWarning(
"An invalid or corrupted package.xml file was installed for"
)
fci.Console.PrintWarning(f" addon {self.name}... ignoring the bad data.\n")
if name in self.py2only:
repo.python2 = True