From e0ed6b8216a0acbec74048f629bf06f1d6d000de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20M=C3=A9ndez?= <45081533+FerMdez@users.noreply.github.com> Date: Fri, 16 Apr 2021 12:55:48 +0200 Subject: [PATCH] Add files via upload --- login/includes/form.php | 238 ++++++++++++++++++++++++++++++++++ login/includes/formLogin.php | 19 +-- login/includes/user_dao.php | 14 +- login/includes/user_dto.php | 2 +- login/index.php | 7 +- login/login_register.php | 96 ++++++++++++++ login/login_register_view.php | 4 +- logout/index.php | 14 +- 8 files changed, 365 insertions(+), 29 deletions(-) create mode 100644 login/includes/form.php create mode 100644 login/login_register.php diff --git a/login/includes/form.php b/login/includes/form.php new file mode 100644 index 0000000..28e615f --- /dev/null +++ b/login/includes/form.php @@ -0,0 +1,238 @@ +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 string 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 (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 $formId en $params. + * + * @param array $params Array que contiene los datos recibidos en el envío formulario. + * + * @return boolean Devuelve TRUE si $formId existe como clave en $params + */ + 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 .= '
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 .= ''; + } + + $html .= ''; + + $html .= $this->generaCamposFormulario($datos); + $html .= '
'; + return $html; + } + + private function generaListaErrores($errores) { + $html=''; + $numErrores = count($errores); + if ( $numErrores == 1 ) { + $html .= ""; + } else if ( $numErrores > 1 ) { + $html .= ""; + } + 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); + } + } +} +*/ +?> \ No newline at end of file diff --git a/login/includes/formLogin.php b/login/includes/formLogin.php index f11b727..01be373 100644 --- a/login/includes/formLogin.php +++ b/login/includes/formLogin.php @@ -28,7 +28,7 @@ class FormLogin extends Form {

{$name}, has iniciado sesión correctamente.

Usa los botones para navegar

- \n"; + \n"; } else if(!isset($_SESSION["login"])){ $this->reply = "

ERROR


". @@ -67,28 +67,19 @@ class FormLogin extends Form { if ($login) { $bd = new UserDAO('complucine'); if($bd){ - $selectUser = $bd->selectUser($username); - $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']); - } - } - + $this->user = $bd->selectUser($username, $password); + try{ if ($this->user) { - $_SESSION['user'] = $this->user; + //$_SESSION["user"] = $this->user; //¿? No funcionan los getters con el objeto. $_SESSION["nombre"] = $this->user->getName(); - $_SESSION["login"] = $login; $_SESSION["rol"] = $this->user->getRol(); + $_SESSION["login"] = $login; } } catch (Exception $e){ $_SESSION["login"] = $login; } - - mysqli_free_result($selectUser); - //$selectUser->free(); } } diff --git a/login/includes/user_dao.php b/login/includes/user_dao.php index 62ddc36..e4e1b1e 100644 --- a/login/includes/user_dao.php +++ b/login/includes/user_dao.php @@ -45,13 +45,23 @@ } //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); $sql = sprintf( "SELECT * FROM users WHERE username = '%s'", $username ); $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. diff --git a/login/includes/user_dto.php b/login/includes/user_dto.php index 18e7a4e..342eac7 100644 --- a/login/includes/user_dto.php +++ b/login/includes/user_dto.php @@ -18,7 +18,7 @@ $this->_password = $password; $this->_rol = $rol; } - + //Methods: //Getters && Setters: diff --git a/login/index.php b/login/index.php index eb1c5ee..444ffbc 100644 --- a/login/index.php +++ b/login/index.php @@ -1,10 +1,7 @@ +
+

Registro

+
+
+
+ Datos personales +
+ +
+
+ +
+
+ +
+
+ +
+
+
+ + +
+
+ + +
+
+
+
+
+
+

¿Ya estás registrado?

+
+

Si dispones de una cuenta de usuario, no es necesario que rellenes este formulario nuevamente

+

Haz click en el botón para iniciar sesión.

+
+ +
+
+
'."\n"; + + $login = ' +
+
+

¿No tienes una cuenta?

+
+

Para crear una cuenta de usuario es necesario haber rellenado el formulario de registro previamente

+

Haz click en el botón para registrate.

+
+ +
+
+
+
+

Iniciar Sesión

+
+
+
+ Datos personales +
+ +
+ +
+ +
+
+
+ + +
+
+
+
'."\n"; +?> \ No newline at end of file diff --git a/login/login_register_view.php b/login/login_register_view.php index 054299a..3cd02b5 100644 --- a/login/login_register_view.php +++ b/login/login_register_view.php @@ -43,7 +43,7 @@ $this->register = '

Registro

-
+
Datos personales @@ -62,7 +62,7 @@
- +
diff --git a/logout/index.php b/logout/index.php index 413d761..4ac706a 100644 --- a/logout/index.php +++ b/logout/index.php @@ -1,21 +1,25 @@ Se ha cerrado la sesión
". "

Serás redirigido al inicio en unos segundos.
- Haz clic aquí si tu navegador no te redirige automáticamente.

\n"; + Haz clic aquí si tu navegador no te redirige automáticamente.

\n"; } else{ $reply = "

Ha ocurrido un problema y no hemos podido finalizar la sesión

". "

Serás redirigido al inicio en unos segundos.
- Haz clic aquí si tu navegador no te redirige automáticamente.

\n"; + Haz clic aquí si tu navegador no te redirige automáticamente.

\n"; } - require_once('../assets/php/template.php'); - $template = new Template(); + ?>