From 6422823854c4a665087157f804bedce587581faa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Mill=C3=A1n?= Date: Thu, 13 Oct 2022 13:01:50 +0200 Subject: [PATCH 1/2] =?UTF-8?q?A=C3=B1adidas=20clases=20propias=20para=20e?= =?UTF-8?q?l=20login?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Andrés Millán @T-Systems --- .../main/java/com/curso/ejercicios3/Rome.java | 3 +- .../main/java/com/curso/ejercicios3/User.java | 47 +++++++ .../java/com/curso/ejercicios3/UserDB.java | 126 ++++++++++++++++++ 3 files changed, 174 insertions(+), 2 deletions(-) create mode 100644 ejercicios3/src/main/java/com/curso/ejercicios3/User.java create mode 100644 ejercicios3/src/main/java/com/curso/ejercicios3/UserDB.java diff --git a/ejercicios3/src/main/java/com/curso/ejercicios3/Rome.java b/ejercicios3/src/main/java/com/curso/ejercicios3/Rome.java index c31aeed..70f55fb 100644 --- a/ejercicios3/src/main/java/com/curso/ejercicios3/Rome.java +++ b/ejercicios3/src/main/java/com/curso/ejercicios3/Rome.java @@ -15,7 +15,6 @@ * @author dpadilla */ public class Rome { - private GregorianCalendar baseTime; private boolean exit; private UserInterface ui; @@ -77,7 +76,7 @@ private void newTicket(int numTickets) { for (int i = 0; i < numTickets;) { dateNumber = ui.askDate();//interface ask for date ticketTime = editCalendar(dateNumber, ticketTime); - + if (checkCalendar(ticketTime)) {//is the day avaliable? ticketList.add(new Ticket((GregorianCalendar) ticketTime.clone())); daysTaken.add((GregorianCalendar) ticketTime.clone()); diff --git a/ejercicios3/src/main/java/com/curso/ejercicios3/User.java b/ejercicios3/src/main/java/com/curso/ejercicios3/User.java new file mode 100644 index 0000000..b21681f --- /dev/null +++ b/ejercicios3/src/main/java/com/curso/ejercicios3/User.java @@ -0,0 +1,47 @@ +package com.curso.ejercicios3; + +public class User { + // dni, name + private String dni; + private String name; + private String hashedPassword; + + + public User(String name, String dni, String hashedPassword){ + this.name = name; + this.dni = dni; + this.hashedPassword=hashedPassword; + } + + public String getDni() { + return dni; + } + + public String getName() { + return name; + } + public String getHashedPassword() { + return hashedPassword; + } + public void setDni(String dni) { + this.dni = dni; + } + + public void setName(String name) { + this.name = name; + } + public void setHashedPassword(String hashedPassword) { + this.hashedPassword = hashedPassword; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + + User o = (User) obj; + return o.getDni().equals(dni) && o.getName().equals(name); + } + +} diff --git a/ejercicios3/src/main/java/com/curso/ejercicios3/UserDB.java b/ejercicios3/src/main/java/com/curso/ejercicios3/UserDB.java new file mode 100644 index 0000000..81443c5 --- /dev/null +++ b/ejercicios3/src/main/java/com/curso/ejercicios3/UserDB.java @@ -0,0 +1,126 @@ +package com.curso.ejercicios3; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.io.PrintWriter; +import java.math.BigInteger; +import java.security.MessageDigest; +import java.util.HashSet; +import java.util.Optional; +import java.util.stream.Collectors; + +import javax.security.auth.login.LoginException; + +public class UserDB { + private static final String DB_FILEPATH = "./db/user.csv"; + private HashSet users = new HashSet<>(); + + + public UserDB() { + try { + loadDB(); + } + catch (FileNotFoundException e) { + e.printStackTrace(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + + public boolean loadDB() throws FileNotFoundException, IOException { + File csvFile = new File(UserDB.DB_FILEPATH); + + if (!csvFile.exists()) { + return false; + } + + try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) { + String line; + + while ((line = br.readLine()) != null) { + String[] taskString = line.split(";"); + + User user = new User( + taskString[0], + taskString[1], + taskString[2] + ); + + this.users.add(user); + } + } + + return true; + } + + + public boolean writeDB() throws IOException { + String output = this.users.stream() + .map(user -> new String ( + user.getName() + ";" + user.getDni() + ";" + user.getHashedPassword() + )).collect(Collectors.joining("\n")); + + File csvFile = new File(UserDB.DB_FILEPATH); + + if (!csvFile.exists()) { + csvFile.getParentFile().mkdirs(); + csvFile.createNewFile(); + } + + try (PrintWriter pw = new PrintWriter(csvFile)) { + pw.println(output); + } + + return csvFile.exists(); + } + + + public boolean addUser(User user) { + if (exists(user.getDni())) { + return false; + } + + return this.users.add(user); + } + + + public boolean exists (String dni) { + return this.users.stream() + .filter(u -> u.getDni().equals(dni)) + .findFirst() + .isPresent(); + } + + + public User login (String dni, String password) throws LoginException { + Optional user = this.users.stream() + .filter(u -> u.getDni().equals(dni) && u.getHashedPassword().equals(password)) + .findFirst(); + + if (!user.isPresent()) { + throw new LoginException("Credenciales inválidos"); + } + + return user.get(); + } + + + public static String getSHA512(String input){ + String toReturn = null; + try { + MessageDigest digest = MessageDigest.getInstance("SHA-512"); + digest.reset(); + digest.update(input.getBytes("utf8")); + toReturn = String.format("%0128x", new BigInteger(1, digest.digest())); + } catch (Exception e) { + e.printStackTrace(); + } + + return toReturn; + } +} From 71c4656ce555e235c53ae3b6b9a88fe9110cb9d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Mill=C3=A1n?= Date: Thu, 13 Oct 2022 13:36:35 +0200 Subject: [PATCH 2/2] Sistema de login funcionando --- db/user.csv | 2 + .../java/com/curso/ejercicios3/Constants.java | 5 +- .../main/java/com/curso/ejercicios3/Rome.java | 71 ++++++++++++++-- .../java/com/curso/ejercicios3/Ticket.java | 11 ++- .../java/com/curso/ejercicios3/UserAuth.java | 80 +++++++++++++++++++ .../java/com/curso/ejercicios3/UserDB.java | 23 +----- 6 files changed, 157 insertions(+), 35 deletions(-) create mode 100644 db/user.csv create mode 100644 ejercicios3/src/main/java/com/curso/ejercicios3/UserAuth.java diff --git a/db/user.csv b/db/user.csv new file mode 100644 index 0000000..aec3d3a --- /dev/null +++ b/db/user.csv @@ -0,0 +1,2 @@ +Ruben;2;1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75 +Andres;1;1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75 diff --git a/ejercicios3/src/main/java/com/curso/ejercicios3/Constants.java b/ejercicios3/src/main/java/com/curso/ejercicios3/Constants.java index b231e75..2b79f39 100644 --- a/ejercicios3/src/main/java/com/curso/ejercicios3/Constants.java +++ b/ejercicios3/src/main/java/com/curso/ejercicios3/Constants.java @@ -13,5 +13,8 @@ public class Constants { static final int DEFAULTOPTION = 0; static final int BUY = 1; static final int EXIT = 2; - static final String MENU="Press 1 for buy \nPress 2 for exit "; + static final int REGISTER_USER = 3; + static final int LOGIN_USER = 4; + static final String MENU="Press 1 for buy \nPress 2 for exit\nPress 3 for register user\nPress 4 for login user"; + static final String USERERROR = "You need to be logged in to perform this action"; } diff --git a/ejercicios3/src/main/java/com/curso/ejercicios3/Rome.java b/ejercicios3/src/main/java/com/curso/ejercicios3/Rome.java index 70f55fb..6707d5a 100644 --- a/ejercicios3/src/main/java/com/curso/ejercicios3/Rome.java +++ b/ejercicios3/src/main/java/com/curso/ejercicios3/Rome.java @@ -5,10 +5,14 @@ package com.curso.ejercicios3; import static com.curso.ejercicios3.Constants.*; + +import java.io.IOException; import java.util.ArrayList; import java.util.GregorianCalendar; +import java.util.HashMap; import java.util.HashSet; -import java.util.InputMismatchException; + +import javax.security.auth.login.LoginException; /** * main class @@ -21,6 +25,11 @@ public class Rome { private Casher casher; private HashSet daysTaken; + private User user = null; + private UserDB userDB = new UserDB(); + private UserAuth userAuth = new UserAuth(userDB); + private HashMap tickets = new HashMap<>(); + public Rome() { exit = false; ui = new UserInterface(); @@ -33,6 +42,12 @@ public Rome() { * method that start the program */ public void run() { + try { + userDB.loadDB(); + } catch (IOException e) { + System.out.println("Error reading the file"); + } + //inith a base time, where millisecods, seconds, minutes and hours dont //matter. I will only use, year, month and day, other data will be 0 int numTickets = 0; @@ -48,16 +63,57 @@ public void run() { switch (option) { case BUY: - numTickets = ui.askNumberTicket(); - casher.buyTickets(numTickets); - newTicket(numTickets); + if (user == null) { + System.out.println(USERERROR); + break; + } + else { + numTickets = ui.askNumberTicket(); + casher.buyTickets(numTickets); + newTicket(numTickets); + break; + } + + case REGISTER_USER: + try { + try { + user = userAuth.registerUser(); + userDB.writeDB(); + } + catch (IOException e) { + System.out.println("Error writing the file"); + } + } + catch (LoginException e) { + e.printStackTrace(); + } break; - case EXIT: - exit = true; + + case LOGIN_USER: + try { + user = userAuth.login(); + } + catch (LoginException e) { + e.printStackTrace(); + } break; + case DEFAULTOPTION: System.out.println(MENU); break; + + case EXIT: + exit = true; + + try { + userDB.writeDB(); + } + catch (IOException e) { + e.printStackTrace(); + } + break; + + default: System.out.println(MENU); } @@ -89,6 +145,7 @@ private void newTicket(int numTickets) { for (Ticket ticket : ticketList) { System.out.println(ticket); + tickets.put(ticket, user); } } @@ -114,7 +171,5 @@ private GregorianCalendar editCalendar(ArrayList dateNumber, GregorianC */ private boolean checkCalendar(GregorianCalendar day) { return !daysTaken.contains(day) && baseTime.before(day); - } - } diff --git a/ejercicios3/src/main/java/com/curso/ejercicios3/Ticket.java b/ejercicios3/src/main/java/com/curso/ejercicios3/Ticket.java index b383601..e8ac549 100644 --- a/ejercicios3/src/main/java/com/curso/ejercicios3/Ticket.java +++ b/ejercicios3/src/main/java/com/curso/ejercicios3/Ticket.java @@ -12,7 +12,6 @@ * @author dpadilla */ public class Ticket { - private int price; private static int totalId=0; private int id; @@ -36,9 +35,9 @@ public GregorianCalendar getDate() { public String toString() { return "Ticket{" + "price=" + price + ", id=" + id + ", date=" + date.getTime() + '}'; } - - - - - + + @Override + public int hashCode() { + return id; + } } diff --git a/ejercicios3/src/main/java/com/curso/ejercicios3/UserAuth.java b/ejercicios3/src/main/java/com/curso/ejercicios3/UserAuth.java new file mode 100644 index 0000000..6c30cd0 --- /dev/null +++ b/ejercicios3/src/main/java/com/curso/ejercicios3/UserAuth.java @@ -0,0 +1,80 @@ +package com.curso.ejercicios3; + +import java.util.Scanner; +import java.math.BigInteger; +import java.security.MessageDigest; + +import javax.security.auth.login.LoginException; + +public class UserAuth { + private UserDB userDB; + private Scanner scan = new Scanner(System.in); + + + public UserAuth(UserDB userDB) { + this.userDB = userDB; + } + + + public User login () throws LoginException { + System.out.println("What's your NIF?"); + System.out.print("> "); + String dni = scan.nextLine(); + + System.out.println("Password for " + dni + ":"); + System.out.print("> "); + String password = scan.nextLine(); + String hashedPassword = getSHA512(password); + + User user = null; + + try { + user = userDB.login(dni, hashedPassword); + } + catch (LoginException e) { + throw new LoginException("Incorrect user or/and password"); + } + + return user; + } + + + public User registerUser() throws LoginException { + System.out.println("What's your name?"); + System.out.print("> "); + String name = scan.nextLine(); + + System.out.println("What's your NIF?"); + System.out.print("> "); + String dni = scan.nextLine(); + + System.out.println("Provide your password:"); + System.out.print("> "); + String password = scan.nextLine(); + String hashedPassword = getSHA512(password); + + User user = new User(name, dni, hashedPassword); + + if (!userDB.addUser(user)) { + throw new LoginException("User already exists in the database"); + } + + return user; + } + + + public String getSHA512(String input){ + + String toReturn = null; + try { + MessageDigest digest = MessageDigest.getInstance("SHA-512"); + digest.reset(); + digest.update(input.getBytes("utf8")); + toReturn = String.format("%0128x", new BigInteger(1, digest.digest())); + } catch (Exception e) { + e.printStackTrace(); + } + + return toReturn; + } +} diff --git a/ejercicios3/src/main/java/com/curso/ejercicios3/UserDB.java b/ejercicios3/src/main/java/com/curso/ejercicios3/UserDB.java index 81443c5..e054a46 100644 --- a/ejercicios3/src/main/java/com/curso/ejercicios3/UserDB.java +++ b/ejercicios3/src/main/java/com/curso/ejercicios3/UserDB.java @@ -6,8 +6,6 @@ import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; -import java.math.BigInteger; -import java.security.MessageDigest; import java.util.HashSet; import java.util.Optional; import java.util.stream.Collectors; @@ -46,9 +44,9 @@ public boolean loadDB() throws FileNotFoundException, IOException { String[] taskString = line.split(";"); User user = new User( - taskString[0], - taskString[1], - taskString[2] + taskString[0],//name + taskString[1],//dni + taskString[2]//password ); this.users.add(user); @@ -108,19 +106,4 @@ public User login (String dni, String password) throws LoginException { return user.get(); } - - - public static String getSHA512(String input){ - String toReturn = null; - try { - MessageDigest digest = MessageDigest.getInstance("SHA-512"); - digest.reset(); - digest.update(input.getBytes("utf8")); - toReturn = String.format("%0128x", new BigInteger(1, digest.digest())); - } catch (Exception e) { - e.printStackTrace(); - } - - return toReturn; - } }