From 05ecfe8ad7b550f9203aeeac12281fd89752e61d Mon Sep 17 00:00:00 2001 From: gleimar Date: Tue, 15 Jul 2014 23:35:03 +0000 Subject: [PATCH] fixes bug#5488 git-svn-id: http://desenvolvimento.rjconsultores.com.br/repositorio/sco/AdmVenta/Model/trunk/modelWeb@36588 d1611594-4594-4d17-8e1d-87c2c4800839 --- .../dao/hibernate/PuntoVentaHibernateDAO.java | 4 + .../dao/hibernate/UsuarioHibernateDAO.java | 11 +-- .../ventaboletos/service/PerfilService.java | 15 ++- .../ventaboletos/service/UsuarioService.java | 14 ++- .../service/impl/UsuarioServiceImpl.java | 95 +++++++++++++++---- .../utilerias/ApplicationProperties.java | 6 +- .../security => seguridad}/Base64.java | 2 +- .../seguridad/ContrasenaUtileria.java | 75 +++++++++++++++ .../spring/security/MiPasswordEncoder.java | 13 +-- 9 files changed, 191 insertions(+), 44 deletions(-) rename src/com/rjconsultores/ventaboletos/utilerias/{spring/security => seguridad}/Base64.java (96%) create mode 100644 src/com/rjconsultores/ventaboletos/utilerias/seguridad/ContrasenaUtileria.java diff --git a/src/com/rjconsultores/ventaboletos/dao/hibernate/PuntoVentaHibernateDAO.java b/src/com/rjconsultores/ventaboletos/dao/hibernate/PuntoVentaHibernateDAO.java index 89723bd30..6249cfacf 100644 --- a/src/com/rjconsultores/ventaboletos/dao/hibernate/PuntoVentaHibernateDAO.java +++ b/src/com/rjconsultores/ventaboletos/dao/hibernate/PuntoVentaHibernateDAO.java @@ -7,6 +7,7 @@ package com.rjconsultores.ventaboletos.dao.hibernate; import java.util.List; import org.hibernate.Criteria; +import org.hibernate.FetchMode; import org.hibernate.SessionFactory; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.MatchMode; @@ -99,8 +100,11 @@ public class PuntoVentaHibernateDAO extends GenericHibernateDAO buscaPuntoVentaParada(Parada parada) { Criteria c = getSession().createCriteria(getPersistentClass()); + c.add(Restrictions.eq("activo", Boolean.TRUE)); c.add(Restrictions.eq("parada", parada)); + + c.addOrder(Order.asc("nombpuntoventa")); return c.list(); } diff --git a/src/com/rjconsultores/ventaboletos/dao/hibernate/UsuarioHibernateDAO.java b/src/com/rjconsultores/ventaboletos/dao/hibernate/UsuarioHibernateDAO.java index 70645a66d..11cf41fc7 100644 --- a/src/com/rjconsultores/ventaboletos/dao/hibernate/UsuarioHibernateDAO.java +++ b/src/com/rjconsultores/ventaboletos/dao/hibernate/UsuarioHibernateDAO.java @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.List; import org.hibernate.Criteria; +import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.SessionFactory; import org.hibernate.criterion.Order; @@ -76,12 +77,10 @@ public class UsuarioHibernateDAO extends GenericHibernateDAO i } public List buscarPelaCveUsuario(String cveUsuario) { - Criteria c = getSession().createCriteria(getPersistentClass()); - c.add(Restrictions.eq("activo", Boolean.TRUE)); - - c.add(Restrictions.eq("claveUsuario", cveUsuario)); - - return c.list(); + Query query = getSession().createQuery("select u from Usuario u where u.activo =1 and u.claveUsuario = :clave order by u.claveUsuario" ); + query.setParameter("clave", cveUsuario); + + return query.list(); } @SuppressWarnings("unchecked") diff --git a/src/com/rjconsultores/ventaboletos/service/PerfilService.java b/src/com/rjconsultores/ventaboletos/service/PerfilService.java index eadba8485..e505c4b56 100644 --- a/src/com/rjconsultores/ventaboletos/service/PerfilService.java +++ b/src/com/rjconsultores/ventaboletos/service/PerfilService.java @@ -4,14 +4,25 @@ */ package com.rjconsultores.ventaboletos.service; -import com.rjconsultores.ventaboletos.entidad.Perfil; import java.util.List; +import com.rjconsultores.ventaboletos.entidad.Perfil; + /** * * @author rodrigo */ -public interface PerfilService extends GenericService { +public interface PerfilService{ + public List obtenerTodos(); + + public Perfil obtenerID(Integer id); + + public Perfil suscribir(Perfil entidad); + + public Perfil actualizacion(Perfil entidad); + + public void borrar(Perfil entidad); + public List buscar(String dscPerfil); } diff --git a/src/com/rjconsultores/ventaboletos/service/UsuarioService.java b/src/com/rjconsultores/ventaboletos/service/UsuarioService.java index 291a69519..e6b34a4c4 100644 --- a/src/com/rjconsultores/ventaboletos/service/UsuarioService.java +++ b/src/com/rjconsultores/ventaboletos/service/UsuarioService.java @@ -7,13 +7,21 @@ package com.rjconsultores.ventaboletos.service; import java.util.List; import com.rjconsultores.ventaboletos.entidad.Empleado; +import com.rjconsultores.ventaboletos.entidad.Perfil; import com.rjconsultores.ventaboletos.entidad.Usuario; +import com.rjconsultores.ventaboletos.exception.BusinessException; /** * * @author gleimar */ -public interface UsuarioService extends GenericService { +public interface UsuarioService { + + public List obtenerTodos(); + + public Usuario obtenerID(Integer id); + + public void borrar(Usuario entidad); public List buscarPeloNome(String nome); @@ -22,4 +30,6 @@ public interface UsuarioService extends GenericService { public List buscarPorEmpleado(Empleado get); public List buscarPelaCveUsuario(String claveUsuario); -} + + public Usuario suscribirActualizar(Usuario entidad, String senha, Perfil perfil) throws BusinessException; +} \ No newline at end of file diff --git a/src/com/rjconsultores/ventaboletos/service/impl/UsuarioServiceImpl.java b/src/com/rjconsultores/ventaboletos/service/impl/UsuarioServiceImpl.java index 0959ae7a9..e1c3e00ff 100644 --- a/src/com/rjconsultores/ventaboletos/service/impl/UsuarioServiceImpl.java +++ b/src/com/rjconsultores/ventaboletos/service/impl/UsuarioServiceImpl.java @@ -4,14 +4,10 @@ */ package com.rjconsultores.ventaboletos.service.impl; -import com.rjconsultores.ventaboletos.dao.UsuarioDAO; -import com.rjconsultores.ventaboletos.entidad.Empleado; -import com.rjconsultores.ventaboletos.entidad.Usuario; -import com.rjconsultores.ventaboletos.entidad.UsuarioPerfil; -import com.rjconsultores.ventaboletos.service.UsuarioService; -import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado; +import java.util.ArrayList; import java.util.Calendar; import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.security.core.userdetails.UserDetails; @@ -20,15 +16,29 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.rjconsultores.ventaboletos.dao.UsuarioDAO; +import com.rjconsultores.ventaboletos.dao.UsuarioPerfilDAO; +import com.rjconsultores.ventaboletos.entidad.Empleado; +import com.rjconsultores.ventaboletos.entidad.Perfil; +import com.rjconsultores.ventaboletos.entidad.Usuario; +import com.rjconsultores.ventaboletos.entidad.UsuarioPerfil; +import com.rjconsultores.ventaboletos.exception.BusinessException; +import com.rjconsultores.ventaboletos.service.UsuarioService; +import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties; +import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado; +import com.rjconsultores.ventaboletos.utilerias.seguridad.ContrasenaUtileria; + /** * * @author Administrador */ @Service("usuarioService") public class UsuarioServiceImpl implements UsuarioService, UserDetailsService { - + @Autowired - private UsuarioDAO usuarioDAO; + private UsuarioDAO usuarioDAO; + @Autowired + private UsuarioPerfilDAO usuarioPerfilDAO; public List buscarPeloNome(String nome) { return usuarioDAO.buscarPeloNome(nome); @@ -41,25 +51,68 @@ public class UsuarioServiceImpl implements UsuarioService, UserDetailsService { public Usuario obtenerID(Integer id) { return usuarioDAO.obtenerID(id); } + + @Transactional(rollbackFor = BusinessException.class) + @Override + public Usuario suscribirActualizar(Usuario entidad,String senha,Perfil perfil) throws BusinessException { + + //validación duplicado + List lsUsuario = this.buscarPelaCveUsuario(entidad.getClaveUsuario()); + boolean podeSalvar = false; + if (lsUsuario.isEmpty()) { + podeSalvar = true; + } else { + if (entidad.getUsuarioId() != null){ + for (Usuario u : lsUsuario) { + if (u.getUsuarioId().equals(entidad.getUsuarioId())) { + podeSalvar = true; + } + } + } + } - @Transactional - public Usuario suscribir(Usuario entidad) { + if (!podeSalvar) { + throw new BusinessException("MSG.Registro.Existe"); + } + if (senha != null){ + //validación complejidad contrasena + if (ApplicationProperties.getInstance().contrasenaValidaComplejidad()){ + ContrasenaUtileria.validarContrasenaCompleja(senha); + } + + //encriptación contrasena + entidad.setSenha(ContrasenaUtileria.encriptarContrasena(senha)); + } + + //Perfil + UsuarioPerfil up = new UsuarioPerfil(); + up.setUsuario(entidad); + up.setPerfil(perfil); + up.setActivo(Boolean.TRUE); + up.setFecmodif(Calendar.getInstance().getTime()); + up.setUsuariomodifId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); + + if (entidad.getUsuarioId() != null) { + List lsUsuarioPerfil = usuarioPerfilDAO.obtenerPorUsuario(entidad); + for (UsuarioPerfil up2 : lsUsuarioPerfil) { + usuarioPerfilDAO.borrar(up2); + } + } + List lsUp = new ArrayList(); + lsUp.add(up); + entidad.setUsuarioPerfilList(lsUp); + + entidad.setUsuariomodifId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); entidad.setFecmodif(Calendar.getInstance().getTime()); entidad.setActivo(Boolean.TRUE); - return usuarioDAO.suscribir(entidad); + if (entidad.getUsuarioId() == null){ + return usuarioDAO.suscribir(entidad); + }else{ + return usuarioDAO.actualizacion(entidad); + } } - - @Transactional - public Usuario actualizacion(Usuario entidad) { - entidad.setUsuariomodifId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); - entidad.setFecmodif(Calendar.getInstance().getTime()); - entidad.setActivo(Boolean.TRUE); - - return usuarioDAO.actualizacion(entidad); - } - @Transactional public void borrar(Usuario entidad) { diff --git a/src/com/rjconsultores/ventaboletos/utilerias/ApplicationProperties.java b/src/com/rjconsultores/ventaboletos/utilerias/ApplicationProperties.java index 002cbcda4..b746fe1cb 100644 --- a/src/com/rjconsultores/ventaboletos/utilerias/ApplicationProperties.java +++ b/src/com/rjconsultores/ventaboletos/utilerias/ApplicationProperties.java @@ -123,5 +123,9 @@ public class ApplicationProperties { String property = p.getProperty("diagramaautobus.dospestana", "0"); return property.equals("1"); } - + public boolean contrasenaValidaComplejidad() { + String property = p.getProperty("contrasena.validaComplejidad", "0"); + return property.equals("1"); + } + } diff --git a/src/com/rjconsultores/ventaboletos/utilerias/spring/security/Base64.java b/src/com/rjconsultores/ventaboletos/utilerias/seguridad/Base64.java similarity index 96% rename from src/com/rjconsultores/ventaboletos/utilerias/spring/security/Base64.java rename to src/com/rjconsultores/ventaboletos/utilerias/seguridad/Base64.java index f913191c8..dbf06aa71 100644 --- a/src/com/rjconsultores/ventaboletos/utilerias/spring/security/Base64.java +++ b/src/com/rjconsultores/ventaboletos/utilerias/seguridad/Base64.java @@ -4,7 +4,7 @@ * Copyright 2002 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ -package com.rjconsultores.ventaboletos.utilerias.spring.security; +package com.rjconsultores.ventaboletos.utilerias.seguridad; /** * Static methods for translating Base64 encoded strings to byte arrays and vice-versa. diff --git a/src/com/rjconsultores/ventaboletos/utilerias/seguridad/ContrasenaUtileria.java b/src/com/rjconsultores/ventaboletos/utilerias/seguridad/ContrasenaUtileria.java new file mode 100644 index 000000000..188d4dd8c --- /dev/null +++ b/src/com/rjconsultores/ventaboletos/utilerias/seguridad/ContrasenaUtileria.java @@ -0,0 +1,75 @@ +package com.rjconsultores.ventaboletos.utilerias.seguridad; + +import java.io.File; +import java.net.URL; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Locale; +import java.util.regex.Pattern; + +import org.zkoss.util.resource.LabelLocator; +import org.zkoss.util.resource.Labels; + +import com.rjconsultores.ventaboletos.exception.BusinessException; + +public class ContrasenaUtileria { + private static final int CANT_MIN_CARACTER = 8; + private static final int CANT_MIN_NUMERO = 1; + private static final int CANT_MIN_LETRA = 1; + private static final int CANT_ESPECIALES = 2; + + private static Pattern patternHayNumero = Pattern.compile(".*[0-9]+.*"); + private static Pattern patternHayLetra = Pattern.compile(".*[a-zA-Z]+.*"); + private static Pattern patternHayEspeciales = Pattern.compile(".*[^\\w]{2,}+.*"); + + public static String encriptarContrasena(String contrasena){ + MessageDigest md; + try { + md = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + + byte[] pass = md.digest(contrasena.getBytes()); + return Base64.byteArrayToBase64(pass); + } + public static void validarContrasenaCompleja(String contrasena) throws BusinessException{ + int length = contrasena.length(); + + if (length< CANT_MIN_CARACTER){ + throw new BusinessException("complejidadContrasena.CANT_MIN_CARACTER", new Object[]{CANT_MIN_CARACTER}); + } + + if (!patternHayLetra.matcher(contrasena).find()){ + throw new BusinessException("complejidadContrasena.CANT_MIN_LETRA", new Object[]{CANT_MIN_LETRA}); + } + + if (!patternHayNumero.matcher(contrasena).find()){ + throw new BusinessException("complejidadContrasena.CANT_MIN_NUMERO", new Object[]{CANT_MIN_NUMERO}); + } + + if (!patternHayEspeciales.matcher(contrasena).find()){ + throw new BusinessException("complejidadContrasena.CANT_ESPECIALES", new Object[]{CANT_ESPECIALES}); + } + } + public static void main(String args[]){ + System.out.println(ContrasenaUtileria.encriptarContrasena("gleimar")); + + LabelLocator teste = new LabelLocator() { + + @Override + public URL locate(Locale arg0) throws Exception { + return new File("E:/scia_ventaboletos_transpais_senda/sco/AdmVenta/Web/trunk/ventaboletos/web/WEB-INF/i3-label_pt_BR.label").toURI().toURL(); + } + }; + Labels.register(teste); + try { + ContrasenaUtileria.validarContrasenaCompleja("asdfasdf1@@"); + System.out.println("ok"); + } catch (BusinessException e) { + System.out.println(e.getLocalizedMessage()); + } + + } + +} diff --git a/src/com/rjconsultores/ventaboletos/utilerias/spring/security/MiPasswordEncoder.java b/src/com/rjconsultores/ventaboletos/utilerias/spring/security/MiPasswordEncoder.java index 75a44fdde..302ba16f3 100644 --- a/src/com/rjconsultores/ventaboletos/utilerias/spring/security/MiPasswordEncoder.java +++ b/src/com/rjconsultores/ventaboletos/utilerias/spring/security/MiPasswordEncoder.java @@ -1,25 +1,16 @@ package com.rjconsultores.ventaboletos.utilerias.spring.security; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - import org.springframework.dao.DataAccessException; import org.springframework.security.authentication.encoding.PasswordEncoder; +import com.rjconsultores.ventaboletos.utilerias.seguridad.ContrasenaUtileria; public class MiPasswordEncoder implements PasswordEncoder { @Override public String encodePassword(String pwd, Object salt) throws DataAccessException { - try { - MessageDigest md = MessageDigest.getInstance("MD5"); - byte[] pass = md.digest(pwd.getBytes()); - return Base64.byteArrayToBase64(pass); - - } catch (NoSuchAlgorithmException e) { - throw new RuntimeException("No fue posible firmar el usuario. El algoritmo no fue encontrado", e); - } + return ContrasenaUtileria.encriptarContrasena(pwd); }