Implemented shared sessions between webclient and website - logging into either will also log in the player to the other. This is addresses the first point of #613.
This commit is contained in:
parent
eebd41f46d
commit
f04c82fa17
7 changed files with 111 additions and 81 deletions
|
|
@ -82,7 +82,7 @@ An "emitter" object must have a function
|
|||
opts = opts || {};
|
||||
this.emitter = opts.emitter || new DefaultEmitter();
|
||||
|
||||
if (opts.ckonnection) {
|
||||
if (opts.connection) {
|
||||
this.connection = opts.connection;
|
||||
}
|
||||
else if (window.WebSocket && wsactive) {
|
||||
|
|
@ -224,6 +224,7 @@ An "emitter" object must have a function
|
|||
// No-op if a connection is already open.
|
||||
return;
|
||||
}
|
||||
// Important - we pass csessid tacked on the url
|
||||
websocket = new WebSocket(wsurl + '?' + csessid);
|
||||
|
||||
// Handle Websocket open event
|
||||
|
|
@ -231,7 +232,6 @@ An "emitter" object must have a function
|
|||
open = true;
|
||||
ever_open = true;
|
||||
Evennia.emit('connection_open', ["websocket"], event);
|
||||
Evennia.msg('csessid', [csessid], {});
|
||||
};
|
||||
// Handle Websocket close event
|
||||
websocket.onclose = function (event) {
|
||||
|
|
|
|||
|
|
@ -8,38 +8,45 @@ from __future__ import print_function
|
|||
from django.shortcuts import render
|
||||
from django.contrib.auth import login
|
||||
|
||||
from evennia.server.sessionhandler import SESSION_HANDLER
|
||||
from evennia.players.models import PlayerDB
|
||||
from evennia.utils import logger
|
||||
|
||||
|
||||
def _shared_login(request):
|
||||
"""
|
||||
Handle the shared login between website and webclient.
|
||||
|
||||
"""
|
||||
csession = request.session
|
||||
player = request.user
|
||||
sesslogin = csession.get("logged_in", None)
|
||||
|
||||
# check if user has authenticated to website
|
||||
if csession.session_key is None:
|
||||
# this is necessary to build the sessid key
|
||||
csession.save()
|
||||
elif player.is_authenticated():
|
||||
if not sesslogin:
|
||||
# User has already authenticated to website
|
||||
csession["logged_in"] = player.id
|
||||
elif sesslogin:
|
||||
# The webclient has previously registered a login to this browser_session
|
||||
player = PlayerDB.objects.get(id=sesslogin)
|
||||
try:
|
||||
login(request, player)
|
||||
except AttributeError:
|
||||
logger.log_trace()
|
||||
|
||||
|
||||
def webclient(request):
|
||||
"""
|
||||
Webclient page template loading.
|
||||
|
||||
"""
|
||||
print ("webclient session:", request.session.session_key, request.user, request.user.is_authenticated())
|
||||
# handle webclient-website shared login
|
||||
_shared_login(request)
|
||||
|
||||
csession = request.session
|
||||
csessid = request.session.session_key
|
||||
player = request.user
|
||||
# check if user has authenticated to website
|
||||
if player.is_authenticated():
|
||||
print ("webclient: player auth, trying to connect sessions")
|
||||
# Try to login all the player's webclient sessions - only
|
||||
# unloggedin ones will actually be logged in.
|
||||
for session in SESSION_HANDLER.sessions_from_csessid(csessid):
|
||||
print ("session to connect:", session)
|
||||
if session.protocol_key in ("websocket", "ajax/comet"):
|
||||
SESSION_HANDLER.login(session, player)
|
||||
csession["logged_in"] = player.id
|
||||
elif csession.get("logged_in"):
|
||||
# The webclient has previously registered a login to this browser_session
|
||||
print ("webclient: browser_session logged in, trying to login")
|
||||
player = PlayerDB.objects.get(csession.get("logged_in"))
|
||||
login(player, request)
|
||||
else:
|
||||
csession["logged_in"] = False
|
||||
|
||||
# make sure to store the browser session's hash so the webclient can get to it
|
||||
# make sure to store the browser session's hash so the webclient can get to it!
|
||||
pagevars = {'browser_sessid': request.session.session_key}
|
||||
|
||||
return render(request, 'webclient.html', pagevars)
|
||||
|
|
|
|||
|
|
@ -13,43 +13,38 @@ from django.shortcuts import render
|
|||
from evennia import SESSION_HANDLER
|
||||
from evennia.objects.models import ObjectDB
|
||||
from evennia.players.models import PlayerDB
|
||||
from evennia.utils import logger
|
||||
|
||||
from django.contrib.auth import login
|
||||
|
||||
_BASE_CHAR_TYPECLASS = settings.BASE_CHARACTER_TYPECLASS
|
||||
|
||||
|
||||
def page_index(request):
|
||||
def _shared_login(request):
|
||||
"""
|
||||
Main root page.
|
||||
Handle the shared login between website and webclient.
|
||||
|
||||
"""
|
||||
|
||||
# handle webclient-website shared login
|
||||
|
||||
csession = request.session
|
||||
csessid = request.session.session_key
|
||||
player = request.user
|
||||
# check if user has authenticated to website
|
||||
if player.is_authenticated():
|
||||
# Try to login all the player's webclient sessions - only
|
||||
# unloggedin ones will actually be logged in.
|
||||
print "website: player auth, trying to connect sessions"
|
||||
for session in SESSION_HANDLER.sessions_from_csessid(csessid):
|
||||
print "session to connect:", session
|
||||
if session.protocol_key in ("websocket", "ajax/comet"):
|
||||
SESSION_HANDLER.login(session, player)
|
||||
session.csessid = csession.session_key
|
||||
csession["logged_in"] = player.id
|
||||
elif csession.get("logged_in"):
|
||||
sesslogin = csession.get("logged_in", None)
|
||||
|
||||
if csession.session_key is None:
|
||||
# this is necessary to build the sessid key
|
||||
csession.save()
|
||||
elif player.is_authenticated():
|
||||
if not sesslogin:
|
||||
csession["logged_in"] = player.id
|
||||
elif sesslogin:
|
||||
# The webclient has previously registered a login to this csession
|
||||
print "website: csession logged in, trying to login"
|
||||
player = PlayerDB.objects.get(id=csession.get("logged_in"))
|
||||
login(request, player)
|
||||
else:
|
||||
csession["logged_in"] = None
|
||||
player = PlayerDB.objects.get(id=sesslogin)
|
||||
try:
|
||||
login(request, player)
|
||||
except AttributeError:
|
||||
logger.log_trace()
|
||||
|
||||
print ("website session:", request.session.session_key, request.user, request.user.is_authenticated())
|
||||
|
||||
def _gamestats():
|
||||
# Some misc. configurable stuff.
|
||||
# TODO: Move this to either SQL or settings.py based configuration.
|
||||
fpage_player_limit = 4
|
||||
|
|
@ -81,6 +76,19 @@ def page_index(request):
|
|||
"num_characters": nchars or "no",
|
||||
"num_others": nothers or "no"
|
||||
}
|
||||
return pagevars
|
||||
|
||||
|
||||
def page_index(request):
|
||||
"""
|
||||
Main root page.
|
||||
"""
|
||||
|
||||
# handle webclient-website shared login
|
||||
_shared_login(request)
|
||||
|
||||
# get game db stats
|
||||
pagevars = _gamestats()
|
||||
|
||||
return render(request, 'index.html', pagevars)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue