jueves, 28 de noviembre de 2013

Practica 1

Enunciado del ejercicio:
Enunciado:
Diseñar una aplicación Web que posibilite registrar nuevos clientes en un servicio postventa de un 
fabricante de objetivos fotográficos. Para ello se solicitará que se rellene un formulario que contiene 
los siguientes campos: login, clave, email, nombre del cliente, apellidos del cliente, dirección postal 
del cliente, modelo del objetivo adquirido, fecha de compra, nombre de la tienda donde se adquirió y 
número de serie del objetivo.
Se validará el formulario. Si el login ya existe se indicará y pedirá uno nuevo. Se valida la clave de 
forma que posea entre 8 y 16 caracteres, al menos una letra mayúscula y al menos un dígito. 
También se valida el email (debe ser un email válido), la fecha de compra (formato dd/mm/aaaa) y 
además no debe ser posterior a la fecha de hoy. Si todo es correcto, se añade la información a la base 
de datos y se informa de que el registro ha sido correcto.
La aplicación mostrará inicialmente una página en la que se ofrece al usuario registrarse en el 
servicio. Si pulsa el botón de nuevo registro, se procederá a ofrecer el formulario, validarlo e informar 
de ello. Si hay errores se mostrará de nuevo el formulario indicando la razón del error. Si no hay 
errores, se indicará que todo ha sido correcto.
Nombre del proyecto Eclipse: ApRegistroPostVenta
Contexto raiz: regpostventa
Nombre de la base de datos MySQL: postventa
Se pide: El proyecto Eclipse completo, código fuente java debidamente documentado en Javadoc, 
script de creación y rellenado inicial de la base de datos MySQL, diagrama del modelo relacional 
creado con WorkBench, archivo WAR (sin contener librería ConectorJ).
Se sube todo comprimido en un archivo denominado PR01-<Primerapellido><SegundoApellido>.[zip|
rar]
Nota: Se supone que la base de datos está en 3 forma normal.

El ejercicio funcionando: http://negrero.no-ip.org:8081/regpostventa/
Planteamiento de la base de datos:





Utilizo cuatro archivos para la web dos clases beans y tres clases pojo de las cuales el peso lo llevan:
registro.jsp y las clases Control y Validador:


registro.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
form.elegante input {
  padding: .2em;
}
form div {
  margin: .4em 0;
 
}
.pequeño{
width: 22%;
}
.mediano{
width: 22%;
}
.grande{
width: 22%;
}
form div label {
  float: left;
}
#contenedor {
  width: 700px;
  margin: 0 auto;
}
font{
color:red;
 font-size:12px;
}
</style>
</head>
<body>
<!--  Mi clases para capturar los datos  -->
<jsp:useBean id="usuario" class="pojo.Usuario"></jsp:useBean>
<jsp:useBean id="cliente" class="pojo.Cliente"></jsp:useBean>
<jsp:useBean id="producto" class="pojo.Producto"></jsp:useBean>
<jsp:useBean id="validador" class="beans.Validador"></jsp:useBean>
<!--  Clase que recoge los valores si los datos son correctos como es validar datos -->
<jsp:useBean id="control" class="beans.Control"></jsp:useBean>
<jsp:setProperty property="*" name="usuario"/>
<jsp:setProperty property="*" name="cliente"/>
<jsp:setProperty property="*" name="producto"/>
<jsp:setProperty property="control" name="validador" value="<%=control%>"/>
<%if (request.getParameter("aceptar")!=null){%>
<jsp:setProperty property="usuario" name="control" value="<%= usuario%>"/>
<jsp:setProperty property="cliente" name="control" value="<%=cliente%>"/>
<jsp:setProperty property="producto" name="control"  value="<%=producto%>"/>
<jsp:setProperty property="aceptar" name="control" value='<%=request.getParameter("aceptar")%>'/>
<%} %>
<div id="contenedor" >
<form action="registro.jsp">
<fieldset>
<legend>Datos de usuario</legend>
<div>
<!--
Exlicacion de la validacion de los campos de formulario:
value=si no es null(=null primera vez, al cargar la pagina) no muestra el valor null pero sino muestra el valor que tenia anterior
<font> Entre las etiquetas font pregunto si se ha pulsado aceptar(primera vez) y despues  pregunto si es valido 
a partir de un patron dado, si no es valido mensaje de error
  
-->
<label for="login" class="pequeño">Login:</label> 
<input type="text" name="login" size="15"
value="<%if (usuario.getLogin()!=null){ %><jsp:getProperty property='login' name='usuario'/><%}%>"
maxlength="15" /> <font ><jsp:getProperty property="validarLogin" name="validador"/></font>
</div>
<div>
<label for="clave"class="pequeño">Clave:</label> 
<input type="password" maxlength="16" name="clave"
value="<%if (usuario.getClave()!=null){ %><jsp:getProperty property='clave' name='usuario'/><%}%>"
size="16" /> <font><jsp:getProperty property="validarClave" name="validador"/></font>
</div>
<div>
<label for="email" class="pequeño">Email:</label> <input
type="email" name="email" 
value="<%if (usuario.getEmail()!=null){ %><jsp:getProperty property='email' name='usuario'/><%}%>"
size="30" maxlength="30" /> <font><jsp:getProperty property="validarEmail" name="validador"/></font>
</div>
</fieldset>
<fieldset>
<legend>Datos de cliente</legend>
<div>
<label for="nombre"class="mediano">Nombre:</label>
<input type="text" max="15" maxlength="15" name="nombre"
value="<%if (cliente.getNombre()!=null){ %><jsp:getProperty property='nombre' name='cliente'/><%}%>"/>
<font><jsp:getProperty property="validarNombre" name="validador"/></font>
</div>
<div>
<label for="apellidos"class="mediano">Apellidos:</label>
<input type="text" max="30" maxlength="30" name="apellidos"
value="<%if (cliente.getApellidos()!=null){ %><jsp:getProperty property='apellidos' name='cliente'/><%}%>"/>
<font><jsp:getProperty property="validarApellidos" name="validador"/></font>
</div>
<div>
<label for="direccion"class="mediano">Direccion:</label>
<input type="text" size="30" maxlength="50" name="direccion"
value="<%if (cliente.getDireccion()!=null){ %><jsp:getProperty property='direccion' name='cliente'/><%}%>"/>
<font><jsp:getProperty property="validarNombre" name="validador"/></font>

</div>
</fieldset>
<fieldset>
<legend>Datos del Producto</legend>
<div>
<label for="objetivo"class="grande">Modelo objetivo:</label>
<input type="text" size="15" maxlength="15" name="objetivo"
value="<%if (producto.getObjetivo()!=null){ %><jsp:getProperty property='objetivo' name='producto'/><%}%>"/>
<font><jsp:getProperty property="validarObjetivo" name="validador"/></font>
</div>
<div>
<label for="fecha" class="grande">Fecha de compra:</label>
<input type="text" name="fecha"
value="<%if (producto.getFecha()!=null){ %><jsp:getProperty property='fecha' name='producto'/><%}%>"/>
<font><jsp:getProperty property="validarFecha" name="validador"/></font>
</div>
<div>
<label for="tienda" class="grande">Nombre de la tienda:</label>
<input type="text" size="30" maxlength="30" name="tienda"
value="<%if (producto.getTienda()!=null){ %><jsp:getProperty property='tienda' name='producto'/><%}%>"/>
<font><jsp:getProperty property="validarTienda" name="validador"/></font>
</div>
<div>
<label for="serie" class="grande">Nº de serie del objetivo:</label>
<input type="number" name="nserie" size="5" maxlength="5"
value="<%if (producto.getNserie()!=null){ %><jsp:getProperty property='nserie' name='producto'/><%}%>"/>
<font><jsp:getProperty property="validarNserie" name="validador"/></font>
</div>
</fieldset>
<fieldset>
<div>
<input type="submit" value="Aceptar" name="aceptar"/>
</div>
</fieldset>
<%if (request.getParameter("aceptar")!=null){
if (control.getGrabar()){%>
<jsp:forward page="grabado.html"></jsp:forward>
<%
}else{
out.write("<font>Error al grabar los datos</font");
}
}
 %>
