Chulupi - Vinculador

Les comparto parte de la clase SIU\Chulupi\util\vinculador, le agregué el If que resalté en negrita porque me generaba algunos enlaces http a pesar de estar toda la web usando https:

function crear_sin_chequeo($controlador, $accion = '', $parametros = array(), $opciones = array())    {
    $protocol = u::strleft(strtolower($_SERVER["SERVER_PROTOCOL"]), "/");
    $server_name = kernel::proyecto()->get_server_name();
    $port = ($_SERVER['SERVER_PORT'] == 80) ? '' : ':'.$_SERVER['SERVER_PORT'];
    $alias = kernel::proyecto()->get_alias();

if ($_SERVER[‘HTTPS’]) {
$protocol = ‘https’;
}
$comun = $protocol.“://”.$server_name.$port.$alias;
$vinculo = “$comun/$controlador/$accion”;
if (!empty($parametros)) {
$vinculo .= $this->generate_params($parametros, $opciones);
}
return $vinculo;
}

En específico generaba links http el logger, y quería activarlo un rato en producción para analizar el caso de este otro tema: http://foro.comunidad.siu.edu.ar/index.php?topic=15873.0

¿Alguna idea del motivo por el cual $_SERVER[“SERVER_PROTOCOL”] no funciona como se esperaría?

Hola Diego,

En las ultimas versiones de 3W lo que se esta haciendo es ver en los parámetros ssl del archivo instalacion/config.php:


...
'ssl' => array(
            'alcance' => 'none',//'none' | 'all'
            'redirigir_ssl' => true,//true | false
        ),
...

En base a dichos parámetros se decide si es HTTP o HTTPs.

La solución que propones es valida. Ojo que la variable $_SERVER[‘HTTPS’] puede tener el valor ‘off’, proba mejor así:


if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
            $protocol = 'https';
}

saludos.

OK… La versión en que estoy trabajando en este momento es 3.13.0

La explicación del no funcionamiento como uno esperaría de:
$protocol = u::strleft(strtolower($_SERVER[“SERVER_PROTOCOL”]), “/”);

SERVER_PROTOCOL has nothing to do with the security of your page, it reports if the connections used are HTTP 1.0 or HTTP 1.1; i.e. '[i]HTTP/1.0[/i]'
Finalmente al código lo dejé así: ``` function crear_sin_chequeo($controlador, $accion = '', $parametros = array(), $opciones = array()) { $protocol = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on') ? 'https' : 'http'; $server_name = kernel::proyecto()->get_server_name(); $port = ($_SERVER['SERVER_PORT'] == 80) ? '' : ':'.$_SERVER['SERVER_PORT']; $alias = kernel::proyecto()->get_alias(); $comun = $protocol."://".$server_name.$port.$alias; $vinculo = "$comun/$controlador/$accion"; if (!empty($parametros)) { $vinculo .= $this->generate_params($parametros, $opciones); } return $vinculo; } ```

¿se podrá aplicar el parche a todas las versiones?

Hola Diego,

Se complica hacerlo, ya que el archivo vendor/siu/chulupi-framework/src/SIU/Chulupi/util/vinculador.php se carga vía Composer (pertenece al Framework Chulupí).

Lo que podes hacer es agregar unas lineas de código en la función postUpdate del archivo src/siu/Install.php, que las mismas modifiquen el archivo vinculador.php agregando esto que arreglaste. Dicha función se ejecuta cada vez que corres el comando composer install o composer update, y te va a servir para tener dicho cambio en todas tus instalaciones 3.13.0.

Esto ya esta corregido en la 3.14.0. También se lo vas a tener que cambiar a la función get_vinculo_accion.

saludos.

Recién noté la actualización… en mis fuentes no encuentro el texto get_vinculo_accion en ningún php… ¿Seguro es ese nombre?

Hola Diego,

La función get_vinculo_accion la podes encontrar en el archivo vendor/siu/chulupi-framework/src/SIU/Chulupi/util/vinculador.php, como ves esta dentro de la carpeta vendor (ya que se descarga vía composer). Por eso es necesario hacer esto que te decía en el mensaje anterior, porque si modificas a mano luego vas a perder el cambio, la siguiente vez que hagas composer install te va a pisar los cambios que hagas a mano.

Lo que te propongo hacer forma parte de esto: https://getcomposer.org/doc/articles/scripts.md. Lo vas a tener que meter en la función postUpdate de la clase src/siu/Install.php.

saludos.