From: Eugene Crosser Date: Thu, 14 Jul 2022 20:15:58 +0000 (+0200) Subject: collector: prevent two active clients share IMEI X-Git-Tag: 1.02~1 X-Git-Url: http://www.average.org/gitweb/?p=loctrkd.git;a=commitdiff_plain;h=6ae989809b438280258121498ca157e0777f5158 collector: prevent two active clients share IMEI --- diff --git a/gps303/collector.py b/gps303/collector.py index 9d694b0..ce41cb5 100644 --- a/gps303/collector.py +++ b/gps303/collector.py @@ -108,15 +108,6 @@ class Client: if len(packet) < 2: # frameend comes too early log.warning("Packet too short: %s", packet) break - if proto_of_message(packet) == LOGIN.PROTO: - msg = parse_message(packet) - if isinstance(msg, LOGIN): # Can be unparseable - self.imei = msg.imei - log.info( - "LOGIN from fd %d (IMEI %s)", - self.sock.fileno(), - self.imei, - ) msgs.append((when, self.addr, packet)) return msgs @@ -160,8 +151,23 @@ class Clients: return None result = [] for when, peeraddr, packet in msgs: - if proto_of_message(packet) == LOGIN.PROTO: # Could do blindly... - if clnt.imei: + if proto_of_message(packet) == LOGIN.PROTO: + msg = parse_message(packet) + if isinstance(msg, LOGIN): # Can be unparseable + if clnt.imei is None: + clnt.imei = msg.imei + log.info( + "LOGIN from fd %d (IMEI %s)", + clnt.sock.fileno(), + clnt.imei, + ) + oldclnt = self.by_imei.get(clnt.imei) + if oldclnt is not None: + log.info( + "Orphaning fd %d with the same IMEI", + oldclnt.sock.fileno(), + ) + oldclnt.imei = None self.by_imei[clnt.imei] = clnt else: log.warning(