2017-07-04 17:23:28 +00:00
|
|
|
try:
|
|
|
|
|
from django.utils.deprecation import MiddlewareMixin as MIDDLEWARE_BASE_CLASS
|
|
|
|
|
except ImportError:
|
|
|
|
|
MIDDLEWARE_BASE_CLASS = object
|
2014-12-31 01:17:15 +00:00
|
|
|
from django.contrib.auth import views as auth_views
|
2017-06-12 23:10:03 +00:00
|
|
|
from django.utils.decorators import method_decorator
|
2014-12-31 01:17:15 +00:00
|
|
|
|
2014-12-31 22:00:45 +00:00
|
|
|
from .decorators import watch_login
|
2014-12-31 01:17:15 +00:00
|
|
|
|
|
|
|
|
|
2017-07-04 17:23:28 +00:00
|
|
|
class FailedLoginMiddleware(MIDDLEWARE_BASE_CLASS):
|
2017-06-28 21:09:44 +00:00
|
|
|
""" Failed login middleware """
|
2017-06-12 23:10:03 +00:00
|
|
|
patched = False
|
|
|
|
|
|
2014-12-31 01:17:15 +00:00
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
|
super(FailedLoginMiddleware, self).__init__(*args, **kwargs)
|
2017-06-12 23:10:03 +00:00
|
|
|
# Watch the auth login.
|
|
|
|
|
# Monkey-patch only once - otherwise we would be recording
|
|
|
|
|
# failed attempts multiple times!
|
|
|
|
|
if not FailedLoginMiddleware.patched:
|
|
|
|
|
# Django 1.11 turned the `login` function view into the
|
|
|
|
|
# `LoginView` class-based view
|
|
|
|
|
try:
|
|
|
|
|
from django.contrib.auth.views import LoginView
|
2017-06-26 16:23:23 +00:00
|
|
|
our_decorator = watch_login()
|
|
|
|
|
watch_login_method = method_decorator(our_decorator)
|
2017-06-12 23:10:03 +00:00
|
|
|
LoginView.dispatch = watch_login_method(LoginView.dispatch)
|
|
|
|
|
except ImportError: # Django < 1.11
|
2017-06-26 16:23:23 +00:00
|
|
|
auth_views.login = watch_login()(auth_views.login)
|
2017-06-12 23:10:03 +00:00
|
|
|
|
|
|
|
|
FailedLoginMiddleware.patched = True
|