Skip to content

Commit 3c7def2

Browse files
committed
Add captcha challenge to staff login page
Signed-off-by: Keshav Priyadarshi <[email protected]>
1 parent 0db4727 commit 3c7def2

File tree

5 files changed

+97
-3
lines changed

5 files changed

+97
-3
lines changed

vulnerabilities/forms.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#
99

1010
from django import forms
11+
from django.contrib.admin.forms import AdminAuthenticationForm
1112
from django.core.validators import validate_email
1213
from django_recaptcha.fields import ReCaptchaField
1314
from django_recaptcha.widgets import ReCaptchaV2Checkbox
@@ -98,3 +99,12 @@ class PipelineSchedulePackageForm(forms.Form):
9899
},
99100
),
100101
)
102+
103+
104+
class AdminLoginForm(AdminAuthenticationForm):
105+
captcha = ReCaptchaField(
106+
error_messages={
107+
"required": ("Captcha is required"),
108+
},
109+
widget=ReCaptchaV2Checkbox(),
110+
)
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
{% extends "admin/base_site.html" %}
2+
{% load i18n static %}
3+
4+
{% block extrastyle %}{{ block.super }}<link rel="stylesheet" href="{% static "admin/css/login.css" %}">
5+
{{ form.media }}
6+
{% endblock %}
7+
8+
{% block bodyclass %}{{ block.super }} login{% endblock %}
9+
10+
{% block usertools %}{% endblock %}
11+
12+
{% block nav-global %}{% endblock %}
13+
14+
{% block nav-sidebar %}{% endblock %}
15+
16+
{% block content_title %}{% endblock %}
17+
18+
{% block nav-breadcrumbs %}{% endblock %}
19+
20+
{% block content %}
21+
22+
{% if form.errors %}
23+
{% if form.errors.captcha %}
24+
{{ form.errors.captcha }}
25+
{% else %}
26+
{% for error in form.errors.values %}
27+
{{ error }}
28+
{% endfor %}
29+
{% endif %}
30+
{% endif %}
31+
32+
33+
<div id="content-main">
34+
35+
{% if user.is_authenticated %}
36+
<p class="errornote">
37+
{% blocktranslate trimmed %}
38+
You are authenticated as {{ username }}, but are not authorized to
39+
access this page. Would you like to login to a different account?
40+
{% endblocktranslate %}
41+
</p>
42+
{% endif %}
43+
44+
<form action="{{ app_path }}" method="post" id="login-form">{% csrf_token %}
45+
<div class="form-row">
46+
{{ form.username.errors }}
47+
{{ form.username.label_tag }} {{ form.username }}
48+
</div>
49+
<div class="form-row">
50+
{{ form.password.errors }}
51+
{{ form.password.label_tag }} {{ form.password }}
52+
<input type="hidden" name="next" value="{{ next }}">
53+
</div>
54+
{% url 'admin_password_reset' as password_reset_url %}
55+
{% if password_reset_url %}
56+
<div class="password-reset-link">
57+
<a href="{{ password_reset_url }}">{% translate 'Forgotten your password or username?' %}</a>
58+
</div>
59+
{% endif %}
60+
<div class="field" style="padding-top: 1rem; text-align: center;">
61+
<div class="control" style="display: inline-block;">
62+
{{ form.captcha }}
63+
</div>
64+
</div>
65+
<div class="submit-row">
66+
<input type="submit" value="{% translate 'Log in' %}">
67+
</div>
68+
</form>
69+
</div>
70+
{% endblock %}

vulnerabilities/views.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from cvss.exceptions import CVSS3MalformedError
1313
from cvss.exceptions import CVSS4MalformedError
1414
from django.contrib import messages
15+
from django.contrib.auth.views import LoginView
1516
from django.core.exceptions import ValidationError
1617
from django.core.mail import send_mail
1718
from django.db.models import Prefetch
@@ -27,6 +28,7 @@
2728
from django.views.generic.list import ListView
2829

2930
from vulnerabilities import models
31+
from vulnerabilities.forms import AdminLoginForm
3032
from vulnerabilities.forms import ApiUserCreationForm
3133
from vulnerabilities.forms import PackageSearchForm
3234
from vulnerabilities.forms import PipelineSchedulePackageForm
@@ -418,3 +420,8 @@ def get_context_data(self, **kwargs):
418420
)
419421
context["pipeline_name"] = run.pipeline_class.__name__
420422
return context
423+
424+
425+
class AdminLoginView(LoginView):
426+
template_name = "admin_login.html"
427+
authentication_form = AdminLoginForm

vulnerablecode/settings.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,14 @@
8787
"django_rq",
8888
)
8989

90-
RECAPTCHA_PUBLIC_KEY = env.str("RECAPTCHA_PUBLIC_KEY", "")
91-
RECAPTCHA_PRIVATE_KEY = env.str("RECAPTCHA_PRIVATE_KEY", "")
92-
SILENCED_SYSTEM_CHECKS = ["captcha.recaptcha_test_key_error"]
90+
if env.str("RECAPTCHA_PUBLIC_KEY", None):
91+
RECAPTCHA_PUBLIC_KEY = env.str("RECAPTCHA_PUBLIC_KEY")
92+
93+
if env.str("RECAPTCHA_PRIVATE_KEY", None):
94+
RECAPTCHA_PRIVATE_KEY = env.str("RECAPTCHA_PRIVATE_KEY")
95+
96+
SILENCED_SYSTEM_CHECKS = ["django_recaptcha.recaptcha_test_key_error"]
97+
SILENCED_SYSTEM_CHECKS = ["django_recaptcha.recaptcha_test_key_error"]
9398
RECAPTCHA_DOMAIN = env.str("RECAPTCHA_DOMAIN", "www.recaptcha.net")
9499

95100

vulnerablecode/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from vulnerabilities.api_v2 import PackageV2ViewSet
2525
from vulnerabilities.api_v2 import PipelineScheduleV2ViewSet
2626
from vulnerabilities.api_v2 import VulnerabilityV2ViewSet
27+
from vulnerabilities.views import AdminLoginView
2728
from vulnerabilities.views import ApiUserCreateView
2829
from vulnerabilities.views import HomePage
2930
from vulnerabilities.views import PackageDetails
@@ -60,6 +61,7 @@ def __init__(self, *args, **kwargs):
6061

6162

6263
urlpatterns = [
64+
path("admin/login/", AdminLoginView.as_view(), name="admin-login"),
6365
path("api/v2/", include(api_v2_router.urls)),
6466
path(
6567
"robots.txt",

0 commit comments

Comments
 (0)