From b643d2d6876e8870b8b72e34d0d3fe9f471ddb55 Mon Sep 17 00:00:00 2001 From: obai Albek <3009594@stud.hs-mannheim.de> Date: Fri, 30 May 2025 01:37:18 +0200 Subject: [PATCH] Implement user registration and login functionality --- MailSystem/src/domain/User.java | 54 ++++++++++++ MailSystem/src/domain/UserEmail.java | 32 +++++++ MailSystem/src/domain/UserManager.java | 86 +++++++++++++++++++ .../exception/UserAlreadyExistsException.java | 7 ++ .../src/domain/unitTest/AddUserTest.java | 75 ++++++++++++++++ .../src/domain/unitTest/CheckLoginTest.java | 34 ++++++++ MailSystem/src/module-info.java | 3 + 7 files changed, 291 insertions(+) create mode 100644 MailSystem/src/domain/User.java create mode 100644 MailSystem/src/domain/UserEmail.java create mode 100644 MailSystem/src/domain/UserManager.java create mode 100644 MailSystem/src/domain/exception/UserAlreadyExistsException.java create mode 100644 MailSystem/src/domain/unitTest/AddUserTest.java create mode 100644 MailSystem/src/domain/unitTest/CheckLoginTest.java diff --git a/MailSystem/src/domain/User.java b/MailSystem/src/domain/User.java new file mode 100644 index 0000000..dda9db8 --- /dev/null +++ b/MailSystem/src/domain/User.java @@ -0,0 +1,54 @@ +package domain; + +import java.time.LocalDate; + +public class User { + + private static int counter = 1000; + private int userID; + private String firstname; + private String lastname; + private LocalDate birthdate; + private UserEmail usermail; + + public User(String firstname, String lastname, LocalDate birthdate,String nutzername, char[] password) { + this.userID = counter++; + this.firstname = firstname; + this.lastname = firstname; + this.birthdate = birthdate; + this.usermail = new UserEmail(nutzername,password); + } + + public String getFirstname() { + return firstname; + } + + public void setFirstname(String firstname) { + this.firstname = firstname; + } + + public String getLastname() { + return lastname; + } + + public void setLastname(String lastname) { + this.lastname = lastname; + } + + public LocalDate getBirthdate() { + return birthdate; + } + + public void setBirthdate(LocalDate birthdate) { + this.birthdate = birthdate; + } + + public int getUserID() { + return userID; + } + + public UserEmail getUsermail() { + return usermail; + } + +} diff --git a/MailSystem/src/domain/UserEmail.java b/MailSystem/src/domain/UserEmail.java new file mode 100644 index 0000000..c7dd4be --- /dev/null +++ b/MailSystem/src/domain/UserEmail.java @@ -0,0 +1,32 @@ +package domain; + +public class UserEmail { + + private static int counter = 1000; + private int accountID; + private String username; + private char[] password; + + public UserEmail(String username, char[] password) { + this.username = username; + this.password = password; + this.accountID = counter++; + } + + public String getUsername() { + return username; + } + + public char[] getPassword() { + return password; + } + + public void setPassword(char[] password) { + this.password = password; + } + + public int getAccountID() { + return accountID; + } + +} diff --git a/MailSystem/src/domain/UserManager.java b/MailSystem/src/domain/UserManager.java new file mode 100644 index 0000000..7d6ee2b --- /dev/null +++ b/MailSystem/src/domain/UserManager.java @@ -0,0 +1,86 @@ +package domain; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Arrays; + +import domain.exception.UserAlreadyExistsException; + +public class UserManager { + + private ArrayList users; + + public UserManager() { + this.users = new ArrayList<>(); + } + + public boolean addUser(String firstName, String lastName, String username, + int year, int day, String monthName, + char[] password, char[] passwordConfirmation) throws Exception { + + if (firstName == null || lastName == null || username == null || password == null || passwordConfirmation == null) { + throw new IllegalArgumentException("No input should be null!"); + } + + if (firstName.trim().isEmpty() || lastName.trim().isEmpty() || username.trim().isEmpty() || + password.length == 0 || passwordConfirmation.length == 0) { + throw new IllegalArgumentException("All fields are required!"); + } + + if (!Arrays.equals(password, passwordConfirmation)) + throw new IllegalArgumentException("Passwords do not match!"); + + String email = username + "@easymail.de"; + + for (User tempUser : users) + if (tempUser.getUsermail().getUsername().equalsIgnoreCase(email)) + throw new UserAlreadyExistsException("This email address is already taken!"); + + int month = getMonthNumber(monthName); + if (month == 0) + throw new IllegalArgumentException("Invalid month name: " + monthName); + + LocalDate birthDate = LocalDate.of(year, month, day); + char[] passwordCopy = Arrays.copyOf(password, password.length); + User newUser = new User(firstName, lastName, birthDate, email, passwordCopy); + + users.add(newUser); + + Arrays.fill(password, ' '); + Arrays.fill(passwordConfirmation, ' '); + return true; + } + + public boolean checkLogin(String username, char[] password) { + if (username == null || password == null) return false; + + for (User user : users) + if (user.getUsermail().getUsername().equalsIgnoreCase(username) + && Arrays.equals(user.getUsermail().getPassword(), password)) { + Arrays.fill(password, ' '); + return true; + } + Arrays.fill(password, ' '); + return false; + } + + + private int getMonthNumber(String txtMonth) { + switch (txtMonth.toLowerCase()) { + case "januar": return 1; + case "februar": return 2; + case "märz": return 3; + case "april": return 4; + case "mai": return 5; + case "juni": return 6; + case "juli": return 7; + case "august": return 8; + case "september": return 9; + case "oktober": return 10; + case "november": return 11; + case "dezember": return 12; + default: return 0; + } + } +} + diff --git a/MailSystem/src/domain/exception/UserAlreadyExistsException.java b/MailSystem/src/domain/exception/UserAlreadyExistsException.java new file mode 100644 index 0000000..97d59d4 --- /dev/null +++ b/MailSystem/src/domain/exception/UserAlreadyExistsException.java @@ -0,0 +1,7 @@ +package domain.exception; + +public class UserAlreadyExistsException extends Exception { + public UserAlreadyExistsException(String msg) { + super(msg); + } +} diff --git a/MailSystem/src/domain/unitTest/AddUserTest.java b/MailSystem/src/domain/unitTest/AddUserTest.java new file mode 100644 index 0000000..482e148 --- /dev/null +++ b/MailSystem/src/domain/unitTest/AddUserTest.java @@ -0,0 +1,75 @@ +package domain.unitTest; +import static org.junit.Assert.*; +import static org.junit.Assert.assertThrows; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import domain.UserManager; + +class AddUserTest { + private UserManager userManager; + + @BeforeEach + void setUp() { + userManager = new UserManager(); + } + + @Test + void testLeererVorname() { + Exception ex = assertThrows(Exception.class, () -> { + userManager.addUser("", "Test","nutzer", 2000, 1, "Januar", new char[]{'1'}, new char[]{'1'}); + }); + assertEquals("Alle Felder sind erforderlich!", ex.getMessage()); + } + + @Test + void testLeererNachname() { + Exception ex = assertThrows(Exception.class, () -> { + userManager.addUser("Max", "","nutzer", 2000, 1, "Januar", new char[]{'1'}, new char[]{'1'}); + }); + assertEquals("Alle Felder sind erforderlich!", ex.getMessage()); + } + + @Test + void testLeererNutzername() { + Exception ex = assertThrows(Exception.class, () -> { + userManager.addUser("Max", "Mustermann","", 2000, 1, "Januar", new char[]{'1'}, new char[]{'1'}); + }); + assertEquals("Alle Felder sind erforderlich!", ex.getMessage()); + } + + @Test + void testLeeresPasswort() { + Exception ex = assertThrows(Exception.class, () -> { + userManager.addUser("Max", "Mustermann","nutzer",2000, 1, "Januar", new char[]{}, new char[]{}); + }); + assertEquals("Alle Felder sind erforderlich!", ex.getMessage()); + } + + @Test + void testPasswoerterUnterschiedlich() { + Exception ex = assertThrows(Exception.class, () -> { + userManager.addUser("Max", "Mustermann","nutzer",2000, 1, "Januar", new char[]{'1','2'}, new char[]{'1','3'}); + }); + assertEquals("Passwörter stimmen nicht überein!", ex.getMessage()); + } + + @Test + void testNutzernameBereitsVergeben() throws Exception { + // Ersten Nutzer hinzufügen + userManager.addUser("Max", "Mustermann","nutzer",2000, 1, "Januar" , new char[]{'1'}, new char[]{'1'}); + + // Zweiter Nutzer mit gleicher E-Mail + Exception ex = assertThrows(Exception.class, () -> { + userManager.addUser("Moritz", "Muster","nutzer", 2001, 2, "Februar", new char[]{'1'}, new char[]{'1'}); + }); + assertEquals("Diese E-Mail-Adresse ist bereits vergeben!", ex.getMessage()); + } + + @Test + void testErfolgreichHinzufuegen() throws Exception { + boolean result = userManager.addUser("Anna", "Beispiel","anna",1995, 15, "Mai", new char[]{'1'}, new char[]{'1'}); + assertTrue(result); + } +} diff --git a/MailSystem/src/domain/unitTest/CheckLoginTest.java b/MailSystem/src/domain/unitTest/CheckLoginTest.java new file mode 100644 index 0000000..a103827 --- /dev/null +++ b/MailSystem/src/domain/unitTest/CheckLoginTest.java @@ -0,0 +1,34 @@ +package domain.unitTest; + +import static org.junit.Assert.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import domain.UserManager; + +class CheckLoginTest { + private UserManager userManager; + + @BeforeEach + void setUp() throws Exception { + userManager = new UserManager(); + char[] pw = {'1','2','3','4'}; + userManager.addUser("Ali", "Test","ali.test",2000, 1, "Januar", pw, pw.clone()); + } + + @Test + void testLoginMitKorrektenDaten() { + assertTrue(userManager.checkLogin("ali.test@easymail.de", new char[]{'1','2','3','4'})); + } + + @Test + void testLoginMitFalschemPasswort() { + assertFalse(userManager.checkLogin("ali.test@easymail.de", new char[]{'1','1','1','1'})); + } + + @Test + void testLoginMitFalschemNutzername() { + assertFalse(userManager.checkLogin("nicht.vorhanden@easymail.de", new char[]{'1','2','3','4'})); + } +} diff --git a/MailSystem/src/module-info.java b/MailSystem/src/module-info.java index db48e53..bb36cb9 100644 --- a/MailSystem/src/module-info.java +++ b/MailSystem/src/module-info.java @@ -5,4 +5,7 @@ * */ module MailSystem { + requires java.desktop; + requires junit; + requires org.junit.jupiter.api; } \ No newline at end of file