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