Add files via upload

This commit is contained in:
Fernando Méndez 2021-04-06 21:14:59 +02:00 committed by GitHub
parent 73ac7f9de1
commit bc2f1cb89b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 365 additions and 9 deletions

View File

@ -14,8 +14,8 @@
public function __construct($bd_name){ public function __construct($bd_name){
try{ try{
if (!$this->mysqli) { if (!$this->mysqli) {
$this->mysqli = new mysqli(_SERVERNAME, _USERNAME, $this->mysqli = new mysqli("localhost", "sw",
_PASSWORD, $bd_name); "_admin_", $bd_name);
} }
// echo "Conexión a la BD, satisfactoria."; // echo "Conexión a la BD, satisfactoria.";
} catch (Exception $e){ } catch (Exception $e){

View File

@ -1,4 +1,7 @@
<?php <?php
require_once('dao.php');
include_once('user_dto.php');
class UserDAO extends DAO { class UserDAO extends DAO {
//Constants: //Constants:
@ -10,7 +13,7 @@
//Constructor: //Constructor:
function __construct($bd_name){ function __construct($bd_name){
parent::__construct(); parent::__construct($bd_name);
} }
//Methods: //Methods:
@ -37,14 +40,24 @@
public function selectUser($username){ public function selectUser($username){
$sql = sprintf( "SELECT * FROM users WHERE username = '%s'", $username ); $sql = sprintf( "SELECT * FROM users WHERE username = '%s'", $username );
return $sql; //return $sql;
return $result = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
}
//Returns a query to check if the user pass matches:
public function selectPass($password){
$sql = sprintf( "SELECT * FROM users WHERE passwd = '%s'", $password );
//return $sql;
return $result = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
} }
//Returns a query to get the user's data: //Returns a query to get the user's data:
public function userData($id){ public function userData($id){
$sql = sprintf( "SELECT * FROM users WHERE id = '%d'", $id ); $sql = sprintf( "SELECT * FROM users WHERE id = '%d'", $id );
return $sql; //return $sql;
return $result = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
} }
//Create a new User Data Transfer Object: //Create a new User Data Transfer Object:

View File

@ -30,8 +30,8 @@
public function getEmail(){ return $this->_email; } public function getEmail(){ return $this->_email; }
public function setPass($passwd){ $this->_password = $passwd; } public function setPass($passwd){ $this->_password = $passwd; }
public function getPass(){ return $this->_password; } public function getPass(){ return $this->_password; }
public function setRoles($rol){ $this->_rol = $rol; } public function setRol($rol){ $this->_rol = $rol; }
public function getRoles(){ return $this->_rol; } public function getRol(){ return $this->_rol; }
} }
?> ?>

View File

@ -8,7 +8,7 @@
public function getEmail(); public function getEmail();
public function setPass($passwd); public function setPass($passwd);
public function getPass(); public function getPass();
public function setRoles($rol); public function setRol($rol);
public function getRoles(); public function getRol();
} }
?> ?>

240
login/includes/form.php Normal file
View File

@ -0,0 +1,240 @@
<?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 &lt;form&gt; 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 &lt;form&gt; del fomrulario y que procesará el envío del formulario.
*/
private $action;
/**
* Valor del atributo "class" de la etiqueta &lt;form&gt; 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 &lt;form&gt; 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 &lt;form&gt; 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 &lt;form&gt; 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);
}
}
}
-->

View File

@ -0,0 +1,103 @@
<?php
include_once('../assets/php/user_dao.php');
include_once('form.php');
class FormLogin extends Form {
//Constants:
const HTML5_EMAIL_REGEXP = '^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$';
//Atributes:
private $user; // User who is going to log-in.
private $reply; // Validation response
//Constructor:
public function __construct() {
parent::__construct('formLogin');
$this->reply = array();
}
//Methods:
//Returns validation response:
public function getReply() {
if(isset($_SESSION["login"])){
$this->reply = "<h1>Bienvenido {$_SESSION['nombre']}</h1><hr />
<p>{$_SESSION['nombre']} has iniciado sesión correctamente.</p>
<p>Usa los botones para navegar</p>
<a href='../'><button>Inicio</button></a>
<a href='../../panel_{$_SESSION["rol"]}'><button>Mi Panel</button></a>\n";
}
else if(!isset($_SESSION["login"])){
$this->reply = "<h1>ERROR</h1><hr />".
"<p>El usuario o contraseña no son válidos.</p>
<p>Vuelve a intetarlo o regístrate si no lo habías hecho previamente.</p>
<a href='./'><button>Iniciar Sesión</button></a>
<form method='post' action='./'><button name='register' id='register'>Registro</button></form>\n";
}
return $this->reply;
}
//Process form:
public function processesForm($name, $pass) {
$login = true;
$name = $this->test_input($name);
$pass = $this->test_input($pass);
$username = isset($name) ? $name : null ;
if (!$username || !mb_ereg_match(self::HTML5_EMAIL_REGEXP, $username)) {
$login = false;
}
else{
$login = true;
}
$password = isset($pass) ? $pass : null ;
if (!$password || mb_strlen($password) < 4) {
$login = false;
}
else{
$login = true;
}
if ($login) {
$bd = new UserDAO('complucine');
if($bd){
$selectUser = $bd->selectUser($username);
if($selectUser){
/*
while($row = mysqli_fetch_array($selectUser)){
$id = $row['id'];
$username = $row['username'];
$email = $row['email'];
$password = $row['passwd'];
$rol = $row['rol'];
}
$this->user = $bd->loadUser($id, $username, $email, $password, $rol);
*/
//ARREGLAR LO DE ARRIBA Y BORRAR:
if($username == "admin") $this->user = $bd->loadUser("0", "admin", "admin@complucine.sytes.net", "adminpass", "admin");
else if($username == "manager") $this->user = $bd->loadUser("1", "manager", "manager@complucine.sytes.net", "managerpass", "manager");
else $this->user = $bd->loadUser("2", "user", "user@complucine.sytes.net", "userpass", "user");
}
}
if ($this->user->getName()) {
$_SESSION['user'] = $this->user;
$_SESSION["nombre"] = $this->user->getName();
$_SESSION["login"] = $login;
$_SESSION["rol"] = $this->user->getRol();
}
}
//mysqli_free_result($selectUser);
}
protected function test_input($input){
return htmlspecialchars(trim(strip_tags($input)));
}
}
?>