From: Michael Tremer Date: Mon, 26 Nov 2018 10:43:12 +0000 (+0000) Subject: Use yabencode to decode torrent files X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3ec6114d6bc4f61997764d7656ed2d2948907f65;p=ipfire.org.git Use yabencode to decode torrent files Signed-off-by: Michael Tremer --- diff --git a/Makefile.am b/Makefile.am index ca83aff7..d96b35b3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -65,7 +65,6 @@ backend_PYTHON = \ src/backend/releases.py \ src/backend/settings.py \ src/backend/talk.py \ - src/backend/tracker.py \ src/backend/util.py \ src/backend/wiki.py \ src/backend/zeiterfassung.py diff --git a/requirements.txt b/requirements.txt index e34c7a49..da6d09ee 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,6 +4,7 @@ cffi==1.11.5 cryptography==2.3.1 ecdsa==0.13 feedparser==5.2.1 +file-magic==0.4.0 html5lib==1.0.1 idna==2.7 iso3166==0.9 @@ -28,4 +29,5 @@ sshpubkeys==3.1.0 textile==3.0.3 tornado==4.4.2 webencodings==0.5.1 +yabencode==0.2.0 zxcvbn==4.4.27 diff --git a/src/backend/releases.py b/src/backend/releases.py index 5197f368..eef85097 100644 --- a/src/backend/releases.py +++ b/src/backend/releases.py @@ -6,9 +6,9 @@ import os import re import tornado.gen import urllib.parse +import yabencode from . import database -from . import tracker from .misc import Object TRACKERS = ( @@ -366,21 +366,14 @@ class Release(Object): torrent_hash, file.id) def torrent_read_hash(self, filename): - f = None - try: - f = open(filename, "rb") - - metainfo = tracker.bdecode(f.read()) - metainfo = tracker.bencode(metainfo["info"]) - - hash = hashlib.sha1() - hash.update(metainfo) + with open(filename, "rb") as f: + metainfo = yabencode.decode(f) + metainfo = yabencode.encode(metainfo["info"]) - return hash.hexdigest() + h = hashlib.new("sha1") + h.update(metainfo) - finally: - if f: - f.close() + return h.hexdigest() def supports_arch(self, arch): return arch in ("x86_64", "i586") diff --git a/src/backend/tracker.py b/src/backend/tracker.py deleted file mode 100644 index 7229905d..00000000 --- a/src/backend/tracker.py +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/python - -def ncode_hex(s): - return s.encode("hex") - -def decode_hex(s): - return s.decode("hex") - -##### This is borrowed from the bittorrent client libary ##### - -def decode_int(x, f): - f += 1 - newf = x.index('e', f) - n = int(x[f:newf]) - if x[f] == '-': - if x[f + 1] == '0': - raise ValueError - elif x[f] == '0' and newf != f+1: - raise ValueError - return (n, newf+1) - -def decode_string(x, f): - colon = x.index(':', f) - n = int(x[f:colon]) - if x[f] == '0' and colon != f+1: - raise ValueError - colon += 1 - return (x[colon:colon+n], colon+n) - -def decode_list(x, f): - r, f = [], f+1 - while x[f] != 'e': - v, f = decode_func[x[f]](x, f) - r.append(v) - return (r, f + 1) - -def decode_dict(x, f): - r, f = {}, f+1 - while x[f] != 'e': - k, f = decode_string(x, f) - r[k], f = decode_func[x[f]](x, f) - return (r, f + 1) - -decode_func = {} -decode_func['l'] = decode_list -decode_func['d'] = decode_dict -decode_func['i'] = decode_int -decode_func['0'] = decode_string -decode_func['1'] = decode_string -decode_func['2'] = decode_string -decode_func['3'] = decode_string -decode_func['4'] = decode_string -decode_func['5'] = decode_string -decode_func['6'] = decode_string -decode_func['7'] = decode_string -decode_func['8'] = decode_string -decode_func['9'] = decode_string - -def bdecode(x): - try: - r, l = decode_func[x[0]](x, 0) - except (IndexError, KeyError, ValueError): - raise Exception("not a valid bencoded string") - if l != len(x): - raise Exception("invalid bencoded value (data after valid prefix)") - return r - -def encode_bencached(x,r): - r.append(x.bencoded) - -def encode_int(x, r): - r.extend(('i', str(x), 'e')) - -def encode_bool(x, r): - if x: - encode_int(1, r) - else: - encode_int(0, r) - -def encode_string(x, r): - r.extend((str(len(x)), ':', x)) - -def encode_list(x, r): - r.append('l') - for i in x: - encode_func[type(i)](i, r) - r.append('e') - -def encode_dict(x,r): - r.append('d') - ilist = list(x.items()) - ilist.sort() - for k, v in ilist: - r.extend((str(len(k)), ':', k)) - encode_func[type(v)](v, r) - r.append('e') - -encode_func = {} -encode_func[int] = encode_int -encode_func[str] = encode_string -encode_func[list] = encode_list -encode_func[tuple] = encode_list -encode_func[dict] = encode_dict -encode_func[bool] = encode_bool - -def bencode(x): - r = [] - encode_func[type(x)](x, r) - return ''.join(r)