From 8534a825b3790ac904f37c59749c3857b50fc0e7 Mon Sep 17 00:00:00 2001 From: drew2a Date: Mon, 22 Aug 2022 18:18:53 +0200 Subject: [PATCH] Ensure tracker object --- .../db/orm_bindings/torrent_metadata.py | 14 ++++++++--- .../db/tests/test_torrent_metadata.py | 25 ++++++++++++++++--- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/tribler/core/components/metadata_store/db/orm_bindings/torrent_metadata.py b/src/tribler/core/components/metadata_store/db/orm_bindings/torrent_metadata.py index e13b2d46a30..10f390924ca 100644 --- a/src/tribler/core/components/metadata_store/db/orm_bindings/torrent_metadata.py +++ b/src/tribler/core/components/metadata_store/db/orm_bindings/torrent_metadata.py @@ -5,7 +5,7 @@ from pony.orm import db_session from tribler.core import notifications -from tribler.core.components.metadata_store.category_filter.category import default_category_filter +from tribler.core.components.metadata_store.category_filter.category import Category, default_category_filter from tribler.core.components.metadata_store.category_filter.family_filter import default_xxx_filter from tribler.core.components.metadata_store.db.orm_bindings.channel_node import COMMITTED from tribler.core.components.metadata_store.db.serialization import EPOCH, REGULAR_TORRENT, TorrentMetadataPayload @@ -21,13 +21,14 @@ def infohash_to_id(infohash): return abs(unpack(">q", infohash[:8])[0]) -def tdef_to_metadata_dict(tdef): +def tdef_to_metadata_dict(tdef, category_filter: Category = None): """ Helper function to create a TorrentMetadata-compatible dict from TorrentDef """ # We only want to determine the type of the data. XXX filtering is done by the receiving side + category_filter = category_filter or default_category_filter try: - tags = default_category_filter.calculateCategory(tdef.metainfo, tdef.get_name_as_unicode()) + tags = category_filter.calculateCategory(tdef.metainfo, tdef.get_name_as_unicode()) except UnicodeDecodeError: tags = "Unknown" @@ -36,13 +37,18 @@ def tdef_to_metadata_dict(tdef): except ValueError: torrent_date = EPOCH + tracker = tdef.get_tracker() + if not isinstance(tracker, bytes): + tracker = b'' + tracker_url = ensure_unicode(tracker, 'utf-8') + tracker_info = get_uniformed_tracker_url(tracker_url) or '' return { "infohash": tdef.get_infohash(), "title": tdef.get_name_as_unicode()[:300], "tags": tags[:200], "size": tdef.get_length(), "torrent_date": torrent_date if torrent_date >= EPOCH else EPOCH, - "tracker_info": get_uniformed_tracker_url(ensure_unicode(tdef.get_tracker() or '', 'utf-8')) or '', + "tracker_info": tracker_info, } diff --git a/src/tribler/core/components/metadata_store/db/tests/test_torrent_metadata.py b/src/tribler/core/components/metadata_store/db/tests/test_torrent_metadata.py index 9fb5356e87a..7b5e6e0a6f9 100644 --- a/src/tribler/core/components/metadata_store/db/tests/test_torrent_metadata.py +++ b/src/tribler/core/components/metadata_store/db/tests/test_torrent_metadata.py @@ -1,13 +1,12 @@ from datetime import datetime from time import time +from unittest.mock import MagicMock, Mock +import pytest from ipv8.keyvault.crypto import default_eccrypto - from pony import orm from pony.orm import db_session -import pytest - from tribler.core.components.libtorrent.torrentdef import TorrentDef from tribler.core.components.metadata_store.db.orm_bindings.channel_node import TODELETE from tribler.core.components.metadata_store.db.orm_bindings.discrete_clock import clock @@ -393,3 +392,23 @@ def test_popular_torrens_with_metadata_type(metadata_store): with pytest.raises(TypeError): metadata_store.get_entries(popular=True, metadata_type=[REGULAR_TORRENT, CHANNEL_TORRENT]) + + +WRONG_TRACKERS_OBJECTS = [ + (["b'udp://tracker/announce'"]), + (None) +] + + +@pytest.mark.parametrize('tracker', WRONG_TRACKERS_OBJECTS) +def test_tdef_to_metadata_dict_wrong_tracker(tracker): + # Ensure that in the case of wrong returned `get_tracker` object, `tdef_to_metadata_dict` function produces a + # correct dictionary + # see: https://github.com/Tribler/tribler/issues/6987 + metadata_dict = tdef_to_metadata_dict( + tdef=MagicMock( + get_tracker=Mock(return_value=tracker) + ), + category_filter=MagicMock()) + + assert metadata_dict['tracker_info'] == ''