From e26ed74ac2ae3f18a660e34c8b9e981091589086 Mon Sep 17 00:00:00 2001 From: adevopg <133045315+adevopg@users.noreply.github.com> Date: Wed, 13 Nov 2024 16:14:17 +0100 Subject: [PATCH] Cambio de Contrase;a Implementado --- home/__pycache__/views.cpython-313.pyc | Bin 46901 -> 50249 bytes .../change_password_response.js | 43 ++++++++++ home/templates/partials/change_password.html | 2 +- home/templates/partials/head.html | 1 + home/views.py | 81 ++++++++++++++++-- 5 files changed, 119 insertions(+), 8 deletions(-) create mode 100644 home/static/nw-themes/nw-ryu/nw-js-handlers/change_password_response.js diff --git a/home/__pycache__/views.cpython-313.pyc b/home/__pycache__/views.cpython-313.pyc index 346eb7bfbc48d49ca03c595e7c161ddd02ba7e56..411d7a1bbe1057de1fab64880ac3b78bc4086063 100644 GIT binary patch delta 3386 zcmZuze^gWV6@M@A5=cUV1PG4=c%mFYAPg;{AX2pa5Gb|89PzL=K9UFI2nl|ZC^Bq7 zJ7MdbKfeAzyQ-b8GJg%1+T(gWn?0UwN9WqaxQ1oa(Ydb2&RLwSuAXh(_dZAz+xN#O z_ulX4-tWEN@4b2N!ad2=p(xdZxHvgQp1Aj(Y4`u?yeh4oL3fDmUDz(C=~i6ckwaU( zZ5_8{NiWe9h3=9y^fE|hfc1D?cRy{xq3$Jg2i9zyNAtL3V-CH+yME&%sniXeO?Z7z zQbsR`)!@Auq#l4R0N(-V^X}`Zr193cSjj~Ozqq^<`>gYEmRM^RX% zO2(tsq`l9^;?+VLj#Ftt#jhLW_(efaOT&cNm|_wY9^lckh&}d6yC=rPy0hLZHmhY0MXi_)Vv>fP zjjGap-{7i#$~7Upc~c@DsMF9|{IMr7+8Do-#-o}<++7fh%Ze14UrTh(>^P=a{9Z*; zQOq}{n=qT(k`~^xISF4bOiF$705r3>xP9SVWlLt5-!vcdp2S3BVz|igZ&Nld>ence zB6=osM>!9Th@@i*s{|SbLQgH!A4nozBe;WbIYj zh0Tw(ITnY#tzec(E!n&*Qo&I@v zLvebzfi-qrMweg5^xt~lhym4X16#H z5-cu9nC`BJtlKlXKcgjaI=)E{zlj1$UEkjGS*c{oE*Y8gl;}AR6}gYD>B&SBK7n z0eV!lhBWPh%Piht8*+4+d2(<9ItRlV^~p#(65m(8M0OxLLMH%Z%7AXAFD7M7n|`owPhU`*?bl|Hr~=xOptjtvEe~ibhLmIac}E)#H3aqfeto{L z;Mst_GN`Zd>uUn~RlXQ@jOC8%59xz!uAj~IEhr7JWkI&m&sKT@?8+h47g8#od#mrm zvW5@Ww2o^sMye($s^WRceTtgfD0x6pi7!ZqC61t!QlxXND>Jq=Y z#1o-5h}7prYNJSP1Ztu_sF`;|Gw;NTlXX9?8$rh#1DZuaO{rf~da)#+SsB!<@@rNF zH1$I<<66T=&*h$gcJ+`Fs>%$qc{kX+k=g)TJfs>=%L=9y-bgDPRR+?^eKDzoqGIuh zGOcHllIY_n61dS0-<*mmMiN&^Ka8SO-(S4>jTv5G0;nXo(Cr&}6Ol=`AeAI>G={t#FA$f+c) zd3AA8y&~#&3VA&%v(OZNd%wmz(0iIzpdBz*0BgN9eWvIX_>z0#{iA^8R|(*E`)|jJ zLpTW9$iSQQFs|EHk<8C_4kM{oJ z@R^vI&*!e=-rY8(?3h<0;_m+Py&Kn(HQ>E=@bQ2fVKjBiZjk+ zO1}Wnjcd-Vi@y%y-vRCdJjA1C*3w_%n6nF{_rdUQyyR?A$s;0$6uhOwCTtSm4TU~| zMe#%aU$CZXbD%EXqnEl1?Mg^^kIC@`&*9{LM#I)2Y|ob>CT465*r6W%OL0$1dW2AM-a3J zg04W&5D0n!K^q|G00fth;Iff;M&iLt9~9W&0ukhkHd6SR3tD+5k%^6RhPF7{~8vIk#Q!tg?X&32WREz?aOCy+rGbF;QHc$vzokHtjlkEuFT7r-cD~ zv5Ur+AyRoVO{&$!YJ3A;Z-kURPpDh z_(S_!%dIEu>QFEl1g@Ry{1SKZnoW^JG7<|1>~_$G{`3;Pl_wp-NP4r(lJu!udcq-E z@en47;%KSo2+v@IRK?LXLUxmE#`iwU7(Jv?bPiA=FxXIlzD$$sBX18L%VcFgsr|U> z^K0@XsaAAlXXF>8j^KaUUU`aCCw6ys$uCLupua0)oF;Xg`<2i2o9#L$zaj4=4s?&n zv!uSlmSY``Z34YL>*XLBgQ~hGBjgatoO;;n5JKUjzP0)Y89zDEfBX;6RgyRPw){A& zm#H`Vox*d4JWIxcQ4>XfvB3hy$h+@UsS~eD{TAuRPIdj%*KT)Wte&J`9lZ;;&zcPMf{LYwS++bLYn>cX3 zSGU_;#!VN_7RK1M@0s@oya^aX@9;AQZw)?X+``J?=k&i=HsaRdtqXWtaF=n9@c>7M ztHs~AD7RGqlZ{#2l&f6#4@t`i*3?GKMl)*0k}%DK_A8j-G4GBzM1#qs846I4Ot{a( zml+!=ZizCS*iwMwxymw~-ezGQSx*sC+HF^Uwy4k7>6>&_OwTXMx+mu^9(ONR<=;<9 z(cUrg<8FS?@ET(cgCCOpAb_)HhYUDgz{vuR5^#!u0|cBM;Mf2s1~@Fh=>QG}a2UWo qD*Jrq&Wk<1O5lY;y@pkzMV?~PN9 diff --git a/home/static/nw-themes/nw-ryu/nw-js-handlers/change_password_response.js b/home/static/nw-themes/nw-ryu/nw-js-handlers/change_password_response.js new file mode 100644 index 0000000..5202b71 --- /dev/null +++ b/home/static/nw-themes/nw-ryu/nw-js-handlers/change_password_response.js @@ -0,0 +1,43 @@ +$(function(){ + $('.change-password-button').on('click', function(e) { + e.preventDefault(); + e.stopPropagation(); + $("#change-password-response").empty(); + + var button = $(this); + var originalText = button.html(); + var data = $("#nw-change-password-form").serialize(); + + changeButton(button, 'Cambiando contraseña'); + + $.ajax({ + type: 'POST', + url: '', + data: data, + dataType: 'json', + success: function(response) { + $("#change-password-response").html(response.message).hide().slideDown(); + + if (response.success) { + button.html("Contraseña cambiada").css("color", "#d79602"); + if (response.redirect) { + setTimeout(function() { + window.location.href = '/es/log-in'; + }, 3000); + } + } else { + setTimeout(function() { + $("#change-password-response").slideUp(function() { + $("#change-password-response").empty(); + restoreButton(button, originalText); + }); + }, 5000); + } + }, + error: function() { + alert("Algo ha salido mal. Por favor, intenta más tarde."); + window.location.reload(); + } + }); + }); +}); diff --git a/home/templates/partials/change_password.html b/home/templates/partials/change_password.html index 0e0a1d3..f11cad0 100644 --- a/home/templates/partials/change_password.html +++ b/home/templates/partials/change_password.html @@ -13,7 +13,7 @@


-
+
diff --git a/home/templates/partials/head.html b/home/templates/partials/head.html index 0f29e79..0ea9692 100644 --- a/home/templates/partials/head.html +++ b/home/templates/partials/head.html @@ -49,6 +49,7 @@ + diff --git a/home/views.py b/home/views.py index 32658a8..1151566 100644 --- a/home/views.py +++ b/home/views.py @@ -600,7 +600,7 @@ def my_account(request): account_data = cursor.fetchone() if not account_data: - return redirect('login') + return redirect('index') account_id = account_data[0] @@ -780,11 +780,78 @@ def get_account_characters(account_id): def change_password_view(request): + # Verificar si el usuario está autenticado mediante la sesión + username = request.session.get('username') + if not username: + return redirect('login') + + # Obtener el usuario desde la base de datos de `acore_auth` + user_data = get_user_from_acore(username) + if not user_data: + return redirect('login') + + user_id = user_data['id'] + email = user_data['email'] + + if request.method == 'POST': + current_password = request.POST.get('cur-password').strip() + new_password = request.POST.get('new-password').strip() + conf_new_password = request.POST.get('conf-new-password').strip() + security_token = request.POST.get('security-token').strip() + + # Validar campos vacíos + if not current_password or not new_password or not conf_new_password or not security_token: + return JsonResponse({'success': False, 'message': 'Por favor, complete todos los campos.'}) + + # Validar que la nueva contraseña coincida con su confirmación + if new_password != conf_new_password: + return JsonResponse({'success': False, 'message': 'Las contraseñas no coinciden.'}) + + # Validar longitud de la nueva contraseña + if len(new_password) > 16: + return JsonResponse({'success': False, 'message': 'La contraseña nueva no debe exceder los 16 caracteres.'}) + + # Verificar si el token de seguridad ha sido generado + existing_token = SecurityToken.objects.filter(user_id=user_id).first() + if not existing_token: + return JsonResponse({'success': False, 'message': 'No tienes un token de seguridad generado. Por favor, genera uno antes de cambiar tu contraseña.'}) + + # Verificar si el token proporcionado es correcto + if existing_token.token != security_token: + return JsonResponse({'success': False, 'message': 'El token ingresado es incorrecto.'}) + + # Verificar la contraseña actual usando la función `authenticate` + if not authenticate(username, current_password): + return JsonResponse({'success': False, 'message': 'La contraseña actual es incorrecta.'}) + + # Generar salt y verifier para la nueva contraseña + new_salt = binascii.hexlify(os.urandom(32)).decode('utf-8').upper() + new_verifier = calculate_srp6_verifier(username, new_password, new_salt) + + # Convertir `salt` y `verifier` a bytes antes de guardarlos en la base de datos + new_salt_bytes = binascii.unhexlify(new_salt) + new_verifier_bytes = binascii.unhexlify(new_verifier) + + # Actualizar la contraseña en la base de datos + with connections['acore_auth'].cursor() as cursor: + cursor.execute(""" + UPDATE account SET salt = %s, verifier = %s WHERE username = %s + """, [new_salt_bytes, new_verifier_bytes, username]) + + # Cerrar la sesión por seguridad + if 'username' in request.session: + del request.session['username'] + + # Redirigir al usuario a la página de inicio de sesión + return JsonResponse({ + 'success': True, + 'message': 'Contraseña cambiada exitosamente. Has sido desconectado por seguridad.', + 'redirect': True + }) + return render(request, 'account/change_password.html') - - def get_user_from_acore(username): """ Obtiene la información del usuario desde la base de datos `acore_auth`. @@ -800,12 +867,12 @@ def security_token_view(request): # Verificar si el usuario está autenticado mediante la sesión username = request.session.get('username') if not username: - return redirect('login') + return redirect('index') # Obtener el usuario desde la base de datos de `acore_auth` user_data = get_user_from_acore(username) if not user_data: - return redirect('login') + return redirect('index') user_id = user_data['id'] email = user_data['email'] @@ -946,7 +1013,7 @@ def help_view(request): # Verificar si el usuario está logueado if 'username' not in request.session: # Si no está logueado, redirigir al inicio de sesión - return redirect('login') + return redirect('index') # Si está logueado, renderizar la página de ayuda return render(request, 'community/help.html') @@ -1045,7 +1112,7 @@ def get_achievement_name(achievement_id): def novawow_players_view(request): # Verificar si el usuario está logueado if 'username' not in request.session: - return redirect('/login') + return redirect('index') # Obtener las 5 hermandades con más miembros with connections['acore_characters'].cursor() as cursor: