From a6fda5c19e4d657c78f24b63d811e2b1e0ab33d3 Mon Sep 17 00:00:00 2001 From: Shengjing Zhu Date: Wed, 25 Dec 2024 08:29:45 +0800 Subject: [PATCH] urlchecker: Extract version from deb for rotating url --- src/checkers/urlchecker.py | 8 ++++++++ src/lib/utils.py | 8 ++++++++ tests/com.google.Chrome.yaml | 9 +++++++++ tests/test_urlchecker.py | 30 ++++++++++++++++++++++++++---- 4 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 tests/com.google.Chrome.yaml diff --git a/src/checkers/urlchecker.py b/src/checkers/urlchecker.py index 767eb5af..6086f394 100644 --- a/src/checkers/urlchecker.py +++ b/src/checkers/urlchecker.py @@ -114,6 +114,14 @@ async def check(self, external_data: ExternalBase): version_string = await utils.extract_appimage_version( tmpfile, ) + if url.endswith(".deb"): + with tempfile.NamedTemporaryFile("w+b") as tmpfile: + new_version = await utils.get_extra_data_info_from_url( + url, session=self.session, dest_io=tmpfile + ) + version_string = utils.extract_deb_version( + tmpfile, + ) else: new_version = await utils.get_extra_data_info_from_url( url, session=self.session diff --git a/src/lib/utils.py b/src/lib/utils.py index 8ffbb606..6c2d41d6 100644 --- a/src/lib/utils.py +++ b/src/lib/utils.py @@ -18,6 +18,8 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +import apt_inst +import apt_pkg import datetime as dt import zoneinfo import json @@ -449,6 +451,12 @@ async def extract_appimage_version(appimg_io: t.IO): return kf.get_string(GLib.KEY_FILE_DESKTOP_GROUP, "X-AppImage-Version") +def extract_deb_version(deb_io: t.IO): + assert deb_io.name + control = apt_inst.DebFile(deb_io.name).control.extractdata("control") + return apt_pkg.TagSection(control).get("Version") + + _GITHUB_URL_PATTERN = re.compile( r""" ^git@github.com: diff --git a/tests/com.google.Chrome.yaml b/tests/com.google.Chrome.yaml new file mode 100644 index 00000000..f6278777 --- /dev/null +++ b/tests/com.google.Chrome.yaml @@ -0,0 +1,9 @@ +app-id: com.google.Chrome +modules: + - name: chrome + sources: + - type: extra-data + filename: chrome.deb + url: https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb + sha256: "0000000000000000000000000000000000000000000000000000000000000000" + size: 0 diff --git a/tests/test_urlchecker.py b/tests/test_urlchecker.py index 206df23f..6d7902f8 100644 --- a/tests/test_urlchecker.py +++ b/tests/test_urlchecker.py @@ -5,15 +5,15 @@ from src.lib.utils import init_logging from src.lib.checksums import MultiDigest -TEST_MANIFEST = os.path.join(os.path.dirname(__file__), "com.unity.UnityHub.yaml") - class TestURLChecker(unittest.IsolatedAsyncioTestCase): def setUp(self): init_logging() - async def test_check(self): - checker = ManifestChecker(TEST_MANIFEST) + async def test_check_appimage(self): + checker = ManifestChecker( + os.path.join(os.path.dirname(__file__), "com.unity.UnityHub.yaml") + ) ext_data = await checker.check() data = self._find_by_filename(ext_data, "UnityHubSetup.AppImage") @@ -32,6 +32,28 @@ async def test_check(self): ) self.assertIsNotNone(data.new_version.version) + async def test_check_deb(self): + checker = ManifestChecker( + os.path.join(os.path.dirname(__file__), "com.google.Chrome.yaml") + ) + ext_data = await checker.check() + + data = self._find_by_filename(ext_data, "chrome.deb") + self.assertIsNotNone(data) + self.assertEqual(data.filename, "chrome.deb") + self.assertIsNotNone(data.new_version) + self.assertIsInstance(data.new_version.size, int) + self.assertGreater(data.new_version.size, 0) + self.assertIsNotNone(data.new_version.checksum) + self.assertIsInstance(data.new_version.checksum, MultiDigest) + self.assertNotEqual( + data.new_version.checksum, + MultiDigest( + sha256="0000000000000000000000000000000000000000000000000000000000000000" # noqa: E501 + ), + ) + self.assertIsNotNone(data.new_version.version) + def _find_by_filename(self, ext_data, filename): for data in ext_data: if data.filename == filename: