implement access token activate/read/write stuff
This commit is contained in:
parent
8026b78f42
commit
642a73c235
4 changed files with 60 additions and 8 deletions
|
@ -29,7 +29,7 @@ admin.site.register(User, UserAdmin)
|
||||||
class AccessTokenInline(admin.TabularInline):
|
class AccessTokenInline(admin.TabularInline):
|
||||||
model = AccessToken
|
model = AccessToken
|
||||||
show_change_link = True
|
show_change_link = True
|
||||||
readonly_fields = ('author', 'permissions', 'description', 'creation_date', 'expires', 'expired')
|
readonly_fields = ('author', 'permissions', 'description', 'creation_date', 'activated', 'expires', 'expired')
|
||||||
|
|
||||||
def has_add_permission(self, request):
|
def has_add_permission(self, request):
|
||||||
return False
|
return False
|
||||||
|
@ -55,9 +55,9 @@ class AccessTokenInstanceInline(admin.TabularInline):
|
||||||
@admin.register(AccessToken)
|
@admin.register(AccessToken)
|
||||||
class AccessTokenAdmin(admin.ModelAdmin):
|
class AccessTokenAdmin(admin.ModelAdmin):
|
||||||
inlines = (AccessTokenInstanceInline,)
|
inlines = (AccessTokenInstanceInline,)
|
||||||
list_display = ('__str__', 'user', 'permissions', 'author', 'creation_date', 'expires', 'expired')
|
list_display = ('__str__', 'user', 'permissions', 'author', 'creation_date', 'activated', 'expires', 'expired')
|
||||||
fields = ('user', 'permissions', 'author', 'creation_date', 'expires', 'expired')
|
fields = ('user', 'permissions', 'author', 'creation_date', 'activated', 'expires', 'expired')
|
||||||
readonly_fields = ('user', 'creation_date', 'expired')
|
readonly_fields = ('user', 'creation_date', 'activated', 'expired')
|
||||||
|
|
||||||
def has_add_permission(self, request):
|
def has_add_permission(self, request):
|
||||||
return False
|
return False
|
||||||
|
|
50
src/c3nav/access/middleware.py
Normal file
50
src/c3nav/access/middleware.py
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
import re
|
||||||
|
from datetime import timedelta
|
||||||
|
|
||||||
|
from django.db import transaction
|
||||||
|
from django.db.models import Q
|
||||||
|
from django.utils import timezone
|
||||||
|
|
||||||
|
from c3nav.access.models import AccessTokenInstance
|
||||||
|
|
||||||
|
|
||||||
|
class AccessTokenMiddleware:
|
||||||
|
def __init__(self, get_response):
|
||||||
|
self.get_response = get_response
|
||||||
|
|
||||||
|
def __call__(self, request):
|
||||||
|
request.c3nav_access_instance = None
|
||||||
|
request.c3nav_access_token = None
|
||||||
|
request.c3nav_new_access_token = False
|
||||||
|
|
||||||
|
access_cookie = request.COOKIES.get('c3nav_access')
|
||||||
|
if access_cookie and re.match(r'^[0-9]+:[a-zA-Z0-9]+$', access_cookie):
|
||||||
|
pk, secret = access_cookie.split(':')
|
||||||
|
queryset = AccessTokenInstance.objects.filter(Q(access_token__id=int(pk), secret=secret),
|
||||||
|
Q(expires__isnull=True) | Q(expires__gt=timezone.now()),
|
||||||
|
Q(access_token__expired=False),
|
||||||
|
Q(access_token__expires__isnull=True) |
|
||||||
|
Q(access_token__expires__gt=timezone.now()))
|
||||||
|
access_instance = queryset.select_related('access_token').first()
|
||||||
|
if access_instance:
|
||||||
|
request.c3nav_access_instance = access_instance
|
||||||
|
request.c3nav_access_token = access_instance.access_token
|
||||||
|
request.c3nav_access_token.instances.filter(creation_date__lt=access_instance.creation_date).delete()
|
||||||
|
|
||||||
|
response = self.get_response(request)
|
||||||
|
|
||||||
|
if request.c3nav_access_token is not None:
|
||||||
|
with transaction.atomic():
|
||||||
|
cookie_value = request.c3nav_access_token.new_instance()
|
||||||
|
response.set_cookie('c3nav_access', cookie_value, expires=timezone.now() + timedelta(days=30))
|
||||||
|
|
||||||
|
if request.c3nav_new_access_token:
|
||||||
|
request.c3nav_access_token.activated = True
|
||||||
|
request.c3nav_access_token.save()
|
||||||
|
|
||||||
|
if request.c3nav_access_instance:
|
||||||
|
access_token = request.c3nav_access_instance.access_token
|
||||||
|
access_token.expired = True
|
||||||
|
access_token.save()
|
||||||
|
|
||||||
|
return response
|
|
@ -69,8 +69,9 @@ def prove(request):
|
||||||
|
|
||||||
|
|
||||||
def activate_token(request, pk, secret):
|
def activate_token(request, pk, secret):
|
||||||
token = get_object_or_404(AccessToken, expired=False, id=pk, secret=secret) # noqa
|
token = get_object_or_404(AccessToken, expired=False, activated=False, id=pk, secret=secret)
|
||||||
|
request.c3nav_access_token = token
|
||||||
|
request.c3nav_new_access_token = True
|
||||||
return render(request, 'access/activate.html', context={
|
return render(request, 'access/activate.html', context={
|
||||||
'success': True,
|
'success': True,
|
||||||
})
|
})
|
||||||
|
|
|
@ -151,7 +151,7 @@ INSTALLED_APPS = [
|
||||||
'c3nav.editor',
|
'c3nav.editor',
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE_CLASSES = [
|
MIDDLEWARE = [
|
||||||
'django.middleware.security.SecurityMiddleware',
|
'django.middleware.security.SecurityMiddleware',
|
||||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||||
'django.middleware.locale.LocaleMiddleware',
|
'django.middleware.locale.LocaleMiddleware',
|
||||||
|
@ -161,6 +161,7 @@ MIDDLEWARE_CLASSES = [
|
||||||
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
|
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
|
||||||
'django.contrib.messages.middleware.MessageMiddleware',
|
'django.contrib.messages.middleware.MessageMiddleware',
|
||||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||||
|
'c3nav.access.middleware.AccessTokenMiddleware',
|
||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -168,7 +169,7 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
MIDDLEWARE_CLASSES += [
|
MIDDLEWARE += [
|
||||||
'htmlmin.middleware.HtmlMinifyMiddleware',
|
'htmlmin.middleware.HtmlMinifyMiddleware',
|
||||||
'htmlmin.middleware.MarkRequestMiddleware',
|
'htmlmin.middleware.MarkRequestMiddleware',
|
||||||
]
|
]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue