#!/usr/bin/perl

# --------------------------------------------------------------
# Prontus CMS
# http://www.prontus.cl
# by Altavoz.net
#
# licensed under LGPL license.
# http://www.prontus.cl/license.html
# --------------------------------------------------------------
# -------------------------------COMENTARIO GLOBAL---------------
# ---------------------------------------------------------------
# PROPOSITO.
# -----------
# Manejo cookies
# ---------------------------------------------------------------
# ---------------------------------------------------------------
# DIRECTIVAS DE COMPILACION.
# ---------------------------
package lib_cookies;

use strict;
use utf8;

# Setea una cookie temporal simple para la sesion.
# parámetros:
#   nombre de la cookie
#   valor de la cookie
sub set_simple_cookie {
    my($name, $value) = @_;
    print "Set-Cookie: $name=$value; SameSite=Strict; HttpOnly; path=/;\r\n\r\n";
}

# Setea una cookie temporal para la sesion.
# parámetros:
#   hash con los datos a ingresar en la cookie.
# Soporta especificar Samesite, Max-Age, HttpOnly.
sub set_cookie {
    my %params = %{$_[0]};
    my $samesite = $params{'samesite'};
    $samesite = 'Strict' if $samesite eq '';
    my $httponly = '';
    $httponly = 'HttpOnly' if $params{'httponly'} == 1;

    my $path = $params{'path'} || '/';

    my $close_headers = $params{'close_headers'} || '';
    my $return_string = $params{'return_string'} || '';

    # creamos la string de tiempo de expiración, debe tener el formato:
    # Expires=[Nombre día], [día] [mes] [año] [hora] [minuto] [segundo] GMT;
    # e.g. Expires=Tue, 01 02 2020 15:18:23 GMT;
    my $time_string;
    if (defined $params{'expires_ts'}) {
        $time_string = gmtime($params{'expires_ts'});
        my @parts = split(/\W+/, $time_string);
        $time_string = "Expires=$parts[0], $parts[2] $parts[1] $parts[6] $parts[3]:$parts[4]:$parts[5] GMT;";
    }
    my $cookie_string = "Set-Cookie: $params{'name'}=$params{'value'}; SameSite=$samesite; $httponly; path=$path; $time_string\r\n";
    $cookie_string .= "\r\n" if $close_headers;
    # print STDERR $cookie_string;
    if ($return_string) {
        return $cookie_string;
    } else {
        print $cookie_string;
    }
}

sub expire_cookie {
    my $cookie_name = shift;
    my %cookies = &get_cookies;
    if (defined $cookies{$cookie_name}) {
        # hacemos expirar la cookie de sesión OIDC.
        my $cookie_params = {
            'name'  => $cookie_name,
            'value' => '',
            'httponly' => 1,
            'samesite' => 'Strict',
            'expires_ts' => time - 3600, # seteamos la cookie en el pasado para hacerla expirar.
        };
        &set_cookie($cookie_params);
    }
}

# Get Cookies desde la variable de ambiente ENV.
# Las cookies estan separadas por ";" y un espacio,
# esto las esplitea y retorna un hash de cookies.
sub get_cookies {
    my(@rawCookies) = split (/; /,$ENV{'HTTP_COOKIE'});
    my(%cookies);
    my($key, $val);

    foreach(@rawCookies){
        ($key, $val) = split (/=/,$_);
        $cookies{$key} = $val;
    }

    return %cookies;
}

1;
