From 36629a8bdb3bb9c4e69df228b5293c4e255e3afe Mon Sep 17 00:00:00 2001 From: Griatch Date: Sun, 19 Oct 2014 19:11:56 +0200 Subject: [PATCH] Fixed a race condition when the telnet protocol synced with the server with a delay (such as when the connecting client didn't respond to all protocol request tokens. This could lead to the sync overwriting already updated session flags, notably the puppet id (puid). Resolves #583. --- src/server/portal/portalsessionhandler.py | 8 ++++++++ src/server/serversession.py | 6 ------ src/server/sessionhandler.py | 5 +++++ 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/server/portal/portalsessionhandler.py b/src/server/portal/portalsessionhandler.py index 9ff5d122d7..0d9b1e3b08 100644 --- a/src/server/portal/portalsessionhandler.py +++ b/src/server/portal/portalsessionhandler.py @@ -64,6 +64,14 @@ class PortalSessionHandler(SessionHandler): # only use if session already has sessid (i.e. has already connected) sessdata = session.get_sync_data() if self.portal.amp_protocol: + # we remove sessdata that could already have changed on the + # server level + sessdata = dict((key, val) for key, val in sessdata.items() if key in ("protocol_key", + "address", + "suid", + "conn_time", + "protocol_flags", + "server_data",)) self.portal.amp_protocol.call_remote_ServerAdmin(session.sessid, operation=PCONNSYNC, data=sessdata) diff --git a/src/server/serversession.py b/src/server/serversession.py index 3498d74ffc..825ef2c574 100644 --- a/src/server/serversession.py +++ b/src/server/serversession.py @@ -234,12 +234,6 @@ class ServerSession(Session): Send Evennia -> User """ text = text if text else "" - #if text is None: - # text = "" - #else: - # text = to_unicode(text) - # text = to_str(text, self.encoding) - self.sessionhandler.data_out(self, text=text, **kwargs) def __eq__(self, other): diff --git a/src/server/sessionhandler.py b/src/server/sessionhandler.py index d4498054f1..b4b17eff02 100644 --- a/src/server/sessionhandler.py +++ b/src/server/sessionhandler.py @@ -220,6 +220,11 @@ class ServerSessionHandler(SessionHandler): sessid = portalsessiondata.get("sessid") session = self.sessions.get(sessid) if session: + # since some of the session properties may have had + # a chance to change already before the portal gets here + # the portal doesn't send all sessiondata here, but only + # ones which should only be changed from portal (like + # protocol_flags etc) session.load_sync_data(portalsessiondata) def portal_disconnect(self, sessid):