Update AJAX client with the corrected Autologin functionality

This commit is contained in:
Griatch 2017-10-05 22:43:12 +02:00
parent 8eff4678b4
commit 2d030afb36
3 changed files with 34 additions and 11 deletions

View file

@ -294,9 +294,9 @@ if WEBSERVER_ENABLED:
# create ajax client processes at /webclientdata # create ajax client processes at /webclientdata
from evennia.server.portal import webclient_ajax from evennia.server.portal import webclient_ajax
webclient = webclient_ajax.WebClient() ajax_webclient = webclient_ajax.AjaxWebClient()
webclient.sessionhandler = PORTAL_SESSIONS ajax_webclient.sessionhandler = PORTAL_SESSIONS
web_root.putChild("webclientdata", webclient) web_root.putChild("webclientdata", ajax_webclient)
webclientstr = "\n + webclient (ajax only)" webclientstr = "\n + webclient (ajax only)"
if WEBSOCKET_CLIENT_ENABLED and not websocket_started: if WEBSOCKET_CLIENT_ENABLED and not websocket_started:

View file

@ -93,7 +93,6 @@ class WebSocketClient(Protocol, Session):
csession = self.get_client_session() csession = self.get_client_session()
if csession: if csession:
print("In disconnect: csession uid=%s" % csession.get("webclient_authenticated_uid", None))
csession["webclient_authenticated_uid"] = None csession["webclient_authenticated_uid"] = None
csession.save() csession.save()
self.logged_in = False self.logged_in = False

View file

@ -53,11 +53,11 @@ def jsonify(obj):
# #
# WebClient resource - this is called by the ajax client # AjaxWebClient resource - this is called by the ajax client
# using POST requests to /webclientdata. # using POST requests to /webclientdata.
# #
class WebClient(resource.Resource): class AjaxWebClient(resource.Resource):
""" """
An ajax/comet long-polling transport An ajax/comet long-polling transport
@ -163,13 +163,13 @@ class WebClient(resource.Resource):
remote_addr = request.getClientIP() remote_addr = request.getClientIP()
host_string = "%s (%s:%s)" % (_SERVERNAME, request.getRequestHostname(), request.getHost().port) host_string = "%s (%s:%s)" % (_SERVERNAME, request.getRequestHostname(), request.getHost().port)
sess = WebClientSession() sess = AjaxWebClientSession()
sess.client = self sess.client = self
sess.init_session("ajax/comet", remote_addr, self.sessionhandler) sess.init_session("ajax/comet", remote_addr, self.sessionhandler)
sess.csessid = csessid sess.csessid = csessid
csession = _CLIENT_SESSIONS(session_key=sess.csessid) csession = _CLIENT_SESSIONS(session_key=sess.csessid)
uid = csession and csession.get("logged_in", False) uid = csession and csession.get("webclient_authenticated_uid", False)
if uid: if uid:
# the client session is already logged in # the client session is already logged in
sess.uid = uid sess.uid = uid
@ -292,14 +292,26 @@ class WebClient(resource.Resource):
# web client interface. # web client interface.
# #
class WebClientSession(session.Session): class AjaxWebClientSession(session.Session):
""" """
This represents a session running in a webclient. This represents a session running in an AjaxWebclient.
""" """
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.protocol_name = "ajax/comet" self.protocol_name = "ajax/comet"
super(WebClientSession, self).__init__(*args, **kwargs) super(AjaxWebClientSession, self).__init__(*args, **kwargs)
def get_client_session(self):
"""
Get the Client browser session (used for auto-login based on browser session)
Returns:
csession (ClientSession): This is a django-specific internal representation
of the browser session.
"""
if self.csessid:
return _CLIENT_SESSIONS(session_key=self.csessid)
def disconnect(self, reason="Server disconnected."): def disconnect(self, reason="Server disconnected."):
""" """
@ -308,10 +320,22 @@ class WebClientSession(session.Session):
Args: Args:
reason (str): Motivation for the disconnect. reason (str): Motivation for the disconnect.
""" """
csession = self.get_client_session()
if csession:
csession["webclient_authenticated_uid"] = None
csession.save()
self.logged_in = False
self.client.lineSend(self.csessid, ["connection_close", [reason], {}]) self.client.lineSend(self.csessid, ["connection_close", [reason], {}])
self.client.client_disconnect(self.csessid) self.client.client_disconnect(self.csessid)
self.sessionhandler.disconnect(self) self.sessionhandler.disconnect(self)
def at_login(self):
csession = self.get_client_session()
if csession:
csession["webclient_authenticated_uid"] = self.uid
csession.save()
def data_out(self, **kwargs): def data_out(self, **kwargs):
""" """
Data Evennia -> User Data Evennia -> User