From 3ae6dc14cc0a8e9ff9bd184730e2d7e233a91e88 Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Sun, 23 Oct 2022 19:52:08 +0200 Subject: [PATCH 01/24] Update base.html --- django_web_app/blog/templates/blog/base.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django_web_app/blog/templates/blog/base.html b/django_web_app/blog/templates/blog/base.html index c0cb7cf7..3017ac3e 100644 --- a/django_web_app/blog/templates/blog/base.html +++ b/django_web_app/blog/templates/blog/base.html @@ -1,4 +1,4 @@ -{% load staticfiles %} +{% load static %} From 8a86dbc12ff28fdbfb65cada9bce475dfd4b4a36 Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Sun, 23 Oct 2022 19:53:42 +0200 Subject: [PATCH 02/24] Update settings.py --- django_web_app/django_web_app/settings.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/django_web_app/django_web_app/settings.py b/django_web_app/django_web_app/settings.py index cfaf5b2e..373725cf 100644 --- a/django_web_app/django_web_app/settings.py +++ b/django_web_app/django_web_app/settings.py @@ -25,8 +25,8 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = [] - +ALLOWED_HOSTS = [] +#wstawić adres zewnętrzny!!!!!!!!!!!!!!!!! # Application definition From aaab3ec189d2fb0a4a79a318ee9cc9bf07761c6d Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Tue, 8 Nov 2022 16:27:05 +0100 Subject: [PATCH 03/24] setting.py csrf/xss COOKIE_HTTPONLY --- django_web_app/django_web_app/settings.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/django_web_app/django_web_app/settings.py b/django_web_app/django_web_app/settings.py index 373725cf..cfc4ad0a 100644 --- a/django_web_app/django_web_app/settings.py +++ b/django_web_app/django_web_app/settings.py @@ -25,9 +25,12 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = [] +ALLOWED_HOSTS = [] #wstawić adres zewnętrzny!!!!!!!!!!!!!!!!! +# Allow cookies only for server inside +SESSION_COOKIE_HTTPONLY = True + # Application definition INSTALLED_APPS = [ From 8337948a0b09f8a052761133a6792e210b333fe2 Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Tue, 8 Nov 2022 07:29:07 -0800 Subject: [PATCH 04/24] update: templates xss {{name | escape }} --- django_web_app/blog/templates/blog/base.html | 22 +++++++++---------- django_web_app/blog/templates/blog/home.html | 20 ++++++++--------- .../blog/templates/blog/search.html | 9 ++++---- .../blog/templates/blog/user_posts.html | 8 +++---- 4 files changed, 30 insertions(+), 29 deletions(-) diff --git a/django_web_app/blog/templates/blog/base.html b/django_web_app/blog/templates/blog/base.html index 3017ac3e..d2f08931 100644 --- a/django_web_app/blog/templates/blog/base.html +++ b/django_web_app/blog/templates/blog/base.html @@ -2,7 +2,7 @@ - + @@ -24,34 +24,34 @@ - +
@@ -63,9 +63,9 @@ {% endfor %} {% endif %} {% block content %} - + {% endblock %} -
+ diff --git a/django_web_app/blog/templates/blog/home.html b/django_web_app/blog/templates/blog/home.html index 18a53dd6..6cd63281 100644 --- a/django_web_app/blog/templates/blog/home.html +++ b/django_web_app/blog/templates/blog/home.html @@ -7,29 +7,29 @@
-

{{ post.author }}

+

{{ post.author | escape }}

{{ post.date_upload|date:"F d, Y" }}
{% if post.file %}
{{ post.blog }}
{% endif %} - - - -

{{ post.title }}

+ + + +

{{ post.title | escape }}

-

{{ post.content }}

+

{{ post.content | escape }}

{% if post.file %} -
+
{% endif %} - +
- +
-
+ {% endfor %} {% if is_paginated %} diff --git a/django_web_app/blog/templates/blog/search.html b/django_web_app/blog/templates/blog/search.html index e1b9572b..ab5cdb31 100644 --- a/django_web_app/blog/templates/blog/search.html +++ b/django_web_app/blog/templates/blog/search.html @@ -1,13 +1,14 @@ {% extends 'blog/base.html' %} {% block content %} -

Posts containing '{{query_string}}'

+

Posts containing '{{query_string}}'

{% for post in posts %}
{{ post.created }} -

{{ post.title }}

+

{{ post.title | escape }}

- {{ post.body|safe }} + {{ post.body| escape }} +
{% endfor %} -{% endblock content %} \ No newline at end of file +{% endblock content %} diff --git a/django_web_app/blog/templates/blog/user_posts.html b/django_web_app/blog/templates/blog/user_posts.html index 016c8090..598ee104 100644 --- a/django_web_app/blog/templates/blog/user_posts.html +++ b/django_web_app/blog/templates/blog/user_posts.html @@ -1,16 +1,16 @@ {% extends "blog/base.html" %} {% block content %} -

Posts by {{ view.kwargs.username }} ({{ page_obj.paginator.count }})

+

Posts by {{ view.kwargs.username | escape }} ({{ page_obj.paginator.count | escape }})

{% for post in posts %}
-

{{ post.title }}

-

{{ post.content }}

+

{{ post.title | escape }}

+

{{ post.content | escape }}

