diff --git a/assets/php/common/user.php b/assets/php/common/user.php new file mode 100644 index 0000000..1fc9927 --- /dev/null +++ b/assets/php/common/user.php @@ -0,0 +1,36 @@ + Será eliminado en la siguiente práctica para usar el modelo relacional de nuestra BD. + + //Constructor: + function __construct($id, $username, $email, $password, $rol){ + $this->_id = $id; + $this->_username = $username; + $this->_email = $email; + $this->_password = $password; + $this->_rol = $rol; + } + + //Methods: + + //Getters && Setters: + public function setId($id){ $this->_id = $id; } + public function getId(){ return $this->_id; } + public function setName($username){ $this->_username = $username; } + public function getName(){ return $this->_username; } + public function setEmail($email){ $this->_email = $email; } + public function getEmail(){ return $this->_email; } + public function setPass($passwd){ $this->_password = $passwd; } + public function getPass(){ return $this->_password; } + public function setRol($rol){ $this->_rol = $rol; } + public function getRol(){ return $this->_rol; } + + } +?> \ No newline at end of file diff --git a/assets/php/common/user_dao.php b/assets/php/common/user_dao.php index 23a8fce..f4acf1a 100644 --- a/assets/php/common/user_dao.php +++ b/assets/php/common/user_dao.php @@ -1,6 +1,6 @@ mysqli->real_escape_string($id); + $username = $this->mysqli->real_escape_string($username); + + $sql = sprintf( "UPDATE users SET username = '%s' WHERE id = '%d'", $username, $id ); + $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database'); + + return $resul; + + } + //Create a new User Data Transfer Object. public function loadUser($id, $username, $email, $password, $rol){ - return new UserDTO($id, $username, $email, $password, $rol); + return new User($id, $username, $email, $password, $rol); } } diff --git a/assets/php/config.php b/assets/php/config.php index 2d8ef8e..66f1854 100644 --- a/assets/php/config.php +++ b/assets/php/config.php @@ -44,4 +44,6 @@ * @see http://php.net/manual/en/language.types.callable.php */ register_shutdown_function(array($app, 'shutdown')); + + ?> diff --git a/assets/php/form.php b/assets/php/form.php index 28e615f..fa09d49 100644 --- a/assets/php/form.php +++ b/assets/php/form.php @@ -1,238 +1,216 @@ 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 { + * Clase base para la gestión de formularios. + * + * Además de la gestión básica de los formularios. + */ +abstract class Form { + /** + * @var string 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 $action; - private $classAtt; - private $enctype; - public function __construct($formId, $opciones = array() ) { + /** + * @var string URL asociada al atributo "action" de la etiqueta <form> del fomrulario y que procesará el + * envío del formulario. + */ + private $action; + + /** + * Crea un nuevo formulario. + * + * Posibles opciones: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
OpciónValor por defectoDescripción
action$_SERVER['PHP_SELF']URL asociada al atributo "action" de la etiqueta <form> del fomrulario y que procesará el envío del formulario.
+ + * @param string $formId Identificador utilizado en el 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 array $opciones (ver más arriba). + */ + public function __construct($formId, $opciones = array() ) + { $this->formId = $formId; - $opcionesPorDefecto = array( 'ajax' => false, 'action' => null, 'class' => null, - 'enctype' => null ); + + $opcionesPorDefecto = array( 'action' => 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); + if ( !$this->action ) { + $this->action = htmlentities($_SERVER['PHP_SELF']); } } + + /** + * Se encarga de orquestar todo el proceso de gestión de un formulario. + * + * El proceso es el siguiente: + * + */ + public function gestiona() + { + if ( ! $this->formularioEnviado($_POST) ) { + return $this->generaFormulario(); + } else { + $result = $this->procesaFormulario($_POST); + if ( is_array($result) ) { + return $this->generaFormulario($_POST, $result); + } else { + header('Location: '.$result); + exit(); + } + } + } + + /** + * Genera el HTML necesario para presentar los campos del formulario. + * + * Si el formulario ya ha sido enviado y hay errores en {@see Form::procesaFormulario()} se llama a este método + * nuevamente con los datos que ha introducido el usuario en $datosIniciales y los errores al procesar + * el formulario en $errores + * + * @param string[] $datosIniciales Datos iniciales para los campos del formulario (normalmente $_POST). + * + * @param string[] $errores (opcional)Lista / Tabla asociativa de errores asociados al formulario. + * + * @return string HTML asociado a los campos del formulario. + */ + protected function generaCamposFormulario($datosIniciales, $errores = array()) + { + return ''; + } + + /** + * Procesa los datos del formulario. + * + * @param string[] $datos Datos enviado por el usuario (normalmente $_POST). + * + * @return string|string[] Devuelve el resultado del procesamiento del formulario, normalmente una URL a la que + * se desea que se redirija al usuario, o un array con los errores que ha habido durante el procesamiento del formulario. + */ + protected function procesaFormulario($datos) + { + return array(); + } + + /** + * Función que verifica si el usuario ha enviado el formulario. + * + * Comprueba si existe el parámetro $formId en $params. + * + * @param string[] $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 string[] $datos (opcional) Array con los valores por defecto de los campos del formulario. + * + * @param string[] $errores (opcional) Array con los mensajes de error de validación y/o procesamiento del formulario. + * + * @return string HTML asociado al formulario. + */ + private function generaFormulario(&$datos = array(), &$errores = array()) + { + $htmlCamposFormularios = $this->generaCamposFormulario($datos, $errores); + + /* <<< Permite definir cadena en múltiples líneas. + * Revisa https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc + */ + $htmlForm = '
+ + '.$htmlCamposFormularios.' +
'; + return $htmlForm; + } + + /** + * Genera la lista de mensajes de errores globales (no asociada a un campo) a incluir en el formulario. + * + * @param string[] $errores (opcional) Array con los mensajes de error de validación y/o procesamiento del formulario. + * + * @param string $classAtt (opcional) Valor del atributo class de la lista de errores. + * + * @return string El HTML asociado a los mensajes de error. + */ + protected static function generaListaErroresGlobales($errores = array(), $classAtt='') + { + $html=''; + $clavesErroresGenerales = array_filter(array_keys($errores), function ($elem) { + return is_numeric($elem); + }); + + $numErrores = count($clavesErroresGenerales); + if ($numErrores > 0) { + $html = "'; + } + return $html; + } + + /** + * Crea una etiqueta para mostrar un mensaje de error. Sólo creará el mensaje de error + * si existe una clave $idError dentro del array $errores. + * + * @param string[] $errores (opcional) Array con los mensajes de error de validación y/o procesamiento del formulario. + * @param string $idError (opcional) Clave dentro de $errores del error a mostrar. + * @param string $htmlElement (opcional) Etiqueta HTML a crear para mostrar el error. + * @param array $atts (opcional) Tabla asociativa con los atributos a añadir a la etiqueta que mostrará el error. + */ + protected static function createMensajeError($errores=array(), $idError='', $htmlElement='span', $atts = array()) + { + $html = ''; + if (isset($errores[$idError])) { + $att = ''; + foreach($atts as $key => $value) { + $att .= "$key=$value"; + } + $html = " <$htmlElement $att>{$errores[$idError]}"; + } + + return $html; + } } -*/ -?> \ No newline at end of file diff --git a/panel_user/includes/formChangeName.php b/panel_user/includes/formChangeName.php index 15c5adc..e2b27dc 100644 --- a/panel_user/includes/formChangeName.php +++ b/panel_user/includes/formChangeName.php @@ -1,3 +1,83 @@ \ No newline at end of file +class FormChangeName extends Form { + + public function __construct() { + $options = array("action" => "./?option=manage_profile"); + parent::__construct('formChangeUserName', $options); + } + + protected function generaCamposFormulario($datos, $errores = array()){ + $nombre = $datos['nombreUsuario'] ?? ''; + + // Se generan los mensajes de error si existen. + $htmlErroresGlobales = self::generaListaErroresGlobales($errores); + $errorNombre = self::createMensajeError($errores, 'nombre', 'span', array('class' => 'error')); + $errorPassword = self::createMensajeError($errores, 'pass', 'span', array('class' => 'error')); + $errorPassword2 = self::createMensajeError($errores, 'repass', 'span', array('class' => 'error')); + + $html = '
'.$htmlErroresGlobales.' +
+ Nuevo Nombre de usuario +
+ +
+
+ +
+
+ +
+
+
+ + +
+
'; + return $html; + } + + + protected function procesaFormulario($datos){ + $result = array(); + + $nombre = $datos['new_name'] ?? null; + if ( empty($nombre) || mb_strlen($nombre) < 5 ) { + $result['new_name'] = "El nombre tiene que tener una longitud de al menos 5 caracteres."; + } + + $password = $datos['pass'] ?? null; + if ( empty($password) || mb_strlen($password) < 5 ) { + $result['pass'] = "El password tiene que tener una longitud de al menos 5 caracteres."; + } + $password2 = $datos['repass'] ?? null; + if ( empty($password2) || strcmp($password, $password2) !== 0 ) { + $result['repass'] = "Los passwords deben coincidir"; + } + + if (count($result) === 0) { + $bd = new UserDAO("complucine"); + $user = $bd->selectUser(unserialize($_SESSION['user'])->getName(), $password); + if (!$user) { + $result[] = "El usuario no existe."; + } else { + $bd->changeUserName(unserialize($_SESSION['user'])->getId(), $username); + $user = $bd->selectUser($username, $password); + if (!$user){ + $result[] = "Ha ocurrido un probrema al actualizar el nombre de usuario."; + }else{ + $_SESSION['user'] = serialize($user); + $_SESSION["nombre"] = $user->getName(); + $result = './?option=manage_profile'; + } + } + } + return $result; + } + + protected function test_input($input){ + return htmlspecialchars(trim(strip_tags($input))); + } +} \ No newline at end of file diff --git a/panel_user/includes/formChangePass.php b/panel_user/includes/formChangePass.php new file mode 100644 index 0000000..15c5adc --- /dev/null +++ b/panel_user/includes/formChangePass.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/panel_user/panelUser.php b/panel_user/panelUser.php index 09d11d7..2f141b0 100644 --- a/panel_user/panelUser.php +++ b/panel_user/panelUser.php @@ -1,5 +1,5 @@ -

Cambiar nombre de usuario

-
-
-
- Nuevo Nombre de usuario -
- -
-
- -
-
- -
-
-
- - -
-
-
- -
+ require_once('./includes/formChangePass.php'); + require_once('./includes/formChangeEmail.php'); + require_once('./includes/formChangeName.php'); + + $formCN = new FormChangeName(); + $htmlFormChangeName = $formCN->gestiona(); + + return $reply = ' +
+

Cambiar nombre de usuario

+ '.$htmlFormChangeName.' +
+

Cambiar contraseña