def lockout_response(request): context = { 'failure_limit': FAILURE_LIMIT, 'username': request.POST.get(USERNAME_FORM_FIELD, '') } if request.is_ajax(): if COOLOFF_TIME: context.update({'cooloff_time': iso8601(COOLOFF_TIME)}) return HttpResponse( json.dumps(context), content_type='application/json', status=403, ) elif LOCKOUT_TEMPLATE: if COOLOFF_TIME: context.update({'cooloff_time': iso8601(COOLOFF_TIME)}) return render(request, LOCKOUT_TEMPLATE, context, status=403) elif LOCKOUT_URL: return HttpResponseRedirect(LOCKOUT_URL) else: msg = 'Account locked: too many login attempts. {0}' if COOLOFF_TIME: msg = msg.format('Please try again later.') else: msg = msg.format('Contact an admin to unlock your account.') return HttpResponse(msg, status=403)
def test_iso8601(self): """ Test iso8601 correctly translates datetime.timdelta to ISO 8601 formatted duration. """ expected = { timedelta(days=1, hours=25, minutes=42, seconds=8): 'P2DT1H42M8S', timedelta(days=7, seconds=342): 'P7DT5M42S', timedelta(days=0, hours=2, minutes=42): 'PT2H42M', timedelta(hours=20, seconds=42): 'PT20H42S', timedelta(seconds=300): 'PT5M', timedelta(seconds=9005): 'PT2H30M5S', timedelta(minutes=9005): 'P6DT6H5M', timedelta(days=15): 'P15D' } for delta, iso_duration in expected.items(): with self.subTest(iso_duration): self.assertEqual(iso8601(delta), iso_duration)
def lockout_response(request): context = { 'failure_limit': settings.AXES_FAILURE_LIMIT, 'username': request.POST.get(settings.AXES_USERNAME_FORM_FIELD, '') } cool_off = settings.AXES_COOLOFF_TIME if cool_off: if isinstance(cool_off, (int, float)): cool_off = timedelta(hours=cool_off) context.update({ 'cooloff_time': iso8601(cool_off) }) if request.is_ajax(): return HttpResponse( json.dumps(context), content_type='application/json', status=403, ) elif settings.AXES_LOCKOUT_TEMPLATE: return render( request, settings.AXES_LOCKOUT_TEMPLATE, context, status=403 ) elif settings.AXES_LOCKOUT_URL: return HttpResponseRedirect(settings.AXES_LOCKOUT_URL) return HttpResponse(get_lockout_message(), status=403)
def lockout_response(request): context = { 'failure_limit': Settings.objects.first().failure_limit, 'username': get_client_username(request) or '' } cool_off = settings.AXES_COOLOFF_TIME if cool_off: if isinstance(cool_off, (int, float)): cool_off = timedelta(hours=cool_off) context.update({'cooloff_time': iso8601(cool_off)}) if request.is_ajax(): return HttpResponse( json.dumps(context), content_type='application/json', status=403, ) elif settings.AXES_LOCKOUT_TEMPLATE: return render(request, settings.AXES_LOCKOUT_TEMPLATE, context, status=403) elif settings.AXES_LOCKOUT_URL: return HttpResponseRedirect(settings.AXES_LOCKOUT_URL) return HttpResponse(get_lockout_message(), status=403)
def test_iso8601(self): """Tests iso8601 correctly translates datetime.timdelta to ISO 8601 formatted duration.""" EXPECTED = { datetime.timedelta(days=1, hours=25, minutes=42, seconds=8): 'P2DT1H42M8S', datetime.timedelta(days=7, seconds=342): 'P7DT5M42S', datetime.timedelta(days=0, hours=2, minutes=42): 'PT2H42M', datetime.timedelta(hours=20, seconds=42): 'PT20H42S', datetime.timedelta(seconds=300): 'PT5M', datetime.timedelta(seconds=9005): 'PT2H30M5S', datetime.timedelta(minutes=9005): 'P6DT6H5M', datetime.timedelta(days=15): 'P15D' } for timedelta, iso_duration in six.iteritems(EXPECTED): self.assertEqual(iso8601(timedelta), iso_duration)
def lockout_response(request): context = { 'failure_limit': settings.AXES_FAILURE_LIMIT, 'username': request.POST.get(settings.AXES_USERNAME_FORM_FIELD, '') } cool_off = settings.AXES_COOLOFF_TIME if cool_off: if (isinstance(cool_off, int) or isinstance(cool_off, float)): cool_off = timedelta(hours=cool_off) context.update({ 'cooloff_time': iso8601(cool_off) }) if request.is_ajax(): return HttpResponse( json.dumps(context), content_type='application/json', status=403, ) elif settings.AXES_LOCKOUT_TEMPLATE: return render( request, settings.AXES_LOCKOUT_TEMPLATE, context, status=403 ) elif settings.AXES_LOCKOUT_URL: return HttpResponseRedirect(settings.AXES_LOCKOUT_URL) else: msg = 'Account locked: too many login attempts. {0}' if settings.AXES_COOLOFF_TIME: msg = msg.format('Please try again later.') else: msg = msg.format('Contact an admin to unlock your account.') return HttpResponse(msg, status=403)