Changeset e12053


Ignore:
Timestamp:
07/08/2022 07:34:29 AM (3 years ago)
Author:
Calum Lind <calumlind+deluge@gmail.com>
Branches:
develop, master
Children:
b64084
Parents:
f52cf7
git-author:
Calum Lind <calumlind+deluge@gmail.com> (07/08/2022 07:29:18 AM)
git-committer:
Calum Lind <calumlind+deluge@gmail.com> (07/08/2022 07:34:29 AM)
Message:

Fix parsing magnet with tracker tiers

Magnets with trackers specified with tr.x param were not being unquoted
so unusable raw tracker string was being set.

Fixed by unquoting tracker and adding test

See-also: https://dev.deluge-torrent.org/ticket/2716

Location:
deluge
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • deluge/common.py

    rf52cf7 re12053  
    735735DN_PARAM = 'dn='
    736736TR_PARAM = 'tr='
     737TR_TIER_PARAM = 'tr.'
     738TR_TIER_REGEX = re.compile(r'^tr.(\d+)=(\S+)')
    737739
    738740
     
    777779    """
    778780
    779     tr0_param = 'tr.'
    780     tr0_param_regex = re.compile(r'^tr.(\d+)=(\S+)')
    781781    if not uri.startswith(MAGNET_SCHEME):
    782782        return {}
     
    806806            trackers[tracker] = tier
    807807            tier += 1
    808         elif param.startswith(tr0_param):
    809             try:
    810                 tier, tracker = re.match(tr0_param_regex, param).groups()
    811                 trackers[tracker] = tier
    812             except AttributeError:
    813                 pass
     808        elif param.startswith(TR_TIER_PARAM):
     809            tracker_match = re.match(TR_TIER_REGEX, param)
     810            if not tracker_match:
     811                continue
     812
     813            tier, tracker = tracker_match.groups()
     814            tracker = unquote_plus(tracker)
     815            trackers[tracker] = int(tier)
    814816
    815817    if info_hash:
  • deluge/tests/test_common.py

    rf52cf7 re12053  
    88import sys
    99import tarfile
     10from urllib.parse import quote_plus
    1011
    1112import pytest
     
    2021    fspeed,
    2122    ftime,
     23    get_magnet_info,
    2224    get_path_size,
    2325    is_infohash,
     
    210212                    result = tar.extractfile(tar_info).read().decode()
    211213                    assert result == 'test'
     214
     215    def test_get_magnet_info_tiers(self):
     216        tracker1 = 'udp://tracker1.example.com'
     217        tracker2 = 'udp://tracker2.example.com'
     218        magnet = (
     219            'magnet:?xt=urn:btih:SU5225URMTUEQLDXQWRB2EQWN6KLTYKN'
     220            f'&tr.1={quote_plus(tracker1)}'
     221            f'&tr.2={quote_plus(tracker2)}'
     222        )
     223        result = get_magnet_info(magnet)
     224        assert result['info_hash'] == '953bad769164e8482c7785a21d12166f94b9e14d'
     225        assert result['trackers'][tracker1] == 1
     226        assert result['trackers'][tracker2] == 2
Note: See TracChangeset for help on using the changeset viewer.