-
-
Notifications
You must be signed in to change notification settings - Fork 457
Expand file tree
/
Copy pathadmin.py
More file actions
83 lines (59 loc) · 2.43 KB
/
admin.py
File metadata and controls
83 lines (59 loc) · 2.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
from django.conf import settings
from django.contrib import admin
from django.contrib.admin import AdminSite
from django.contrib.auth import REDIRECT_FIELD_NAME
from django.contrib.auth.views import redirect_to_login
from django.shortcuts import resolve_url
from django.utils.http import is_safe_url
from .models import PhoneDevice, U2FDevice
from .utils import monkeypatch_method
class AdminSiteOTPRequiredMixin(object):
"""
Mixin for enforcing OTP verified staff users.
Custom admin views should either be wrapped using :meth:`admin_view` or
use :meth:`has_permission` in order to secure those views.
"""
def has_permission(self, request):
"""
Returns True if the given HttpRequest has permission to view
*at least one* page in the admin site.
"""
if not super(AdminSiteOTPRequiredMixin, self).has_permission(request):
return False
return request.user.is_verified()
def login(self, request, extra_context=None):
"""
Redirects to the site login page for the given HttpRequest.
"""
redirect_to = request.POST.get(REDIRECT_FIELD_NAME, request.GET.get(REDIRECT_FIELD_NAME))
if not redirect_to or not is_safe_url(url=redirect_to, host=request.get_host()):
redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL)
return redirect_to_login(redirect_to)
class AdminSiteOTPRequired(AdminSiteOTPRequiredMixin, AdminSite):
"""
AdminSite enforcing OTP verified staff users.
"""
pass
def patch_admin():
@monkeypatch_method(AdminSite)
def login(self, request, extra_context=None):
"""
Redirects to the site login page for the given HttpRequest.
"""
redirect_to = request.POST.get(REDIRECT_FIELD_NAME, request.GET.get(REDIRECT_FIELD_NAME))
if not redirect_to or not is_safe_url(url=redirect_to, host=request.get_host()):
redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL)
return redirect_to_login(redirect_to)
def unpatch_admin():
setattr(AdminSite, 'login', original_login)
original_login = AdminSite.login
class PhoneDeviceAdmin(admin.ModelAdmin):
"""
:class:`~django.contrib.admin.ModelAdmin` for
:class:`~two_factor.models.PhoneDevice`.
"""
raw_id_fields = ('user',)
class U2FDeviceAdmin(admin.ModelAdmin):
pass
admin.site.register(PhoneDevice, PhoneDeviceAdmin)
admin.site.register(U2FDevice, U2FDeviceAdmin)