From 8236aaf2344c54ee8dba17c559aaff6e1b2086cb Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Sat, 25 Mar 2017 12:26:17 +0900 Subject: [PATCH] Be more strict on form of features dictionary --- lib/peer.py | 13 +++++++++---- server/controller.py | 4 ++-- server/peers.py | 7 ++++++- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/lib/peer.py b/lib/peer.py index 1e3c630..5f94e03 100644 --- a/lib/peer.py +++ b/lib/peer.py @@ -49,6 +49,7 @@ class Peer(object): a dictionary of features, and a record of the source.''' assert isinstance(host, str) assert isinstance(features, dict) + assert host in features.get('hosts', {}) self.host = host self.features = features.copy() # Canonicalize / clean-up @@ -105,10 +106,14 @@ class Peer(object): def update_features(self, features): '''Update features in-place.''' - tmp = Peer(self.host, features) - self.features = tmp.features - for feature in self.FEATURES: - setattr(self, feature, getattr(tmp, feature)) + try: + tmp = Peer(self.host, features) + except Exception: + pass + else: + self.features = tmp.features + for feature in self.FEATURES: + setattr(self, feature, getattr(tmp, feature)) def connection_port_pairs(self): '''Return a list of (kind, port) pairs to try when making a diff --git a/server/controller.py b/server/controller.py index 81d663e..3bd8264 100644 --- a/server/controller.py +++ b/server/controller.py @@ -508,8 +508,8 @@ class Controller(util.LoggedClass): host = features['hosts'][hostname] yield fmt.format(hostname[:30], item['status'], - host['tcp_port'] or '', - host['ssl_port'] or '', + host.get('tcp_port') or '', + host.get('ssl_port') or '', features['server_version'] or 'unknown', features['protocol_min'], features['protocol_max'], diff --git a/server/peers.py b/server/peers.py index 4525765..e78845a 100644 --- a/server/peers.py +++ b/server/peers.py @@ -400,7 +400,12 @@ class PeerManager(util.LoggedClass): if data: version, items = ast.literal_eval(data) if version == 1: - peers = [Peer.deserialize(item) for item in items] + peers = [] + for item in items: + try: + peers.append(Peer.deserialize(item)) + except Exception: + pass self.add_peers(peers, source='peers file', limit=None) def import_peers(self):