</form>
</div>

</body>
</body>
</html>

Validador.java
package beans;

import java.io.Serializable;


/**
 * @author Andres Carmona gil
 * Clase que encapsula las validaciones de los datos del formulario
 * a la cual se le pasa los datos a traves de la clase Control
 *
 */
@SuppressWarnings("serial")
public class Validador implements Serializable {


/**
* Clase control que recibe los datos del formulario
*/
private Control control=null;

public Validador(){

}


/**
* Retorna la clase control
* @return the control
*/
public Control getControl() {
return control;
}


/**
* Le pasamos la clase control
* @param control the control to set
*/
public void setControl(Control control) {
this.control = control;
}


/**
* Devuelve un String con el error si no es valido el login:
* esta vacio el campo o si el login existe ya en la base de datos
* @return String error
*/
public String getValidarLogin(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (control.getUsuario().getLogin()==null){
error="<-- Usuario requerido no puede estar vacio) ";
}else{
if (control.getExisteLogin()){
error="<--Nombre de usuario ya existe";
}
}
}

return error;
}
/**
* Devuelve un String con el error si no es valida la clave segun patron
* o el campo esta vacio
* @return String error
*/
public String getValidarClave(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (control.getUsuario().getClave()==null ||
!control.validar(control.getUsuario().getClave(), "patronClave")){
error="<-- Clave requerida(8-15 caracteres al menos un digito y una mayuscula)";
}
}

return error;

}

/**
* Devuelve un String con el error si no es valida la email segun patron
* o el campo esta vacio
* @return String error
*/
public String getValidarEmail(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (control.getUsuario().getEmail()==null ||
!control.validar(control.getUsuario().getEmail(), "patronEmail")){
error="<-- Email requerido o mal escrito(nombre@compañia.com)";
}
}
return error;
}

/**
* Devuelve un String con el error si el nombre del cliente esta vacio
* @return String error
*/
public String getValidarNombre(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (control.getCliente().getNombre()==null){
error="<-- Nombre requerido no puede estar vacio";
}
}
return error;
}
/**
* Devuelve un String con el error si el apellidos del cliente esta vacio
* @return String error
*/
public String getValidarApellidos(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (control.getCliente().getApellidos()==null){
error="<-- Apellidos requerido no puede estar vacio";
}
}
return error;
}

/**
* Devuelve un String con el error si el direccion del cliente esta vacio
* @return String error
*/
public String getValidarDireccion(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (control.getCliente().getDireccion()==null){
error="<-- Direccion requerida no puede estar vacio";
}
}
return error;
}

/**
* Devuelve un String con el error si el nombre del objetivo esta vacio
* @return String error
*/
public String getValidarObjetivo(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (control.getProducto().getObjetivo()==null){
error="<--Nombre objetivo requerido no puede estar vacio";
}
}
return error;
}

/**
* Devuelve un String con el error si la fecha de compra del objetivo no es valida
* segun patron (dd/mm/yyyy) y no es posterior a hoy
* @return String error
*/
public String getValidarFecha(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (!control.validar(control.getProducto().getFecha(),"patronFecha")){
error="<-- Fecha requerida  o no valida(dd/mm/aaaa)";
}else{
if (control.getFecha()){
error="<-- la fecha tiene que ser anterior a la de hoy";
}
}
}
return error;
}

/**
* Devuelve un String con el error si el nombre de la tienda esta vacia
* @return String error
*/
public String getValidarTienda(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (control.getProducto().getTienda()==null){
error="<--Nombre tienda requerido no puede estar vacio";
}
}
return error;
}
/**
* Devuelve un String con el error si el numero de serie no es un numero con el patron numero
* @return String error
*/
public String getValidarNserie(){
String error="";
if(control.getAceptar()!=null && control!=null){
if (control.getProducto().getNserie()==null ||
control.validar(control.getProducto().getNserie(), "patronNumero")){
error="<-- Numero de serie no puede estar vacio o no es valido";
}
}
return error;
}


}

