From 44dbc39877edf241b3295bea0389c832c42d971a Mon Sep 17 00:00:00 2001 From: Jarmil Date: Fri, 6 Dec 2019 20:35:35 +0100 Subject: [PATCH] FIX: CSRF bug v souhlasu se zprac.os.udaju --- nalodeni/templates/profil.html | 42 +++++++++-------- nalodeni/urls.py | 1 + nalodeni/views.py | 84 ++++++++++++++-------------------- 3 files changed, 59 insertions(+), 68 deletions(-) diff --git a/nalodeni/templates/profil.html b/nalodeni/templates/profil.html index 25fdff7..a72dfc1 100644 --- a/nalodeni/templates/profil.html +++ b/nalodeni/templates/profil.html @@ -53,34 +53,38 @@
Vyberte, za jakým účelem se chcete nalodit k Pirátům.
Chtěl bych:
{{form.kind.errors}}{{form.kind}}
 
-
Přihlášením do Nalodění byl dán souhlas se zpracováním - osobních údajů v rozsahu nezbytném pro poskytování - požadovaných funkcí a služeb. Detaily způsobu zpracování osobních údajů - jsou k dispozici online. -
-
- Datum souhlasu se zpracováním os. údajů:
- {{form.dc_stamp}} - {% if request.user.dc_stamp is not None %} - Odvolat souhlas se zpracováním osobních údajů - {% endif %} - {% if request.user.dc_undo_stamp is not None %} - (souhlas odvolán {{request.user.dc_undo_stamp}}) - {% endif %} -
{%comment%}
{{form.interestedIn.label}}
{{form.interestedIn.errors}}{{form.interestedIn}}
{%endcomment%}
+ +
+ + +

Souhlas se zpracováním osobních údajů

+
+ {%csrf_token%} +
Přihlášením do Nalodění byl dán souhlas se zpracováním + osobních údajů v rozsahu nezbytném pro poskytování + požadovaných funkcí a služeb. Detaily způsobu zpracování osobních údajů + jsou k dispozici online. +
+
 
