Cambio de Contrase;a Implementado

This commit is contained in:
adevopg
2024-11-13 16:14:17 +01:00
parent 4797bbc696
commit e26ed74ac2
5 changed files with 119 additions and 8 deletions
Binary file not shown.
@@ -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();
}
});
});
});
+1 -1
View File
@@ -13,7 +13,7 @@
<div class="centered">
<br>
<br>
<form action="" method="POST" id="uw-change-password-form" accept-charset="utf-8">
<form action="" method="POST" id="nw-change-password-form" accept-charset="utf-8">
<table class="middle-center-table">
<tbody><tr>
<td><input type="password" maxlength="16" name="cur-password" id="cur-password" placeholder="Contraseña actual" autofocus="">
+1
View File
@@ -49,6 +49,7 @@
<script src="{{ URL_PRINCIPAL }}/static/nw-themes/nw-ryu/nw-js-handlers/change_email_response.js"></script>
<script src="{{ URL_PRINCIPAL }}/static/nw-themes/nw-ryu/nw-js-handlers/register.js"></script>
<script src="{{ URL_PRINCIPAL }}/static/nw-themes/nw-ryu/nw-js-handlers/security_token_response.js"></script>
<script src="{{ URL_PRINCIPAL }}/static/nw-themes/nw-ryu/nw-js-handlers/change_password_response.js"></script>
<script>var aowow_tooltips = { "colorlinks": true, "iconizelinks": true, "renamelinks": true }</script>
<script src="{{ URL_PRINCIPAL }}/static/nw-themes/nw-ryu/nw-js/nw-scripts.js"></script>
+74 -7
View File
@@ -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': '<span class="red-form-response">Por favor, complete todos los campos.</span>'})
# Validar que la nueva contraseña coincida con su confirmación
if new_password != conf_new_password:
return JsonResponse({'success': False, 'message': '<span class="red-form-response">Las contraseñas no coinciden.</span>'})
# Validar longitud de la nueva contraseña
if len(new_password) > 16:
return JsonResponse({'success': False, 'message': '<span class="red-form-response">La contraseña nueva no debe exceder los 16 caracteres.</span>'})
# 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': '<span class="red-form-response">No tienes un token de seguridad generado. Por favor, genera uno antes de cambiar tu contraseña.</span>'})
# Verificar si el token proporcionado es correcto
if existing_token.token != security_token:
return JsonResponse({'success': False, 'message': '<span class="red-form-response">El token ingresado es incorrecto.</span>'})
# Verificar la contraseña actual usando la función `authenticate`
if not authenticate(username, current_password):
return JsonResponse({'success': False, 'message': '<span class="red-form-response">La contraseña actual es incorrecta.</span>'})
# 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': '<span class="ok-form-response">Contraseña cambiada exitosamente. Has sido desconectado por seguridad.</span>',
'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: