#!/usr/bin/perl
package prontus_check_friendly;

# ---------------------------------------------------------------
# Prontus CMS
# http://www.prontus.cl
# by Altavoz.net
#
# licensed under LGPL license.
# http://www.prontus.cl/license.html
# ---------------------------------------------------------------

# -------------------------------COMENTARIO GLOBAL---------------
# ---------------------------------------------------------------
# PROPOSITO
# -----------
# Version mod_perl de prontus_check_friendly.cgi
# Chequear la existencia de un friendly URL, verificando que el
# usuario se encuentre logueado.
# status = 0 => error de acceso.
# status = 1 => puede leer el friendly.
#    Responde igual que readFriendly de lib_friendly:
#    res = 0 '' y un mensaje si el friendly no existe.
#    res = 1 el path al archivo real final y un msg si el friendly existe.
#    res = 2 el path al archivo y un msg si el link existe, pero la pagina del archivo no.
#    res = 3 el path al archivo y un msg si el link existe, pero la vista del archivo no.
#    res = 4 el path y un msg si el link existe, pero el archivo de destino no.
#    res = 5 el path y un msg si se trata de un path real.
#
#    Ejemplo:
#    {"res":1,"path":"/test/site/tax/port/all/taxport_2___1.html","status":1,"msg":"Archivo físico base existe, solicitado sin paginación"}
#
# ---------------------------------------------------------------
# LLAMADAS A ARCHIVOS EXTERNOS.
# ------------------------------
# Para ubicar las vistas lee el archivo de cfg del Prontus identificado por $My::prontusId.
#
# ---------------------------------------------------------------
# INVOCACIONES ACEPTADAS.
# ------------------------
# A traves de metodo POST, con parámetros "url" y "_prontus_id".
# Ejemplos:
#    curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "url=/conpag&_prontus_id=test" http://prontus.prontus12.int/cgi-cpn/prontus_check_friendly.cgi
#    (Falla por no tener sesion)
#    curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "url=/conpag&_prontus_id=test" 'http://prontus.prontus12.int/cgi-cpn/prontus_check_friendly.cgi' -H 'Cookie: SESSION_test=9XxLXPjzjbxdm6E8LhbhEV4ybp62jj5d'
#    (OK si la cookie de sesion es valida)
#
# ---------------------------------------------------------------
# PLANTILLAS HTML UTILIZADAS.
# ------------------------
# No registra.
# ---------------------------------------------------------------
#
# Versiones:
# 1.0 2019-07-08 ALD - Primera version.
# -------------------------------BEGIN SCRIPT--------------------
# ---------------------------------------------------------------
# DECLARACIONES GLOBALES.
# ------------------------

use strict;
use utf8;
use warnings;

use JSON;
use URI::Escape;
use lib_friendly;

# Toma variables definidas en apache_startup.pl
my $PRONTUSID = $My::prontusId;
my $F5DIR     = $My::f5dir;
my $ROOTDIR   = $My::documentRoot;

my @VISTAS = ();
my $URL_PREFIX = '';
my $LASTINIT = 0;

# ---------------------------------------------------------------
# Handler.
# -------------