+
Datum souhlasu se zpracováním os. údajů:
+
+ {{form.dc_stamp}} + {% if request.user.dc_undo_stamp is not None %} + (souhlas odvolán {{request.user.dc_undo_stamp}}) + {% endif %} +
+
{% if request.user.dc_stamp is None %} - - Souhlasím se zpracováním osobních údajů + {% else %} - + {% endif %}
-
diff --git a/nalodeni/urls.py b/nalodeni/urls.py index 68ca470..1c0321f 100644 --- a/nalodeni/urls.py +++ b/nalodeni/urls.py @@ -29,6 +29,7 @@ urlpatterns = [ url(r'^nastaveni-newsletteru/$', views.dotaznik_follow, name="dotaznik_follow"), url(r'^ja-pirat/email-vizitka/$', views.email_vizitka, name="email_vizitka"), + url(r'^ja-pirat/souhlas/$', views.souhlas, name="souhlas"), url(r'^person/(?P[0-9]+)/$', people.person_detail, name="person_detail"), url(r'^person/(?P[0-9]+)/edit$', people.person_edit, name="person_edit"), diff --git a/nalodeni/views.py b/nalodeni/views.py index 29cb2c8..a44605e 100644 --- a/nalodeni/views.py +++ b/nalodeni/views.py @@ -49,7 +49,7 @@ def about(request): if not request.user.is_anonymous: return HttpResponseRedirect('/ja-pirat/') - return render(request, 'about.html', {}) + return render(request, 'about.html') def page_eurovolby_2019(request, reg_ok=False): @@ -332,29 +332,16 @@ def follow_pirates(request): def paluby(request): + return render(request, 'paluby.html') - template = 'paluby.html' - context = { - } - - return render(request, template, context) def posadky(request): + return render(request, 'posadky.html') - template = 'posadky.html' - context = { - } - - return render(request, template, context) @login_required(login_url="/prihlaseni") def ja_pirat(request): - - template = 'ja_pirat.html' - context = { - } - - return render(request, template, context) + return render(request, 'ja_pirat.html') @ensure_csrf_cookie @@ -376,8 +363,6 @@ def prihlaseni(request): Pokud je uživatel již registrován (s nebo bez ověřeného emailu), je mu zaslán přihlašovací odkaz na email. Použitím odkazu bude uživatel přihlášen. - - """ if not request.user.is_anonymous: @@ -456,15 +441,11 @@ def prihlaseni(request): fs_email = '' messages.error(request, "Zadali jste neplatnou emailovou adresu.") - - - template = 'prihlaseni.html' context = { 'AUTH_AVAIL_IDP' : appSettings.AUTH_AVAIL_IDP, 'fs_email' : fs_email, } - - return render(request, template, context) + return render(request, 'prihlaseni.html', context) @login_required(login_url="/prihlaseni") @@ -489,31 +470,9 @@ def profil(request): _form = forms.AppUserSsoForm if request.user.ssoUid else forms.AppUserForm - def save_and_redirect(page): - request.user.save() - return HttpResponseRedirect(page) - # TODO :: check and enforce DB transaction to prevent race-condition attacks if request.method == "GET": - # udeleni souhlasu se zpracovanim osobnich udaju - if request.GET.get('doConsent', None) is not None: - request.user.dc_stamp = datetime.now() - request.user.dc_undo_stamp = None - return save_and_redirect('/ja-pirat/profil/') - - # odvolani souhlasu se zpracovanim osobnich udaju - if request.GET.get('undoConsent', None) is not None: - request.user.dc_stamp = None - request.user.dc_undo_stamp = datetime.now() - messages.info(request, "Odvolal/a jste souhlas se zpracováním osobních údajů.") - send_mail( - "Nalodeni: %s odvolal souhlas se zpracovanim osobnich udaju" % request.user.email, - "Stalo se tak {mydate}".format(mydate=request.user.dc_undo_stamp), - "nalodeni@pirati.cz", [appSettings.EMAIL_RECIPIENT_GDPR], - ) - return save_and_redirect('/ja-pirat/profil/') - emailToken = request.GET.get('t', None) if emailToken: # user token from DB @@ -552,6 +511,8 @@ def profil(request): form = _form(instance=request.user) elif request.method == "POST": + + form = _form(request.POST, instance=request.user) email_contact_orig = request.user.email_contact with request.user.audit_context(request.user) as audit: @@ -593,6 +554,34 @@ def profil(request): return render(request, 'profil.html', context) +@ensure_csrf_cookie +@login_required(login_url="/prihlaseni") +@transaction.atomic +def souhlas(request): + """ Udeleni ci odvolani souhlasu se zpracovanim osobnich udaju """ + + if request.method == "POST": + + if request.POST.get("action", None) == "yes": + messages.info(request, "Souhlasil/a jste se zpracováním osobních údajů. Děkujeme.") + request.user.dc_stamp = datetime.now() + request.user.dc_undo_stamp = None + request.user.save() + + if request.POST.get("action", None) == "no": + request.user.dc_stamp = None + request.user.dc_undo_stamp = datetime.now() + messages.info(request, "Odvolal/a jste souhlas se zpracováním osobních údajů.") + send_mail( + "Nalodeni: %s odvolal souhlas se zpracovanim osobnich udaju" % request.user.email, + "Stalo se tak {mydate}".format(mydate=request.user.dc_undo_stamp), + "nalodeni@pirati.cz", [appSettings.EMAIL_RECIPIENT_GDPR], + ) + request.user.save() + + return HttpResponseRedirect('/ja-pirat/profil/') + + @login_required(login_url="/prihlaseni") @transaction.atomic def dotaznik(request): @@ -607,7 +596,6 @@ def dotaznik(request): # TODO :: check and enforce DB transaction to prevent race-condition attacks if request.method == "GET": - # create edit form form = _form(instance=request.user.userform) elif request.method == "POST": @@ -649,7 +637,6 @@ def dotaznik2(request): # TODO :: check and enforce DB transaction to prevent race-condition attacks if request.method == "GET": - # create edit form form = _form(instance=uf) elif request.method == "POST": @@ -690,7 +677,6 @@ def dotaznik_follow(request): # TODO :: check and enforce DB transaction to prevent race-condition attacks if request.method == "GET": - # create edit form form = _form(instance=uf) elif request.method == "POST":