viernes, 15 de noviembre de 2013

Expresiones Regulares

1. Validar una URL

¿Quieres saber si una dirección web es válida? No hay problema con esta expresión regular lo tendremos muy fácil:
  1. /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \?=.-]*)*\/?$/  

2. Validar un E-mail

En muchas ocasiones necesitaremos saber si un e-mail con el que se trata de registrar un usuario es válido:
  1. ^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$  

3. Comprobar la seguridad de una contraseña

Para aquellos que necesitáis sugerir / comprobar la fortaleza de una contraseña:
  1. (?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$  
De esta forma comprobaremos:
  • Contraseñas que contengan al menos una letra mayúscula.
  • Contraseñas que contengan al menos una letra minúscula.
  • Contraseñas que contengan al menos un número o caracter especial.
  • Contraseñas cuya longitud sea como mínimo 8 caracteres.
  • Contraseñas cuya longitud máxima no debe ser arbitrariamente limitada.

4. Validar un número de teléfono

Con este snippet se validarán todos los número de teléfono pertenecientes a los listados en la Wikipedia:
  1. ^\+?\d{1,3}?[- .]?\(?(?:\d{2,3})\)?[- .]?\d\d\d[- .]?\d\d\d\d$  

5. Validar número de tarjeta de crédito

Ahora que tan de moda está el e-commerce seguro que esto le vendrá bien a más de uno:
  1. ^((67\d{2})|(4\d{3})|(5[1-5]\d{2})|(6011))(-?\s?\d{4}){3}|(3[4,7])\ d{2}-?\s?\d{6}-?\s?\d{5}$  

6. Recoger ID de un vídeo de Youtube

Si necesitas recoger el ID de un vídeo de Youtube en sus múltiples combinaciones, esta es tu expresión regular:
  1. /http:\/\/(?:youtu\.be\/|(?:[a-z]{2,3}\.)?youtube\.com\/watch(?:\?|#\!)v=)([\w-]{11}).*/gi  

7. Validar todas las etiquetas de imagen sin cerrar

Ahora que prácticamente todos empleamos xHTML es interesante comprobar que todas nuestras etiquetas de imagen están correctamente cerradas:
  1. <img([^>]+)(\s*[^\/])></img([^>  

8. Validar una dirección IP

Si necesitas validar una dirección IP introducida por un usuario, esto te será de gran ayuda:
  1. /^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/  

9. Validar código postal

En muchas ocasiones necesitamos recoger en los formularios de alta el código postal:
  1. ^([1-9]{2}|[0-9][1-9]|[1-9][0-9])[0-9]{3}$  

10. Validar un nombre de usuario

Si por ejemplo quisiésemos validar un nombre de usuario con un mínimo de 4 caracteres y un máximo de 15 haríamos lo siguiente:
  1. /^[a-z\d_]{4,15}$/i  
Además el nombre estaría utilizando sólo caracteres de la A-z y números.

domingo, 3 de noviembre de 2013

Practica 1 de daw instalacion joomla dese servidor ftp

Indice

Pasos para instalar joomla

1.- Instalacion de paqueteria
2.- Configuracion de usuarios para ftp
3.- Configuracion de servidores
4.- Instalacion joomla

1.- Instalacion de paqueteria


sudo apt-get install
apache2
php5
mysql
vsftpd
phpmyadmin
filezilla


2.- Configuracion de usuarios para ftp

1.- editamos el fichero /etc/shell y añadimos la linea /bin/ftp
sudo echo “/bin/ftp”>>/etc/shells
2.- Añadimos usuario al grupo www-data y con directorio por defecto www y utilice una shell falsa:
sudo useradd -g www-data -d /var/www -s /bin/ftp nombre-usuario
en mi caso le he puesto ftpandres contraseña andres
3.- Añadimos clave al usuario creado
sudo passwd usuario
3.- Damos permiso al grupo www-data para poder subir archivos y descomprimirlos
sudo chmod 775 /var/www

3.- Configuracion de servidores

El servidor que configuraremos sera el vsftpd:
1.- Editamos vsftpd.conf(que esta al final de este documento)
sudo gedit /et/vsftpd.conf
2.- Creamos la carpeta vsftpd
sudo mkdir vsftpd
2.- Editadmos vsftpd.chroot_list para indicar los usuarios que queremos enjaular
sudo gedit /etc/vsftpd/vsftpd.chroot_list
3.- Reiniciamos el servicio:
sudo service vsftpd restart






4.- Configuracion de Joomla

1.- Iniciamos filezilla como cliente y nos conectamos con el usuario y contraseñas antes creado.
2.- Subimos el zip de joomla en mi caso
Joomla_3.0.3-Spanish-Pack_Completo.zip
3.- Una vez subido en filezilla boton derecho del raton sobre el fichero y le pinchamos ver/editar (tendremos que tener instalado un compresor en el sistema).
4.- Una vez abierto el compresor seleccionar todas las carpetas y directorios del zip y arrastrarlo desde el programa de compresion hasta la carpeta del filezilla que hayamos elegido para instalar joomla:



5.- Crearemos un usuario en mysql llamado joomla para poderle dar permiso a la base de datos joomla que crearemos

6. Accedemos al directorio de joomla desde el navegador en mi caso:
dwec.no-ip.org/joomla3 o localhost/joomla3

7. Metemos los damos de administracion y despues los de la base de datos que hemos creado junto con el usuario:












en mi caso hemos creado una base de datos joomla y un usuario joomla el cual tiene permiso sobre la base de datos tanto para cualquier host % como para localhost



























# Ejemplo del archivo de configuración /etc/vsftpd.conf
# General Settings
#
# Permite el modo escritura.
write_enable=YES

# Activa mensajes de directorio.
dirmessage_enable=YES

# Mensaje de bienvenida
ftpd_banner=Bienvenido al servidor ftp de Andres Carmona

# Local FTP user Settings
#
# Permite que usuarios locales puedan conectarse.
local_enable=YES

# Enjaula a los usuarios locales dentro de su propio directorio personal,
# esta opción mejora la seguridad.
chroot_local_user=YES

# Permite especificar una lista con los usuarios locales a los cuales no
# se les enjaulará cuando la opción chroot_local_user = YES.
chroot_list_enable=YES

# Especifica la ruta en donde se encuentra la lista, en mi caso he creado una
# carpeta en el directorio /etc llamada “vsftpd”, en la cual coloqué el archivo
# de texto (vsftpd.chroot_list) que contiene la lista.
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list

# Esta directiva la he dejado comentada, pero puede resultar muy interesante
# para los casos en que sea necesario limitar la velocidad de transferencia para
# los usuarios locales, por defecto la velocidad de transferencia es ilimitada.
#local_max_rate=7200

# Anonymus FTP user Settings
#
# Permitir conexiones anónimas.
anonymous_enable=NO



# Transfer Settings
#
# (ftp-data).
connect_from_port_20=YES

# Tiempo de espera para mantener establecidas conexiones inactivas.
idle_session_timeout=600

# Tiempo de espera para mantener establecidas conexiones de datos inactivas.
data_connection_timeout=120

# Comando que permite activar/desactivar conexiones pasivas.
pasv_enable=YES

# PAM setting. Suele estar configurado por defecto.
pam_service_name=vsftpd

# Configura listen=YES para que vsftpd corra en modo standalone.
listen=YES

# Máximos clientes simultáneos conectados. Ejemplo:
max_clients=5

# Máximas conexiones simultáneas por IP. Ejemplo:
max_per_ip=3

# Como tenemos activado el uso de conexiones pasivas especificamos el rango de
# puertos que serán utilizados por este método de conexión.
pasv_min_port=40000
pasv_max_port=40020

local_umask=22
ftp_username=andres