Add files via upload
This commit is contained in:
parent
a01ee7e513
commit
e0ed6b8216
238
login/includes/form.php
Normal file
238
login/includes/form.php
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class Form {
|
||||||
|
/**
|
||||||
|
* Sufijo para el nombre del parámetro de la sesión del usuario donde se almacena el token CSRF.
|
||||||
|
*/
|
||||||
|
const CSRF_PARAM = 'csrf';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cadena utilizada como valor del atributo "id" de la etiqueta <form> asociada al formulario y como parámetro a comprobar para verificar que el usuario ha enviado el formulario.
|
||||||
|
*/
|
||||||
|
private $formId;
|
||||||
|
|
||||||
|
private $ajax;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* URL asociada al atributo "action" de la etiqueta <form> del fomrulario y que procesará el envío del formulario.
|
||||||
|
*/
|
||||||
|
private $action;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Valor del atributo "class" de la etiqueta <form> asociada al formulario. Si este parámetro incluye la cadena "nocsrf" no se generá el token CSRF para este formulario.
|
||||||
|
*/
|
||||||
|
private $classAtt;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Valor del parámetro enctype del formulario.
|
||||||
|
*/
|
||||||
|
private $enctype;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Se encarga de orquestar todo el proceso de creación y procesamiento de un formulario web.
|
||||||
|
*
|
||||||
|
* @param string $formId Cadena utilizada como valor del atributo "id" de la etiqueta <form> asociada al formulario y como parámetro a comprobar para verificar que el usuario ha enviado el formulario.
|
||||||
|
*
|
||||||
|
* @param string $action (opcional) URL asociada al atributo "action" de la etiqueta <form> del fomrulario y que procesará el envío del formulario. Por defecto la URL es $_SERVER['PHP_SELF']
|
||||||
|
*
|
||||||
|
* @param string $class (opcional) Valor del atributo "class" de la etiqueta <form> asociada al formulario. Si este parámetro incluye la cadena "nocsrf" no se generá el token CSRF para este formulario.
|
||||||
|
*
|
||||||
|
* @param string enctype (opcional) Valor del parámetro enctype del formulario.
|
||||||
|
*/
|
||||||
|
public function __construct($formId, $opciones = array() ) {
|
||||||
|
$this->formId = $formId;
|
||||||
|
|
||||||
|
$opcionesPorDefecto = array( 'ajax' => false, 'action' => null, 'class' => null, 'enctype' => null );
|
||||||
|
$opciones = array_merge($opcionesPorDefecto, $opciones);
|
||||||
|
|
||||||
|
$this->ajax = $opciones['ajax'];
|
||||||
|
$this->action = $opciones['action'];
|
||||||
|
$this->classAtt = $opciones['class'];
|
||||||
|
$this->enctype = $opciones['enctype'];
|
||||||
|
|
||||||
|
if ( !$this->action ) {
|
||||||
|
$this->action = $_SERVER['PHP_SELF'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function gestiona() {
|
||||||
|
|
||||||
|
if ( ! $this->formularioEnviado($_POST) ) {
|
||||||
|
echo $this->generaFormulario();
|
||||||
|
} else {
|
||||||
|
// Valida el token CSRF si es necesario (hay un token en la sesión asociada al formulario)
|
||||||
|
$tokenRecibido = isset($_POST['CSRFToken']) ? $_POST['CSRFToken'] : FALSE;
|
||||||
|
|
||||||
|
if ( ($errores = $this->csrfguard_ValidateToken($this->formId, $tokenRecibido)) !== TRUE ) {
|
||||||
|
if ( ! $this->ajax ) {
|
||||||
|
echo $this->generaFormulario($errores, $_POST);
|
||||||
|
} else {
|
||||||
|
echo $this->generaHtmlErrores($errores);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$result = $this->procesaFormulario($_POST);
|
||||||
|
if ( is_array($result) ) {
|
||||||
|
// Error al procesar el formulario, volvemos a mostrarlo
|
||||||
|
if ( ! $this->ajax ) {
|
||||||
|
echo $this->generaFormulario($result, $_POST);
|
||||||
|
} else {
|
||||||
|
echo $this->generaHtmlErrores($result);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ( ! $this->ajax ) {
|
||||||
|
header('Location: '.$result);
|
||||||
|
} else {
|
||||||
|
echo $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Devuelve un <code>string</code> con el HTML necesario para presentar los campos del formulario. Es necesario asegurarse que como parte del envío se envía un parámetro con nombre <code$formId</code> (i.e. utilizado como valor del atributo name del botón de envío del formulario).
|
||||||
|
*/
|
||||||
|
protected function generaCamposFormulario ($datos) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Procesa los datos del formulario.
|
||||||
|
*/
|
||||||
|
protected function procesaFormulario($datos) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Función que verifica si el usuario ha enviado el formulario. Comprueba si existe el parámetro <code>$formId</code> en <code>$params</code>.
|
||||||
|
*
|
||||||
|
* @param array $params Array que contiene los datos recibidos en el envío formulario.
|
||||||
|
*
|
||||||
|
* @return boolean Devuelve <code>TRUE</code> si <code>$formId</code> existe como clave en <code>$params</code>
|
||||||
|
*/
|
||||||
|
private function formularioEnviado(&$params) {
|
||||||
|
return isset($params['action']) && $params['action'] == $this->formId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Función que genera el HTML necesario para el formulario.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param array $errores (opcional) Array con los mensajes de error de validación y/o procesamiento del formulario.
|
||||||
|
*
|
||||||
|
* @param array $datos (opcional) Array con los valores por defecto de los campos del formulario.
|
||||||
|
*/
|
||||||
|
private function generaFormulario($errores = array(), &$datos = array()) {
|
||||||
|
|
||||||
|
$html= $this->generaListaErrores($errores);
|
||||||
|
|
||||||
|
$html .= '<form method="POST" action="'.$this->action.'" id="'.$this->formId.'"';
|
||||||
|
if ( $this->classAtt ) {
|
||||||
|
$html .= ' class="'.$this->classAtt.'"';
|
||||||
|
}
|
||||||
|
if ( $this->enctype ) {
|
||||||
|
$html .= ' enctype="'.$this->enctype.'"';
|
||||||
|
}
|
||||||
|
$html .=' >';
|
||||||
|
|
||||||
|
// Se genera el token CSRF si el usuario no solicita explícitamente lo contrario.
|
||||||
|
if ( ! $this->classAtt || strpos($this->classAtt, 'nocsrf') === false ) {
|
||||||
|
$tokenValue = $this->csrfguard_GenerateToken($this->formId);
|
||||||
|
$html .= '<input type="hidden" name="CSRFToken" value="'.$tokenValue.'" />';
|
||||||
|
}
|
||||||
|
|
||||||
|
$html .= '<input type="hidden" name="action" value="'.$this->formId.'" />';
|
||||||
|
|
||||||
|
$html .= $this->generaCamposFormulario($datos);
|
||||||
|
$html .= '</form>';
|
||||||
|
return $html;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function generaListaErrores($errores) {
|
||||||
|
$html='';
|
||||||
|
$numErrores = count($errores);
|
||||||
|
if ( $numErrores == 1 ) {
|
||||||
|
$html .= "<ul><li>".$errores[0]."</li></ul>";
|
||||||
|
} else if ( $numErrores > 1 ) {
|
||||||
|
$html .= "<ul><li>";
|
||||||
|
$html .= implode("</li><li>", $errores);
|
||||||
|
$html .= "</li></ul>";
|
||||||
|
}
|
||||||
|
return $html;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function csrfguard_GenerateToken($formId) {
|
||||||
|
if ( ! isset($_SESSION) ) {
|
||||||
|
throw new Exception('La sesión del usuario no está definida.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( function_exists('hash_algos') && in_array('sha512', hash_algos()) ) {
|
||||||
|
$token = hash('sha512', mt_rand(0, mt_getrandmax()));
|
||||||
|
} else {
|
||||||
|
$token=' ';
|
||||||
|
for ($i=0;$i<128;++$i) {
|
||||||
|
$r=mt_rand(0,35);
|
||||||
|
if ($r<26){
|
||||||
|
$c=chr(ord('a')+$r);
|
||||||
|
} else{
|
||||||
|
$c=chr(ord('0')+$r-26);
|
||||||
|
}
|
||||||
|
$token.=$c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$_SESSION[$formId.'_'.self::CSRF_PARAM]=$token;
|
||||||
|
|
||||||
|
return $token;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function csrfguard_ValidateToken($formId, $tokenRecibido) {
|
||||||
|
if ( ! isset($_SESSION) ) {
|
||||||
|
throw new Exception('La sesión del usuario no está definida.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = TRUE;
|
||||||
|
|
||||||
|
if ( isset($_SESSION[$formId.'_'.self::CSRF_PARAM]) ) {
|
||||||
|
if ( $_SESSION[$formId.'_'.self::CSRF_PARAM] !== $tokenRecibido ) {
|
||||||
|
$result = array();
|
||||||
|
$result[] = 'Has enviado el formulario dos veces';
|
||||||
|
}
|
||||||
|
$_SESSION[$formId.'_'.self::CSRF_PARAM] = ' ';
|
||||||
|
unset($_SESSION[$formId.'_'.self::CSRF_PARAM]);
|
||||||
|
} else {
|
||||||
|
$result = array();
|
||||||
|
$result[] = 'Formulario no válido';
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
class Formulario {
|
||||||
|
|
||||||
|
private $formId;
|
||||||
|
private $action;
|
||||||
|
private $classAtt;
|
||||||
|
private $enctype;
|
||||||
|
|
||||||
|
public function __construct($formId, $opciones = array() ) {
|
||||||
|
$this->formId = $formId;
|
||||||
|
$opcionesPorDefecto = array( 'ajax' => false, 'action' => null, 'class' => null,
|
||||||
|
'enctype' => null );
|
||||||
|
$opciones = array_merge($opcionesPorDefecto, $opciones);
|
||||||
|
|
||||||
|
$this->ajax = $opciones['ajax'];
|
||||||
|
$this->action = $opciones['action'];
|
||||||
|
$this->classAtt = $opciones['class'];
|
||||||
|
$this->enctype = $opciones['enctype'];
|
||||||
|
|
||||||
|
if (!$this->action) {
|
||||||
|
$app = Aplicacion::getSingleton();
|
||||||
|
$this->action = htmlspecialchars($_SERVER['REQUEST_URI']);
|
||||||
|
$this->action = $app->resuelve($this->action);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
?>
|
@ -28,7 +28,7 @@ class FormLogin extends Form {
|
|||||||
<p>{$name}, has iniciado sesión correctamente.</p>
|
<p>{$name}, has iniciado sesión correctamente.</p>
|
||||||
<p>Usa los botones para navegar</p>
|
<p>Usa los botones para navegar</p>
|
||||||
<a href='../'><button>Inicio</button></a>
|
<a href='../'><button>Inicio</button></a>
|
||||||
<a href='../panel_{$_SESSION["rol"]}'><button>Mi Panel</button></a>\n";
|
<a href='../../panel_{$_SESSION["rol"]}'><button>Mi Panel</button></a>\n";
|
||||||
}
|
}
|
||||||
else if(!isset($_SESSION["login"])){
|
else if(!isset($_SESSION["login"])){
|
||||||
$this->reply = "<h1>ERROR</h1><hr />".
|
$this->reply = "<h1>ERROR</h1><hr />".
|
||||||
@ -67,28 +67,19 @@ class FormLogin extends Form {
|
|||||||
if ($login) {
|
if ($login) {
|
||||||
$bd = new UserDAO('complucine');
|
$bd = new UserDAO('complucine');
|
||||||
if($bd){
|
if($bd){
|
||||||
$selectUser = $bd->selectUser($username);
|
$this->user = $bd->selectUser($username, $password);
|
||||||
$selectUser->data_seek(0);
|
|
||||||
while ($fila = $selectUser->fetch_assoc()) {
|
|
||||||
if($username === $fila['username'] && $bd->verifyPass($password, $fila['passwd'])){
|
|
||||||
$this->user = $bd->loadUser($fila['id'], $fila['username'], $fila['email'], $fila['passwd'], $fila['rol']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try{
|
try{
|
||||||
if ($this->user) {
|
if ($this->user) {
|
||||||
$_SESSION['user'] = $this->user;
|
//$_SESSION["user"] = $this->user; //¿? No funcionan los getters con el objeto.
|
||||||
$_SESSION["nombre"] = $this->user->getName();
|
$_SESSION["nombre"] = $this->user->getName();
|
||||||
$_SESSION["login"] = $login;
|
|
||||||
$_SESSION["rol"] = $this->user->getRol();
|
$_SESSION["rol"] = $this->user->getRol();
|
||||||
|
$_SESSION["login"] = $login;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception $e){
|
catch (Exception $e){
|
||||||
$_SESSION["login"] = $login;
|
$_SESSION["login"] = $login;
|
||||||
}
|
}
|
||||||
|
|
||||||
mysqli_free_result($selectUser);
|
|
||||||
//$selectUser->free();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -45,13 +45,23 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Returns a query to check if the user name exists.
|
//Returns a query to check if the user name exists.
|
||||||
public function selectUser($username){
|
public function selectUser($username, $password){
|
||||||
$username = $this->mysqli->real_escape_string($username);
|
$username = $this->mysqli->real_escape_string($username);
|
||||||
|
|
||||||
$sql = sprintf( "SELECT * FROM users WHERE username = '%s'", $username );
|
$sql = sprintf( "SELECT * FROM users WHERE username = '%s'", $username );
|
||||||
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
|
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
|
||||||
|
|
||||||
return $resul;
|
$resul->data_seek(0);
|
||||||
|
while ($fila = $resul->fetch_assoc()) {
|
||||||
|
if($username === $fila['username'] && $this->verifyPass($password, $fila['passwd'])){
|
||||||
|
$user = $this->loadUser($fila['id'], $fila['username'], $fila['email'], $fila['passwd'], $fila['rol']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//mysqli_free_result($selectUser);
|
||||||
|
$resul->free();
|
||||||
|
|
||||||
|
return $user;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Returns a query to check if the user pass matches.
|
//Returns a query to check if the user pass matches.
|
||||||
|
@ -1,10 +1,7 @@
|
|||||||
<!DOCTYPE HTML>
|
<!DOCTYPE HTML>
|
||||||
<?php
|
<?php
|
||||||
session_start();
|
//General Config File:
|
||||||
|
require_once('../assets/php/config.php');
|
||||||
//HTML template:
|
|
||||||
require_once('../assets/php/template.php');
|
|
||||||
$template = new Template();
|
|
||||||
|
|
||||||
//Change the view of the "Login page" to "Registration page":
|
//Change the view of the "Login page" to "Registration page":
|
||||||
require('login_register_view.php');
|
require('login_register_view.php');
|
||||||
|
96
login/login_register.php
Normal file
96
login/login_register.php
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
<?php
|
||||||
|
$isLogin = setLogin(true);
|
||||||
|
|
||||||
|
if(array_key_exists('register',$_POST)){
|
||||||
|
$isLogin = setLogin(false);
|
||||||
|
}
|
||||||
|
else if(array_key_exists('login',$_POST)){
|
||||||
|
$isLogin = setLogin(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function setLogin($set){
|
||||||
|
return $set;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$register = '<!-- Register -->
|
||||||
|
<div class="column left">
|
||||||
|
<h2>Registro</h2>
|
||||||
|
<form method="post" action="">
|
||||||
|
<div class="row">
|
||||||
|
<fieldset id="datos_personales">
|
||||||
|
<legend>Datos personales</legend>
|
||||||
|
<div class="_name">
|
||||||
|
<input type="text" name="name" id="name" value="" placeholder="Nombre" required/>
|
||||||
|
</div>
|
||||||
|
<div class="_email">
|
||||||
|
<input type="email" name="email" id="email" value="" placeholder="Email" required/>
|
||||||
|
</div>
|
||||||
|
<div class="_passwd">
|
||||||
|
<input type="password" name="pass" id="pass" value="" placeholder="Contraseña" required/>
|
||||||
|
</div>
|
||||||
|
<div class="_passwd">
|
||||||
|
<input type="password" name="repass" id="repass" value="" placeholder="Repita la contraseña" required/>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
<div class="verify">
|
||||||
|
<input type="checkbox" id="checkbox" name="terms" required>
|
||||||
|
<label for="terms">Marque esta casilla para verificar que ha leído nuestros términos y condiciones del servicio.</label>
|
||||||
|
</div>
|
||||||
|
<div class="actions">
|
||||||
|
<input type="submit" id="submit" value="Registrarse" class="primary" />
|
||||||
|
<input type="reset" id="reset" value="Borrar" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="column right">
|
||||||
|
<div class="code info">
|
||||||
|
<h2>¿Ya estás registrado?</h2>
|
||||||
|
<hr />
|
||||||
|
<p>Si dispones de una cuenta de usuario, no es necesario que rellenes este formulario nuevamente</p>
|
||||||
|
<p>Haz click en el botón para iniciar sesión.</p>
|
||||||
|
<form method="post">
|
||||||
|
<button type="submit" name="login" id="login">Inicia Sesión</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>'."\n";
|
||||||
|
|
||||||
|
$login = '<!-- Login -->
|
||||||
|
<div class="column left">
|
||||||
|
<div class="code info">
|
||||||
|
<h2>¿No tienes una cuenta?</h2>
|
||||||
|
<hr />
|
||||||
|
<p>Para crear una cuenta de usuario es necesario haber rellenado el formulario de registro previamente</p>
|
||||||
|
<p>Haz click en el botón para registrate.</p>
|
||||||
|
<form method="post">
|
||||||
|
<button type="submit" name="register" id="register">Registrate</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="column right">
|
||||||
|
<h2>Iniciar Sesión</h2>
|
||||||
|
<form method="post" action="validate.php">
|
||||||
|
<div class="row">
|
||||||
|
<fieldset id="datos_personales">
|
||||||
|
<legend>Datos personales</legend>
|
||||||
|
<div class="_name">
|
||||||
|
<input type="text" name="name" id="name" value="" placeholder="Nombre" required/>
|
||||||
|
</div>
|
||||||
|
<!--
|
||||||
|
<div class="_email">
|
||||||
|
<input type="email" name="email" id="email" value="" placeholder="Email" required/>
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
<div class="_passwd">
|
||||||
|
<input type="password" name="pass" id="pass" value="" placeholder="Contraseña" required/>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
<div class="actions">
|
||||||
|
<input type="submit" id="submit" value="Iniciar Sesión" class="primary" />
|
||||||
|
<input type="reset" id="reset" value="Borrar" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>'."\n";
|
||||||
|
?>
|
@ -43,7 +43,7 @@
|
|||||||
$this->register = '<!-- Register -->
|
$this->register = '<!-- Register -->
|
||||||
<div class="column left">
|
<div class="column left">
|
||||||
<h2>Registro</h2>
|
<h2>Registro</h2>
|
||||||
<form method="post" action="">
|
<form method="post" action="../register/register.php">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<fieldset id="datos_personales">
|
<fieldset id="datos_personales">
|
||||||
<legend>Datos personales</legend>
|
<legend>Datos personales</legend>
|
||||||
@ -62,7 +62,7 @@
|
|||||||
</fieldset>
|
</fieldset>
|
||||||
<div class="verify">
|
<div class="verify">
|
||||||
<input type="checkbox" id="checkbox" name="terms" required>
|
<input type="checkbox" id="checkbox" name="terms" required>
|
||||||
<label for="terms">Marque esta casilla para verificar que ha leído nuestros términos y condiciones del servicio.</label>
|
<label for="terms"><a href ="../fdicines/terms_conditions/">Marque esta casilla para verificar que ha leído nuestros términos y condiciones del servicio.</a></label>
|
||||||
</div>
|
</div>
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<input type="submit" id="submit" value="Registrarse" class="primary" />
|
<input type="submit" id="submit" value="Registrarse" class="primary" />
|
||||||
|
@ -1,21 +1,25 @@
|
|||||||
<?php
|
<?php
|
||||||
header("refresh:4;url=../");
|
header("refresh:4;url=../");
|
||||||
session_start();
|
|
||||||
|
//General Config File:
|
||||||
|
require_once('../assets/php/config.php');
|
||||||
|
|
||||||
|
//Session:
|
||||||
|
//session_start(); /* Inicializada en config.php */
|
||||||
unset($_SESSION);
|
unset($_SESSION);
|
||||||
session_destroy();
|
session_destroy();
|
||||||
if(!isset($_SESSION["nombre"])){
|
if(!isset($_SESSION["nombre"])){
|
||||||
$reply = "<h1>Se ha cerrado la sesión</h1><hr />".
|
$reply = "<h1>Se ha cerrado la sesión</h1><hr />".
|
||||||
"<p>Serás redirigido al inicio en unos segundos.<br />
|
"<p>Serás redirigido al inicio en unos segundos.<br />
|
||||||
Haz clic <a href='/'>aquí</a> si tu navegador no te redirige automáticamente.</p>\n";
|
Haz clic <a href='{$prefix}'>aquí</a> si tu navegador no te redirige automáticamente.</p>\n";
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
$reply = "<h1>Ha ocurrido un problema y no hemos podido finalizar la sesión</h1>".
|
$reply = "<h1>Ha ocurrido un problema y no hemos podido finalizar la sesión</h1>".
|
||||||
"<p>Serás redirigido al inicio en unos segundos.<br />
|
"<p>Serás redirigido al inicio en unos segundos.<br />
|
||||||
Haz clic <a href='/'>aquí</a> si tu navegador no te redirige automáticamente.</p>\n";
|
Haz clic <a href='{$prefix}'>aquí</a> si tu navegador no te redirige automáticamente.</p>\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
require_once('../assets/php/template.php');
|
|
||||||
$template = new Template();
|
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE HTML>
|
<!DOCTYPE HTML>
|
||||||
<!--
|
<!--
|
||||||
|
Loading…
Reference in New Issue
Block a user