{% endfor %} From fdb1f2f95a5186800bec34f61bc827f796dea7aa Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Tue, 8 Nov 2022 07:30:42 -0800 Subject: [PATCH 05/24] update: templates xss {{name | escape }} From 5459c5af0e75be790d2bd1fa70098743e8be90aa Mon Sep 17 00:00:00 2001 From: ernikus <41674224+ernikus@users.noreply.github.com> Date: Tue, 8 Nov 2022 17:19:05 +0100 Subject: [PATCH 06/24] Update settings.py Ustawiono adres zew. jako '*' --- django_web_app/django_web_app/settings.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/django_web_app/django_web_app/settings.py b/django_web_app/django_web_app/settings.py index cfc4ad0a..37b049eb 100644 --- a/django_web_app/django_web_app/settings.py +++ b/django_web_app/django_web_app/settings.py @@ -25,8 +25,8 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = [] -#wstawić adres zewnętrzny!!!!!!!!!!!!!!!!! +# [!] Ustawić adres zewnętrzny!!!!!!!!!!!!!!!!! +ALLOWED_HOSTS = ['*'] # Allow cookies only for server inside SESSION_COOKIE_HTTPONLY = True From a0a38b650c8d4f3d14f5f318743a90f9d25df960 Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Tue, 15 Nov 2022 16:30:45 +0100 Subject: [PATCH 07/24] update: add captcha --- django_web_app/django_web_app/settings.py | 1 + 1 file changed, 1 insertion(+) diff --git a/django_web_app/django_web_app/settings.py b/django_web_app/django_web_app/settings.py index 37b049eb..be7061ad 100644 --- a/django_web_app/django_web_app/settings.py +++ b/django_web_app/django_web_app/settings.py @@ -43,6 +43,7 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'captcha' ] MIDDLEWARE = [ From 43536b16047732f5515c0f82dcbdaddd8627414d Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Tue, 15 Nov 2022 16:31:31 +0100 Subject: [PATCH 08/24] update: add captcha --- django_web_app/django_web_app/urls.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/django_web_app/django_web_app/urls.py b/django_web_app/django_web_app/urls.py index 75f5e784..0f168a1f 100644 --- a/django_web_app/django_web_app/urls.py +++ b/django_web_app/django_web_app/urls.py @@ -27,8 +27,9 @@ path('profile/', user_views.profile, name='profile'), path('logout/', auth_views.LogoutView.as_view(template_name='users/logout.html'), name='logout'), path('', include('blog.urls')), + path('captcha/', include('captcha.urls')), ] if settings.DEBUG: - urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) From 30945e55347cac6b39e77ec27aa1385f054c4dfa Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Tue, 15 Nov 2022 16:34:29 +0100 Subject: [PATCH 09/24] update: add captcha --- django_web_app/users/views.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/django_web_app/users/views.py b/django_web_app/users/views.py index c2d999c8..c0e0753b 100644 --- a/django_web_app/users/views.py +++ b/django_web_app/users/views.py @@ -24,11 +24,13 @@ def profile(request): p_form = ProfileUpdateForm(request.POST, request.FILES, instance=request.user.profile) - if u_form.is_valid() and p_form.is_valid(): + if (u_form.is_valid() and p_form.is_valid()): u_form.save() p_form.save() messages.success(request, f'Your account has been updated!') return redirect('profile') + else: + return redirect('profile') else: u_form = UserUpdateForm(instance=request.user) From f76526eca2e728c2fe4e5294f2034661dbec0339 Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Tue, 15 Nov 2022 16:34:53 +0100 Subject: [PATCH 10/24] update: add captcha --- django_web_app/users/forms.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/django_web_app/users/forms.py b/django_web_app/users/forms.py index c28ff278..24e8461f 100644 --- a/django_web_app/users/forms.py +++ b/django_web_app/users/forms.py @@ -2,11 +2,11 @@ from django.contrib.auth.models import User from django.contrib.auth.forms import UserCreationForm from .models import Profile - +from captcha.fields import CaptchaField class UserRegisterForm(UserCreationForm): email = forms.EmailField() - + captcha = CaptchaField() class Meta: model = User fields = ['username', 'email', 'password1', 'password2'] @@ -14,7 +14,7 @@ class Meta: class UserUpdateForm(forms.ModelForm): email = forms.EmailField() - + captcha = CaptchaField() class Meta: model = User fields = ['username', 'email'] From 3de4548ee3fd97d454e8430410c42ac4282ea356 Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Tue, 15 Nov 2022 16:36:23 +0100 Subject: [PATCH 11/24] update: add captcha --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1bc504f3..da16596e 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ This project was done by me as a assignment for an internship.
  • Django
  • django-crispy-forms
  • Pillow
  • +
  • django-simple-captcha
  • Note :

    From 7a1a33f057a6e8b3fdbfa36db494a05f77fb617c Mon Sep 17 00:00:00 2001 From: ernikus <41674224+ernikus@users.noreply.github.com> Date: Tue, 15 Nov 2022 20:52:16 +0100 Subject: [PATCH 12/24] Update settings.py DEBUG = FALSE --- django_web_app/django_web_app/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django_web_app/django_web_app/settings.py b/django_web_app/django_web_app/settings.py index be7061ad..70c93b3a 100644 --- a/django_web_app/django_web_app/settings.py +++ b/django_web_app/django_web_app/settings.py @@ -23,7 +23,7 @@ SECRET_KEY = '@5&-q%^o=@mb@=@e%b9yz^b#l-2)w&_s0ick#=wy3kw36$z($g' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True +DEBUG = False # [!] Ustawić adres zewnętrzny!!!!!!!!!!!!!!!!! ALLOWED_HOSTS = ['*'] From d829a4c1057ece6bae4d6385cee0579bb96313d4 Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Thu, 17 Nov 2022 12:32:05 -0800 Subject: [PATCH 13/24] update: small changes, changes against SQLi reuploaded blog/django_web_app/users due to laziness added warnings in case of wrong data during registry and change of data on profile check if needed to add in templates "escape" in data show elements --- .../blog/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 165 bytes .../blog/__pycache__/admin.cpython-310.pyc | Bin 0 -> 276 bytes .../blog/__pycache__/apps.cpython-310.pyc | Bin 0 -> 383 bytes .../blog/__pycache__/models.cpython-310.pyc | Bin 0 -> 1282 bytes .../blog/__pycache__/urls.cpython-310.pyc | Bin 0 -> 837 bytes .../blog/__pycache__/views.cpython-310.pyc | Bin 0 -> 3859 bytes .../__pycache__/0001_initial.cpython-310.pyc | Bin 0 -> 1055 bytes .../__pycache__/0002_post_file.cpython-310.pyc | Bin 0 -> 607 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 176 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 175 bytes .../__pycache__/settings.cpython-310.pyc | Bin 0 -> 2581 bytes .../__pycache__/urls.cpython-310.pyc | Bin 0 -> 1573 bytes .../__pycache__/wsgi.cpython-310.pyc | Bin 0 -> 592 bytes django_web_app/django_web_app/settings.py | 8 ++++---- .../users/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 166 bytes .../users/__pycache__/admin.cpython-310.pyc | Bin 0 -> 280 bytes .../users/__pycache__/apps.cpython-310.pyc | Bin 0 -> 533 bytes .../users/__pycache__/forms.cpython-310.pyc | Bin 0 -> 1450 bytes .../users/__pycache__/models.cpython-310.pyc | Bin 0 -> 1112 bytes .../users/__pycache__/signals.cpython-310.pyc | Bin 0 -> 727 bytes .../users/__pycache__/views.cpython-310.pyc | Bin 0 -> 1422 bytes .../__pycache__/0001_initial.cpython-310.pyc | Bin 0 -> 945 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 177 bytes .../users/templates/users/profile.html | 12 +++++++----- .../users/templates/users/register.html | 2 +- django_web_app/users/views.py | 4 ++++ 26 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 django_web_app/blog/__pycache__/__init__.cpython-310.pyc create mode 100644 django_web_app/blog/__pycache__/admin.cpython-310.pyc create mode 100644 django_web_app/blog/__pycache__/apps.cpython-310.pyc create mode 100644 django_web_app/blog/__pycache__/models.cpython-310.pyc create mode 100644 django_web_app/blog/__pycache__/urls.cpython-310.pyc create mode 100644 django_web_app/blog/__pycache__/views.cpython-310.pyc create mode 100644 django_web_app/blog/migrations/__pycache__/0001_initial.cpython-310.pyc create mode 100644 django_web_app/blog/migrations/__pycache__/0002_post_file.cpython-310.pyc create mode 100644 django_web_app/blog/migrations/__pycache__/__init__.cpython-310.pyc create mode 100644 django_web_app/django_web_app/__pycache__/__init__.cpython-310.pyc create mode 100644 django_web_app/django_web_app/__pycache__/settings.cpython-310.pyc create mode 100644 django_web_app/django_web_app/__pycache__/urls.cpython-310.pyc create mode 100644 django_web_app/django_web_app/__pycache__/wsgi.cpython-310.pyc create mode 100644 django_web_app/users/__pycache__/__init__.cpython-310.pyc create mode 100644 django_web_app/users/__pycache__/admin.cpython-310.pyc create mode 100644 django_web_app/users/__pycache__/apps.cpython-310.pyc create mode 100644 django_web_app/users/__pycache__/forms.cpython-310.pyc create mode 100644 django_web_app/users/__pycache__/models.cpython-310.pyc create mode 100644 django_web_app/users/__pycache__/signals.cpython-310.pyc create mode 100644 django_web_app/users/__pycache__/views.cpython-310.pyc create mode 100644 django_web_app/users/migrations/__pycache__/0001_initial.cpython-310.pyc create mode 100644 django_web_app/users/migrations/__pycache__/__init__.cpython-310.pyc diff --git a/django_web_app/blog/__pycache__/__init__.cpython-310.pyc b/django_web_app/blog/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..990fb98ae4a1870f668bb72ddaaad41691f40f9e GIT binary patch literal 165 zcmd1j<>g`k0t@BLWL6;k7{oyaj6jY95Erumi4=xl22Do4l?+87VFdBZLq8)wH&s77 zF(*^sCAB!aB)>qvJT*xnv7kWTB`Yy6JzqCGHOUdkO9AuZfs*kc$)ue8bp81F%)HE! b_;|g7%3B;Zx%nxjIjMFa8;Y5L1PcQI`nM*( literal 0 HcmV?d00001 diff --git a/django_web_app/blog/__pycache__/admin.cpython-310.pyc b/django_web_app/blog/__pycache__/admin.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b41968970957d1bc31b21cd90087dfdf499fc1b GIT binary patch literal 276 zcmYk0u}%Xq42GRc?o?2V`UprY+(5H3AOuob5fTGZ8LGR+I?^VWQxb%D8yI<|teyG_ zOgPsCOa86Tzh&FaW~V@LeW5q6RQDPF2Pe3r43{Jd6f74RvCZP$6b`8D7aN6R*I; zU4leUy8pZHKHJS^37}k@)$2#}Uz8k*z+{Qq&(Ubm%tFI*#^4Tgr1=MEZrD4|BQ5SB zJ^IEeNLiR%dw=WNO#Z#r8_l5oI2=brMO%Qi5KbhRR#>ib^YnhpT_u{;KHRZhUUS>~4Tep0@kH}qs;h}lqCA=Tq?Z9$V=L}zLCpTHQ=2Z#7_WPL@? KACRVS%6|cEQ&#@~ literal 0 HcmV?d00001 diff --git a/django_web_app/blog/__pycache__/models.cpython-310.pyc b/django_web_app/blog/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d5e0f2f1460e34634fc0a036d5a8de062efa50f GIT binary patch literal 1282 zcmZ8hPjA~c6esn^l5N>Z)1=tCVHmKJ4z;g43`2ut*`cU0AQ=V-0|+@}Y}u5kk<`)} z?POkR4C=55Jq~45$3^UMBnNd;Bp$~yEz(~JAMoT2;fbJ|;Xh$9;_*4j z)Aw*D$*CLEiVJA~rM9ZYPBj8>^t%xn-ia1}3vI;W62tGW7>uVN<_eS`1?8j&M7W7K z<-rXtV!#6)!V~fMCM*&WzD?heVhG*=*ggYo#hV zvkH^p;;QVV1vpd9S`kuf_8FvTf(5o3dG{Cx3|LF<9JN44e#|OQ}}#zWB5DrArty zRx>umt6>_*fbKHPc6R6ZjA#e}D4yt704&+iw*k{@A!srZ8H?-1dz-BZ3DIH3uM!Q!SQqx&?a zQ`A8kW|2mJK6b-?@@9P5XO-RAovozNp5WuVPnd+RmNVoq>xZ+aH~zFo!xrC^M{u}{ hpX0xWzvv!0&lMTE^rybOKjSQz3{(a*@k!~U;3LR`Il2G< literal 0 HcmV?d00001 diff --git a/django_web_app/blog/__pycache__/urls.cpython-310.pyc b/django_web_app/blog/__pycache__/urls.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08673fb2580e60ab22a65be8baedc3186cc86695 GIT binary patch literal 837 zcmZ9K&5qMB5XbF&r)fjk4?vt&;?zUeSG1}s5EUnckWfL&rAq5jn{C`gaY}{XVc%gn z@-93kT~ISQ@Xp3@{fO>$>i^ei(aoo^mzR$TTE?2ek0r;Jq>U4Eq`g@gwvb| znovr(#qHb@c47-BafF+=!b?2iC%y=hz{H(A6jowU0+hR8-*$cw?s5Od)*L`!IBdBC zj^U`~F1Ut!Eyv&)e$sLue8W#$K6%8aU|mQ2tc{*)>hfnu%P{Hj=by>o#hu;}8PLWl z(|UDB5xl1RsgU)DOx9mA*flZI1nM-)kNmEJw1y*3Oa6c-kV6~qPbF0ME9%d=-*jc! z5EahzVmVwD0?@=J6`)SHI-iYXU0vY}*T$-Y(_yKdNEPFQjj~OBRj$WOMaV;L9IDU+ zH?TXbFN{-l{_v%(@q5VG)8ia&_HfAAlR6W?vy{Eha*+Q$C|^QaEmo}Y_7ml$^I}^w z)iL`s@Np0~5x-71%i?ld<+8GLw<|n(m4o7WyA0i3 hmfxFTBnrOGVT|WOzSPns7qlDn?LIwTF^y^P=N}^F@>&1@ literal 0 HcmV?d00001 diff --git a/django_web_app/blog/__pycache__/views.cpython-310.pyc b/django_web_app/blog/__pycache__/views.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b225ed08a3e5f88ecf6ae5c18dc0eaadcf169b20 GIT binary patch literal 3859 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 literal 0 HcmV?d00001 diff --git a/django_web_app/blog/migrations/__pycache__/0002_post_file.cpython-310.pyc b/django_web_app/blog/migrations/__pycache__/0002_post_file.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce19379e473cdc4896e0dc648e8b5c1e8c990405 GIT binary patch literal 607 zcmYjPO>fjN5cOBKNz@|50eVD2LfQk(!ifVytyGm0y|fY{7c1GBF5Y$G5NCxr!?nMF zU%+4Tl@osf3AJM{sGZ0Yzr4}B@pIh4LCGjyKQqf8oUvaK+z&VnO)-&D)yB9xt3jm>0S@58KffYvV~bw6?f$F%%{60({D zs|D~CuO+H=76ov&-UCHX2D57kd)JcK9CDH>Lh=5;1_`Rxx>eX;EEX@d>CI#s8`R+Z z6x5Zmcp0)Ydil8wS!e+t^qe5#WG5V81lzM?t3w`3b;T>@ms+i#SBWp>zZObLb}w6I}2IT>Z^&5`R8dq1bgkf;Jr@jh@K6F?YK|>J#!eJ3HRePsDuG IcqksrTblHu6aWAK literal 0 HcmV?d00001 diff --git a/django_web_app/blog/migrations/__pycache__/__init__.cpython-310.pyc b/django_web_app/blog/migrations/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e44b7cbf1f1c2786e4967a778201ce14dd45789 GIT binary patch literal 176 zcmd1j<>g`k0t@BLWL6;k7{oyaj6jY95Erumi4=xl22Do4l?+87VFd9jSU)2_H&s77 zF(*^sCAB!aB)>qvJT*xnv7kWTB`Yy6JzqCGHOUdkO9AuZfs*kc$)ue8bp71S^rFO) m%>2A!{rLFIyv&mLc)fzkTO2mI`6;D2sdgaCikW}}3j+Z2iz_w& literal 0 HcmV?d00001 diff --git a/django_web_app/django_web_app/__pycache__/__init__.cpython-310.pyc b/django_web_app/django_web_app/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ccd964f222b1a15744d29b3ec2df9751474936c2 GIT binary patch literal 175 zcmd1j<>g`k0t@BLWL6;k7{oyaj6jY95Erumi4=xl22Do4l?+87VFd9jNIxS#H&s77 zF(*^sCAB!aB)>qvJT*xnv7kWTB`Yy6JzqCGHOUdkO9AuZfs*kcNi=SJd}dx|NqoFs YLFFwDo80`A(wtN~kX^-0K!Sw<0L8Z|)c^nh literal 0 HcmV?d00001 diff --git a/django_web_app/django_web_app/__pycache__/settings.cpython-310.pyc b/django_web_app/django_web_app/__pycache__/settings.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5836bf2663ee0462b222dc7fa4f04b86f36e5b0 GIT binary patch literal 2581 zcmb7GTXWh*6h^WPnAnbEJ8`a!W^yI1r8rKLw$r4RL9v-&ph%7rJwzk43#_dR(TY;* zx8$MDTYp6V$iDWaed%K#I-RCR64(sROkF^$vuD3^*|Xn~@aN_V8TkD2M__+HpUM0h zPsTqvm~6mBe}e&Kj11xs?{Ef(xqbepsj*SO(??wVHL_^R$RWYVqv;N3%z#wrWKi}4 zXPkq34(_ukZ_J??m~s_ zjg=@%-8mZ(K#!jce$J zaUFeT+(0*t&k(O=ilVj7Wio~GzU6g%k>W5UUWbZpKM+x(GY7b3TD_jw3;ca-hf<-i zg*_ZtAx2{BP`sDIRxRWbPo$w0ghS*#u}{I7IQ0EUT9clF^$T$A`T-V+2T@!rB)%uY zFYFSCOC0rZY+_iuM}#yuz&qUDz3cO z1DdLLV=>jUSvw%KcWA~XqtS9&5XttvFd!`{DSosxsqKf|=-PxbHo;yP9`-PeRwfoH zrWB6j^nwcuRtGGuPFjR;fOdRrl;v!z7usE`n2T12Fqa_Y;DHrjiDJ7Sknm8_hQiMA zTJ(6*>o5;#%w9`%V^+n}L4X>r?@6WP_8(9hw51XZuLvHDL7z_KVnG$h^H5+81tfOD z+%dz+O^j+bZoHG$am?z;CpO^#XZ9`o0J=wd{UWejT<^tgLdWcehdpXfsUJ8rl84Sh z?Dib!P^kr8u!lw+B$bn%)`!cKEhcpMF*KpKY{<l5JPVt&G4v{n>YZc{0}RBL4>lq*e*<&{RmOr%`Bp;ziP zExMUHKCatUs-xCP8R{6#GU4GvP!djxn_LOwF7Ag|BQ9~QxJzE82tSCPpViY2@rc`Z ztJv#=-4pxo&T5}FO=FnjiGz)^I;izs91#1ohiUAs_9>g%)k{%chIa&XkIb^Ez@}Y{ zh!y4JgRC&3auocbnBxz4n65=;}_R zs_3f57WTBQN{p{oN=nQ=ChYsfV>4w%SK_QRc3Iigx6Ov4X?yi%*?gr`E3jAx>dsY_ z+SabJr9v)c72H;KRMV&f%ksOhpUT=-wN$FEJ*=^8tkVtHq7IQtaW?GSP>$1sgw=9I zF%x+vm1E3usaeq)Z_H8BkV@$#TddZB&t?-$nrbQ88=FaWVDxh)SObbD!(UA~J{O1&3{4>eW*Dwf~ z{Ot89Aty{_c|phv`8lD$3p~ejd7l3${4IPG7Wf>`&2qv&AkTqL7`y%ymIQz&-|PZ6 L&kI~E=ed6Y;!Sg` literal 0 HcmV?d00001 diff --git a/django_web_app/django_web_app/__pycache__/urls.cpython-310.pyc b/django_web_app/django_web_app/__pycache__/urls.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..969367ade487881078b8aa21ebf189a51425e54a GIT binary patch literal 1573 zcma)6PjA~c6qjt-vgJQXn$}5sB8CBufmB3$8DO--vL@XEbS==e8=#9Si?l6Q6a|uA zR$Y6}2icd{VIPCX?X-{3UA9MB&b$HxDns(`y~p?O$4BzPAaLOM?Sn{vZ8^>#M%aCf z^(%Pg@9-f`())@-7Raz~Xk^WBsUK`wYNm z=sMIVK5eY_R{QT8fIGCcI#}HzT@qZoq(}PKP0$YLaCJzAwX_G)ZL(iW2jFoBJZ@Q! z!&-ZrcF3Lgu8lbYd}Q##k47|D9SKfHv=8VQ-n-=Zy77e*jmX{a9rI4^C07k-bd?kf z9$(Q}oRlSc{qh-l!i#yfSc^nuya<9m<@r-oFut->z)pwY3e7H0#^ckvuO(;n6cq`hkH-d&C&80Ek@Efw8Y4SV|E~(JmQm|g61`q z(+ypl?FbFw+al|=rSX&cxNNgs`kI!16L_XwOiu z{n`yI9Z8jft|Z{LR4`I$)wXW9YD3Jdz}5a*QX#RG!lhz4tQ{x{(~>9}n|;$QYXrS# z#HuUk0>+pMtUFs+bzltVSx&L`YgGB*29u7fgPRl}+8o+s2SGbk_olh3lP0A~mkF-= zHL^{cf?(d)j20>uoU7-Pd)kj<(8aMH*0jTJDUr)u``yL) b)8Fg6`)+^pYmVF@{6<#tKD2wsuJ`vpId1I` literal 0 HcmV?d00001 diff --git a/django_web_app/django_web_app/__pycache__/wsgi.cpython-310.pyc b/django_web_app/django_web_app/__pycache__/wsgi.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..418957aafeab7ddda0126513dd7972a8b9eec3d4 GIT binary patch literal 592 zcmZ8f!EO^V5cN7~Qx=LipmMduDH2@+Cxj|QrIaWL(nDHR%EfWklZ{iay;{3T+bcgp z4?XZpK5*g0FK}WuQKhz)Jl3;k=DnG*+ucnGt`Dzuewz^Trvdj@8^LGX{w*3s#zZBG znq-{d*)p_jjavzUWYPY)rP^xih9YYHAmeRCN2I%b{X0Dy^#?3>cBTt9b2U>7X$vP- zFcq?@SXH|PJSbRI(GKXR^I?z4@!J59MOIavNa zd&lQ)6&zPk8Fy8J4SeMb&C|cw6*BB5@nr!)G(-+7`asi5($Oi4c)GA75g`k0t@BLWL6;k7{oyaj6jY95Erumi4=xl22Do4l?+87VFdBZQ$Hg=H&s77 zF(*^sCAB!aB)>qvJT*xnv7kWTB`Yy6JzqCGHOUdkO9AuZfs*kc$-K9dj4UD|ftxSCd zCVc6FCI8lE|FZ37vlHOBzR;_h>raCJAsFsB!zGIXg$67x5kX~2n9Pc$Kp@=Yp9P7p z)X$%xD)#J#3S-eItGhiO=;+D2S8eFAD&wizG~L?GSFRhpZhgjupU-HVt zUtr?S0VyZlJKvq}`JJ2bcu2rbkIU5u#4k+x7C|xvw-W$KB-Ny%1*PPQ$UuhgM23pK zg+(BvYm&v^aEoNr4KCVt*3|2Av%*T>0!XId_6R_cf=U9@vyM-8GeB zTcJxfS9bf@wCqVOC!%fH{9e?X=Hyl_VI?Mg#-Yiv>8Tl+zmOe8oASWPC0+r3H{fJFq#3-c!@nouoeQ~26hi1ArVajUt46M g8+9Uclx0we@AMc@p+Op#oOREi<6l`MOvz#R3oK`KL;wH) literal 0 HcmV?d00001 diff --git a/django_web_app/users/__pycache__/forms.cpython-310.pyc b/django_web_app/users/__pycache__/forms.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a03a8ef2a77b6bbe6a997ef50d12e61ef303c39 GIT binary patch literal 1450 zcmb7EOK;Oa5Z?9Mu9LoKc}pD0fkbddsHml!8X-`Hv=__GZd12*Y<3-0^jdxhaO*GO zKkSuL&y_fEVrHGtv`vxN$m4lsb{^ljY_%c+=hvbd{ICf5iNfr0K-hps)j&AmG$#dR zlp=5CR$(*S@OJJLE^~o*xSM;0&wQiz@}LM=NXc8meI9%vJP_`w%_5LP9)TPQdbj|Z z7&Hq!22DKCw0P?S>9o(`X40YB-7jUKfN^$}knmo@_oftSot2|)FrL%K(|;$+{VW&Y z6K|$fJvd0WGm-NFMw&e~2pjNRJOv^Mqnt2H*k7G*gt@{yCCrDcD7PRh>(pWaw;>~^ zx%s^qW~vqvZ@v*3dfD{t-j&GA8A818l)2o3NcPDZ)-W5XyCdopt_a3p7^Q{Kt|-zh z*I|_^bzDmR{E~gqKl5~uB|%MU~y(TasjnIYW+boHS^cYG#hRW-9jMf zdJzB#NI*ThLXGyuD5gV}=n9=}W6O6dp4Q_3Mu$KcS}-~Tf|J#&am?T()@};v%Qmuq zTRf9H_G1N&cafOxNQB8;=SN^LjeCe5DBW71dH~ibim%|-p5S(QvKarU9#?1s9))>L zg9)2CoDMHxyM7~(DPOx;kq$+_<6R#%!aLAZ(zh!yVi>M46eKNoHQ&I(P{IVR2t!`xWj;Ok&s_{4H54!Fuoqz634g literal 0 HcmV?d00001 diff --git a/django_web_app/users/__pycache__/models.cpython-310.pyc b/django_web_app/users/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72b054e4b4060751a526691afdd939af81d4a900 GIT binary patch literal 1112 zcmY*Y&ui2`6rPz(e(ZL)6)7G>q2MW?yH^nrYpbQ8wNOO}!jRpW?k1aT;!I+3*`8YP zq<9xW!At+8xq9lqAPByfY(WR+%X@h<^S=4so1)+E5*YXIB;zlPkYDKhJ2*IxVVVa3 zl1Q47oJN$Q%`%odk<-{t#&b7vDcK{EOZS{eSJBivb0S}QMQjv?&tADjWPc3z|1(z697dbDoMnYlXB$(dXj!(kq=fNnRFxvuOnUQos+2hksMR$ z%iuhS);2lSpQHL$4RCjXQ!A8prI8mJ{16+a;n*#wKLeUj=Qa zF0&$*qAJF;q16J~ARF0%Y1RRjBqb^R3POEjkdz%Pf~~8x%<>wpYy-r3oFfr#RCatp zbRYKq-WyJfTn%S&mJD~5nN>wOJW->qxGaaeX*{14_ui<{Hh8k}1Ox>J@jx?dl^v8H ztS^MAv=CTZgZ$R%Vq-;Pu!{Y64;R*;;2XH%EkH#ox+G^TWlNfnCHqM~L(wbeJBJ&( zsrQ4PI!h<@C7p3|3#;$2K`?X6PJT-Ua1CrmsP&2Ewj& zO&;G@uao2xyH?aySy#d&3v~evAjCL}jS-@eUSsX_bpR|xQ^^~2oozBsyYxEce-^zf z`H)%Iw}B8?LLqEd2vEMx(C!KGu8y-dqEUIqpL3V>&c%A|JipTDzxw6neYRAYf` zw|M|>dY1KVkPWgtf_ zpPMUxT+Az-j0SOCO$Tl3wB($_{pYRp?hAaY%}K3FP3i_PwGAG&7k`A$zytt2(xW|k G!}$wdm=Xd2 literal 0 HcmV?d00001 diff --git a/django_web_app/users/__pycache__/signals.cpython-310.pyc b/django_web_app/users/__pycache__/signals.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58de28b79f369a1d761ea98fff1cc391c42f4733 GIT binary patch literal 727 zcmZWn%Zk)M6s@W}JN+0H7cwisRWIypU5Jb@3qfdvL4+VQN$T32bY4`YXApX)+xZ7w z&Oi7iwRJVW;70GQWT3$cRdpXH_ncc*?R*|F9Isv!`7h4cZ*oqDi_Qg3{TUa@B(GS_ z6VAyNm8hM>v9?pWwU>BkyV9%tI!FS}zyl7B^lya>WcZzZ<4JfDo5;wN}>+5b@_-ylZQS_i0tcm!S83+r>AKJx{wXzAV#b+rIn+*<19a^){H?P?G3% ztcz`vR(jQaHH(2^(+zzRzb0|6c*5Pk>M@%Cbu2JwJ6@o1D})3r0m{- z)y!#f;gEm8VfO}q$yZLfan1oz<(@1A(Jhxz!ht zXB<8;499%Wc5KTo{VNadU>{t0%-gcl@G=toitV_GFO#h&{3}d}>4;#@PCT@A(H1%z z+j~1!`^NRAhjvWHmKAL8V*-+gHhA>i$zz)|c%LIbPcb2xDO8;*Nb^;;HYn0UryEf9 z^626n+EY*AkiW^wRHY4Q)wpk?N}81t5Mxq+II&5g=jT~j2pj0^T-ttK%B+@Rj>*of zzmx_7niuOP&#`ns$+ht&gSx1fz){1J#Z*J74Gd9-9*W;Rcptl0$J3RnsY2h^{wipyOZD@Ea=EG~91#K;0Mo1>Z3f5FOY;vYjFgFZ>-xLSiK4(=9*r z>@so0@U}M{M@CCa??6lEvVTp>Ya6jgJ0X2;r*;SAZOgV?M8EQ#Zw9z3-uefQT#e|~ z6ty;4oy&{c{|{2*E{8a>@w&YlFu+LZ4mNYDy^Yqczj(XN>tU9oV?2bna55w$925af zf)467JpSg}uTS73@{LH`AVE2Wn3`zEot8$GVXJ<_d~bl;do$2Eh-beQeg7NXt#Gu=J4R7ZJ}7S z@ZNsYILR8bnh2RI$czFFgoh0&PrAJtE)^8N!>Ns)PWzuIY;wO+qABI)^!w2S|HvaA LZ?eSaqaphnB|&A& literal 0 HcmV?d00001 diff --git a/django_web_app/users/migrations/__pycache__/0001_initial.cpython-310.pyc b/django_web_app/users/migrations/__pycache__/0001_initial.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44350fb0c834bcba0fcce3576238c0943e140f03 GIT binary patch literal 945 zcmYjPOK;Oa5caN}_z|ZqP$A&NLjvVMQf>$#)Tn8p5^WJ}1@dL(WG2C`?KQSTm0sc6 z{{Tn+(q1|77m%RL+I_9HtNCWe-_CqHvfK3xTF)OvlZU2Z{L|A2C&3P zS-_aKdBRgOFjFhAYHTL0p#9na3tHa{XrUR~U(LVx_2m*+r(Gs=pb;=I0uC%N(fZ!Pc5MG(GZr{##V&9#(Th94 z=%Xs2eQHfP*yQuU0T;YePPjw3i%aox?8Phb4b1_*j?7Hxo^oQl2}@M-vT}DW3OrEu zyFyN*1Qm~9OY!Yd&r*IkucVk17*+_XlNV7M77KBN3+0wrL}3!0pz^<9F_tBYEKE_g zC})Nz9l&WgPpW>L&y=4x+#-)AS{VC0sN8v;$Ph#&l{F_uin%fqq!d!25TEB^qLT^PQ5IEHUqO#g`k0t@BLWL6;k7{oyaj6jY95Erumi4=xl22Do4l?+87VFd9jL_Z@xH&s77 zF(*^sCAB!aB)>qvJT*xnv7kWTB`Yy6JzqCGHOUdkO9AuZfs*kc$
    - -

    {{ user.email }}

    + +

    {{ user.email | escape }}

    - {% csrf_token %}
    Profile Info - {{ u_form|crispy }} - {{ p_form|crispy }} + {% csrf_token %} + {{ u_form |crispy }} + {{ p_form |crispy }}
    + +
    diff --git a/django_web_app/users/templates/users/register.html b/django_web_app/users/templates/users/register.html index 3c3df17f..8da3ec00 100644 --- a/django_web_app/users/templates/users/register.html +++ b/django_web_app/users/templates/users/register.html @@ -3,9 +3,9 @@ {% block content %}
    - {% csrf_token %}
    Join Today + {% csrf_token %} {{ form|crispy }}
    diff --git a/django_web_app/users/views.py b/django_web_app/users/views.py index c0e0753b..3516fd32 100644 --- a/django_web_app/users/views.py +++ b/django_web_app/users/views.py @@ -12,6 +12,9 @@ def register(request): username = form.cleaned_data.get('username') messages.success(request, f'Your account has been created! You are now able to log in') return redirect('login') + else: + messages.warning(request, f'Your information or chaptcha is wrong!') + form = UserRegisterForm() else: form = UserRegisterForm() return render(request, 'users/register.html', {'form': form}) @@ -30,6 +33,7 @@ def profile(request): messages.success(request, f'Your account has been updated!') return redirect('profile') else: + messages.warning(request, f'Your information or chaptcha is wrong!') return redirect('profile') else: From e04184df8e6bc05c43728240b3d2019c307f87c6 Mon Sep 17 00:00:00 2001 From: Adrian Skrobas Date: Sat, 19 Nov 2022 18:25:42 +0100 Subject: [PATCH 14/24] Add middleware, structlog and axes --- db.sqlite3 | Bin 0 -> 192512 bytes django_web_app/.gitignore | 45 ++++++++ django_web_app/db.sqlite3 | Bin 151552 -> 200704 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 175 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 159 -> 0 bytes .../__pycache__/settings.cpython-310.pyc | Bin 2581 -> 0 bytes .../__pycache__/settings.cpython-37.pyc | Bin 2558 -> 0 bytes .../__pycache__/urls.cpython-310.pyc | Bin 1573 -> 0 bytes .../__pycache__/urls.cpython-37.pyc | Bin 1511 -> 0 bytes .../__pycache__/wsgi.cpython-310.pyc | Bin 592 -> 0 bytes .../__pycache__/wsgi.cpython-37.pyc | Bin 576 -> 0 bytes django_web_app/django_web_app/backends.py | 4 + django_web_app/django_web_app/middlewares.py | 34 ++++++ django_web_app/django_web_app/settings.py | 97 +++++++++++++++++- 14 files changed, 176 insertions(+), 4 deletions(-) create mode 100644 db.sqlite3 create mode 100644 django_web_app/.gitignore delete mode 100644 django_web_app/django_web_app/__pycache__/__init__.cpython-310.pyc delete mode 100644 django_web_app/django_web_app/__pycache__/__init__.cpython-37.pyc delete mode 100644 django_web_app/django_web_app/__pycache__/settings.cpython-310.pyc delete mode 100644 django_web_app/django_web_app/__pycache__/settings.cpython-37.pyc delete mode 100644 django_web_app/django_web_app/__pycache__/urls.cpython-310.pyc delete mode 100644 django_web_app/django_web_app/__pycache__/urls.cpython-37.pyc delete mode 100644 django_web_app/django_web_app/__pycache__/wsgi.cpython-310.pyc delete mode 100644 django_web_app/django_web_app/__pycache__/wsgi.cpython-37.pyc create mode 100644 django_web_app/django_web_app/backends.py create mode 100644 django_web_app/django_web_app/middlewares.py diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..a3672170b8384c39a9f6b84af0d35ac3911bc3ce GIT binary patch literal 192512 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 diff --git a/django_web_app/django_web_app/__pycache__/__init__.cpython-310.pyc b/django_web_app/django_web_app/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index ccd964f222b1a15744d29b3ec2df9751474936c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175 zcmd1j<>g`k0t@BLWL6;k7{oyaj6jY95Erumi4=xl22Do4l?+87VFd9jNIxS#H&s77 zF(*^sCAB!aB)>qvJT*xnv7kWTB`Yy6JzqCGHOUdkO9AuZfs*kcNi=SJd}dx|NqoFs YLFFwDo80`A(wtN~kX^-0K!Sw<0L8Z|)c^nh diff --git a/django_web_app/django_web_app/__pycache__/__init__.cpython-37.pyc b/django_web_app/django_web_app/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 469f8cad98e1ccd9fada8fdd6326a7f5d580a404..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmZ?b<>g`k0>K!yVl7qb9~6oz01O-8?!3`HPe1o6wm*(xTqIJKxa z#y2q|wKzi|II%o2uO!ALwK%&ZzaS~s_ zjg=@%-8mZ(K#!jce$J zaUFeT+(0*t&k(O=ilVj7Wio~GzU6g%k>W5UUWbZpKM+x(GY7b3TD_jw3;ca-hf<-i zg*_ZtAx2{BP`sDIRxRWbPo$w0ghS*#u}{I7IQ0EUT9clF^$T$A`T-V+2T@!rB)%uY zFYFSCOC0rZY+_iuM}#yuz&qUDz3cO z1DdLLV=>jUSvw%KcWA~XqtS9&5XttvFd!`{DSosxsqKf|=-PxbHo;yP9`-PeRwfoH zrWB6j^nwcuRtGGuPFjR;fOdRrl;v!z7usE`n2T12Fqa_Y;DHrjiDJ7Sknm8_hQiMA zTJ(6*>o5;#%w9`%V^+n}L4X>r?@6WP_8(9hw51XZuLvHDL7z_KVnG$h^H5+81tfOD z+%dz+O^j+bZoHG$am?z;CpO^#XZ9`o0J=wd{UWejT<^tgLdWcehdpXfsUJ8rl84Sh z?Dib!P^kr8u!lw+B$bn%)`!cKEhcpMF*KpKY{<l5JPVt&G4v{n>YZc{0}RBL4>lq*e*<&{RmOr%`Bp;ziP zExMUHKCatUs-xCP8R{6#GU4GvP!djxn_LOwF7Ag|BQ9~QxJzE82tSCPpViY2@rc`Z ztJv#=-4pxo&T5}FO=FnjiGz)^I;izs91#1ohiUAs_9>g%)k{%chIa&XkIb^Ez@}Y{ zh!y4JgRC&3auocbnBxz4n65=;}_R zs_3f57WTBQN{p{oN=nQ=ChYsfV>4w%SK_QRc3Iigx6Ov4X?yi%*?gr`E3jAx>dsY_ z+SabJr9v)c72H;KRMV&f%ksOhpUT=-wN$FEJ*=^8tkVtHq7IQtaW?GSP>$1sgw=9I zF%x+vm1E3usaeq)Z_H8BkV@$#TddZB&t?-$nrbQ88=FaWVDxh)SObbD!(UA~J{O1&3{4>eW*Dwf~ z{Ot89Aty{_c|phv`8lD$3p~ejd7l3${4IPG7Wf>`&2qv&AkTqL7`y%ymIQz&-|PZ6 L&kI~E=ed6Y;!Sg` diff --git a/django_web_app/django_web_app/__pycache__/settings.cpython-37.pyc b/django_web_app/django_web_app/__pycache__/settings.cpython-37.pyc deleted file mode 100644 index 01656b54b9e6272b7832821e1bbcbdd57b6cd68a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2558 zcmb7FS#R4$5SC|A4Q3>R;$X(IF|>svMxMR$R``@y+b)40mI0E}y_(`}d!Bf167r{s z%o#b7hj};y3vd<|;T$X(88QRs$t+wj5+J}uxCEEs3S2b=mV|4c1tUr3;5wOy8*nr7 zc!s7yJWRn?pHnPJ7T^}#M$KEW9L;y4`7TQu0yzu!$RgY)=P;fne9q%@0anPxBb*0^ zsZNqyI$A$GOp(j*h+KhHaupwqq5jT|mHs=k!>c z7e;XxVtB7h#ZKQeMU!z)bUMfT(rrLTl)2)My4k1v|M+rgXUx%`SUZWD|8)K9yQ`n> zd~{x|Tdnn1>-0|R+XMe&>$bW2bY*Z?{?fJ5Qf7xjIOD)qeBupxo zHjpYhc83}Mg+8Y)kJ;NH8S}|(+hx3WpoQ7u{!*L^sqNUF%UV*DcmLcZx9@fRs}s!7 zgxa2W(4*YHI3eVeb3BQY0t*GYffiRLEj&ECc6egkUmeOU24K>G?ox@*fus(J z>XFQUHVHL!E{)l%F>lOj<)jlV1;~KNZ z+EJyB8BT6ul&EpzYMi_=tLIr?>a9TcjV}xVlB_y|69#nBDM%N9`!}U6cET zA(%(4o{1ePwGf5cFzOho6!ma(DCT4_s)3(84ST7Lu{kdH?@xl9)RBO;`iB4D6q+vm zgni}t4~M!(bsDDi3&>%*{j~|@qf~yuU?f`+g3N|oe5ce(L@1RTYLJz;wzP=K)VG@D zdQJ6j#=u8e8*qb#9flc?jx)#r?dW~eJF0GI9Vd~0GMPu${5&#;^hzp7E49sXO$mgW zTvgl*eg^!v6Y)ni)YCa1I4)@TsbLVglfu51y|8in9#xseOg-$8_pyfK`maxmRAn}^ z`c{S7hSxo||NgZ0am#ECV>|{}KP^D5Z&8=EPa;fHd$rHW)ONGzXA5{EVDA)2Iwr`p zMSaRlQw`?J zHMNN>WMJi}LB3ipl`6`P+)#qqM!nwDwi}gVz4j)^HI?dCMQ$o;u&|?UmP7qYxhRK4 z76^L|vx8hoZpxu^HMk^iH{WVova0UX8zt?%Tq&cljukprk!zdV@}{B{>m>zY%T+}q zbu6arHilh(@=YzKDo-BQf^^7h65L4>Jr%=ff|(&5hKB(wrLwF=bS|b*hb$EvWp(R= zHVPU;DZUF9D|IYet$`*Dr5Nok$i+M~`ZeJ$V(q!lpB6G9y_8Q+g(IIulz60t#M%aCf z^(%Pg@9-f`())@-7Raz~Xk^WBsUK`wYNm z=sMIVK5eY_R{QT8fIGCcI#}HzT@qZoq(}PKP0$YLaCJzAwX_G)ZL(iW2jFoBJZ@Q! z!&-ZrcF3Lgu8lbYd}Q##k47|D9SKfHv=8VQ-n-=Zy77e*jmX{a9rI4^C07k-bd?kf z9$(Q}oRlSc{qh-l!i#yfSc^nuya<9m<@r-oFut->z)pwY3e7H0#^ckvuO(;n6cq`hkH-d&C&80Ek@Efw8Y4SV|E~(JmQm|g61`q z(+ypl?FbFw+al|=rSX&cxNNgs`kI!16L_XwOiu z{n`yI9Z8jft|Z{LR4`I$)wXW9YD3Jdz}5a*QX#RG!lhz4tQ{x{(~>9}n|;$QYXrS# z#HuUk0>+pMtUFs+bzltVSx&L`YgGB*29u7fgPRl}+8o+s2SGbk_olh3lP0A~mkF-= zHL^{cf?(d)j20>uoU7-Pd)kj<(8aMH*0jTJDUr)u``yL) b)8Fg6`)+^pYmVF@{6<#tKD2wsuJ`vpId1I` diff --git a/django_web_app/django_web_app/__pycache__/urls.cpython-37.pyc b/django_web_app/django_web_app/__pycache__/urls.cpython-37.pyc deleted file mode 100644 index b2be178bbf46c70896ac6814633ef3c5f3348d13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1511 zcma)6&2QT_6qn==+44u6rggeu19)=;q!QZ80HYn+Cg~QSU4gdQK`@{yCT+*}IVBlG>p8opF?B|wc{i&Jl z>H_f;UhxNP*orJ{V<)$%6FIh~8+n5^qn4qYd7HYCOFL1=@U6T{y~s0kJMYnc)URy@ zU^BEW;$oLLtG(6e+5x&lTC4rl9o)s~8n%f79dthsp%lQHQ7bsyf(@c730%8JJL@U7+FPp%v&Y?TyC7GIIe zI4MhX@#ZBuVZ|a_Ry>gzD?IOAO3?d?=Vc-#;e~jQ@=Qp?StW_k1_DWje$2>~2+#}0 z5oMg9tXMEkjSE!fBoPD&LZ%*ql}cHPX&7QQ7r`chlCu?=%V5rENQ&@L@Gz9D%;qB0 z${~aop?CIELcy1qdM~PCuCv>OHBKJ}=o!W+DNsgB#^n^D1!ok|52mn82TF)9*Do=h}7@x7Bg5#qrm6oz-a{$CbMriAN60s~Z?Bl;G6 zne0C?8?7HCBGyih{Esp^FXnlLvtkJ#n0UIhIW%*N&$$5xK`PK5txJx4w5Xw+Zs6Lq zBhY|vldN@*4JeX%cjEirUvQ@^-&U;z)2z^h!Nqq}Q$w%Z+6+!Q zf=CHf3833T!br{6ZDSU$+u$=R!u6;Ugp1H{K`Lnux&ujIS`tZO-8a=ThahiicHQM< z31duns5)D6-GMP&WH||yTT^Qn%wW>P_5N)LU`-6AqXVO?b@#S7-;M?_*A*p&j5%ZS zJO6X##xcm^I2zXQLRTcuE;(F4OC9`I7$lWUc>_)&Pm`wELiKh!!<%r*;fH12igllP zTN@qz>uzE24mO~1SL?S-8Ih+ywdbbDBvDP>a@BpQ0sS7vOS$!&@tzLW*Tx>4Lc!*^ zw{u}s>-6mT#W$+^>g@FVSqx*Rybby0_3L-PS^P`wLT`Vco=j&Kx>>VVNlHYD-X>Q` zA!nyV`~Ww8wn={bKl+%}IR@ni)p<-Au5$AA9{3brz}B?;@QlpfZ}jc4J%nd$kD6`! EA5l5jg#Z8m diff --git a/django_web_app/django_web_app/__pycache__/wsgi.cpython-310.pyc b/django_web_app/django_web_app/__pycache__/wsgi.cpython-310.pyc deleted file mode 100644 index 418957aafeab7ddda0126513dd7972a8b9eec3d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcmZ8f!EO^V5cN7~Qx=LipmMduDH2@+Cxj|QrIaWL(nDHR%EfWklZ{iay;{3T+bcgp z4?XZpK5*g0FK}WuQKhz)Jl3;k=DnG*+ucnGt`Dzuewz^Trvdj@8^LGX{w*3s#zZBG znq-{d*)p_jjavzUWYPY)rP^xih9YYHAmeRCN2I%b{X0Dy^#?3>cBTt9b2U>7X$vP- zFcq?@SXH|PJSbRI(GKXR^I?z4@!J59MOIavNa zd&lQ)6&zPk8Fy8J4SeMb&C|cw6*BB5@nr!)G(-+7`asi5($Oi4c)GA75-I8*>&o*S8J0LuKkAI z+d~ih5C^G9?yGk#-F#hL*#Ae_E-8hK@g~O!>TO=%h3Cm&NHVRaA}3Q_6Fy@q z*K`3FlvNd}YCVI@MqxO#1b$T7fFZU3vZ`ZJvI_}>8Nx`Z`K5$C33HHS&T6qtDOLg} zlZi)@B4bu)HJNz4ub!;bH4vdZZ@Ekmtvt9eWGW==5(5wx)>dXej=9cEv=X=0l<6`C z6~B+(#f4s29doFpzA8c4cwur8hYx-#Xw(bb>l`d??wY37GTcu8+remXLX*SO)8S~4 z(BqT-+0o(ko99D_3|K2vZh9Tpq0}p()M0JhtJS+G^KC>8dW}7w>wubzS}Pa&LJm`Q zDXrW3hxi87&6h6SWB<#3dS;+D=`kz76eM8_rfk{=^WEwyeXiyIuwjj=E7$$7n*PVG O2R4ms<1T)IU*acA+PDD# diff --git a/django_web_app/django_web_app/backends.py b/django_web_app/django_web_app/backends.py new file mode 100644 index 00000000..58ce3a9a --- /dev/null +++ b/django_web_app/django_web_app/backends.py @@ -0,0 +1,4 @@ +from axes.backends import AxesBackend + +class AxesBackend(AxesBackend): + pass diff --git a/django_web_app/django_web_app/middlewares.py b/django_web_app/django_web_app/middlewares.py new file mode 100644 index 00000000..ffbebec8 --- /dev/null +++ b/django_web_app/django_web_app/middlewares.py @@ -0,0 +1,34 @@ +import structlog +logger = structlog.get_logger('base') + +class RequestResponseLogMiddleware: + LOGGED_HEADERS = ["CONTENT_LENGTH", "CONTENT_TYPE", "HTTP_HOST", "HTTP_PROXY"] + + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + logger.info('Request started', **self._get_request_data(request)) + + response = self.get_response(request) + + logger.info('Request completed', **self._get_response_data(response, request)) + + return response + + def _get_request_data(self, request): + return { + 'get_params': {field_name: request.GET.getlist(field_name) for field_name in request.GET.keys()}, + 'request_headers': {header_name: request.META[header_name] for header_name in self.LOGGED_HEADERS + if header_name in request.META}, + 'url': request.path_info, + 'method': request.method, + } + + def _get_response_data(self, response, request): + result = { + 'status_code': response.status_code, + 'url': request.path_info, + 'method': request.method, + } + return result diff --git a/django_web_app/django_web_app/settings.py b/django_web_app/django_web_app/settings.py index ba55e0d3..8be4f8a6 100644 --- a/django_web_app/django_web_app/settings.py +++ b/django_web_app/django_web_app/settings.py @@ -11,10 +11,11 @@ """ import os +import structlog +import logging -# Build paths inside the project like this: os.path.join(BASE_DIR, ...) -BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - +PROJECT_DIR = os.path.dirname(os.path.dirname(__file__)) +BASE_DIR = os.path.dirname(PROJECT_DIR) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/ @@ -33,7 +34,8 @@ # Application definition -INSTALLED_APPS = [ +PROJECT_APPS = ( + 'django_web_app', 'blog.apps.BlogConfig', 'users.apps.UsersConfig', 'crispy_forms', @@ -44,9 +46,21 @@ 'django.contrib.messages', 'django.contrib.staticfiles', 'captcha', +) + +THIRD_PARTY_APPS = ( + 'axes', +) + +INSTALLED_APPS = PROJECT_APPS + THIRD_PARTY_APPS + +AUTHENTICATION_BACKENDS = [ + 'django_web_app.backends.AxesBackend', ] MIDDLEWARE = [ + 'django_structlog.middlewares.RequestMiddleware', + 'django_web_app.middlewares.RequestResponseLogMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', @@ -54,8 +68,13 @@ 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'axes.middleware.AxesMiddleware' ] +MIDDLEWARE_CLASSES = ( + MIDDLEWARE +) + ROOT_URLCONF = 'django_web_app.urls' TEMPLATES = [ @@ -74,9 +93,70 @@ }, ] +structlog.configure( + processors=[ + structlog.stdlib.filter_by_level, + structlog.processors.TimeStamper(fmt="iso", utc=True), + structlog.stdlib.add_log_level, + structlog.stdlib.PositionalArgumentsFormatter(), + structlog.processors.StackInfoRenderer(), + structlog.processors.format_exc_info, + structlog.processors.UnicodeDecoder(), + structlog.stdlib.ProcessorFormatter.wrap_for_formatter, + ], + context_class=structlog.threadlocal.wrap_dict(dict), + logger_factory=structlog.stdlib.LoggerFactory(), + wrapper_class=structlog.stdlib.BoundLogger, + cache_logger_on_first_use=True, +) + WSGI_APPLICATION = 'django_web_app.wsgi.application' +LOGLEVEL = "INFO" + +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'formatters': { + "json_renderer": { + "()": structlog.stdlib.ProcessorFormatter, + "processor": structlog.processors.JSONRenderer(sort_keys=True), + }, + "console_renderer": { + "()": structlog.stdlib.ProcessorFormatter, + "processor": structlog.dev.ConsoleRenderer(colors=False), + }, + "key_value_renderer": { + "()": structlog.stdlib.ProcessorFormatter, + "processor": structlog.processors.KeyValueRenderer(key_order=['timestamp', 'level', 'event', 'logger']), + }, + }, + 'filters': { + 'require_debug_false': { + '()': 'django.utils.log.RequireDebugFalse' + } + }, + 'handlers': { + "console": { + "class": "logging.StreamHandler", + "formatter": "json_renderer", + }, + 'gunicorn': { + 'level': 'DEBUG', + 'class': 'logging.StreamHandler', + 'formatter': 'json_renderer', + } + }, + 'loggers': { + 'base': { + 'level': LOGLEVEL, + 'propagate': False, + 'handlers': ['console'], + }, + } +} + # Database # https://docs.djangoproject.com/en/2.1/ref/settings/#databases @@ -134,3 +214,12 @@ LOGIN_REDIRECT_URL = 'blog-home' LOGIN_URL = 'login' + +AXES_COOLOFF_TIME = 1 # h +AXES_WHITELIST_CALLABLE = lambda request, credentials: not credentials.get('username') +AXES_LOCK_OUT_BY_USER_OR_IP = True +AXES_FAILURE_LIMIT = 10 +AXES_ENABLED = 1 +AXES_ONLY_USER_FAILURES = 1 + +SILENCED_SYSTEM_CHECKS = ['captcha.recaptcha_test_key_error'] From ee52cdf0fe8b685b5ef07385cefb3e5f75c78dea Mon Sep 17 00:00:00 2001 From: Adrian Skrobas Date: Sat, 19 Nov 2022 20:58:06 +0100 Subject: [PATCH 15/24] Add custom password validation and cors --- db.sqlite3 | Bin 192512 -> 200704 bytes django_web_app/django_web_app/handlers.py | 8 ++ .../django_web_app/password_validation.py | 96 ++++++++++++++++++ django_web_app/django_web_app/settings.py | 45 ++++---- django_web_app/users/forms.py | 2 +- .../migrations/0002_remove_profile_image.py | 17 ++++ django_web_app/users/models.py | 16 +-- django_web_app/users/views.py | 6 +- 8 files changed, 156 insertions(+), 34 deletions(-) create mode 100644 django_web_app/django_web_app/handlers.py create mode 100644 django_web_app/django_web_app/password_validation.py create mode 100644 django_web_app/users/migrations/0002_remove_profile_image.py diff --git a/db.sqlite3 b/db.sqlite3 index a3672170b8384c39a9f6b84af0d35ac3911bc3ce..bdfaa7fe730da68397c6452c049090fa01b80940 100644 GIT binary patch delta 2847 zcma);OKcn06^3Uxd`OnbYsXIH+KnP0vYo;bIrlLy7OqW6q)0u76h%vd18JTl#i#fZ ztqsj|5g^@IaS#RFG>ak)&?11U0xjB|0dI>IDi8xji=Zw7v|XeRq+PT?dnsClBtwb` z-ZL1^nV%oe`S0P}|E%x+hi4yLIsb%V7)V!uE(cxjYz<@f$HS?;y2 zNGILX@8U4K{kKu}!o$75Fgx&L-pRk@>HC-gS>LaG*!%w3FVBwleZ13tx3AUi_jsB1 zO{V8n??_K?$XnKPrj1sr84U^I5E5w__@OB!wxB5Mg~-fgv0-hl^M$cI*%(TcrOM+rnGj(Fv1S&s#oO6p&8lQIf4P-E zR!%X9uwQ{#K(NibyJ&N#pd}*{6V*($wxk(it*T*Cjfu_LP)OORg!RSrytxspDDydE zN|(!OZq1ko&qi|d%Zm{t@ySM^r35x88)c$+op5HU9&mM; zZ=AwBnjM{qR+6=nai>)_n${w0)U=R2v^-T%mt$nHs5gaWsSznpM5nd7IBrVur8~`1 zpj1Z@wJwC}#nN%+(+M#O3Ia8$3R4L>v9>0Af~3HA$wC!&0Y zjwug#n*ncwe}TV%--BO*pM&@QKf89`$$-{b?p5|+K6tKjbM)jZHl+JPXKEhJaslr3 z!=E|3vRx&vkGpbk(b2>8_wL{9?Qop?w)_4M-1pfJ*@pku)EmTSWK)cJI${cFzY zdV~3VtNjP3=X2(JTkTbclGz@-=8$i|b~5ehzkZ#4D_zs{yme$uA35Q-6IUJT_N7_& z^7e19I>vswbj|U@d#`xBj~H+lobmn4XZtRCAAwK2W$(aF+v#)i5fYyITQYSG@v@CHO_Z=~T9yf)SESDAjA4;i=emlm z@Z@B|T3f5|HnBxXQWTp{xiRXjp4V zmle9jkWBBAG%VW05^TjLNF+oyiA8j*^9n@AAf+G{_7w$5O?4HQLvst8TB&}Q_QTc% z9#T-*k}z+JmM#%m2>O3&8I~>cwx*e~d`J@UL7r|xzl8>05Y_-4P1bfT~J+_9qH`y08S)!ACs(%jIC*Dc^N@uj5Swrn) zzi89vI>|58PuiH-PV$MJ`qr^lO?9$gvK9;3 zb-jDvdENs)Wx&6|m*5NfkoXk*4(x``z2CF*VAylZ>ERgG<8;&LcDiVEIh{1pKqKdL z(CFY;j_K_V)h7)25BMkeEBG_`BOR{kb?e0XEs}r46k7YTo6CDnY H>+Ss?7zgjV delta 694 zcma)(&ubGw6vuaV(@ji5ClX@P);95wq}cq}otfRuL@%)iAte&2Ac{dZyR(|qRBckk zT+-Ep2R)<&S@2YYprDAcpa=hq7JBW~lX~yLt!+ViP#-+r_8nZ!obM> zK0XNKCnklkD9izUwR7j@eYVnSwA+n)%Nh8Vn^-SJ28;QNsbElu`+hI1w%Lk%G<W*?VLZ$PdV9nFzK91@$(|J#Aqe$oN0iV!;<`IkpFTm#lL&x z7oeYmAK(q>AK823y{aHaBDE5C{c2^Q`>?gdG>u>rE2?EuhN;0U#N>JbW5TFnGKA{} zBL<;JLMSWCS(zqet%#H&mU9GCQb1MyfLOkKjhGgaT$_5`b+!zh=$1+~ zWJ(I67CT0iii(!gkg5>ucYh$jE+@h_unV_G_FdS^2sQA(@rC{6zb5-57(XY}PW;o^ Ndni5JNDP03egPTgunPbH diff --git a/django_web_app/django_web_app/handlers.py b/django_web_app/django_web_app/handlers.py new file mode 100644 index 00000000..560b9f96 --- /dev/null +++ b/django_web_app/django_web_app/handlers.py @@ -0,0 +1,8 @@ +from corsheaders.signals import check_request_enabled + + +def cors_allow_api_to_everyone(sender, request, **kwargs): + return request.path.startswith("/api/") + + +check_request_enabled.connect(cors_allow_api_to_everyone) diff --git a/django_web_app/django_web_app/password_validation.py b/django_web_app/django_web_app/password_validation.py new file mode 100644 index 00000000..63a024b3 --- /dev/null +++ b/django_web_app/django_web_app/password_validation.py @@ -0,0 +1,96 @@ +from django.forms import ValidationError +from password_strength import PasswordStats + +class PasswordVerifier: + passwordsettings = { + 'minlength': 14, + 'maxlength': 20, + 'mindigits': 1, + 'maxorderedsequencelen': 3, + 'maxrepeatedpatternlen': 3, + 'mindictwordlen': 3, + 'minentropybits': 1, + 'minlowercaseletters': 1, + 'minuppercaseletters': 1, + 'minspecialcharacters': 1, + 'forceminlength': True, + 'forcemaxlength': True, + 'forcemindigits': True, + 'forcemaxorderedsequencelen': False, + 'forcemaxrepeatedpatternlen': False, + 'forcemindictwordlen': True, + 'forceminentropybits': False, + 'forceminlowercaseletters': True, + 'forceminuppercaseletters': True, + 'forceminspecialcharacters': True + } + + def verify(self, password): + output = {} + stats = PasswordStats(password) + output.update(self.checkrules(stats)) + return output + + def checkrules(self, stats): + output = {} + if self.passwordsettings.get('forceminlength', False) and \ + stats.length < self.passwordsettings['minlength']: + output['tooshort'] = True + if self.passwordsettings.get('forcemaxlength', False) and \ + stats.length > self.passwordsettings['maxlength']: + output['toolong'] = True + if self.passwordsettings.get('forceminentropybits', False) and \ + stats.entropy_bits < self.passwordsettings['minentropybits']: + output['notenoughentropybits'] = True + if self.passwordsettings.get('forcemaxorderedsequencelen', False) and \ + stats.sequences_length > self.passwordsettings['maxorderedsequencelen']: + output['toolongseq'] = True + if self.passwordsettings.get('forcemaxrepeatedpatternlen', False) and \ + stats.repeated_patterns_length > self.passwordsettings['maxrepeatedpatternlen']: + output['repeatedpattern'] = True + if self.passwordsettings.get('forcemindigits', False) and \ + stats.numbers < self.passwordsettings['mindigits']: + output['numbers'] = True + if self.passwordsettings.get('forceminlowercaseletters', False) and \ + stats.letters_lowercase < self.passwordsettings['minlowercaseletters']: + output['lowercase'] = True + if self.passwordsettings.get('forceminuppercaseletters', False) and \ + stats.letters_uppercase < self.passwordsettings['minuppercaseletters']: + output['uppercase'] = True + if self.passwordsettings.get('forceminspecialcharacters', False) and \ + stats.special_characters < self.passwordsettings['minspecialcharacters']: + output['special'] = True + return output + + +class CustomPasswordValidator: + + def validate(self, password, userid=None): + print("CustomPasswordValidator: ", password) + results = PasswordVerifier().verify(password=password) + matchedwords = results.get('matchedwords', '') + + errorsmessages = { + 'numbers': 'Password does not have enough digits', + 'repeatedpattern': 'Password has too long repeated pattern', + 'dictionaryword': 'Password has forbidden words: ' + ', '.join(matchedwords), + 'toolongseq': 'Password has too long sequence', + 'notenoughentropybits': 'Password does not have enough entropy bits', + 'toolong': 'Password is too long', + 'tooshort': 'Password is too short', + 'lowercase': 'Password does not have enough lowercase letters', + 'uppercase': 'Password does not have enough uppercase letters', + 'special': 'Password does not have enough special characters', + } + + errors = set(errorsmessages.keys()).intersection(results) + + printederrors = [errorsmessages[key] for key in errors] + if errors: + raise ValidationError( + printederrors + ) + + def get_help_text(self): + """Required method see link above""" + return "Use strong password" diff --git a/django_web_app/django_web_app/settings.py b/django_web_app/django_web_app/settings.py index 8be4f8a6..d34d3426 100644 --- a/django_web_app/django_web_app/settings.py +++ b/django_web_app/django_web_app/settings.py @@ -12,6 +12,7 @@ import os import structlog +from corsheaders.defaults import default_headers, default_methods import logging PROJECT_DIR = os.path.dirname(os.path.dirname(__file__)) @@ -38,21 +39,26 @@ 'django_web_app', 'blog.apps.BlogConfig', 'users.apps.UsersConfig', +) + +THIRD_PARTY_APPS = ( + 'axes', + 'captcha', + 'corsheaders', 'crispy_forms', + 'password_strength', +) + +DJANGO_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'captcha', -) - -THIRD_PARTY_APPS = ( - 'axes', ) -INSTALLED_APPS = PROJECT_APPS + THIRD_PARTY_APPS +INSTALLED_APPS = PROJECT_APPS + DJANGO_APPS + THIRD_PARTY_APPS AUTHENTICATION_BACKENDS = [ 'django_web_app.backends.AxesBackend', @@ -61,6 +67,7 @@ MIDDLEWARE = [ 'django_structlog.middlewares.RequestMiddleware', 'django_web_app.middlewares.RequestResponseLogMiddleware', + 'corsheaders.middleware.CorsMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', @@ -75,6 +82,14 @@ MIDDLEWARE ) +CORS_ALLOWED_ORIGINS = [ + "http://localhost:8080", + "http://127.0.0.1:8000", +] + +CORS_ALLOW_HEADERS = default_headers +CORS_ALLOW_METHODS = default_methods + ROOT_URLCONF = 'django_web_app.urls' TEMPLATES = [ @@ -171,21 +186,9 @@ # Password validation # https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - +AUTH_PASSWORD_VALIDATORS = ( + {'NAME': 'django_web_app.password_validation.CustomPasswordValidator'}, +) # Internationalization # https://docs.djangoproject.com/en/2.1/topics/i18n/ diff --git a/django_web_app/users/forms.py b/django_web_app/users/forms.py index 24e8461f..d6a94ef7 100644 --- a/django_web_app/users/forms.py +++ b/django_web_app/users/forms.py @@ -23,4 +23,4 @@ class Meta: class ProfileUpdateForm(forms.ModelForm): class Meta: model = Profile - fields = ['image'] + fields = [] diff --git a/django_web_app/users/migrations/0002_remove_profile_image.py b/django_web_app/users/migrations/0002_remove_profile_image.py new file mode 100644 index 00000000..022f29aa --- /dev/null +++ b/django_web_app/users/migrations/0002_remove_profile_image.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2 on 2022-11-19 19:52 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='profile', + name='image', + ), + ] diff --git a/django_web_app/users/models.py b/django_web_app/users/models.py index 2c0e9889..cfdfa6ad 100644 --- a/django_web_app/users/models.py +++ b/django_web_app/users/models.py @@ -5,17 +5,17 @@ class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) - image = models.ImageField(default='default.jpg', upload_to='profile_pics') + # image = models.ImageField(default='default.jpg', upload_to='profile_pics') def __str__(self): return f'{self.user.username} Profile' - def save(self, *args, **kwargs): - super(Profile, self).save(*args, **kwargs) + # def save(self, *args, **kwargs): + # super(Profile, self).save(*args, **kwargs) - img = Image.open(self.image.path) + # img = Image.open(self.image.path) - if img.height > 300 or img.width > 300: - output_size = (300, 300) - img.thumbnail(output_size) - img.save(self.image.path) + # if img.height > 300 or img.width > 300: + # output_size = (300, 300) + # img.thumbnail(output_size) + # img.save(self.image.path) diff --git a/django_web_app/users/views.py b/django_web_app/users/views.py index 3516fd32..7ba42709 100644 --- a/django_web_app/users/views.py +++ b/django_web_app/users/views.py @@ -13,8 +13,7 @@ def register(request): messages.success(request, f'Your account has been created! You are now able to log in') return redirect('login') else: - messages.warning(request, f'Your information or chaptcha is wrong!') - form = UserRegisterForm() + return render(request, 'users/register.html', {'form': form}) else: form = UserRegisterForm() return render(request, 'users/register.html', {'form': form}) @@ -33,8 +32,7 @@ def profile(request): messages.success(request, f'Your account has been updated!') return redirect('profile') else: - messages.warning(request, f'Your information or chaptcha is wrong!') - return redirect('profile') + return render(request, 'users/profile.html', {'form': form}) else: u_form = UserUpdateForm(instance=request.user) From cf980f1c19e17d06ba3d1e8ed265ec222a6df276 Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Tue, 22 Nov 2022 18:23:57 +0100 Subject: [PATCH 16/24] Update settings.py --- django_web_app/django_web_app/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django_web_app/django_web_app/settings.py b/django_web_app/django_web_app/settings.py index d34d3426..03537bb9 100644 --- a/django_web_app/django_web_app/settings.py +++ b/django_web_app/django_web_app/settings.py @@ -25,7 +25,7 @@ SECRET_KEY = '@5&-q%^o=@mb@=@e%b9yz^b#l-2)w&_s0ick#=wy3kw36$z($g' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True +DEBUG = False ALLOWED_HOSTS = ["*"] #wstawić adres zewnętrzny!!!!!!!!!!!!!!!!! From 3f2122cf20f85e33636eb8c8ed62ba23e5ac3770 Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Tue, 29 Nov 2022 19:44:03 +0100 Subject: [PATCH 17/24] Update settings.py --- django_web_app/django_web_app/settings.py | 137 ++++------------------ 1 file changed, 21 insertions(+), 116 deletions(-) diff --git a/django_web_app/django_web_app/settings.py b/django_web_app/django_web_app/settings.py index 03537bb9..55f29c7d 100644 --- a/django_web_app/django_web_app/settings.py +++ b/django_web_app/django_web_app/settings.py @@ -1,22 +1,17 @@ """ Django settings for django_web_app project. - Generated by 'django-admin startproject' using Django 2.1.7. - For more information on this file, see https://docs.djangoproject.com/en/2.1/topics/settings/ - For the full list of settings and their values, see https://docs.djangoproject.com/en/2.1/ref/settings/ """ import os -import structlog -from corsheaders.defaults import default_headers, default_methods -import logging -PROJECT_DIR = os.path.dirname(os.path.dirname(__file__)) -BASE_DIR = os.path.dirname(PROJECT_DIR) +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/ @@ -25,7 +20,7 @@ SECRET_KEY = '@5&-q%^o=@mb@=@e%b9yz^b#l-2)w&_s0ick#=wy3kw36$z($g' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = False +DEBUG = True ALLOWED_HOSTS = ["*"] #wstawić adres zewnętrzny!!!!!!!!!!!!!!!!! @@ -35,39 +30,20 @@ # Application definition -PROJECT_APPS = ( - 'django_web_app', +INSTALLED_APPS = [ 'blog.apps.BlogConfig', 'users.apps.UsersConfig', -) - -THIRD_PARTY_APPS = ( - 'axes', - 'captcha', - 'corsheaders', 'crispy_forms', - 'password_strength', -) - -DJANGO_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', -) - -INSTALLED_APPS = PROJECT_APPS + DJANGO_APPS + THIRD_PARTY_APPS - -AUTHENTICATION_BACKENDS = [ - 'django_web_app.backends.AxesBackend', + 'captcha', ] MIDDLEWARE = [ - 'django_structlog.middlewares.RequestMiddleware', - 'django_web_app.middlewares.RequestResponseLogMiddleware', - 'corsheaders.middleware.CorsMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', @@ -75,21 +51,8 @@ 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'axes.middleware.AxesMiddleware' ] -MIDDLEWARE_CLASSES = ( - MIDDLEWARE -) - -CORS_ALLOWED_ORIGINS = [ - "http://localhost:8080", - "http://127.0.0.1:8000", -] - -CORS_ALLOW_HEADERS = default_headers -CORS_ALLOW_METHODS = default_methods - ROOT_URLCONF = 'django_web_app.urls' TEMPLATES = [ @@ -108,70 +71,9 @@ }, ] -structlog.configure( - processors=[ - structlog.stdlib.filter_by_level, - structlog.processors.TimeStamper(fmt="iso", utc=True), - structlog.stdlib.add_log_level, - structlog.stdlib.PositionalArgumentsFormatter(), - structlog.processors.StackInfoRenderer(), - structlog.processors.format_exc_info, - structlog.processors.UnicodeDecoder(), - structlog.stdlib.ProcessorFormatter.wrap_for_formatter, - ], - context_class=structlog.threadlocal.wrap_dict(dict), - logger_factory=structlog.stdlib.LoggerFactory(), - wrapper_class=structlog.stdlib.BoundLogger, - cache_logger_on_first_use=True, -) - WSGI_APPLICATION = 'django_web_app.wsgi.application' -LOGLEVEL = "INFO" - -LOGGING = { - 'version': 1, - 'disable_existing_loggers': False, - 'formatters': { - "json_renderer": { - "()": structlog.stdlib.ProcessorFormatter, - "processor": structlog.processors.JSONRenderer(sort_keys=True), - }, - "console_renderer": { - "()": structlog.stdlib.ProcessorFormatter, - "processor": structlog.dev.ConsoleRenderer(colors=False), - }, - "key_value_renderer": { - "()": structlog.stdlib.ProcessorFormatter, - "processor": structlog.processors.KeyValueRenderer(key_order=['timestamp', 'level', 'event', 'logger']), - }, - }, - 'filters': { - 'require_debug_false': { - '()': 'django.utils.log.RequireDebugFalse' - } - }, - 'handlers': { - "console": { - "class": "logging.StreamHandler", - "formatter": "json_renderer", - }, - 'gunicorn': { - 'level': 'DEBUG', - 'class': 'logging.StreamHandler', - 'formatter': 'json_renderer', - } - }, - 'loggers': { - 'base': { - 'level': LOGLEVEL, - 'propagate': False, - 'handlers': ['console'], - }, - } -} - # Database # https://docs.djangoproject.com/en/2.1/ref/settings/#databases @@ -186,9 +88,21 @@ # Password validation # https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators -AUTH_PASSWORD_VALIDATORS = ( - {'NAME': 'django_web_app.password_validation.CustomPasswordValidator'}, -) +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + # Internationalization # https://docs.djangoproject.com/en/2.1/topics/i18n/ @@ -217,12 +131,3 @@ LOGIN_REDIRECT_URL = 'blog-home' LOGIN_URL = 'login' - -AXES_COOLOFF_TIME = 1 # h -AXES_WHITELIST_CALLABLE = lambda request, credentials: not credentials.get('username') -AXES_LOCK_OUT_BY_USER_OR_IP = True -AXES_FAILURE_LIMIT = 10 -AXES_ENABLED = 1 -AXES_ONLY_USER_FAILURES = 1 - -SILENCED_SYSTEM_CHECKS = ['captcha.recaptcha_test_key_error'] From ab19830afdbc3da75547c9521cef0aa153a6af4b Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Tue, 29 Nov 2022 19:44:29 +0100 Subject: [PATCH 18/24] Delete middlewares.py --- django_web_app/django_web_app/middlewares.py | 34 -------------------- 1 file changed, 34 deletions(-) delete mode 100644 django_web_app/django_web_app/middlewares.py diff --git a/django_web_app/django_web_app/middlewares.py b/django_web_app/django_web_app/middlewares.py deleted file mode 100644 index ffbebec8..00000000 --- a/django_web_app/django_web_app/middlewares.py +++ /dev/null @@ -1,34 +0,0 @@ -import structlog -logger = structlog.get_logger('base') - -class RequestResponseLogMiddleware: - LOGGED_HEADERS = ["CONTENT_LENGTH", "CONTENT_TYPE", "HTTP_HOST", "HTTP_PROXY"] - - def __init__(self, get_response): - self.get_response = get_response - - def __call__(self, request): - logger.info('Request started', **self._get_request_data(request)) - - response = self.get_response(request) - - logger.info('Request completed', **self._get_response_data(response, request)) - - return response - - def _get_request_data(self, request): - return { - 'get_params': {field_name: request.GET.getlist(field_name) for field_name in request.GET.keys()}, - 'request_headers': {header_name: request.META[header_name] for header_name in self.LOGGED_HEADERS - if header_name in request.META}, - 'url': request.path_info, - 'method': request.method, - } - - def _get_response_data(self, response, request): - result = { - 'status_code': response.status_code, - 'url': request.path_info, - 'method': request.method, - } - return result From 1bbc1250be9e899cb3b6e8b918522ea4aa0d19d3 Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Tue, 29 Nov 2022 19:45:39 +0100 Subject: [PATCH 19/24] Delete password_validation.py --- .../django_web_app/password_validation.py | 96 ------------------- 1 file changed, 96 deletions(-) delete mode 100644 django_web_app/django_web_app/password_validation.py diff --git a/django_web_app/django_web_app/password_validation.py b/django_web_app/django_web_app/password_validation.py deleted file mode 100644 index 63a024b3..00000000 --- a/django_web_app/django_web_app/password_validation.py +++ /dev/null @@ -1,96 +0,0 @@ -from django.forms import ValidationError -from password_strength import PasswordStats - -class PasswordVerifier: - passwordsettings = { - 'minlength': 14, - 'maxlength': 20, - 'mindigits': 1, - 'maxorderedsequencelen': 3, - 'maxrepeatedpatternlen': 3, - 'mindictwordlen': 3, - 'minentropybits': 1, - 'minlowercaseletters': 1, - 'minuppercaseletters': 1, - 'minspecialcharacters': 1, - 'forceminlength': True, - 'forcemaxlength': True, - 'forcemindigits': True, - 'forcemaxorderedsequencelen': False, - 'forcemaxrepeatedpatternlen': False, - 'forcemindictwordlen': True, - 'forceminentropybits': False, - 'forceminlowercaseletters': True, - 'forceminuppercaseletters': True, - 'forceminspecialcharacters': True - } - - def verify(self, password): - output = {} - stats = PasswordStats(password) - output.update(self.checkrules(stats)) - return output - - def checkrules(self, stats): - output = {} - if self.passwordsettings.get('forceminlength', False) and \ - stats.length < self.passwordsettings['minlength']: - output['tooshort'] = True - if self.passwordsettings.get('forcemaxlength', False) and \ - stats.length > self.passwordsettings['maxlength']: - output['toolong'] = True - if self.passwordsettings.get('forceminentropybits', False) and \ - stats.entropy_bits < self.passwordsettings['minentropybits']: - output['notenoughentropybits'] = True - if self.passwordsettings.get('forcemaxorderedsequencelen', False) and \ - stats.sequences_length > self.passwordsettings['maxorderedsequencelen']: - output['toolongseq'] = True - if self.passwordsettings.get('forcemaxrepeatedpatternlen', False) and \ - stats.repeated_patterns_length > self.passwordsettings['maxrepeatedpatternlen']: - output['repeatedpattern'] = True - if self.passwordsettings.get('forcemindigits', False) and \ - stats.numbers < self.passwordsettings['mindigits']: - output['numbers'] = True - if self.passwordsettings.get('forceminlowercaseletters', False) and \ - stats.letters_lowercase < self.passwordsettings['minlowercaseletters']: - output['lowercase'] = True - if self.passwordsettings.get('forceminuppercaseletters', False) and \ - stats.letters_uppercase < self.passwordsettings['minuppercaseletters']: - output['uppercase'] = True - if self.passwordsettings.get('forceminspecialcharacters', False) and \ - stats.special_characters < self.passwordsettings['minspecialcharacters']: - output['special'] = True - return output - - -class CustomPasswordValidator: - - def validate(self, password, userid=None): - print("CustomPasswordValidator: ", password) - results = PasswordVerifier().verify(password=password) - matchedwords = results.get('matchedwords', '') - - errorsmessages = { - 'numbers': 'Password does not have enough digits', - 'repeatedpattern': 'Password has too long repeated pattern', - 'dictionaryword': 'Password has forbidden words: ' + ', '.join(matchedwords), - 'toolongseq': 'Password has too long sequence', - 'notenoughentropybits': 'Password does not have enough entropy bits', - 'toolong': 'Password is too long', - 'tooshort': 'Password is too short', - 'lowercase': 'Password does not have enough lowercase letters', - 'uppercase': 'Password does not have enough uppercase letters', - 'special': 'Password does not have enough special characters', - } - - errors = set(errorsmessages.keys()).intersection(results) - - printederrors = [errorsmessages[key] for key in errors] - if errors: - raise ValidationError( - printederrors - ) - - def get_help_text(self): - """Required method see link above""" - return "Use strong password" From 3c4f809d2361e052c016f5b96b96e79b4f6efacb Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Tue, 29 Nov 2022 19:45:46 +0100 Subject: [PATCH 20/24] Delete handlers.py --- django_web_app/django_web_app/handlers.py | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 django_web_app/django_web_app/handlers.py diff --git a/django_web_app/django_web_app/handlers.py b/django_web_app/django_web_app/handlers.py deleted file mode 100644 index 560b9f96..00000000 --- a/django_web_app/django_web_app/handlers.py +++ /dev/null @@ -1,8 +0,0 @@ -from corsheaders.signals import check_request_enabled - - -def cors_allow_api_to_everyone(sender, request, **kwargs): - return request.path.startswith("/api/") - - -check_request_enabled.connect(cors_allow_api_to_everyone) From 38a94086ffbf6a248d7285ceabad4ad3fda777f3 Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Tue, 29 Nov 2022 19:45:54 +0100 Subject: [PATCH 21/24] Delete backends.py --- django_web_app/django_web_app/backends.py | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 django_web_app/django_web_app/backends.py diff --git a/django_web_app/django_web_app/backends.py b/django_web_app/django_web_app/backends.py deleted file mode 100644 index 58ce3a9a..00000000 --- a/django_web_app/django_web_app/backends.py +++ /dev/null @@ -1,4 +0,0 @@ -from axes.backends import AxesBackend - -class AxesBackend(AxesBackend): - pass From ff61beb7b18504d2ac3122b0e4787907fb019f5f Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Tue, 29 Nov 2022 19:53:05 +0100 Subject: [PATCH 22/24] Update views.py --- django_web_app/users/views.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/django_web_app/users/views.py b/django_web_app/users/views.py index 7ba42709..3516fd32 100644 --- a/django_web_app/users/views.py +++ b/django_web_app/users/views.py @@ -13,7 +13,8 @@ def register(request): messages.success(request, f'Your account has been created! You are now able to log in') return redirect('login') else: - return render(request, 'users/register.html', {'form': form}) + messages.warning(request, f'Your information or chaptcha is wrong!') + form = UserRegisterForm() else: form = UserRegisterForm() return render(request, 'users/register.html', {'form': form}) @@ -32,7 +33,8 @@ def profile(request): messages.success(request, f'Your account has been updated!') return redirect('profile') else: - return render(request, 'users/profile.html', {'form': form}) + messages.warning(request, f'Your information or chaptcha is wrong!') + return redirect('profile') else: u_form = UserUpdateForm(instance=request.user) From 6dfecb6c80302a463f830c0a78134410929c8501 Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Tue, 29 Nov 2022 19:54:02 +0100 Subject: [PATCH 23/24] Update models.py --- django_web_app/users/models.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/django_web_app/users/models.py b/django_web_app/users/models.py index cfdfa6ad..2c0e9889 100644 --- a/django_web_app/users/models.py +++ b/django_web_app/users/models.py @@ -5,17 +5,17 @@ class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) - # image = models.ImageField(default='default.jpg', upload_to='profile_pics') + image = models.ImageField(default='default.jpg', upload_to='profile_pics') def __str__(self): return f'{self.user.username} Profile' - # def save(self, *args, **kwargs): - # super(Profile, self).save(*args, **kwargs) + def save(self, *args, **kwargs): + super(Profile, self).save(*args, **kwargs) - # img = Image.open(self.image.path) + img = Image.open(self.image.path) - # if img.height > 300 or img.width > 300: - # output_size = (300, 300) - # img.thumbnail(output_size) - # img.save(self.image.path) + if img.height > 300 or img.width > 300: + output_size = (300, 300) + img.thumbnail(output_size) + img.save(self.image.path) From 4d5b6a402e38fe23c78f32266dea1d298969f17d Mon Sep 17 00:00:00 2001 From: lyjnamur <92183339+lyjnamur@users.noreply.github.com> Date: Tue, 29 Nov 2022 19:55:00 +0100 Subject: [PATCH 24/24] Update forms.py --- django_web_app/users/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django_web_app/users/forms.py b/django_web_app/users/forms.py index d6a94ef7..24e8461f 100644 --- a/django_web_app/users/forms.py +++ b/django_web_app/users/forms.py @@ -23,4 +23,4 @@ class Meta: class ProfileUpdateForm(forms.ModelForm): class Meta: model = Profile - fields = [] + fields = ['image']