sub handler {
    my $r = shift;
    # my $uri = $r->uri();
    my ($data,$url,$prontusId,$res,$path,$msg,$json,$cookie,$sessionId);
    my %resHash;

    # Inicializa el hash de resultados.
    %resHash = ( );

    # Chequea que el metodo de invocacion sea POST.
    if ($r->method() eq 'POST') {

        # Rescata parametros recibidos.
        $r->read($data,10000);
        ($url,$prontusId) = &getVars($data);

        $PRONTUSID = $prontusId;

        # Inicializa (de nuevo) si han pasado mas de 60 segundos.
        if (time - $LASTINIT > 60) {
            &init();
            $LASTINIT = time;
        }

        # print STDERR "url[$url] prontusId[$prontusId]\n";

        # Valida Prontus ID.
        if (($prontusId ne '') && (-f "$ROOTDIR/$prontusId/cpan/$prontusId\-var.cfg")) {

            # Chequea la sesion del usuario.
            $cookie = $r->headers_in->{Cookie} || '';
            # SESSION_test=9XxLXPjzjbxdm6E8LhbhEV4ybp62jj5d
            if ($cookie =~ /SESSION_$prontusId=(\w+)/) {
                $sessionId = $1;

                # Chequea la existencia del archivo de sesion.
                if (-f "$ROOTDIR/$prontusId/cpan/data/users/sessions/$sessionId") {

                    # Agrega el prefijo si existe.
                    if ($URL_PREFIX ne '') {
                        if ($url !~ /^\/$URL_PREFIX/) {
                            $url = "/$URL_PREFIX$url";
                        } else {
                            $url =~ s/^\/$URL_PREFIX\/?(.*?)$/\/$URL_PREFIX\/$1/sg;
                        }
                    }

                    # Lee la friendly y arma el hash de respuesta.
                    ($res,$path,$msg) = &lib_friendly::readFriendly($url);
                    %resHash = ( status => 1, res => $res, path => $path, msg => $msg , prefix => $URL_PREFIX, url => $url);

                }else{
                    # No hay archivo de sesion.
                    %resHash = ( status => 0, msg => "Sesión inválida (2)" );
                }
            }else{
                # No hay cookie de sesion.
                %resHash = ( status => 0, msg => "Sesión inválida (1)" );
            }

        }else{
            # No hay identificador de Prontus, o no hay archivo de cfg de ese Prontus.
            %resHash = ( status => 0, msg => "El identificador de Prontus es inválido" );
        }

    }

    # Arma el string del json de respuesta.
    $json = &hash2Json(\%resHash);
    # Emite la respuesta, del tipo json.
    $r->content_type('application/json');
    $r->print($json);

    return Apache2::Const::OK;
}

#------------------------------------------------------------------------------#
# Inicializacion del handler.
sub init {
    # Lee las vistas desde la configuracion de Prontus.
    @VISTAS = ();
    my ($line);
    my $cfgFile = "$ROOTDIR/$PRONTUSID/cpan/$PRONTUSID\-var.cfg";

    print STDERR "$PRONTUSID , cfgFile = $cfgFile\n";
    open my $IN, '<', $cfgFile;
    while (<$IN>) {
        $line = $_;

        # print STDERR "$line\n";

        if ($line =~ /FRIENDLY_V5_URL_PREFIX\s*=\s*["'](\w+)["']/) {
            print STDERR "refix!!\n";
            $URL_PREFIX = $1;
        }

        if ($line =~ /MULTIVISTA\s*=\s*['"]*(\w*)['"]*/) {
            push @VISTAS, $1;
            # print STDERR "$line $1\n"; # debug
        }
    }
    close $IN;

    &lib_friendly::init($ROOTDIR,$F5DIR,\@VISTAS);
} # init

#------------------------------------------------------------------------------#
sub getVars {
    my $buffer = $_[0];
    my ($name, $value);
    my ($url,$prontusId) = ('','');

    my(@pairs) = split('&', $buffer);

    foreach my $pair (@pairs) {
        ($name, $value) = split(/=/, $pair);
        $name = lc($name); # Case insensitive.

        $value = uri_unescape($value);

        # Caracteres aceptados.
        # $value =~ s/~!/ ~!/g;
        $value =~ s/[^\w\d\.\/\-]//g;

        if ($name eq 'url') {
            $url = $value;
        }

        if ($name eq '_prontus_id') {
            $prontusId = $value;
        }

    }

    return ($url,$prontusId);

} # getVars

#------------------------------------------------------------------------------#
# Genera un json en base al hash pasado como parametro (se pasa la referencia).
sub hash2Json {
    my $hash = $_[0];
    my $res;

    if ($JSON::VERSION =~ /^1\./) {
        my $json = new JSON;
        $res = $json->objToJson($hash);
    } else {
        $res = &JSON::encode_json($hash);
    }
    return $res;
} # hash2Json

1;
