From 9fbaf8fa89197554e6f9dd4d90565349586365f7 Mon Sep 17 00:00:00 2001 From: Johnny Date: Wed, 24 Oct 2018 19:55:30 +0000 Subject: [PATCH 1/2] Converts shared_login view function to a middleware class, renames deprecated MIDDLEWARE_CLASSES setting to MIDDLEWARE. --- evennia/settings_default.py | 5 +++-- evennia/web/website/views.py | 41 ------------------------------------ 2 files changed, 3 insertions(+), 43 deletions(-) diff --git a/evennia/settings_default.py b/evennia/settings_default.py index 40c36e6f7e..41da7fc653 100644 --- a/evennia/settings_default.py +++ b/evennia/settings_default.py @@ -765,14 +765,15 @@ TEMPLATES = [{ # MiddleWare are semi-transparent extensions to Django's functionality. # see http://www.djangoproject.com/documentation/middleware/ for a more detailed # explanation. -MIDDLEWARE_CLASSES = ( +MIDDLEWARE = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', # 1.4? 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.admindocs.middleware.XViewMiddleware', - 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',) + 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware', + 'evennia.web.utils.middleware.SharedLoginMiddleware',) ###################################################################### # Evennia components diff --git a/evennia/web/website/views.py b/evennia/web/website/views.py index fe93b06426..344ea9d80b 100644 --- a/evennia/web/website/views.py +++ b/evennia/web/website/views.py @@ -20,43 +20,6 @@ from django.contrib.auth import login _BASE_CHAR_TYPECLASS = settings.BASE_CHARACTER_TYPECLASS - -def _shared_login(request): - """ - Handle the shared login between website and webclient. - - """ - csession = request.session - account = request.user - website_uid = csession.get("website_authenticated_uid", None) - webclient_uid = csession.get("webclient_authenticated_uid", None) - - if not csession.session_key: - # this is necessary to build the sessid key - csession.save() - - if account.is_authenticated(): - # Logged into website - if not website_uid: - # fresh website login (just from login page) - csession["website_authenticated_uid"] = account.id - if webclient_uid is None: - # auto-login web client - csession["webclient_authenticated_uid"] = account.id - - elif webclient_uid: - # Not logged into website, but logged into webclient - if not website_uid: - csession["website_authenticated_uid"] = account.id - account = AccountDB.objects.get(id=webclient_uid) - try: - # calls our custom authenticate, in web/utils/backend.py - authenticate(autologin=account) - login(request, account) - except AttributeError: - logger.log_trace() - - def _gamestats(): # Some misc. configurable stuff. # TODO: Move this to either SQL or settings.py based configuration. @@ -96,10 +59,6 @@ def page_index(request): """ Main root page. """ - - # handle webclient-website shared login - _shared_login(request) - # get game db stats pagevars = _gamestats() From 821e0552d0ae5c334979d40dd6bd2054a40a2e99 Mon Sep 17 00:00:00 2001 From: Johnny Date: Wed, 24 Oct 2018 20:06:11 +0000 Subject: [PATCH 2/2] Adds middleware. --- evennia/web/utils/middleware.py | 60 +++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 evennia/web/utils/middleware.py diff --git a/evennia/web/utils/middleware.py b/evennia/web/utils/middleware.py new file mode 100644 index 0000000000..3a60c3ca4f --- /dev/null +++ b/evennia/web/utils/middleware.py @@ -0,0 +1,60 @@ +from django.contrib.auth import authenticate, login +from evennia.accounts.models import AccountDB +from evennia.utils import logger + +class SharedLoginMiddleware(object): + """ + Handle the shared login between website and webclient. + + """ + def __init__(self, get_response): + # One-time configuration and initialization. + self.get_response = get_response + + def __call__(self, request): + # Code to be executed for each request before + # the view (and later middleware) are called. + + # Process view + response = self.get_response(request) + + # Code to be executed for each request/response after + # the view is called. + + # Synchronize credentials + self.make_shared_login(request) + + # Return processed view + return response + + @classmethod + def make_shared_login(cls, request): + csession = request.session + account = request.user + website_uid = csession.get("website_authenticated_uid", None) + webclient_uid = csession.get("webclient_authenticated_uid", None) + + if not csession.session_key: + # this is necessary to build the sessid key + csession.save() + + if account.is_authenticated(): + # Logged into website + if not website_uid: + # fresh website login (just from login page) + csession["website_authenticated_uid"] = account.id + if webclient_uid is None: + # auto-login web client + csession["webclient_authenticated_uid"] = account.id + + elif webclient_uid: + # Not logged into website, but logged into webclient + if not website_uid: + csession["website_authenticated_uid"] = account.id + account = AccountDB.objects.get(id=webclient_uid) + try: + # calls our custom authenticate, in web/utils/backend.py + authenticate(autologin=account) + login(request, account) + except AttributeError: + logger.log_trace() \ No newline at end of file