diff --git a/evennia/server/portal/webclient.py b/evennia/server/portal/webclient.py index cc11f1d1f..b74c3eb36 100644 --- a/evennia/server/portal/webclient.py +++ b/evennia/server/portal/webclient.py @@ -68,7 +68,7 @@ class WebSocketClient(WebSocketServerProtocol, _BASE_SESSION_CLASS): """ try: - # client will connect with wsurl?csessid&browserid + # client will connect with wsurl?csessid&page_id&browserid webarg = self.http_request_uri.split("?", 1)[1] except IndexError: # this may happen for custom webclients not caring for the @@ -82,9 +82,12 @@ class WebSocketClient(WebSocketServerProtocol, _BASE_SESSION_CLASS): logger.log_trace(str(self)) return None - self.csessid, *browserstr = webarg.split("&", 1) - if browserstr: - self.browserstr = str(browserstr[0]) + self.csessid, *cargs = webarg.split("&", 2) + if len(cargs) == 1: + self.browserstr = str(cargs[0]) + elif len(cargs) == 2: + self.page_id = str(cargs[0]) + self.browserstr = str(cargs[1]) if self.csessid: return _CLIENT_SESSIONS(session_key=self.csessid) diff --git a/evennia/server/portal/webclient_ajax.py b/evennia/server/portal/webclient_ajax.py index 9ec5211cd..5a6e44229 100644 --- a/evennia/server/portal/webclient_ajax.py +++ b/evennia/server/portal/webclient_ajax.py @@ -270,6 +270,18 @@ class AjaxWebClient(resource.Resource): """ return html.escape(request.args[b"csessid"][0].decode("utf-8")) + def get_client_page_id(self, request): + """ + Helper to get the client page id out of the request. + + Args: + request (Request): Incoming request object. + Returns: + csessid (int): The client-page id. + + """ + return html.escape(request.args[b"cuid"][0].decode("utf-8")) + def get_browserstr(self, request): """ Get browser-string out of the request. @@ -313,10 +325,10 @@ class AjaxWebClient(resource.Resource): def client_disconnect(self, csessid): """ - Disconnect session with given csessid. + Disconnect session with given id. Args: - csessid (int): Session id. + csessid (int): Client page+session id. """ if csessid in self.requests: @@ -334,7 +346,8 @@ class AjaxWebClient(resource.Resource): request (Request): Incoming request. """ - csessid = self.get_client_sessid(request) + session_id = self.get_client_sessid(request) + page_id = self.get_client_page_id(request) browserstr = self.get_browserstr(request) remote_addr = ip_from_request(request) @@ -349,9 +362,9 @@ class AjaxWebClient(resource.Resource): sess.client = self sess.init_session("ajax/comet", remote_addr, self.sessionhandler) - sess.csessid = csessid + sess.csessid = session_id+page_id sess.browserstr = browserstr - csession = _CLIENT_SESSIONS(session_key=sess.csessid) + csession = _CLIENT_SESSIONS(session_key=session_id) uid = csession and csession.get("webclient_authenticated_uid", False) if uid: # the client session is already logged in @@ -359,7 +372,7 @@ class AjaxWebClient(resource.Resource): sess.logged_in = True # watch for dead links - self.last_alive[csessid] = (time.time(), False) + self.last_alive[sess.csessid] = (time.time(), False) if not self.keep_alive: # the keepalive is not running; start it. self.keep_alive = LoopingCall(self._keepalive) @@ -373,7 +386,7 @@ class AjaxWebClient(resource.Resource): # actually do the connection sess.sessionhandler.connect(sess) - return jsonify({"msg": host_string, "csessid": csessid}) + return jsonify({"msg": host_string, "csessid": session_id}) def mode_keepalive(self, request): """ @@ -384,7 +397,7 @@ class AjaxWebClient(resource.Resource): request (Request): Incoming request. """ - csessid = self.get_client_sessid(request) + csessid = self.get_client_sessid(request) + self.get_client_page_id(request) self.last_alive[csessid] = (time.time(), False) return b'""' @@ -397,7 +410,7 @@ class AjaxWebClient(resource.Resource): request (Request): Incoming request. """ - csessid = self.get_client_sessid(request) + csessid = self.get_client_sessid(request) + self.get_client_page_id(request) self.last_alive[csessid] = (time.time(), False) cmdarray = json.loads(request.args.get(b"data")[0]) for sess in self.sessionhandler.sessions_from_csessid(csessid): @@ -415,7 +428,7 @@ class AjaxWebClient(resource.Resource): request (Request): Incoming request. """ - csessid = html.escape(request.args[b"csessid"][0].decode("utf-8")) + csessid = self.get_client_sessid(request) + self.get_client_page_id(request) self.last_alive[csessid] = (time.time(), False) dataentries = self.databuffer.get(csessid) @@ -441,7 +454,7 @@ class AjaxWebClient(resource.Resource): request (Request): Incoming request. """ - csessid = self.get_client_sessid(request) + csessid = self.get_client_sessid(request) + self.get_client_page_id(request) try: sess = self.sessionhandler.sessions_from_csessid(csessid)[0] sess.sessionhandler.disconnect(sess) diff --git a/evennia/web/static/webclient/js/evennia.js b/evennia/web/static/webclient/js/evennia.js index 51da36c46..f3dbb5419 100644 --- a/evennia/web/static/webclient/js/evennia.js +++ b/evennia/web/static/webclient/js/evennia.js @@ -220,6 +220,7 @@ An "emitter" object must have a function var websocket = null; var wsurl = window.wsurl; var csessid = window.csessid; + var cuid = window.cuid; var connect = function() { if (websocket && websocket.readyState != websocket.CLOSED) { @@ -227,7 +228,7 @@ An "emitter" object must have a function return; } // Important - we pass csessid tacked on the url - websocket = new WebSocket(wsurl + '?' + csessid + '&' + browser); + websocket = new WebSocket(wsurl + '?' + csessid + '&' + cuid + '&' + browser); // Handle Websocket open event websocket.onopen = function (event) { @@ -304,13 +305,14 @@ An "emitter" object must have a function var stop_polling = false; var is_closing = false; var csessid = window.csessid; + var cuid = window.cuid; // initialize connection, send csessid var init = function() { $.ajax({type: "POST", url: "/webclientdata", async: true, cache: false, timeout: 50000, datatype: "json", - data: {mode: "init", csessid: csessid, browserstr: browser}, + data: {mode: "init", csessid: csessid, cuid: cuid, browserstr: browser}, success: function(data) { open = true; @@ -336,7 +338,7 @@ An "emitter" object must have a function async: true, cache: false, timeout: 30000, dataType: "json", data: {mode: inmode == null ? 'input' : inmode, - data: JSON.stringify(data), 'csessid': csessid}, + data: JSON.stringify(data), 'csessid': csessid, 'cuid': cuid}, success: function(req, stat, err) { stop_polling = false; }, @@ -356,7 +358,7 @@ An "emitter" object must have a function $.ajax({type: "POST", url: "/webclientdata", async: true, cache: false, timeout: 60000, dataType: "json", - data: {mode: 'receive', 'csessid': csessid}, + data: {mode: 'receive', 'csessid': csessid, 'cuid': cuid}, success: function(data) { // log("ajax data received:", data); if (data[0] === "ajax_keepalive") { @@ -411,7 +413,7 @@ An "emitter" object must have a function cache: false, timeout: 50000, dataType: "json", - data: {mode: 'close', 'csessid': csessid}, + data: {mode: 'close', 'csessid': csessid, 'cuid': cuid}, success: function(data){ is_closing = false; diff --git a/evennia/web/templates/webclient/base.html b/evennia/web/templates/webclient/base.html index ca8460c24..05038d83c 100644 --- a/evennia/web/templates/webclient/base.html +++ b/evennia/web/templates/webclient/base.html @@ -40,6 +40,15 @@ JQuery available. }) + + +