From 996c93aafbf2c33b01e8b2c48ba7f891b8942d23 Mon Sep 17 00:00:00 2001 From: adevopg <133045315+adevopg@users.noreply.github.com> Date: Tue, 12 Nov 2024 15:30:01 +0100 Subject: [PATCH] Implementado Registro de Cuentas y Activacion de Email --- .../library_correo.cpython-313.pyc | Bin 0 -> 1278 bytes home/__pycache__/models.cpython-313.pyc | Bin 7668 -> 8801 bytes home/__pycache__/urls.cpython-313.pyc | Bin 3731 -> 3855 bytes home/__pycache__/views.cpython-313.pyc | Bin 28676 -> 33770 bytes home/library_correo.py | 35 ++++++ ...emove_recruitreward_claimed_by_and_more.py | 37 ++++++ .../0003_alter_accountactivation_salt.py | 18 +++ ...4_alter_accountactivation_salt_and_more.py | 23 ++++ ...reward_claimed_by_and_more.cpython-313.pyc | Bin 0 -> 1963 bytes ...ter_accountactivation_salt.cpython-313.pyc | Bin 0 -> 845 bytes ...ntactivation_salt_and_more.cpython-313.pyc | Bin 0 -> 933 bytes home/models.py | 20 +++- .../nw-ryu/nw-js-handlers/register.js | 38 ++++++ home/templates/auth/activation_invalid.html | 3 + home/templates/auth/activation_success.html | 3 + home/templates/emails/activation.html | 6 + home/templates/partials/head.html | 1 + home/templates/partials/register.html | 1 - home/urls.py | 1 + home/views.py | 109 +++++++++++++++++- novawow/__pycache__/settings.cpython-313.pyc | Bin 4259 -> 4572 bytes novawow/settings.py | 10 ++ 22 files changed, 301 insertions(+), 4 deletions(-) create mode 100644 home/__pycache__/library_correo.cpython-313.pyc create mode 100644 home/library_correo.py create mode 100644 home/migrations/0002_accountactivation_remove_recruitreward_claimed_by_and_more.py create mode 100644 home/migrations/0003_alter_accountactivation_salt.py create mode 100644 home/migrations/0004_alter_accountactivation_salt_and_more.py create mode 100644 home/migrations/__pycache__/0002_accountactivation_remove_recruitreward_claimed_by_and_more.cpython-313.pyc create mode 100644 home/migrations/__pycache__/0003_alter_accountactivation_salt.cpython-313.pyc create mode 100644 home/migrations/__pycache__/0004_alter_accountactivation_salt_and_more.cpython-313.pyc create mode 100644 home/static/nw-themes/nw-ryu/nw-js-handlers/register.js create mode 100644 home/templates/auth/activation_invalid.html create mode 100644 home/templates/auth/activation_success.html create mode 100644 home/templates/emails/activation.html diff --git a/home/__pycache__/library_correo.cpython-313.pyc b/home/__pycache__/library_correo.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce306bf90e9e517efc067c2d61dd4e2d58885708 GIT binary patch literal 1278 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 delta 2282 zcma)7-D@0G6rY>y_xEN$lHE<*O=>Bd7}NBFwAOwk8zZ%CYP!MDP#h;S<2rP9Cf=E? zHVUZ}q%A@Sm-a~?d=TtIMbH^6-ru=% z?)ja2&e`9_*AK-WM57@AeqRsmsr?gQj&+gGmUr!sbqRe!)teWpzH{VEVtK6)4|2*6 zRG>+PI28mc)TF|k3Ii2sQV~u?fr`0QZ!ivq>Tk@#;yTRmSMA5P(Ta!h}wy8GPuvJSGX$e0oA`}n;P4Kg_ca9X<2j1)14j@+* zw1g2bmD4l>R~;yI!n#ZxpJCSLs7iCNwFp4Tb=S?7d_9X+7Wgl>;-VbifYMJo0m1ypeTb5B9ss|gC4>y0tRXg0K6~Ui>7{#_S}v3e41hd z{-Tec9%9Sh9Mk-_NS<{D_K{(BGH~%IzbPn7wpuf(CbfzHhfY^jvuw34ot{@IWbuOe zEasDnVv%`*1B+XP#kUpageFX?YBl48dXdNL_$#B;%INqD^a$Lsshgq(C(@w0hzXEr zP1;`l2%Pm%#60^lc-&Pw!rDWB`FLK3*`v@eJ$dvPRNtPL3=5KJwZXph-z%+!yGcKb zMk+m9gv45euzI9#l)uhNbmx~8g{qe2c;-!N(-XjLALck(5q7XUky$s&ake{pn+&l( zqnC?VNjHh(wKZFRY$3%8WBcLE1FZH-!o7HEY2oU^oj`7DQMHB)hqn~fEV~~o?%M^V z6Kc#W@Z<`#!}dW>}Y(-4SJg0h=1-oh?ZB_$wZ#auv%ibZ=?S{N{kgy3O$R^ z+7FKs#l@p&I*0JYY~z8=ewf9r2jNu!CsCJVQ8SLRR5w>j<39S-3ImkXt zR$V<3HpLgQjw&G)HkTUB&VYR(Flk)hZ9nPPSqi zwrbcFs!Fy=n|(3~ww57~ZYeQ5^%&9aBw&qni43qC>8Zj0p|*y;5GpL4x#fzjLB-|R zubIEoQ)nGVz@fH^L#xd0XTMLjzS(!3d2*Kh(b>PX%@f;)ej2^LgTQ;`U06AO4W@^v zDNd9x-fTz)B=Mr#=|RrvnsMFpQ}HbLVOUog+-KkGtxwv<4q;gSj8r z&Qyji<$`0$Y9KGrj%tvmYN2x2iB@z;tEd7?0_aA0e$p76}a@E$H_6jxUfFn>-+l4Y}D z*pM@xMkgk}AyG-TRVo@%U8Ps>C@+I+cs}!@YN%9`kH0+1r_v#7LQ{1G5;`w#%&FFd zf(QP$cNu*lU{0($8}F972k#~ae@qTtdg-BucxQ>*t9WLz+`(2#uPu5{nTo2rf0_I* zXav3Bh~p!J@^0fr$o26%N@(R>kM}x(=j*1@(A6XKI&859txo{f+6f`Q3*9Ti-W6fb iiqO0636R2-*O&CG`nmwi^{kh$Z+jQQ4}~Dvi0xneN$dIm diff --git a/home/__pycache__/urls.cpython-313.pyc b/home/__pycache__/urls.cpython-313.pyc index 94e63b6a648bcc8ce7b6ededb118c6fbc7035308..20e4bd8bb95743c25e4d4305da16f433bc795fa4 100644 GIT binary patch delta 782 zcmZwF&ubGw6bJC#W@__uZ8aM=n@y}^el!-dhO{=Z#Wv71iD0P>5yWB$F>NEXfi|rm zV(l%SlDY>M57J|fkzR824-m;atqMi(FBtJI&crrg>A+s*^L_8_TUPTne8O*s!^+X~ zAst&&tOtU`cRq$1D6+z1E;qkoT3%rK|H-9tLkZIozva&@Yz5ZR;mpw|^wl&oTrAZp zyTw}hX0cSN?rhe+_iqX(H!qy))s1pww^Dw-9oekb3ad2tbTJ$}YMbK&BjRa?)4cZ6 zx_UcH$Mf{rerV!2V&ZxJm{X3q%Rjg*a9M)z#er|gT)$M$HwteGhf{#Yi3w}3Y|=WV zUl+JROV^_4Wy6;MU!ps=3@As27?~;6-OZHY^n=siqLndXVPIt-H}i%V1Tolp1Zaxb z7}$HwWIbglDky6E8K5L_VC|31Ei)hP7pfqt?FyhdGJ>_JU7BR|(ili%t(Smi$aMyO21;}1-QK}o>oK4N39##+*0qZR zA*|hZ$h~cEu-ut-#<8~Vka(=UKMCDBCltln7l+jAF~Qi=EE}#cxWa8KplLFR-wHBq z;Sv6Q)jKTX(?!Frf?I8G0GcP$SX&h2412G;=S-MoFvnBrT0DB*@W#O#@6J8|v`msb S#n(2H;W@#-Z{14MpX)EFmhOE3 delta 555 zcmZvZ&rcdb6vqKah5a#A>#pkp#ZeHEv|Cb*P!d~Ak=_j^#wdC)MvoZJ)*C$mc}>dE zBbO!+Fa8H!d8gHbi6;I5(|Gad%wjw-$z0y&`+e{GX6hdxN}qIH@riRZ`sMIC)TEaG zPd8a7N_B4IM>T#}Os!u&lA9s84^H_Lm(Rg$07~kfQW6%wxF0r zE59ojD@f9Oh{2s|4GZ*t1iI7+j4~M4tR-1ce8Zud-6*@pJR0-uEhH;kl|U1q7qVML zH{xK#=^P^|aGk-9Hf>8j_GWa@a5_gwzVmSg4b57Xcv9k6E8*H1v@=%}Nr@X0m|owR zi-bE{z}Z6Y=Pr^8pAr!@+ly$!zBU;SOKs$BMiPx=Tg=GvD1)@#SI&6LFb4a&Wl4Qp z>LZQQzh}*}_BN6nPcUe{su$ovGr}pUTO1HB&EQ_|XaD3yjJ8hQSRP~f-dY*SCU>Os z^8jat!AEL&kFq3jxN+c`DKt|Z1xcPSGpNvh;H+G2Bqtkvg$#Wk$TRpy?X)bc4(R+% SfL|(K_xou4T&WhtH@^VtC!>7; diff --git a/home/__pycache__/views.cpython-313.pyc b/home/__pycache__/views.cpython-313.pyc index 933a8d8d112b7069c4ec536b22f96eb521e92e3f..5e21b44c90f3a06598e1d5b766328563c003fcb3 100644 GIT binary patch delta 9333 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 literal 0 HcmV?d00001 diff --git a/home/migrations/__pycache__/0003_alter_accountactivation_salt.cpython-313.pyc b/home/migrations/__pycache__/0003_alter_accountactivation_salt.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6add1664d75e374d97c8146955f31168eb3c9238 GIT binary patch literal 845 zcmZuw&u`N(6t2BGQ&850eT5kY`M1XhT_4y^|m98zi3{tcL5-HIJLWTsWW(pL%H4IIvF z*gAt3R>ALhfv>z5(_V(Af8CvPkY`*yUR_;Xqb!Q@o{%h(Nxy8E0?+b3*INX=L;@c$ zh-s9vB;zq{A5tb_n&rUN+<&pkDOf6pN2UzcBCroM<)R}G0$Vd90~Jh{c1l~>Pk0)C zMSHsfegcI|6TwAp+%fNR5pxkGyZ|!@enIOf3HK425B{JhJjL%Bt1A@zGB%A|y(-IKha6y|iuSbs>7?M?E!;82i62*$`u z!FM3(bF#yWcQWr1k@wjk9}uG@xg0mqs;*P50*5QKHS(-<55WwgGzJu#+I&JI7kRJn z$hK~}N6$w-@@||}7f-8;=kv?wbMxnog|kNUw9)($oix^d&N!YwvfYOJaTo4PlkEkL z^5VBlbn=zBT?$f)Fezu=Ho1FOBUODgk$DU5X{!GURG9OTjWPb?A{_j3YuNqlpVgO6 L>Px?oCS~+rV7}vm literal 0 HcmV?d00001 diff --git a/home/migrations/__pycache__/0004_alter_accountactivation_salt_and_more.cpython-313.pyc b/home/migrations/__pycache__/0004_alter_accountactivation_salt_and_more.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6af62b7aa7c23ba49a7de4854e3122ce5cb363b GIT binary patch literal 933 zcmah{L2uJA6t81pS$VD!Gf;t#*M+0pYt)QF8)vh2{_i)#oix%HI`V4~}8qLC3k)|e`UK9e&qJ*cy z>?HwUZK16r(lLR$F{>?J)WZnRphHlcCGfKcC020WvF77g>JNh$-P z`p>>FRA9WS4#LtT`j*6uhuL0JmrU72IF*MR`C8bGSR4pz$RLssKBH|}kVWzwLWDzz z)C^)K@e(0#1~gVW$u1DG8$p`I5obJ6;ehoS4;c3&mV$aR;XF{aKUPY#~^G5%#D-27oyvH8&%RT@W?#!n self.created_at + timezone.timedelta(hours=1) + + \ No newline at end of file diff --git a/home/static/nw-themes/nw-ryu/nw-js-handlers/register.js b/home/static/nw-themes/nw-ryu/nw-js-handlers/register.js new file mode 100644 index 0000000..741d09e --- /dev/null +++ b/home/static/nw-themes/nw-ryu/nw-js-handlers/register.js @@ -0,0 +1,38 @@ +$(function() { + // Manejar el envío del formulario de creación de cuenta + $('#uw-create-form').on('submit', function(e) { + e.preventDefault(); + const data = $(this).serialize(); + const createResponse = $("#create-response"); + + $.ajax({ + type: 'POST', + url: '', + data: data, + dataType: 'json', + success: function(response) { + createResponse.hide().empty(); + if (response.success) { + createResponse.html(`${response.message}`).slideDown(); + } else { + createResponse.html(`${response.message}`).slideDown(); + } + }, + error: function() { + createResponse.html('Error en el servidor. Inténtalo de nuevo más tarde.').slideDown(); + } + }); + }); + + // Manejar el estado del botón según el checkbox + $('#accept-terms-cookies').on('change', function() { + $('#create-account-btn').prop('disabled', !this.checked); + }); +}); + +// Función para habilitar/deshabilitar el botón según el estado del checkbox (alternativa sin jQuery) +function click_checkbox() { + const checkbox = document.getElementById('accept-terms-cookies'); + const createButton = document.getElementById('create-account-btn'); + createButton.disabled = !checkbox.checked; +} diff --git a/home/templates/auth/activation_invalid.html b/home/templates/auth/activation_invalid.html new file mode 100644 index 0000000..47bef81 --- /dev/null +++ b/home/templates/auth/activation_invalid.html @@ -0,0 +1,3 @@ +

