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 c31aeed..6707d5a 100644 --- a/ejercicios3/src/main/java/com/curso/ejercicios3/Rome.java +++ b/ejercicios3/src/main/java/com/curso/ejercicios3/Rome.java @@ -5,23 +5,31 @@ 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 * @author dpadilla */ public class Rome { - private GregorianCalendar baseTime; private boolean exit; private UserInterface ui; 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(); @@ -34,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; @@ -49,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); } @@ -77,7 +132,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()); @@ -90,6 +145,7 @@ private void newTicket(int numTickets) { for (Ticket ticket : ticketList) { System.out.println(ticket); + tickets.put(ticket, user); } } @@ -115,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/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/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 new file mode 100644 index 0000000..e054a46 --- /dev/null +++ b/ejercicios3/src/main/java/com/curso/ejercicios3/UserDB.java @@ -0,0 +1,109 @@ +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.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],//name + taskString[1],//dni + taskString[2]//password + ); + + 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(); + } +}