From 2e2851dc13d73352530dd4495c7e05603b2e520d Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 10 Apr 2024 23:38:38 +0200 Subject: Adding upstream version 2.1.2~dev0+20240219. Signed-off-by: Daniel Baumann --- .../Blocklist/deluge_blocklist/peerguardian.py | 66 ++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py (limited to 'deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py') diff --git a/deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py b/deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py new file mode 100644 index 0000000..b5fb181 --- /dev/null +++ b/deluge/plugins/Blocklist/deluge_blocklist/peerguardian.py @@ -0,0 +1,66 @@ +# +# Copyright (C) 2007 Steve 'Tarka' Smith (tarka@internode.on.net) +# +# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with +# the additional special exception to link portions of this program with the OpenSSL library. +# See LICENSE for more details. +# + +import gzip +import logging +import socket +from struct import unpack + +log = logging.getLogger(__name__) + + +class PGException(Exception): + pass + + +# Incrementally reads PeerGuardian blocklists v1 and v2. +# See http://wiki.phoenixlabs.org/wiki/P2B_Format +class PGReader: + def __init__(self, filename): + log.debug('PGReader loading: %s', filename) + + try: + with gzip.open(filename, 'rb') as _file: + self.fd = _file + except OSError: + log.debug('Blocklist: PGReader: Incorrect file type or list is corrupt') + + # 4 bytes, should be 0xffffffff + buf = self.fd.read(4) + hdr = unpack('l', buf)[0] + if hdr != -1: + raise PGException(_('Invalid leader') + ' %d' % hdr) + + magic = self.fd.read(3) + if magic != 'P2B': + raise PGException(_('Invalid magic code')) + + buf = self.fd.read(1) + ver = ord(buf) + if ver != 1 and ver != 2: + raise PGException(_('Invalid version') + ' %d' % ver) + + def __next__(self): + # Skip over the string + buf = -1 + while buf != 0: + buf = self.fd.read(1) + if buf == '': # EOF + return False + buf = ord(buf) + + buf = self.fd.read(4) + start = socket.inet_ntoa(buf) + + buf = self.fd.read(4) + end = socket.inet_ntoa(buf) + + return (start, end) + + def close(self): + self.fd.close() -- cgit v1.2.3