From a0c70ce4657e3b09a7a892aedfc9f6c6a839383b Mon Sep 17 00:00:00 2001 From: Griatch Date: Wed, 3 Nov 2021 20:09:47 +0100 Subject: [PATCH] Add webclient browser name identifier. Resolve #1650 --- evennia/server/portal/webclient.py | 12 ++++++++++-- evennia/server/portal/webclient_ajax.py | 20 ++++++++++++++++++++ evennia/web/static/webclient/js/evennia.js | 22 ++++++++++++++++++++-- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/evennia/server/portal/webclient.py b/evennia/server/portal/webclient.py index c207336124..4957d27757 100644 --- a/evennia/server/portal/webclient.py +++ b/evennia/server/portal/webclient.py @@ -54,6 +54,7 @@ class WebSocketClient(WebSocketServerProtocol, _BASE_SESSION_CLASS): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.protocol_key = "webclient/websocket" + self.browserstr = "" def get_client_session(self): """ @@ -65,7 +66,8 @@ class WebSocketClient(WebSocketServerProtocol, _BASE_SESSION_CLASS): """ try: - self.csessid = self.http_request_uri.split("?", 1)[1] + # client will connect with wsurl?csessid&browserid + webarg = self.http_request_uri.split("?", 1)[1] except IndexError: # this may happen for custom webclients not caring for the # browser session. @@ -77,6 +79,11 @@ class WebSocketClient(WebSocketServerProtocol, _BASE_SESSION_CLASS): self.csessid = None logger.log_trace(str(self)) return None + + self.csessid, *browserstr = webarg.split("&", 1) + if browserstr: + self.browserstr = str(browserstr[0]) + if self.csessid: return _CLIENT_SESSIONS(session_key=self.csessid) @@ -118,7 +125,8 @@ class WebSocketClient(WebSocketServerProtocol, _BASE_SESSION_CLASS): self.sessid = old_session.sessid self.sessionhandler.disconnect(old_session) - self.protocol_flags["CLIENTNAME"] = "Evennia Webclient (websocket)" + browserstr = f":{self.browserstr}" if self.browserstr else "" + self.protocol_flags["CLIENTNAME"] = f"Evennia Webclient (websocket{browserstr})" self.protocol_flags["UTF-8"] = True self.protocol_flags["OOB"] = True diff --git a/evennia/server/portal/webclient_ajax.py b/evennia/server/portal/webclient_ajax.py index 4032f68f7c..a9db360f5e 100644 --- a/evennia/server/portal/webclient_ajax.py +++ b/evennia/server/portal/webclient_ajax.py @@ -129,6 +129,19 @@ class AjaxWebClient(resource.Resource): """ return html.escape(request.args[b"csessid"][0].decode("utf-8")) + def get_browserstr(self, request): + """ + Get browser-string out of the request. + + Args: + request (Request): Incoming request object. + Returns: + str: The browser name. + + + """ + return html.escape(request.args[b"browserstr"][0].decode("utf-8")) + def at_login(self): """ Called when this session gets authenticated by the server. @@ -181,6 +194,7 @@ class AjaxWebClient(resource.Resource): """ csessid = self.get_client_sessid(request) + browserstr = self.get_browserstr(request) remote_addr = request.getClientIP() @@ -204,6 +218,7 @@ class AjaxWebClient(resource.Resource): sess.init_session("ajax/comet", remote_addr, self.sessionhandler) sess.csessid = csessid + sess.browserstr = browserstr csession = _CLIENT_SESSIONS(session_key=sess.csessid) uid = csession and csession.get("webclient_authenticated_uid", False) if uid: @@ -218,6 +233,11 @@ class AjaxWebClient(resource.Resource): self.keep_alive = LoopingCall(self._keepalive) self.keep_alive.start(_KEEPALIVE, now=False) + browserstr = f":{browserstr}" if browserstr else "" + sess.protocol_flags["CLIENTNAME"] = f"Evennia Webclient (ajax{browserstr})" + sess.protocol_flags["UTF-8"] = True + sess.protocol_flags["OOB"] = True + # actually do the connection sess.sessionhandler.connect(sess) diff --git a/evennia/web/static/webclient/js/evennia.js b/evennia/web/static/webclient/js/evennia.js index 401c841cb5..fb740c966e 100644 --- a/evennia/web/static/webclient/js/evennia.js +++ b/evennia/web/static/webclient/js/evennia.js @@ -227,7 +227,7 @@ An "emitter" object must have a function return; } // Important - we pass csessid tacked on the url - websocket = new WebSocket(wsurl + '?' + csessid); + websocket = new WebSocket(wsurl + '?' + csessid + '&' + browser); // Handle Websocket open event websocket.onopen = function (event) { @@ -310,7 +310,7 @@ An "emitter" object must have a function $.ajax({type: "POST", url: "/webclientdata", async: true, cache: false, timeout: 50000, datatype: "json", - data: {mode: "init", csessid: csessid}, + data: {mode: "init", csessid: csessid, browserstr: browser}, success: function(data) { open = true; @@ -450,6 +450,24 @@ function log() { } } + +// figure out the browser info string +var browser = (function (agent) { + "use strict" + switch (true) { + case agent.indexOf("edge") > -1: return "edge"; + case agent.indexOf("edg") > -1: return "chromium based edge (dev or canary)"; + case agent.indexOf("opr") > -1 && !!window.opr: return "opera"; + case agent.indexOf("chrome") > -1 && !!window.chrome: return "chrome"; + case agent.indexOf("trident") > -1: return "ie"; + case agent.indexOf("firefox") > -1: return "firefox"; + case agent.indexOf("safari") > -1: return "safari"; + default: return "other"; + } +})(window.navigator.userAgent.toLowerCase()); +console.log(window.navigator.userAgent.toLowerCase() + "\n" + browser); + + // Called when page has finished loading (kicks the client into gear) $(document).ready(function() { setTimeout( function () {