From e5840bbab705da9fb7f44553365291d08f39e57b Mon Sep 17 00:00:00 2001
From: Falucho <german.faller@pcunix71.fing.edu.uy>
Date: Sun, 23 Jun 2019 05:40:38 -0300
Subject: [PATCH] Quedo la Password

---
 .../uy/edu/fing/tse/jsf/UserLoginBean.java    | 35 ++++++------
 backoffice/src/main/webapp/jsf/login.xhtml    |  6 +-
 backoffice/src/main/webapp/jsf/register.xhtml |  6 +-
 .../tse/central/db/dao/user/UserDAOBean.java  | 51 +++++++++++++++++
 .../tse/central/db/dao/user/UserDaoLocal.java | 16 ++++++
 .../fing/tse/central/db/entity/Usuario.java   |  5 ++
 .../fing/tse/central/db/entity/UsuarioBO.java |  7 ++-
 central-ejb/pom.xml                           |  6 ++
 .../tse/central/business/common/Secure.java   | 56 +++++++++++++++++++
 .../tse/central/business/mq/RabbitConfig.java |  1 +
 .../central/business/security/Security.java   | 14 +++++
 .../business/security/SecurityBean.java       | 52 +++++++++++++++++
 .../business/security/SecurityLocal.java      |  7 +++
 .../business/security/SecurityRemote.java     |  5 ++
 14 files changed, 241 insertions(+), 26 deletions(-)
 create mode 100644 central-db/src/main/java/uy/edu/fing/tse/central/db/dao/user/UserDAOBean.java
 create mode 100644 central-db/src/main/java/uy/edu/fing/tse/central/db/dao/user/UserDaoLocal.java
 create mode 100644 central-ejb/src/main/java/uy/edu/fing/tse/central/business/common/Secure.java
 create mode 100644 central-ejb/src/main/java/uy/edu/fing/tse/central/business/security/Security.java
 create mode 100644 central-ejb/src/main/java/uy/edu/fing/tse/central/business/security/SecurityBean.java
 create mode 100644 central-ejb/src/main/java/uy/edu/fing/tse/central/business/security/SecurityLocal.java
 create mode 100644 central-ejb/src/main/java/uy/edu/fing/tse/central/business/security/SecurityRemote.java

diff --git a/backoffice/src/main/java/uy/edu/fing/tse/jsf/UserLoginBean.java b/backoffice/src/main/java/uy/edu/fing/tse/jsf/UserLoginBean.java
index 6ffbd0f..92d6fe2 100644
--- a/backoffice/src/main/java/uy/edu/fing/tse/jsf/UserLoginBean.java
+++ b/backoffice/src/main/java/uy/edu/fing/tse/jsf/UserLoginBean.java
@@ -1,5 +1,11 @@
 package uy.edu.fing.tse.jsf;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import uy.edu.fing.tse.central.business.security.SecurityLocal;
+import uy.edu.fing.tse.dto.UserBO;
+
+import javax.ejb.EJB;
 import javax.enterprise.context.RequestScoped;
 import javax.inject.Named;
 import java.io.Serializable;
