[SOLUCIONADO] Error al confirmar el cambio de email en g3w2 (G2 y G3)

Estimados:

Encontramos un problema en la confirmación del cambio de dirección de email en g3w2 y preinscripción de Guarani 2 y 3.

La operación de configuración envia correctamente un email a la nueva casilla con una url válida para la confirmación. Pero si al utilizar esa url desde el cliente de correo (webmail, móvil o escritorio), el usuario no tiene una sesión abierta vigente, el kernel solicita a un nuevo login, y se pierde la redirección a la acción de confirmación con la url ‘/configuracion/cambiar_mail?t=…’

El usuario puede haber cerrado la sesión voluntariamente, o haber leído el email de confirmación tiempo después del cierre de la sesión. Esto produce confusión porque aun queda pendiente el cambio de email, y el usuario no advierte el problema si no entra nuevamente a la operación de configuración.

Revisando el código fuente, notamos que la función ‘save_referrer()’ en el ‘login_manager’ del kernel tiene el contenido comentado; tal vez durante una prueba en el desarrollo.

Los archivos en las últimas versiones son (línea 140):

  • /3w/trunk/3.11.0/src/siu/lib/kernel/acceso/login_manager.php

  • /3w/trunk/2.9.1/src/siu/lib/kernel/acceso/login_manager.php

    La función también está comentada en las versiones de Chulupí de la preinscripción.

    En el caso de Guaraní 2, el cambio se produjo en la versión 2.8.3 y se propagó hasta la 2.9.1. En el caso de Guaraní 3, desde la versión 3.10.0.

    Para solucionar el problema puntual de la confirmación del cambio de email proponemos descomentar el código de función ‘save_referrer()’, pero modificarla para guardar solamente la redirección pendiente para la operación y acción de confirmación. Por algún motivo el código quedó comentado y no quisieramos dejar abierto un problema de seguridad.

ORIGINAL:


...
	protected function save_referrer()
	{
//		if (isset($_GET['ref'])) {
//			$referer = urldecode($_GET['ref']);
//		} elseif (isset($_SERVER['HTTP_REFERER'])) {
//			$referer = $_SERVER['HTTP_REFERER'];
//		}
//
//		if (isset($referer)) {
//			$url = parse_url($referer);
//			if (strpos($url['path'], '/acceso') === false
//				&& strpos($url['host'], $_SERVER['SERVER_NAME']) !== false
//			) {
//				$_SESSION['referer'] = $referer;
//			}
//		}
	}
...

MODIFICACION: (se cambió ‘/acceso’ por ‘/configuracion/cambiar_mail’)


...
	protected function save_referrer()
	{
		if (isset($_GET['ref'])) {
			$referer = urldecode($_GET['ref']);
		} elseif (isset($_SERVER['HTTP_REFERER'])) {
			$referer = $_SERVER['HTTP_REFERER'];
		}
      
		if (isset($referer)) {
			$url = parse_url($referer);
			if (strpos($url['path'], '/configuracion/cambiar_mail') !== false
				&& strpos($url['host'], $_SERVER['SERVER_NAME']) !== false
			) {
				$_SESSION['referer'] = $referer;
			}
		}
	}
...

Esta corrección fue suficiente para arreglar el problema, pero tuvimos que tocar el kernel. Tal vez, sea conveniente a futuro agregar la configuración de una lista blanca de referer válidos esperados.

Saludos,
Pablo Revel
Universidad Nacional del Sur

¡Gracias Pablo! Vamos a revisar lo que nos comentás.
Te molestamos para pedirte que por favor nos envíes un gds cuando encuentres este tipo de casos.
¡Gracias por la colaboración y saludos!

Hola Pablo, primero que todo gracias por el aporte!!! ya solucionamos dicho problema y va a salir corregido en las versiones 2.9.2 y 3.11.1. Igualmente el arreglo no es tal cual el que propones, con la condición que pusiste en el if solo redirecciona si vas a la operación /configuracion/cambiar_mail, pero también tendría que redireccionar para cualquier otra operación, ej: si estas logueado como alumno en la operación de Inscripción a exámenes y de repente expira la sesión estaría bueno que cuando te vuelvas a loguear te lleve a dicha operación y no a la pantalla de bienvenida.


if (strpos($url['path'], '/configuracion/cambiar_mail') !== false
				&& strpos($url['host'], $_SERVER['SERVER_NAME']) !== false
			) {
				$_SESSION['referer'] = $referer;
			}

si queres crea un GDS y te pasamos el parche con la corrección que desarrollamos.

saludos y gracias.

Hola Leonel!

Efectivamente, condición que propuse solo exceptúa a la operación de cambio de email porque no quería comprometer al resto de las operaciones. Por algún motivo ese segmento de código estaba comentado, y habilitarlo a ciegas implicaría un riesgo.

Gracias y saludos.
Pablo.