diff --git a/src/tixl/settings.py b/src/tixl/settings.py index 4be0c19e54..2ed0090682 100644 --- a/src/tixl/settings.py +++ b/src/tixl/settings.py @@ -49,6 +49,7 @@ MIDDLEWARE_CLASSES = ( 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'tixlcontrol.middleware.LoginRequiredMiddleware', ) ROOT_URLCONF = 'tixl.urls' @@ -83,7 +84,8 @@ USE_TZ = True # Authentication AUTH_USER_MODEL = 'tixlbase.User' - +LOGIN_URL = '/login' +LOGIN_URL_CONTROL = '/control/login' # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/dev/howto/static-files/ diff --git a/src/tixl/urls.py b/src/tixl/urls.py index 26a762cf38..1c8cc780b7 100644 --- a/src/tixl/urls.py +++ b/src/tixl/urls.py @@ -1,10 +1,10 @@ from django.conf.urls import patterns, include, url from django.contrib import admin -urlpatterns = patterns('', - # Examples: - # url(r'^$', 'tixl.views.home', name='home'), - # url(r'^blog/', include('blog.urls')), +import tixlcontrol.urls + +urlpatterns = patterns('', + url(r'^control/', include(tixlcontrol.urls, namespace='control')), url(r'^admin/', include(admin.site.urls)), ) diff --git a/src/tixlcontrol/middleware.py b/src/tixlcontrol/middleware.py new file mode 100644 index 0000000000..bfcd8e9443 --- /dev/null +++ b/src/tixlcontrol/middleware.py @@ -0,0 +1,39 @@ +from django.conf import settings +from django.core.urlresolvers import resolve +from django.utils.encoding import force_str +from django.utils.six.moves.urllib.parse import urlparse +from django.shortcuts import resolve_url +from django.contrib.auth import REDIRECT_FIELD_NAME + + +class LoginRequiredMiddleware: + + """ + This middleware enforces all requests to the control app + to require login. + """ + + EXCEPTIONS = ( + "login" + ) + + def process_request(self, request): + if not request.user.is_authenticated(): + url_namespace = resolve(request.path_info).namespace + url_name = resolve(request.path_info).url_name + if url_namespace == 'control' and url_name not in self.EXCEPTIONS: + # Taken from django/contrib/auth/decorators.py + path = request.build_absolute_uri() + # urlparse chokes on lazy objects in Python 3, force to str + resolved_login_url = force_str( + resolve_url(settings.LOGIN_URL_CONTROL)) + # If the login url is the same scheme and net location then just + # use the path as the "next" url. + login_scheme, login_netloc = urlparse(resolved_login_url)[:2] + current_scheme, current_netloc = urlparse(path)[:2] + if ((not login_scheme or login_scheme == current_scheme) and + (not login_netloc or login_netloc == current_netloc)): + path = request.get_full_path() + from django.contrib.auth.views import redirect_to_login + return redirect_to_login( + path, resolved_login_url, REDIRECT_FIELD_NAME) diff --git a/src/tixlcontrol/urls.py b/src/tixlcontrol/urls.py new file mode 100644 index 0000000000..29bbb7f646 --- /dev/null +++ b/src/tixlcontrol/urls.py @@ -0,0 +1,5 @@ +from django.conf.urls import patterns, url + +urlpatterns = patterns('', + url(r'^$', 'tixlcontrol.views.main.index', name='index'), +) diff --git a/src/tixlcontrol/views.py b/src/tixlcontrol/views.py deleted file mode 100644 index 91ea44a218..0000000000 --- a/src/tixlcontrol/views.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here. diff --git a/src/tixlcontrol/views/__init__.py b/src/tixlcontrol/views/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/tixlcontrol/views/main.py b/src/tixlcontrol/views/main.py new file mode 100644 index 0000000000..8090b1d99f --- /dev/null +++ b/src/tixlcontrol/views/main.py @@ -0,0 +1,5 @@ +from django.http import HttpResponse + + +def index(request): + return HttpResponse('Coming soon.')