@@ -10,24 +16,15 @@ public class UserLoginBean implements Serializable {
 
     private static final long serialVersionUID = -7674319505640122631L;
 
-    private String username;
-    private String password;
-    private String repassword;
+    private static final Logger LOG = LoggerFactory.getLogger(UserLoginBean.class);
+    @EJB
+    private SecurityLocal securityLocal;
 
-    public String getUsername() {
-        return username;
-    }
-
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    public String getPassword() {
-        return password;
-    }
+    final UserBO user = new UserBO();
+    private String repassword;
 
-    public void setPassword(String password) {
-        this.password = password;
+    public UserBO getUser() {
+        return user;
     }
 
     public String getRepassword() {
@@ -40,11 +37,13 @@ public class UserLoginBean implements Serializable {
 
 
     public void login() {
-        //aca va el login
+
+        final var s = securityLocal.login(user);
+        LOG.info(s);
     }
 
     public void register() {
-        //aca va el register
+        final var s = securityLocal.register(user);
     }
 
 }
diff --git a/backoffice/src/main/webapp/jsf/login.xhtml b/backoffice/src/main/webapp/jsf/login.xhtml
index 13dd09f..02c8eb5 100644
--- a/backoffice/src/main/webapp/jsf/login.xhtml
+++ b/backoffice/src/main/webapp/jsf/login.xhtml
@@ -14,14 +14,14 @@
             <h:panelGrid columns="2" cellpadding="5" id="form">
 
                 <h:outputLabel for="username" value="Username:"/>
-                <p:inputText id="username" value="#{userLoginView.username}" required="true" label="username"/>
+                <p:inputText id="username" value="#{userLoginView.user.mail}" required="true" label="username"/>
 
                 <h:outputLabel for="password" value="Password:"/>
-                <p:password id="password" value="#{userLoginView.password}" required="true" label="password"/>
+                <p:password id="password" value="#{userLoginView.user.password}" required="true" label="password"/>
 
                 <f:facet name="footer">
                     <p:commandButton value="Register" action="register.xhmtl?faces-redirect=true" update="form"/>
-                    <p:commandButton value="Login" action="#{userLoginView.login}"/>
+                    <p:commandButton value="Login" action="#{userLoginView.login()}"/>
                 </f:facet>
             </h:panelGrid>
         </h:form>
diff --git a/backoffice/src/main/webapp/jsf/register.xhtml b/backoffice/src/main/webapp/jsf/register.xhtml
index 55964be..67596c6 100644
--- a/backoffice/src/main/webapp/jsf/register.xhtml
+++ b/backoffice/src/main/webapp/jsf/register.xhtml
@@ -14,16 +14,16 @@
             <h:panelGrid columns="2" cellpadding="5" id="form">
 
                 <h:outputLabel for="username" value="Username:"/>
-                <p:inputText id="username" value="#{userLoginView.username}" required="true" label="username"/>
+                <p:inputText id="username" value="#{userLoginView.user.mail}" required="true" label="username"/>
 
                 <h:outputLabel for="password" value="Password:"/>
-                <p:password id="password" value="#{userLoginView.password}" required="true" label="password"/>
+                <p:password id="password" value="#{userLoginView.user.password}" required="true" label="password"/>
 
                 <h:outputLabel for="repassword" value="RePassword:"/>
                 <p:password id="repassword" value="#{userLoginView.repassword}" required="true" label="repassword"/>
 
                 <f:facet name="footer">
-                    <p:commandButton value="Register" action="#{userLoginView.register}"/>
+                    <p:commandButton value="Register" action="#{userLoginView.register()}"/>
                 </f:facet>
             </h:panelGrid>
         </h:form>
diff --git a/central-db/src/main/java/uy/edu/fing/tse/central/db/dao/user/UserDAOBean.java b/central-db/src/main/java/uy/edu/fing/tse/central/db/dao/user/UserDAOBean.java
new file mode 100644
index 0000000..fb1b5e1
--- /dev/null
+++ b/central-db/src/main/java/uy/edu/fing/tse/central/db/dao/user/UserDAOBean.java
@@ -0,0 +1,51 @@
+package uy.edu.fing.tse.central.db.dao.user;
+
+import uy.edu.fing.tse.central.db.entity.Usuario;
+import uy.edu.fing.tse.central.db.mapper.MyMapper;
+import uy.edu.fing.tse.dto.User;
+
+import javax.annotation.PostConstruct;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Stateless
+public class UserDAOBean implements UserDaoLocal {
+
+    @PersistenceContext(unitName = "central")
+    private EntityManager em;
+
+    @PostConstruct
+    void init() {
+        //Despues del constructor hace esto
+    }
+
+
+    @Override
+    public void register(User user) {
+
+        final var newUser = MyMapper.INSTANCE.convert(user);
+        em.persist(newUser);
+        em.flush();
+
+    }
+
+    @Override
+    public User find(String mail) {
+        final var query = em.createNamedQuery("Usuario.findByMail", Usuario.class);
+        query.setParameter("mail", mail);
+        final Usuario usuario = query.getSingleResult();
+        return MyMapper.INSTANCE.convert(usuario);
+    }
+
+    @Override
+    public List<User> findAll() {
+        final var query = em.createNamedQuery("Usuario.findAll", Usuario.class);
+        final List<Usuario> usuarios = query.getResultList();
+
+        return usuarios.stream().map(MyMapper.INSTANCE::convert).collect(Collectors.toList());
+    }
+
+}
diff --git a/central-db/src/main/java/uy/edu/fing/tse/central/db/dao/user/UserDaoLocal.java b/central-db/src/main/java/uy/edu/fing/tse/central/db/dao/user/UserDaoLocal.java
new file mode 100644
index 0000000..0849cb6
--- /dev/null
+++ b/central-db/src/main/java/uy/edu/fing/tse/central/db/dao/user/UserDaoLocal.java
@@ -0,0 +1,16 @@
+package uy.edu.fing.tse.central.db.dao.user;
+
+import uy.edu.fing.tse.dto.User;
+
+import javax.ejb.Local;
+import java.util.List;
+
+@Local
+public interface UserDaoLocal {
+
+    void register(User user);
+
+    User find(String mail);
+
+    List<User> findAll();
+}
diff --git a/central-db/src/main/java/uy/edu/fing/tse/central/db/entity/Usuario.java b/central-db/src/main/java/uy/edu/fing/tse/central/db/entity/Usuario.java
index 59f512c..81b41ee 100644
--- a/central-db/src/main/java/uy/edu/fing/tse/central/db/entity/Usuario.java
+++ b/central-db/src/main/java/uy/edu/fing/tse/central/db/entity/Usuario.java
@@ -4,7 +4,12 @@ import javax.persistence.*;
 
 @Entity
 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+@NamedQueries({
+        @NamedQuery(name = "Usuario.findByMail", query = "SELECT u FROM Usuario u WHERE u.mail = :mail"),
+        @NamedQuery(name = "Usuario.findAll", query = "SELECT u FROM Usuario u")
+})
 public abstract class Usuario {
+
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     private Long id;
diff --git a/central-db/src/main/java/uy/edu/fing/tse/central/db/entity/UsuarioBO.java b/central-db/src/main/java/uy/edu/fing/tse/central/db/entity/UsuarioBO.java
index 6d7cbb0..b0126c1 100644
--- a/central-db/src/main/java/uy/edu/fing/tse/central/db/entity/UsuarioBO.java
+++ b/central-db/src/main/java/uy/edu/fing/tse/central/db/entity/UsuarioBO.java
@@ -3,13 +3,12 @@ package uy.edu.fing.tse.central.db.entity;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.ManyToOne;
-import java.util.UUID;
 
 @Entity
 public class UsuarioBO extends Usuario {
 
     @Column(nullable = false)
-    private String salt = UUID.randomUUID().toString();
+    private String salt;
 
     @Column(nullable = false)
     private String password;
@@ -21,6 +20,10 @@ public class UsuarioBO extends Usuario {
         return salt;
     }
 
+    public void setSalt(String salt) {
+        this.salt = salt;
+    }
+
     public String getPassword() {
         return password;
     }
diff --git a/central-ejb/pom.xml b/central-ejb/pom.xml
index 91f5fc6..0af5d6c 100644
--- a/central-ejb/pom.xml
+++ b/central-ejb/pom.xml
@@ -54,6 +54,12 @@
             <artifactId>javax.annotation-api</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>at.favre.lib</groupId>
+            <artifactId>bcrypt</artifactId>
+            <version>0.8.0</version>
+        </dependency>
+
         <!-- Test scope dependencies -->
         <dependency>
             <groupId>junit</groupId>
diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/central/business/common/Secure.java b/central-ejb/src/main/java/uy/edu/fing/tse/central/business/common/Secure.java
new file mode 100644
index 0000000..b003721
--- /dev/null
+++ b/central-ejb/src/main/java/uy/edu/fing/tse/central/business/common/Secure.java
@@ -0,0 +1,56 @@
+package uy.edu.fing.tse.central.business.common;
+
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.KeySpec;
+import java.util.Base64;
+
+public final class Secure {
+    private static final Charset CHARSET = StandardCharsets.UTF_8;
+
+    private Secure() {
+    }
+
+    public static String generateSalt() {
+        final SecureRandom random = new SecureRandom();
+        final byte[] salt = new byte[16];
+        random.nextBytes(salt);
+
+        return new String(Base64.getEncoder().encode(salt), CHARSET);
+    }
+
+
+    public static String encriptSHA(final String pass, final String salt) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("SHA-512");
+            md.update(salt.getBytes(CHARSET));
+
+            byte[] hashedPassword = md.digest(pass.getBytes(CHARSET));
+            return new String(Base64.getEncoder().encode(hashedPassword), CHARSET);
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static String encriptPBKDF(final String pass, final String salt) {
+        try {
+            KeySpec spec = new PBEKeySpec(pass.toCharArray(), salt.getBytes(CHARSET), 65536, 128);
+            SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
+
+            byte[] hashedPassword = factory.generateSecret(spec).getEncoded();
+            return new String(Base64.getEncoder().encode(hashedPassword), CHARSET);
+        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+}
diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/central/business/mq/RabbitConfig.java b/central-ejb/src/main/java/uy/edu/fing/tse/central/business/mq/RabbitConfig.java
index 222443f..f69dc7c 100644
--- a/central-ejb/src/main/java/uy/edu/fing/tse/central/business/mq/RabbitConfig.java
+++ b/central-ejb/src/main/java/uy/edu/fing/tse/central/business/mq/RabbitConfig.java
@@ -39,4 +39,5 @@ final class RabbitConfig {
         return factory;
     }
 
+
 }
diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/central/business/security/Security.java b/central-ejb/src/main/java/uy/edu/fing/tse/central/business/security/Security.java
new file mode 100644
index 0000000..873570c
--- /dev/null
+++ b/central-ejb/src/main/java/uy/edu/fing/tse/central/business/security/Security.java
@@ -0,0 +1,14 @@
+package uy.edu.fing.tse.central.business.security;
+
+
+import uy.edu.fing.tse.dto.User;
+import uy.edu.fing.tse.dto.UserBO;
+
+public interface Security {
+
+    User register(UserBO p);
+
+    String login(UserBO p);
+
+}
+
diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/central/business/security/SecurityBean.java b/central-ejb/src/main/java/uy/edu/fing/tse/central/business/security/SecurityBean.java
new file mode 100644
index 0000000..5d835dc
--- /dev/null
+++ b/central-ejb/src/main/java/uy/edu/fing/tse/central/business/security/SecurityBean.java
@@ -0,0 +1,52 @@
+package uy.edu.fing.tse.central.business.security;
+
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import uy.edu.fing.tse.central.business.common.Secure;
+import uy.edu.fing.tse.central.db.dao.user.UserDaoLocal;
+import uy.edu.fing.tse.dto.User;
+import uy.edu.fing.tse.dto.UserBO;
+
+import javax.annotation.PostConstruct;
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import java.util.Objects;
+
+@Stateless
+public class SecurityBean implements SecurityLocal, SecurityRemote {
+
+    private static final Logger LOG = LoggerFactory.getLogger(Security.class);
+
+    @EJB
+    private UserDaoLocal dao;
+
+    @PostConstruct
+    void init() {
+        //Despues Hace esto
+    }
+
+    @Override
+    public User register(UserBO p) {
+        final var salt = Secure.generateSalt();
+        p.setSalt(salt);
+        final var newPassword = Secure.encriptPBKDF(p.getPassword(), salt);
+        p.setPassword(newPassword);
+        dao.register(p);
+        return dao.find(p.getMail());
+    }
+
+    @Override
+    public String login(UserBO p) {
+        //Valido la password
+        final var user = (UserBO) dao.find(p.getMail());
+        final var salt = user.getSalt();
+        final var thisPassword = Secure.encriptPBKDF(p.getPassword(), salt);
+
+        if (Objects.equals(thisPassword, user.getPassword())) {
+            return thisPassword;
+        }
+        return null;
+    }
+
+}
diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/central/business/security/SecurityLocal.java b/central-ejb/src/main/java/uy/edu/fing/tse/central/business/security/SecurityLocal.java
new file mode 100644
index 0000000..fab0b6a
--- /dev/null
+++ b/central-ejb/src/main/java/uy/edu/fing/tse/central/business/security/SecurityLocal.java
@@ -0,0 +1,7 @@
+package uy.edu.fing.tse.central.business.security;
+
+import javax.ejb.Local;
+
+@Local
+public interface SecurityLocal extends Security {
+}
diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/central/business/security/SecurityRemote.java b/central-ejb/src/main/java/uy/edu/fing/tse/central/business/security/SecurityRemote.java
new file mode 100644
index 0000000..b001861
--- /dev/null
+++ b/central-ejb/src/main/java/uy/edu/fing/tse/central/business/security/SecurityRemote.java
@@ -0,0 +1,5 @@
+package uy.edu.fing.tse.central.business.security;
+
+//@Remote
+public interface SecurityRemote extends Security {
+}
-- 
GitLab