Enlace inválido

+

El enlace de activación no es válido o ha expirado.

+Regístrate de nuevo diff --git a/home/templates/auth/activation_success.html b/home/templates/auth/activation_success.html new file mode 100644 index 0000000..704440a --- /dev/null +++ b/home/templates/auth/activation_success.html @@ -0,0 +1,3 @@ +

Activación exitosa

+

Tu cuenta ha sido activada correctamente. Ya puedes iniciar sesión.

+Iniciar sesión diff --git a/home/templates/emails/activation.html b/home/templates/emails/activation.html new file mode 100644 index 0000000..3342564 --- /dev/null +++ b/home/templates/emails/activation.html @@ -0,0 +1,6 @@ +

Bienvenido, {{ username }}

+

Gracias por registrarte en {{ NOMBRE_SERVIDOR }}.

+

Para activar tu cuenta, haz clic en el siguiente enlace:

+ACTIVAR LA CUENTA +

Si el botón no funciona, copia y pega el siguiente enlace en tu navegador:

+

{{ activation_link }}

diff --git a/home/templates/partials/head.html b/home/templates/partials/head.html index ed1e2c9..d858c7d 100644 --- a/home/templates/partials/head.html +++ b/home/templates/partials/head.html @@ -47,6 +47,7 @@ + diff --git a/home/templates/partials/register.html b/home/templates/partials/register.html index ac1fdb2..d43c3e6 100644 --- a/home/templates/partials/register.html +++ b/home/templates/partials/register.html @@ -75,7 +75,6 @@ -
diff --git a/home/urls.py b/home/urls.py index be99e0c..3b69ca8 100644 --- a/home/urls.py +++ b/home/urls.py @@ -34,6 +34,7 @@ urlpatterns = [ path('ban-history/', views.ban_history_view, name='ban-history'), path('security-history/', views.security_history_view, name='security_history'), path('trade-points/', views.trade_points_view, name='trade_points'), + path('activate-account', views.activate_account_view, name='activate_account'), ] diff --git a/home/views.py b/home/views.py index 1df80ab..2c9c4cc 100644 --- a/home/views.py +++ b/home/views.py @@ -2,19 +2,23 @@ import socket import hashlib import gmpy2 import binascii +import os +import re from django.shortcuts import render, redirect from django.http import JsonResponse from django.db import connections from django.contrib import messages from django.contrib.auth import logout from django import forms -from .models import Noticia, ClienteCategoria, ServerSelection, RecruitAFriend, DownloadClientPage, ContentCreator, RecruitReward, ClaimedReward +from .models import Noticia, ClienteCategoria, ServerSelection, RecruitAFriend, DownloadClientPage, ContentCreator, RecruitReward, ClaimedReward, AccountActivation from django.views.decorators.csrf import csrf_exempt import logging from datetime import datetime, timedelta from .zone_definitions import get_zone_name from .ac_soap import execute_soap_command from django.utils import timezone +from .library_correo import enviar_correo +from django.utils.crypto import get_random_string # Configuración del logger @@ -265,8 +269,111 @@ def logout_view(request): return redirect('index') # Vistas adicionales +@csrf_exempt def register_view(request): + if request.method == 'POST': + username = request.POST.get('username').strip() + password = request.POST.get('password').strip() + conf_password = request.POST.get('conf-password').strip() + email = request.POST.get('email').strip() + conf_email = request.POST.get('conf-email').strip() + recruiter = request.POST.get('recruiter').strip() + + # Validar entradas + if not username or not password or not email: + return JsonResponse({'success': False, 'message': 'Por favor, complete todos los campos.'}) + + if len(username) > 17 or not username.isalnum(): + return JsonResponse({'success': False, 'message': 'Nombre de usuario no válido.'}) + + if password != conf_password: + return JsonResponse({'success': False, 'message': 'Las contraseñas no coinciden.'}) + + if email != conf_email or not re.match(r'^[a-zA-Z0-9._%+-]+@gmail\.com$', email): + return JsonResponse({'success': False, 'message': 'El correo electrónico no es válido.'}) + + # Verificar si el usuario ya existe + with connections['acore_auth'].cursor() as cursor: + cursor.execute("SELECT COUNT(*) FROM account WHERE username = %s", [username]) + if cursor.fetchone()[0] > 0: + return JsonResponse({'success': False, 'message': 'El nombre de usuario ya está en uso.'}) + + # Validar reclutador + recruiter_id = None + if recruiter: + with connections['acore_auth'].cursor() as cursor: + cursor.execute("SELECT id FROM account WHERE username = %s", [recruiter]) + recruiter_data = cursor.fetchone() + recruiter_id = recruiter_data[0] if recruiter_data else None + + # Generar salt y verifier + salt = binascii.hexlify(os.urandom(32)).decode('utf-8').upper() + verifier = calculate_srp6_verifier(username, password, salt) + + # Convertir `salt` y `verifier` a bytes antes de guardarlos en la base de datos + salt_bytes = binascii.unhexlify(salt) + verifier_bytes = binascii.unhexlify(verifier) + + # Generar un hash único para activación + activation_hash = get_random_string(32) + + # Guardar la información en la tabla `AccountActivation` + AccountActivation.objects.create( + username=username, + email=email, + password=password, + salt=salt_bytes, + verifier=verifier_bytes, + recruiter_id=recruiter_id, + hash=activation_hash + ) + + # Enviar correo de activación + activation_link = f"http://localhost:8009/activate-account?act={activation_hash}" + context = { + 'username': username, + 'activation_link': activation_link, + 'NOMBRE_SERVIDOR': 'Nova WoW' + } + enviar_correo( + subject='Activa tu cuenta en Nova WoW', + to_email=email, + template='emails/activation.html', + context=context + ) + + return JsonResponse({'success': True, 'message': 'Cuenta creada exitosamente. Revisa tu correo para activarla.'}) + return render(request, 'auth/register.html') + + +def activate_account_view(request): + activation_hash = request.GET.get('act') + + try: + activation = AccountActivation.objects.get(hash=activation_hash) + + if activation.is_expired(): + return render(request, 'auth/activation_invalid.html') + + # Insertar la cuenta en `acore_auth` + with connections['acore_auth'].cursor() as cursor: + cursor.execute(""" + INSERT INTO account (username, salt, verifier, email, reg_mail, recruiter, joindate, last_ip) + VALUES (%s, %s, %s, %s, %s, %s, NOW(), %s) + """, [ + activation.username, activation.salt, activation.verifier, + activation.email, activation.email, activation.recruiter_id, + request.META.get('REMOTE_ADDR') + ]) + + # Eliminar el registro de activación + activation.delete() + + return render(request, 'auth/activation_success.html') + + except AccountActivation.DoesNotExist: + return render(request, 'auth/activation_invalid.html') def recover_account_view(request): return render(request, 'auth/recover_account.html') diff --git a/novawow/__pycache__/settings.cpython-313.pyc b/novawow/__pycache__/settings.cpython-313.pyc index 5db2018f6666e189827e05fbc104debda78dd1d5..8246ab738b4f1fb78b33315b4e41f2a43b5b0e44 100644 GIT binary patch delta 723 zcmZuuT~8W86y4cwF+mp)Sj7(%RH}&1;#XU3YX!x$6$Lq%zL=1$P{ab(i`Hacp#Px8 zpU@_z&-{b_0w2ky{S|%lsUx=5CcVi$Gv~~?bMIt62fvRxeyXZn5^=FJSN!BVbNJZR z+4xzVoaiDKRO*I8ZaByTCwbu_ZP!aZ=+-5;w;4R}LPL*Wz1u9x;DaKtkK3Y*deM&o zT_zs}(J$6M_^DsqG$7nV+l&S=OnwAt2tgXg2n8@oLD6kQc(hTB(HIy)8=+Sr3I(Ly zP$qdk#r*ZH>uLWDn!tly8^)(QB}r#cFdjO>Vg|F^CivVf zpT~k2{2}iU>ZAXtkNG`{V3DSlv4khWx`d}~eAdS0DAN_1#&gk(Ln9q46culo5jl$( z%^^IpQSE%M|yjD4W&lA^L{6;bzZK>F{ z?HyK18?q#=n_8(_HMmjE8zp1q_R#d4?jIQe(==;=%8^kHe8`vft&V)*t#ML54tuSR z{esbKC?8o5Jf$XF;a-*?7JcR9@~V3HKe2s3U=Bh6AMG09ZK!G}Jx;1(!hF zf))veh^1kq`J*@b(#(IY+?T>{h7nYx-UI#lbIJ>6=*4Sz3r9g{N-z+HiHJ~iN-iM= zO*C%nF0qLOl8(v|q>zvqMVe#Ca9rHkDRBZhP9o1K6gUlwGuY%TG|q`9k1Z~MP@Gt& z7F$JSW}S_`-uSNNImH&^ANreIL}{j@+}ltThoGS%$EvH>YPRMOmr&<28fc=0Hah5{ zXY0cDFFSB0!nVCG+x|b>9Xr4k47fVR5W8X>VsEAUD?M<@(YS^~IaY_s4IFV(QnjSp z7;y*3+?@|vW52Fms{V)O5uNyV`okLamc!7ae_>c^@LD2~^i6enYtH?2