From ffaf119905d3f2bea5ca6fca7c1ec092be407aa7 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Mon, 15 Aug 2011 00:00:58 +0200 Subject: Add support for torrent files (thanks to the nice lib from Petru Paler) --- lib/mat.py | 2 ++ lib/misc.py | 74 +++++++++++++++++++++++++++++------------------------ test/clean.torrent | Bin 0 -> 54609 bytes test/dirty.torrent | Bin 0 -> 54622 bytes 4 files changed, 43 insertions(+), 33 deletions(-) create mode 100644 test/clean.torrent create mode 100644 test/dirty.torrent diff --git a/lib/mat.py b/lib/mat.py index 97a71ea..fd13287 100644 --- a/lib/mat.py +++ b/lib/mat.py @@ -17,6 +17,7 @@ import images import audio import office import archive +import misc __version__ = '0.1' __author__ = 'jvoisin' @@ -33,6 +34,7 @@ STRIPPERS = { 'audio/mpeg': audio.MpegAudioStripper, 'image/jpeg': images.JpegStripper, 'image/png': images.PngStripper, + 'application/x-bittorrent': misc.TorrentStripper, 'application/opendocument': office.OpenDocumentStripper, 'application/officeopenxml': office.OpenXmlStripper, } diff --git a/lib/misc.py b/lib/misc.py index 963800e..c92182a 100644 --- a/lib/misc.py +++ b/lib/misc.py @@ -2,36 +2,33 @@ Care about misc formats ''' -import hachoir_core import parser +import bencode + class TorrentStripper(parser.GenericParser): ''' - A torrent file looks like: - -root - -start - -announce - -announce-list - -comment - -created_by - -creation_date - -encoding - -info - -end + Represent a torrent file with the help + of the bencode lib from Petru Paler ''' - def remove_all(self): - for field in self.editor['root']: - if self._should_remove(field): - #FIXME : hachoir does not support torrent metadata editing :< - del self.editor['/root/' + field.name] - hachoir_core.field.writeIntoFile(self.editor, self.output) - self.do_backup() + def __init__(self, filename, parser, mime, backup, add2archive): + super(TorrentStripper, self).__init__(filename, parser, mime, + backup, add2archive) + self.fields = ['comment', 'creation date', 'created by'] def is_clean(self): - for field in self.editor['root']: - if self._should_remove(field): - return False + ''' + Check if the file is clean from harmful metadatas + ''' + with open(self.filename, 'r') as f: + decoded = bencode.bdecode(f.read()) + for key in self.fields: + try: + if decoded[key] != '': + return False + except: + pass return True def get_meta(self): @@ -39,16 +36,27 @@ class TorrentStripper(parser.GenericParser): Return a dict with all the meta of the file ''' metadata = {} - for field in self.editor['root']: - if self._should_remove(field): - try: # FIXME - metadata[field.name] = field.value - except: - metadata[field.name] = 'harmful content' + with open(self.filename, 'r') as f: + decoded = bencode.bdecode(f.read()) + for key in self.fields: + try: + if decoded[key] != '': + metadata[key] = decoded[key] + except: + pass return metadata - def _should_remove(self, field): - if field.name in ('comment', 'created_by', 'creation_date', 'info'): - return True - else: - return False + def remove_all(self): + ''' + Remove all the files that are compromizing + ''' + with open(self.filename, 'r') as f: + decoded = bencode.bdecode(f.read()) + for key in self.fields: + try: + decoded[key] = '' + except: + pass + with open(self.output, 'w') as f: # encode the decoded torrent + f.write(bencode.bencode(decoded)) # and write it in self.output + self.do_backup() diff --git a/test/clean.torrent b/test/clean.torrent new file mode 100644 index 0000000..e6324f7 Binary files /dev/null and b/test/clean.torrent differ diff --git a/test/dirty.torrent b/test/dirty.torrent new file mode 100644 index 0000000..bd056a0 Binary files /dev/null and b/test/dirty.torrent differ -- cgit v1.3