From 6ae989809b438280258121498ca157e0777f5158 Mon Sep 17 00:00:00 2001 From: Eugene Crosser Date: Thu, 14 Jul 2022 22:15:58 +0200 Subject: [PATCH] collector: prevent two active clients share IMEI --- gps303/collector.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) 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( -- 2.39.2