From 0a4721e91e020cbbe9d534c410133f9d51b29457 Mon Sep 17 00:00:00 2001 From: Robin Strand Prestmo Date: Tue, 3 Mar 2026 16:49:27 +0100 Subject: [PATCH 1/6] Added getHashPassword to PasswordHasher --- .../helpmehelpapplication.iml | 6 +++ .../team6/models/PasswordHasher.java | 52 +++++++++++++++++++ .../sytemutvikling/team6/models/User.java | 6 +-- 3 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 helpmehelpapplication/helpmehelpapplication.iml create mode 100644 helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/PasswordHasher.java diff --git a/helpmehelpapplication/helpmehelpapplication.iml b/helpmehelpapplication/helpmehelpapplication.iml new file mode 100644 index 0000000..9e3449c --- /dev/null +++ b/helpmehelpapplication/helpmehelpapplication.iml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/PasswordHasher.java b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/PasswordHasher.java new file mode 100644 index 0000000..8c2c7ce --- /dev/null +++ b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/PasswordHasher.java @@ -0,0 +1,52 @@ +package ntnu.sytemutvikling.team6.models; + +import javax.crypto.SecretKeyFactory; +import javax.crypto.interfaces.PBEKey; +import javax.crypto.spec.PBEKeySpec; +import java.security.SecureRandom; +import java.util.Base64; + +/** + * A password hasher + * + *

+ * Description + *

+ * + * @author Robin Strand Prestmo + */ +public final class PasswordHasher { + private static final SecureRandom RNG = new SecureRandom(); + + /** + * Get the hash of the password + * + * @param password a string password + * @return a hash secured password + */ + public String getHashPassword(String password) { + String hasPass = ""; + + try { + // 1. Create salt + byte[] salt = new byte[16]; + RNG.nextBytes(salt); + + // 2. Create PBKDF2 Hash value + PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 100000, 32*8); + SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); + byte[] hash = factory.generateSecret(spec).getEncoded(); + + // 3. Combine salt and password bytes + byte[] hashBytes = new byte[48]; + System.arraycopy(salt, 0, hashBytes, 0, 16); + System.arraycopy(hash, 0, hashBytes, 16, 32); + + //4. Turn the combined salt+hash into a string. + hasPass = Base64.getEncoder().encodeToString(hashBytes); + } catch (Exception e) { + throw new RuntimeException("Error while hasing password.", e); + } + return hasPass; + } +} diff --git a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/User.java b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/User.java index 283bfa1..afa414a 100644 --- a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/User.java +++ b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/User.java @@ -2,9 +2,9 @@ import java.util.UUID; -// Passord må hashes!!! -// Unntakshåndtering mangler -// Enhetstesting mangler +// TODO: Passord må hashes!!! +// TODO: Unntakshåndtering mangler +// TODO: Enhetstesting mangler /** * Represents a user. From eed6f98d875d54cc53ba2eaf8c923f503b08efb8 Mon Sep 17 00:00:00 2001 From: Robin Strand Prestmo Date: Tue, 3 Mar 2026 17:44:57 +0100 Subject: [PATCH 2/6] Added isValidPassword to PasswordHasher --- .../team6/models/PasswordHasher.java | 73 +++++++++++++++---- 1 file changed, 57 insertions(+), 16 deletions(-) diff --git a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/PasswordHasher.java b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/PasswordHasher.java index 8c2c7ce..72d3562 100644 --- a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/PasswordHasher.java +++ b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/PasswordHasher.java @@ -1,17 +1,17 @@ package ntnu.sytemutvikling.team6.models; -import javax.crypto.SecretKeyFactory; -import javax.crypto.interfaces.PBEKey; -import javax.crypto.spec.PBEKeySpec; +import java.security.MessageDigest; import java.security.SecureRandom; import java.util.Base64; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.PBEKeySpec; /** - * A password hasher + * A utility for hashing and verifying passwords using PBKDF2. * - *

- * Description - *

+ *

The generated hash contains both a random salt and the hashed password, + * encoded as Base64 string. + *

* * @author Robin Strand Prestmo */ @@ -19,13 +19,18 @@ public final class PasswordHasher { private static final SecureRandom RNG = new SecureRandom(); /** - * Get the hash of the password + * Hashes a password using PBKDF2 and a random salt. * - * @param password a string password - * @return a hash secured password + * @param password the password to hash. + * @return a Base64 string containing the salt and the hashed password. + * @throws IllegalArgumentException if the password is null or blank. */ public String getHashPassword(String password) { - String hasPass = ""; + if (password == null || password.isBlank()) { + throw new IllegalArgumentException("Password cannot be null or blank."); + } + + String hashPass = ""; try { // 1. Create salt @@ -33,7 +38,7 @@ public String getHashPassword(String password) { RNG.nextBytes(salt); // 2. Create PBKDF2 Hash value - PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 100000, 32*8); + PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 100000, 32 * 8); SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); byte[] hash = factory.generateSecret(spec).getEncoded(); @@ -42,11 +47,47 @@ public String getHashPassword(String password) { System.arraycopy(salt, 0, hashBytes, 0, 16); System.arraycopy(hash, 0, hashBytes, 16, 32); - //4. Turn the combined salt+hash into a string. - hasPass = Base64.getEncoder().encodeToString(hashBytes); + // 4. Turn the combined salt+hash into a string. + hashPass = Base64.getEncoder().encodeToString(hashBytes); + } catch (Exception e) { + throw new RuntimeException("Error while hashing password.", e); + } + return hashPass; + } + + /** + * Checks if the password matches a perviously stored hash. + * + * @param password The password the user types. + * @param hashPass Is the stored hashed password + * @return True if password is valid, otherwise false. + */ + public boolean isValidPassword(String password, String hashPass) { + if (password == null || password.isBlank()) { + return false; + } + + try { + // Extract the bytes + byte[] hashBytes = Base64.getDecoder().decode(hashPass); + + // Get salt + byte[] salt = new byte[16]; + System.arraycopy(hashBytes, 0, salt, 0, 16); + + // Compute the hash on the password the user entered + PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 100000, 32 * 8); + SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); + byte[] hash = factory.generateSecret(spec).getEncoded(); + + // Compare results + byte[] storedHash = new byte[32]; + System.arraycopy(hashBytes, 16, storedHash, 0, 32); + + return MessageDigest.isEqual(storedHash, hash); + } catch (Exception e) { - throw new RuntimeException("Error while hasing password.", e); + throw new RuntimeException("Error while validating password.", e); } - return hasPass; } } From 9b9d8eafa856c2419190fa97f8409ef539a9232c Mon Sep 17 00:00:00 2001 From: Robin Strand Prestmo Date: Tue, 3 Mar 2026 17:55:13 +0100 Subject: [PATCH 3/6] Added password hashing to User --- .../ntnu/sytemutvikling/team6/models/User.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/User.java b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/User.java index afa414a..a6a87ad 100644 --- a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/User.java +++ b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/User.java @@ -2,7 +2,6 @@ import java.util.UUID; -// TODO: Passord må hashes!!! // TODO: Unntakshåndtering mangler // TODO: Enhetstesting mangler @@ -12,10 +11,12 @@ * @author Robin Strand Prestmo */ public class User { + private static final PasswordHasher passwordHasher = new PasswordHasher(); + private final UUID id; private String name; private String email; - private String password; + private String passwordHash; private final String role; private final Settings settings; private final Inbox inbox; @@ -43,7 +44,7 @@ public User(UUID id, this.id = id; this.name = name; this.email = email; - this.password = password; + this.passwordHash = passwordHasher.getHashPassword(password); this.role = role; this.settings = settings; this.inbox = inbox; @@ -77,16 +78,21 @@ public Inbox getInbox() { // Add Setters - public void setName(String name) { this.name = name; } public void setPassword(String password) { - this.password = password; + this.passwordHash = passwordHasher.getHashPassword(password); } public void setEmail(String email) { this.email = email; } -} + + // Other methods + + public boolean checkPassword(String password) { + return passwordHasher.isValidPassword(password, passwordHash); + } +} \ No newline at end of file From ab2de3dd6ec22523a78efad5ffc8da1ddd17fa90 Mon Sep 17 00:00:00 2001 From: Robin Strand Prestmo Date: Tue, 3 Mar 2026 18:44:40 +0100 Subject: [PATCH 4/6] Added Junit tests to PasswordHasher --- .../sytemutvikling/team6/models/Donation.java | 2 + .../sytemutvikling/team6/models/Feedback.java | 2 + .../team6/models/{ => user}/Inbox.java | 2 +- .../team6/models/{ => user}/Language.java | 2 +- .../team6/models/{ => user}/Message.java | 2 +- .../team6/models/{ => user}/Role.java | 2 +- .../team6/models/{ => user}/Settings.java | 2 +- .../team6/models/{ => user}/User.java | 4 +- .../{models => security}/PasswordHasher.java | 2 +- .../team6/security/PasswordHasherTest.java | 70 ++++++++++++++++++ .../ntnu/sytemutvikling/team6/Main.class | Bin 0 -> 568 bytes .../sytemutvikling/team6/models/Charity.class | Bin 1676 -> 1676 bytes .../team6/models/CharityRegistry.class | Bin 2899 -> 2943 bytes .../team6/models/Donation.class | Bin 1787 -> 1813 bytes .../team6/models/DonationRegistry.class | Bin 2924 -> 2970 bytes .../team6/models/Feedback.class | Bin 1537 -> 1563 bytes .../sytemutvikling/team6/models/Inbox.class | Bin 2879 -> 0 bytes .../team6/models/Language.class | Bin 1040 -> 0 bytes .../sytemutvikling/team6/models/Message.class | Bin 1549 -> 0 bytes .../sytemutvikling/team6/models/Role.class | Bin 1075 -> 0 bytes .../team6/models/Settings.class | Bin 1589 -> 0 bytes .../sytemutvikling/team6/models/User.class | Bin 1787 -> 0 bytes .../team6/models/UserRegistry.class | Bin 327 -> 327 bytes .../team6/models/user/Inbox.class | Bin 0 -> 2973 bytes .../team6/models/user/Language.class | Bin 0 -> 1146 bytes .../team6/models/user/Message.class | Bin 0 -> 1559 bytes .../team6/models/user/Role.class | Bin 0 -> 1181 bytes .../team6/models/user/Settings.class | Bin 0 -> 1624 bytes .../team6/models/user/User.class | Bin 0 -> 2320 bytes .../team6/security/PasswordHasher.class | Bin 0 -> 2772 bytes ...sswordHasherTest$getHashPasswordTest.class | Bin 0 -> 2725 bytes ...sswordHasherTest$isValidPasswordTest.class | Bin 0 -> 3211 bytes .../team6/security/PasswordHasherTest.class | Bin 0 -> 772 bytes 33 files changed, 83 insertions(+), 7 deletions(-) rename helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/{ => user}/Inbox.java (97%) rename helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/{ => user}/Language.java (70%) rename helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/{ => user}/Message.java (97%) rename helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/{ => user}/Role.java (70%) rename helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/{ => user}/Settings.java (97%) rename helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/{ => user}/User.java (94%) rename helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/{models => security}/PasswordHasher.java (98%) create mode 100644 helpmehelpapplication/src/test/java/ntnu/sytemutvikling/team6/security/PasswordHasherTest.java create mode 100644 helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/Main.class delete mode 100644 helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/Inbox.class delete mode 100644 helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/Language.class delete mode 100644 helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/Message.class delete mode 100644 helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/Role.class delete mode 100644 helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/Settings.class delete mode 100644 helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/User.class create mode 100644 helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/user/Inbox.class create mode 100644 helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/user/Language.class create mode 100644 helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/user/Message.class create mode 100644 helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/user/Role.class create mode 100644 helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/user/Settings.class create mode 100644 helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/user/User.class create mode 100644 helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/security/PasswordHasher.class create mode 100644 helpmehelpapplication/target/test-classes/ntnu/sytemutvikling/team6/security/PasswordHasherTest$getHashPasswordTest.class create mode 100644 helpmehelpapplication/target/test-classes/ntnu/sytemutvikling/team6/security/PasswordHasherTest$isValidPasswordTest.class create mode 100644 helpmehelpapplication/target/test-classes/ntnu/sytemutvikling/team6/security/PasswordHasherTest.class diff --git a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Donation.java b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Donation.java index 16e44cb..c72fbee 100644 --- a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Donation.java +++ b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Donation.java @@ -1,5 +1,7 @@ package ntnu.sytemutvikling.team6.models; +import ntnu.sytemutvikling.team6.models.user.User; + import java.time.LocalDateTime; import java.util.UUID; diff --git a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Feedback.java b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Feedback.java index 2a0657e..4825c95 100644 --- a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Feedback.java +++ b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Feedback.java @@ -1,5 +1,7 @@ package ntnu.sytemutvikling.team6.models; +import ntnu.sytemutvikling.team6.models.user.User; + import java.time.LocalDateTime; import java.util.UUID; diff --git a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Inbox.java b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/Inbox.java similarity index 97% rename from helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Inbox.java rename to helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/Inbox.java index 00c8f52..2aa0605 100644 --- a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Inbox.java +++ b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/Inbox.java @@ -1,4 +1,4 @@ -package ntnu.sytemutvikling.team6.models; +package ntnu.sytemutvikling.team6.models.user; import java.util.*; diff --git a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Language.java b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/Language.java similarity index 70% rename from helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Language.java rename to helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/Language.java index d4ab0ae..0afb14c 100644 --- a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Language.java +++ b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/Language.java @@ -1,4 +1,4 @@ -package ntnu.sytemutvikling.team6.models; +package ntnu.sytemutvikling.team6.models.user; /** * Supported application languages. diff --git a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Message.java b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/Message.java similarity index 97% rename from helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Message.java rename to helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/Message.java index 10ea569..eba920f 100644 --- a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Message.java +++ b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/Message.java @@ -1,4 +1,4 @@ -package ntnu.sytemutvikling.team6.models; +package ntnu.sytemutvikling.team6.models.user; import java.time.LocalDateTime; import java.util.UUID; diff --git a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Role.java b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/Role.java similarity index 70% rename from helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Role.java rename to helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/Role.java index cde9117..74e134f 100644 --- a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Role.java +++ b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/Role.java @@ -1,4 +1,4 @@ -package ntnu.sytemutvikling.team6.models; +package ntnu.sytemutvikling.team6.models.user; /** * Available users diff --git a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Settings.java b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/Settings.java similarity index 97% rename from helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Settings.java rename to helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/Settings.java index cd70f0a..6bbc685 100644 --- a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/Settings.java +++ b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/Settings.java @@ -1,4 +1,4 @@ -package ntnu.sytemutvikling.team6.models; +package ntnu.sytemutvikling.team6.models.user; // Mangler Enhetstesting diff --git a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/User.java b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/User.java similarity index 94% rename from helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/User.java rename to helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/User.java index a6a87ad..654fff6 100644 --- a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/User.java +++ b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/User.java @@ -1,4 +1,6 @@ -package ntnu.sytemutvikling.team6.models; +package ntnu.sytemutvikling.team6.models.user; + +import ntnu.sytemutvikling.team6.security.PasswordHasher; import java.util.UUID; diff --git a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/PasswordHasher.java b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/security/PasswordHasher.java similarity index 98% rename from helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/PasswordHasher.java rename to helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/security/PasswordHasher.java index 72d3562..60b2876 100644 --- a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/PasswordHasher.java +++ b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/security/PasswordHasher.java @@ -1,4 +1,4 @@ -package ntnu.sytemutvikling.team6.models; +package ntnu.sytemutvikling.team6.security; import java.security.MessageDigest; import java.security.SecureRandom; diff --git a/helpmehelpapplication/src/test/java/ntnu/sytemutvikling/team6/security/PasswordHasherTest.java b/helpmehelpapplication/src/test/java/ntnu/sytemutvikling/team6/security/PasswordHasherTest.java new file mode 100644 index 0000000..68a9409 --- /dev/null +++ b/helpmehelpapplication/src/test/java/ntnu/sytemutvikling/team6/security/PasswordHasherTest.java @@ -0,0 +1,70 @@ +package ntnu.sytemutvikling.team6.security; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class PasswordHasherTest { + private final PasswordHasher hasher = new PasswordHasher(); + + @Nested + class getHashPasswordTest { + + @Test + void shouldThrowIfPasswordIsNull() { + assertThrows(IllegalArgumentException.class, () -> hasher.getHashPassword(null)); + } + + @Test + void shouldThrowIfPasswordIsBlank() { + assertThrows(IllegalArgumentException.class, () -> hasher.getHashPassword(" ")); + } + + @Test + void shouldReturnDifferentHashesForSamePasswordBecauseSaltIsRandom() { + String test1 = hasher.getHashPassword("Password"); + String test2 = hasher.getHashPassword("Password"); + + assertNotEquals(test1, test2); + } + } + + @Nested + class isValidPasswordTest { + + @Test + void shouldReturnTrueForCorrectPassword() { + String test = hasher.getHashPassword("Password"); + assertTrue(hasher.isValidPassword("Password", test)); + } + + @Test + void shouldReturnFalseForWrongPassword() { + String test = hasher.getHashPassword("Password"); + assertFalse(hasher.isValidPassword("password", test)); + } + + @Test + void shouldReturnFalseIfPasswordIsBlank() { + String test = hasher.getHashPassword("Test"); + assertFalse(hasher.isValidPassword(" ", test)); + } + + @Test + void shouldReturnFalseIfPasswordIsNull() { + String test = hasher.getHashPassword("Test"); + assertFalse(hasher.isValidPassword(null, test)); + } + + @Test + void shouldThrowIfStoredHashIsNull() { + assertThrows(RuntimeException.class, () -> hasher.isValidPassword("Password", null)); + } + + @Test + void shouldThrowIfStoredHashIsBlank() { + assertThrows(RuntimeException.class, () -> hasher.isValidPassword("Password", " ")); + } + } +} \ No newline at end of file diff --git a/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/Main.class b/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..110f8b9c4ad1592f72a4edc10270d108662df524 GIT binary patch literal 568 zcmaKqO;5r=5Qg97tF%@@5d22)1Rm^74;U{-Z03Duo}KLUwg{v5`fNp*Z3b?noXCovYr+>nn!bkqCr3 zW=J<%T@!hj1}qy3u>X{Ireo##R29b5RB;oK2%YOl1gfJVkNfRBmKf}FPs*_V7)El? zuu#OZfs&0fRv5~2x)_WH&5!|Mn=@`QAVEbiY`3}wstmP21+g=p(h#wlh##nRGwoqSe-DA`ret)gP3~Ief_#erR-vL+L|Ta;IHqHmQm2xRf-CpZ zg~J2!7x)M4P*D)viCg#LA5pw-C@7fCJ@?&v-#O>r1NXqa_wDz`&j7Ar&4C8phQVRN zVkqqd&jWuqhzI`dM>}CZVX!Vnag-2V)qw;cyhd8H)M%vn1N}H#e_emG4-y zP{f3d62~N_Qn!#x@rmxEl^_t_D$7u#9+TRL?(c>uGW?=VioRPm+)m?zDrWQHQp_P7_E322_ z=qTo~evpKNz2S@W=Z1EnC2z2%e8B4OJ*~-J7U>v(O_9t~rYX-klB*oaMUJGOBXQ

24Pnmfr$^WGq|FYVOn?@DnidtQ=uUyK4GDEgl2}bVktvg z{?OOYD+f&dR+q{Bb=4-s$*=-`tl<-?DN`K6l|93oRLcKW+w#qb>a_emqFRw9^M8h# zyk#y{=CL|LvmsxZtr_dMvqCCoR{*!sG7%#<>PgHg zm`D(^d+sZ@x$pY@=7ZfmuNxkHC<#Kscb|KN{MK1}I}D`X-yo!W-mn|U7oi;ZDn~PO z1WOLvULc=IuScNAgjClJz5XCLP?E~(J>5?yuS;KsHwf1p^_wdE<*(M-tkfFxJPUCY zZA_y?hmg$tN7F-w??47?2GesgE%?kyV^F@N-^vP-yR!$5KZghd-BQo5?xnD|>Q z+pv(9EKKZDC&EwHl~o(Rnx{KQXlKF3cY4Oyg1&P7UL?W zr6OdZ2w5gV7KxCbM##f>RxYaZY=-4=j?Wop-tp7~Sz4U743lZYaNyy=}N1{nO(>HsYa7g-!jB8%Bqv7=d|*_ zY(u>r!!D>FW7s8?HU6JaRric#{&5>)G*{Fc!zq+bJL~LIyGe=!=ThH{`k0oEtgPf( gQ9EsM9-S>MI>)HaKINULhsj1J&2tEw+==1lAF6t6vj6}9 diff --git a/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/CharityRegistry.class b/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/CharityRegistry.class index 61b85038c64275096044f821b577e36bed01d1fc..c923756121ae7c43839e549f30a867c6dec35aa1 100644 GIT binary patch literal 2943 zcmb7GZC4vb7`+3OO_t@w@KOkZfV545C5VdFP!uTGXegDp3TkyoCShT-OEt6;b!Um8J(1i~5Mk)|2Dy%Iq?c`*S95yBQK6tciY{mhx;6Bm zmtoFyOgCMrI-=}4XZneu6Rab6c_Cf43c{$QSC6=@JJl^wA_%+65Y2l%x~PzrT%AW! zWK_I?n1X%{0~ll&tp8rM41>h#mMQ1CCc*1PogW%PPGp!$G-D;3I~3fcarN-CgjnLn zvR!h^!gSW2=f$Zch+u>v9th7CCi2{zFfC`|P)wMvVa%!+!l-ofO;Q-pdVX#@HpQPw z?sZ`tZz-72Fo`LKo_ZL**iN#7Okx;KgjM>zX@a4jnHVkKw1!)_&CuZp8RT3z$lcxS zgG_jO(KS7T(vNLX(DU38nJy%dRFKjzgLfEi)`c{1Q3@1w!x1*ay)eapAchGWFg&hV z4Qb5LA{TYDu&&!u^iV^Lo1Vqo$V4#DFdVpi#bfE<`x-vL0%avH6q=m&GdGhwh=E~R z4!)=1V`La2wkTU?B3opb{J&5RRNTjsf=@Jjie-jGtJ%zOqa>UxsfslO=PikfRXk9z zreR&G4=uj@O;(F%E;lHPquYAP*j6ZMhm=c%&^qpi|o8+M7=VD zg6vqSN~>>&m-9;U*Yc`XVZ2G<3ggXT=-zgC{$zun25xM%gnLc-D&=gTp5bnyWv8il zFerJyXfmW)pGblEsb8b*zZ%#9ZAXKb4-0&{VemBV+51<9w@#iU;NbwcY2hTax^203 zUaadfB?kh5mq|4%ixSoJ70Ys{qVUrV;T&0oN*@+_J0Vm$af%wg!_z(-UDL}00yvfc zCmO!RQ)-n}n6MO_YIp`JccJ4zH_xmSk7RR#!RP`aAH+EBV1BU-Cn4 z77S6D&RN!pdz$gLbogWl^)yV}sh*1P@Ya9&l&_x~lWP^~#@D%*OF#h_XRP1~&=p5{#YY3=X$K=g{-k(vc4G-y3LDdwU^vqJv z3fk!l=u4f0rCveVKS%Ues6Tt7Kc{C8jQ}F(K$LJ)d_gVEpMxAWsKxLIn}jX#=BXv| zBB@`X{)WDv=(`OPM=}E4q4|+uzOU>t{r?hM0Zx@zrT)aspXh#tq5atKIpTjv)C-I; z%)G?gzyUJwLD1*27{!H~QwP~_tG9yP}yz2$Nl)R#vArQl1auL}KB LiO|6ro@3-+g`fA8 literal 2899 zcmb7GZBrXn7(F*oHiU(Q6tDz~KxrF-B|x=WLs6h0(NHRH6@0xUH(_D3OEzr)Y_YXzhX6VejcABWr zbwqpr~xu)y6T&p57^90o~rx}_(&(M~f*kNd2BApSmp<6{K zA_}4m*X#TXmc^@5L$=9NNThs>;+x-Qs|~8o}6fkp3LUoIJ{CyA{fF=1#dI-*W+F?b)5>MnMOs$ zFy5i6I0lteE4snSj4+HPo5ft9E?U%#g5L#;)og*`PS9<8JNq~jbXz}`tX!wSHd->g zQm_ifNq4>fvJ_^C>kC%NDGS41evub0e;9Wd629zgVIX_a|XF@-esA&mnK3d2xC`MlFK!O&$UPO~G zER8SFdDSKs3s&Wtn>1Ifsao!JPMk-@U4rT*o$Br z&lJ#lOt!jPReXtEhHJF4KRfD zldmuhoZ-C?{d~kAdD>i_1Tg`m5hjquXN`oPBiBSY zTqCT-O(Czzke`I`bB)xi(kPLR5$Sk`Clk z#rj=LukxLqbONBxZWX{2)c`;l``)GD*r%r~iAHCKD8qE$j!}UPhwfyhDoKk%=lt||O zzK{taf&m4CD$Zd@AZfdHRj(YmW~u5PS_ego#I9+SruC9jFpCvE>)3{CIkrG3zh{&! z_h_|1nVsUES8)LsDcC4ERh!C1R?=Nk5yNGHK*4ZLfmj{tS|wA@IeDX)p6WEbeGTiBb~v);^h^k#OIH?x{JD`1OZlH+~ue!$Ndz^wKeLi+-xhJJ0V zhGA`@hNu<`)DYKV!5T(l!DHM!M)D2%G@j~j(X076eIi;<#TNKPcC?*&r6c$$mO6mr?cf(3!CC&6oz8ir9lX{NyzC{n F@*7S2l79dI literal 1787 zcma)7+fEZv6kVscp=G!#Vg*D*Xggd65K+oSD+MJf`oQIZx1pWDKs#gFDG9&g5BOrD zCKinket>WOkh;#a1uZotlg!@d%wBu1z0W%Bk6+)u16apP1wMgC%bmp3cvU_Ts zcT?%dmC+I;qx?9+Si#=d#9G zN8m@FiXPk&@W&H-5!}Wd1yO;{f2XQq0D}UNqG9Kpf}FEJZ#>aB`!EFVst6(^y?ZJY zv`O#2iZCM5d!V8ns`SQHbf7bWI5Y(bfw7jOm)uoMV3LzOG~I2}btxTAa*9k^qU+&H z5lmx7fqoq&)>_IQzH@N!AEE1j6zTl?z75xjCg*6#Qt+Gh9J)Kr23u>P+_nwZ=V;b@{B?mCG7f@p$u!2GE$l3f29{Sh-UTF$m z#nTJ0ubP;Zhd(rcQ%%9okh%b0(jIB7yxtW29BWO$qmAIrrrC{#cYkhTdZ>5HN@l*+4(hEf}#f?6GtNm$tI(#=vmZF-C1JjPNsGhL>UIXL9U}4>1EsIwVYmcR4C|1J_5x25RemKe7@kGYYF;x@xb-R27>OA9~H@F5l`F?q4rX0@NZnbdv)3^Q`@ zT@9Zg!w|Ja#X1$)62sL0#j>yB9+ni`*YGKp8B!f5G=o+a&gvnzb*Gjkb%~ZJy|q!X ziZuo68a8AUp)8QU$#e0{!IEPlT8ppyw4}?l*QAxvhcpAsyWj);| zgd>S?tl?WcrB+3S2}{9=hG(EU7&<6)^VB*P>73^giQpw(a4dP4^;W{IzXPwlvmlt{ zYkt7Zq9Lj?ImvE^C^? zUNv~NDyj-xhHK5kvqea2cnW@Cn0WnADt^8fbU^mf4Fy!i6Y^3)@6V{!g$H!sVDipF z&n)$?l7u3@HImls?S_}`dMc5MW zHnk*PboLjhzajn;eRo0PNJgM9G(Q^5_mw@O|6k&9fKww@sXsaQC;DDtcrWqR8Akt* zsOK1`{rVE`0_V8VMUVFxBu}@;GfGUL3s1z0{0hb~glW23+@Q;k)IRLv2HeDeJhq8@ z$3tNKfl<5E^#othQ-)Ot0|0s@Wz literal 2924 zcmb7GZF3V<7(F+wO`2}o5GdLrwUh!)s|^K3F;FZ8BpO~Myhwe$O>WYqo87Y6twjHl zA9O~+!i;`&#_=~fp1Ye(Hico*FWJq#&vVXsUXy?Rd;TYYtN1C2gut@x*?zv+@>Ik3 zcFZlywCj0K$;P>S!>KB(nZM%L(lZ_Vj;fnY&ut|!D3Ez1cVym@G`_X*NL4(6;cDBk z$?H;Z?|Y_|FVU;O>#|uVknbvii+ipwl=@atSRvNX1=BXY6@h{I+&jcTtSF1b$b0RQ1zgNvGrM2qT{f4r=t4}H_5Rk%2fg_RdVs)k>?HSwgW;WD}?OWDT8pkoO z+a|}%wS@+4UG`j#LLqm51dDhtiFXCYx|!9fGq8j_n~_7oc_B?t3B%JoVR%`{a^#i` zoWWVPtEY6{Pro)THQx>jm%r_*s#%eqDvaO*e3-;Jfj7HCdT0!Mg!5EXGc8ZK0_Wot zuRx3!tOqFIDj2wci=13t`)j7FMIY{oF;?VsH2u0Y;^QB5hQMgqla;L-a=SfKBeL4* zCxNB;{%4CNN#TmXWK`9cYN{)C&A_L)&J97HJ(Ud?Rw1`8kcw0bEbc=ATftQgXGcX6 zxNqXA4yR!~%T=?i#oRJ*8()wv^eWZ_j>YX?RT{0%l8ue3oI5SB5;qUv_aQg8p2j^q zNP@dE*Y~D1@FgA!7~EfLn_P%qF!jC5D^QZgSNJB0uX_eW-x&B-mtaUe_NB$e7sazI zkS;sETT$0cy>us{G)8N4N%uF~=(6K@>`S?QLwTD{wV6g0wIt{g8-3H>akf;x6y%DA zvL-8@Q`rfMefgTRUI!tIH&H+M<21g2ka%B~0#jbl_l!0pK2Mg619XOiC%Nb$+t10CH6 zPcG9+@R?b724mp`#vVRH=64+UHLyO&&#?d}g+Y3a)9(<^jL-)YILvR{oOp}aA;V;V zdxobPH?{B^4*Y?sU-+JY#?xAW(HKsugEK?j5zcIY(;|C<_VbH>WAp`%Kg^zZhEsoO z)LkrazdXljU>ENv`0=rT<{1chrpN>wpzbVVI7E#Tn5EuReAh7?4sqMuWWWk8QQId0 zf*9lLD$^6DsnV7))se9l$ynUQ)dU{sgoVUeQUX)_JVN55nB;$iF5y&%a0*3y)=T&~ zN_z;WJA|FM8S)Js^34Q(?vRF6I!4l2lFr2lr#pnxdm_xFb$7Q3&oUi4(ZdUiPjUAt z)-`s#ViN&oSovZ06r~e@o!u`$C@KO7V;{ix0gc24pSmO_v-k)NIKkUCn(*NBPB-ih Jp5RAJ{tr(1?_K}^ diff --git a/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/Feedback.class b/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/Feedback.class index 28853eca2459be072730105ee9d9b4a9cda23bf8..e4b6592e62098fc717e5aa60c9cc09902f27ad9a 100644 GIT binary patch literal 1563 zcmb7EO;Zy=5Pg#b7QzNFfQa}(Krq=rRuB;lqLGg(s-hkO9Jper|4 zR+&75E*{n~f~x|NM%}In%;qn>T?U#vTokcuI>vBaKr2;U*Y;R@yp=}vqu|%bE*r%S z+|+PO$8AgqjH&{C$FxnFB*YPhY4v#O%# z7$e2g@?@3lbH^{Gy23<-YNJ-NHyv4ZtW6;!HHri~9^%kG$X}B2CPHK#vio z{X$$AOI&Br%Qb-rCix4Q!XPt_V46df4X#$SshrJ%p^l)XIhyAR`HZ4vg)(o v(evQtK=3n61b`Fg!P!7?4$lL?L+8P(fnW}20C@fr>o{9;E)cw?qSpTcuU%AM literal 1537 zcma)5+fEZv6kVq+3=G3XE+RL%32mpqs33~1AaY4asy-BW;BDHDIMA7zc8cLw`~hD~ z)Wo9k!4L4G)ODtvMA{}alg!!Y%vyWxz0aE8e}4V~u!lVbA%VE-xfP>)=~+(2yRgp- zwtH%Lmg%e;PBCv4%ErEB<+En)TtP%&;LN-*je<$g>+G48^90m4b-+QM-_t&z;@Jh` z=;&ZKDG;fYt&%`AeWTJ5fg~uoqT^UDQxDd%`EnVr#L{HGyy;m2W3_Ld?N~;-m@^Bz zJU--(kRH3d?H1ijr&uWqh!cU%lVS#Wgeyrj) z?kE@)=)2y%hB1tDLM7A97achd_7saZ&Zrv#lNvhEDWkg@6m-dGMngAL6?3?!U|wL< z&)(dzh6OCL6u0smA{V}*k~wY-ewdAtb@c9~K) zvIBTh#eF=PzZ2MYIJkoA##M-sCZ)p} zNwael?ToPgU#OX4rIfSwZP{>dpuQqafmu!`%-^~LA?YJVA?YH2rHA~L*Y2+zA=gea z`Z2)wE$%)OFZpZwcMR%3FjB>Yo~U9OidF{u)!VG{hEaz$*Mzm%6JH& zzodl~2nD)=Bq$*84CD3U4X%>Zp?|}~7X~4}8rdPJC6%-qpspmai7lSU&i^M*H04LxtQB=7jB-GAn2M)Cjv diff --git a/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/Inbox.class b/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/Inbox.class deleted file mode 100644 index 72613e7b9d3b93e13c31cabfb4cd0b77c2d6076c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2879 zcmb7FYf~Fl7=BKmY*>~{gT+EE(w5c)EP+aV0XehN@DtJ9fPQt=wm+l3@%Rll% zozWt6Mn5{^_?sNxv%4gllqv9KH~XIVJkRr9^Ur_Be*&1t&kAA;cTCsx($0Y^DxSNi z?-;sSPP>9v#?uw6C=4f^HS^ZKf@X%UZNA6T1}Bf@{I)2#4DpI^99|XnSc zTcn>J64+K2ZYY>8CX%U!c*$kz72}1HpyC>?D|n0HN-fe^%P^=Cx@9^V`tdf^!856H zddUw*=78a5vQf+_>N-ohSqvkXImi~NH=@_p*0OV%=(Xit$;u51?8&(tFBGhTLDF4o zxGaTP=Ek&L_A0`3=l2W3=a1tKLvJWMTO25G)3n@yycjS&!x&L<3rX1`Dau-?(r@4u z*QQR-q}JOojJpcnW$377Ri;hD2-4Jej%(96FkGvvUSLfV3>{_?G*M$3?%_VQrYmI5 zM_-$hl4trwOFy>;WZLjPK2R{u@McX&9gT(um>@+Z-Ef7?FcGCV1uS?x~A0QsLH0FpIJ+qJ!>t1w;Fa%L_Y8d^a2)l^0K1iQ(=!rYI~R z)gz8M(h+_)lvCDfLBl6lq&+|s4K)pxQYN*@poDrEhRz=06LN~f78Pqxga%qE(F_L@ zuo=fAhO42=D;<}hT{9+iey-sOR%k;8kl7N$jVRh_^&;VMgIDrJJ~+zoFzW7;pFfn; zri!Q7Q1AsUvGXok4V(Cq;Sy~!S?Bs4<_l2qHNI8wP2I4_6Ajw^B1P{2S)XpYiZ!0KUl0q9L5YoMr8JyP04iMpr?^Qg?CnU{^%l&wm(D zzW#1Fqfx!H+%Q&j+6bL35M5YQsijN}t5_ogEuss}(`FZTLk!wz+{bXp#-L?QQ`oZx zcO2m;IAFM4Teo#V)~8Ovj|}~^&;m+06yMAz@Q{HyQXP0tP=ryI?91D&`+Pe2Rq&{q$A(dNWe!VVaEecXFw zmALVt-*EX4^gXBFF-SbA1-Kr;iC1w3NcRcOO&_O1>@o6B4*!kzm$8mGBtL zGR(&@{8A+iBAg}CIU-$%5cXFI`x_$cQe{Jjg!d^OGP$io!!NM@0$)k&XqAGj1=Vg1 vq!R#j^LYURQFQ>6vAj=HK#|_EBs*j?VBwkn%Z7(Nd{1YxN%!#senRj6*qz`8 diff --git a/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/Language.class b/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/Language.class deleted file mode 100644 index de22840e2faa5672993a34756d66b15239b7fbe3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1040 zcmb7CT~pIQ6g}INrVS~SqE#q?Ej#E@$wDV3TzQEi1jIjrw%?E>YN zRm>nKcDGc>$TQ5Fj%T-`LD%-*@vduAjyddcx6OS=oa3MZ33F66{Nw~wXvE#frp-o8 zo5qKN72KC`kD-*(Hx8&3Djwh=LxKA~ANPh|#teGe#ZmXf?uGUJl(Fj&Iis$`l8!zy z?4)6dd2Ncv7FJhPJi=3k7iq3Nmj^*TCE$j9Vn&Pz^;)rpk>9glJK{Nu*YmU?^2np* z^gSL%KHa@c(Fts03ZdKe-A(GFM6;dQT@q~tO3R|D6v@(BfS8V1I_=O|eAORdow6#O zqj-je>`yvLr&zGgu=tIxGq_EwLVpmrNEDSgDsE`P60%JyDT>Pa+R8cZOn^B`Kmt6e{`&~YeLFHl|oN;g+BuGrX(gaWnXal)Zfj;N)S WnSOyMzrg;D%ivke`5d+Qul)ru81$b2 diff --git a/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/Message.class b/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/Message.class deleted file mode 100644 index 12c1cec780b114eaf18df46e8009a8bff591b4a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1549 zcma)5+fEZv6kUh5Oc@5j3L+p_Etg2r~Iqbn~V@{DriHDA(TkwWpv`UgsyXK1|=)##vQ8HtgKKY2mbw+ z5_%biP8Hd-ETgPj%U-!^Q&a2jipC)~T_=jW3XR6hzQ0ym18*qQcV@v;^Ly0vS;m5AaCBLxyfY&*f<9}th z`c5)kzPBL4&naky!qA>I9pgpSE*M@;F9aJVRwS=`ra0HZFn?oK7}V@__nTI$ZHMc{ zgDw5A9wSmV_$F<4l&n8KhR%~J&+oHDH^gX2J@V=kAc1}2nZ=fO+^SbJHcU~sQvb3t zLLLlKk0JUnBZvuY$%_ePeM`FfmQ?jE2|>1*7;U&g&vrWfA$FLot{$T!^$T+93vPWt z+jsQr#rlrX|1(Ws`V1Hs;5dQfXTTu=s$VfugQ})#NUP}@GU|8@6NFCHF#Cy;gfLIf zX-W?aP}(6XVVG8U6eAcz1}f%|!YX;spn$YBzDn8GXCiUne+L9tlGV>(gUezVN? zM7vGCCmIf6iTqwP|Dz;f2~0v~@CRCC`jG%nkgUs~krh!Q>Sw4Q$!YRS6Mt$tw-XnTzD5hUC?Ty?O diff --git a/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/Role.class b/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/Role.class deleted file mode 100644 index f19f0d329763812b4a709a4241f91f6d46660b20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1075 zcma)4U2hUm5IvU#mX9q(wA6n1-CEdINFQusAWaFuNL(Oc3kmVTTyU*hm&Gi*B>XF- z4{bCyKKrALbGMtqgC^|5-kCdd&YZb3zyEx{22evmMu=h8c5SaXp1Q`+b0_9!%e2pm zuEB>##o_3KVU3IJk!8pTGo;S>gcmJN2{qdrG9;U=cB7)b@94EQ!=APjRf$2VzNxh9 zr@a7}tTj80oo+?z)O3d2yQO(zK?KnlWZ`5L$cPH-zJeIyM5URw(e#FW!#U-B%V5Z8qXDI%rRA+aLY5uP;>cZ8%p3Yp2~Q_kX{fv9n)wOJi`t{oI4Jm4n|+5f_R~w zR{z`>xTX3(uBb%@*_YG$$WU5@1+S1_^2J4qIR(4OGrU~nsakwIE-e(lC7w4TR)%Ju z&_|v#FkYMD8RKHN3L=MW-8{3o>p67)YJp1N%1a77E}b0G+$7p>>10F96rhvF38Xj0 zFewtIGl3-KDdcs@7hmBASTD08T_SaXjPKkF`_5YACxxULGI}pO!2g-VT1lD zzgiqC#3?Fl`VkSO?F(ugQjX9htNYuR*qVc*lz;%F__mB~A(n(bz{3E3M2!e|c82xd zTS>j{m4%{)v~`6?2VW_2BjtvT-Aahlq@D*HD&>e;i40S(u=fk>|F{rTpK~7v{`ulB D2n_Uq diff --git a/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/Settings.class b/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/Settings.class deleted file mode 100644 index 9420861a9951a8429b08d5a232a8ced6cafaf647..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1589 zcmb7ET~8B16g|^jy8VWh0xDmnKy9~$s-Q6ezd{g+1s`fiAn{>aH_O6ym$XxqpTaNj z#RoMK5>52c#2+Qz*|uyYO{8hEGjn_IIrp49yTAW@`vG7b_Z9dUayGY{#l{KOYfXM^ z9$Kbt6uGX|9u#ZNTit3D%R1*2Y$%W!h7Po2t!QbK^r~{8S2;t_GL3z{Mac|ok0Bub zZE6M`^QHfym)glI1fKm-cSOXf78oION9hO3cQY}D8*~yV$u`O<@yQfRtLL~`_=V_q zjPE8U&oTW|9Y3RR;S6)?)Nt!i(Yj7QTYzD2V{G|PR`=(Cm6<4mvPh`Zt~LFBncK*Lr9dsVzgaEu}vjbVcdZ5?IUe`?g;&E maIH(hKpT%fRk+)uc<$4c;*Flg_j)pCt}?&uS-j*@EdK@YgDD;W diff --git a/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/User.class b/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/User.class deleted file mode 100644 index c0cc6c87cded03b76d2e92e8c97e2e1da84a487c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1787 zcmbVLZBNr+6g|(_)-kH!c#$FUDzcT0A}W|*@B@M&E@+s{L_c-VV6p2=+oAp`qlt}) zG5!F5l=0rD1+kQ{_@(#udG0yA_ny;VzrX(ku!#o>QUY_1?{swUqi?o4{;~Dewwy!V zH;vYc-fAD1wx{oTrmG+=FmPlX8@g>!!L#O(x$g_4tOGi)$%~F}+4|nz_Tx2yv}3eP zfkJpAA$8v+YP!pqEyJ<}a_zpD$jYQ?^BT{uu!|SuXl$O(Me-J2L zj@sr*f@B|Bj^(cld@9A;Ki~9!o^(G#w|$ozw5$!%C668qsTjbpKu@XM=!L*_6&YkX zE2>bC`)1p0Bq%?!LKY@mhO% zF^l};V4C*dL%*bg0t-l4ish4$#FLSvqgY_!WF*;SB+)45iD3ZO=vkn*AB5+siuMhI z+CqR4trB2Vs|Fa;is=C3S}_w~LMvtiOld_Wz|0q_PvI6lZG~t@dPQE@eDj)g$+o&obenPneik%Gk>X{=BB?G z@ZzRhJASVb!VX sS?N|*>RvL}c$}+2TrV%+VvjJ_{ba7OIM*xUdVK*GJCC_mq;*#R01lHzzW@LL diff --git a/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/UserRegistry.class b/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/UserRegistry.class index 970aced91dfd7f8c243d76c46fae27be61d4a66b..ce901b4a918fd9f434bfdda2f2b2be33c2d60ef4 100644 GIT binary patch delta 89 zcmX@kbeu{2)W2Q(7#J8_83ec(m>8JZ8CZB2SQ*$RIw%3z920pB*clmEobyvsClDiJCLUj<})y`YHerWm@LJp3jpVU437W+ diff --git a/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/user/Inbox.class b/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/user/Inbox.class new file mode 100644 index 0000000000000000000000000000000000000000..4e08a720a2d165681ebdcc677f9674df75d5ee33 GIT binary patch literal 2973 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 N4_*rduX@U?{Q;9ILF@nk literal 0 HcmV?d00001 diff --git a/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/user/Role.class b/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/user/Role.class new file mode 100644 index 0000000000000000000000000000000000000000..8d6c32ea9233165043bdc30cdfd4f45d6854a2b2 GIT binary patch literal 1181 zcmb7DZBNrs6n^g7u4^f5OhlRZ!i&0&mpb3Rj1U$w1IYlh!ji=grW;o%c3sl7B!2TJ z=}3fVG<^0)8PDxzoIw+}q&+?Np69veJonl6AD_PgsNji;1Vh0O{mAOR3wb*VPu;hk z>mOMmciPXbcIS|LT`TJHz^ZjTu7N=|pdiUGw!2r`DOX<~*p(W?a`pdNN`fY3Koc~^ z=2p43z2As=#KxEb1LF+pV!d2FsMriEuSOx)kw!+vxPeJz8I+dS@j1g(-mIQDr;g=0 zG~QnGgtx+yjwxJMF>T-mZZb^#E~xlXn|e5Pyom3;VR)7wLT`Fbw_6%ou)}~vD-E9@ z2x9)6fm@hmNUpiQ8?G}<4^s`0+h#olMW^v|DQF_j8JNd{kRk4&%V6crk%XWle?jF< zx=4m})%E#q)Nb-%-)VZZvhkN*%u&>4$W}Wo$E!PmD<}uNvhTEsK6_OohRhBRk2{Ai zoq%dW9?)oVc1_!YCl9lsD_-lC>7uF_vw8h)amOHcFf8B?jH@L_v$caK+%7 zu=A?8?~Nj8=y$m1Ts0{MA}g(U&I2{-KT7xqWI}O=$|lgiS!4`7#`3& z8Sl{*lA#_V5!XMZC=hy<6)te?5=_)5{;1E>iqWrvi2`Ly^e6;-FG|TkkYchTMTxf5 z!qV(HW6El*P(DR} zz!x9XNJuo%M-x9v+-KS{mGptWoa^3e?X~tffBt^|31AbeVFVCVp+wP#euhOyIBvdi zB6!sm$JU{3Ic8pPqk2DIt-axPBkwkNJ+B*%=^7?yP&aqC^zFiPhP!%ixoZ)G5LOY1 zVgS)AQx~`pR8)hZf8BB{@rYqHQ|gtwlr2Uuh#?ijl0MEbd|(_Kd7FggUzQJeMKA<2 z*`kUOhO~dTZQI;5?5B0pt#U_fzN_#fVbz=vMj6K2zN9LKsHIW{>muZgp<%~6~itXbxZDBhl<#@DCw$=YdgQj5Gx3ya=2q0 zwUCBH%`|PU`-P7*PoB1GYswj{?2`iCwuxam(`)ClMTP-~zx6Q&tVRbhHLXMuCKrCh zQYPCg4MA9qi|QF7g_>Kh@Mo5EGuF0ZQMM9u)Qv&w>B6)_fU)tm;CbZlsrnTu)q$GL}5`6|LjkA=Ok}rs!E}9${u^O{&fbNKp}DDgrW)A$uWqj|9oHxTbx>#0RL#M<_w6&#$Vf zIfr4~>ChZ+RUkQ%2oh*3hw&IAc;YdRdCg5;Seqol{e&zf2Ehhtxrls=O3u=_KIz*hS_Hfn n%6MR-LqT5)kA5=lbxEH7d?|UWYw}W8=G0~87hRK=J&Kiod>1+S literal 0 HcmV?d00001 diff --git a/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/user/User.class b/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/user/User.class new file mode 100644 index 0000000000000000000000000000000000000000..3a155f92f0d324c28866844af1a908de60cee3eb GIT binary patch literal 2320 zcmbVOZBr9h6n<_9Ko1Ey6RM1g^9>Ud$AqX z$*HX-Onf3%8MoqizTl3UIELd2qdz%8@N=!cciRc}<*Lh@?{_S4%Z<7hzOcW42edSV zJWgbB(!^)@Tw&qR3<^h{xS_bvVpfZuknccz2hqETm>Fm^NzAFb8 zOibgV!eHQrA+r-G%zq%@?w8n(5jvqo6BcHeP_J65{h}~;K#~nH*ZG<=aS1j9_kvx= z_x3u0UrY$RKkniq$@+l8AF+8y7yZT`dGh{uOiaw7a!}l*Xm3*KOu?pCb+;Ool3Rb^ zlzc7YTG{b;ow_Ic_%I#rdwj3i170JQv&5HfX@ZYMjcu@yCJM2RIw@1g^5d4Sp~=?g z?kXY?4c4T5BHQ~^l)^9%Tf$ISB=V3si+Hsx6zl`zBOTEb>NxWHXo6}a$HTPfXiIb- z2QgCKcgxQ@pArck(ZA&~dy{TsL)*1Rz3i@g5_(P&d`VgordU}iHpM}lkgmejgfuzM zDd|pnX8+MM3srw-UFwZ-_y>J1idBX)-%-{>| zzT^npk8b1c3U|C$N1^me;*b~@rIXSxS$)M-TCXIUj9y7RhF(cTSw`|TzKP?pISX6H zdX4OFTtqG!`tYiDK@vcN*ad~FSmKE!qZ>TZ3tmYCFDHV>d%-sn!QUo=r+UHbiQpA{ zm*DpKUhthn@HJdd02g|}TZ!NsxEX_2m|l4?LzFYpQH1<%0}q(w9nEkovTDD&p*1Tn zwc6%d<%aTk}-<}$SYgliqQ z;z+Nxyc6fBty6C>`zyWemRG5Zt>3dj+@@+Hp`Fu_0>ghH|L`s5Utv<*<6i@gkygjJ J+t3%>`5zRT*|`7! literal 0 HcmV?d00001 diff --git a/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/security/PasswordHasher.class b/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/security/PasswordHasher.class new file mode 100644 index 0000000000000000000000000000000000000000..e454773c8dd1e84d32bd2397f0695b732674173c GIT binary patch literal 2772 zcmb7`*Xqe#4gr)mxm;az| zed~)4T|OV6#ZP_fL;s<^wf)`6LQs6@2R<`r=AL`*Io~-;{`%+lKLGUNyD)0t)8N+; zKu{q1$XGIxIm5~%Z_hrGX;&b4-Ly=%Q^42II2lF=wHm@YBG9*~kGr;MWdtZV4PMo>9>nSL$-iu;%g$9bwetn1Srl8cxx^+Ov{O+pCLiKItsVbaFJ+J1AGjDJs}! zbezRGfry*$&Kh=?Z5yis{)WbxZXd+cAHq0^CPm~t&uEzGo=FW1C<@I2`$kiPJ$;w& znQpd!!AOtycU`{P7Df^mHC)nh8La~K+s*0*U^SzaLFo_(?wTpA{)ezhG88exGiwV%c~s} z2~>K~P2|hfcR;09m4~Ie&~Qg!uV=@r?MmHg7%wNTw=h<)TysHI) zC7K6#sNp>w24;6cQ!x{q^9(XOsy|}6Ps}hA<{&l9>&PH0aKwXC$-`mkI7UYHm>KD? z2ePU4J}DSEN(4;A(;++(NK}JaGIHje;l9MC9zLdCH$xNHJ!D#Pq_8k6?FmIeAU2dw z8@WltHq~?KrQgk(>=La*|GR5-@C>HBYGLJeCUADA_^Uoj2?@P)j2vUFnMo;`{YT)K zr&lTNm--Wr)8@;a;`nyeSNZ^Ls?=eDsavTN3NqMV&x;_1 zC_Ss^uZCmTj}u%y!>6-2jYeEU6FPAoLug?uN#Z^(B8yh;Z=;1PDBvnSrIw2RK1X{! zCg5Mvu3D2Hfym8(J8I*#`#Y1E0}1ANFGq*EfNq>u2i=jkJSLaBzQ zfS&mywg0ls@K@164I%zRXc&!9^E2)#vc5t4wbXXDSOG|89%ODQ5VtufM{yH(I7ue>cNY(Fk2|Lbc-jLxk1+MeJWxJwmqP33z7`K{fVrZ(#0Yo-YKedj> lzv6((eNmPBd#Umj-__tLzUDnfX^<1-8-9fcynl<@{{WZ#th@jK literal 0 HcmV?d00001 diff --git a/helpmehelpapplication/target/test-classes/ntnu/sytemutvikling/team6/security/PasswordHasherTest$getHashPasswordTest.class b/helpmehelpapplication/target/test-classes/ntnu/sytemutvikling/team6/security/PasswordHasherTest$getHashPasswordTest.class new file mode 100644 index 0000000000000000000000000000000000000000..40476931164b97787fadaf1556b44eef9215e85c GIT binary patch literal 2725 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 LO~M75Vhi{LR*u_M literal 0 HcmV?d00001 From 5ed46ad955ff2652834610cb9c8091cf5dbd3444 Mon Sep 17 00:00:00 2001 From: Robin Strand Prestmo Date: Tue, 3 Mar 2026 19:04:20 +0100 Subject: [PATCH 5/6] Added exeption handling in User --- .../team6/models/user/User.java | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/User.java b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/User.java index 654fff6..28c5934 100644 --- a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/User.java +++ b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/models/user/User.java @@ -4,7 +4,6 @@ import java.util.UUID; -// TODO: Unntakshåndtering mangler // TODO: Enhetstesting mangler /** @@ -19,7 +18,7 @@ public class User { private String name; private String email; private String passwordHash; - private final String role; + private final Role role; private final Settings settings; private final Inbox inbox; @@ -39,9 +38,32 @@ public User(UUID id, String name, String email, String password, - String role, + Role role, Settings settings, Inbox inbox) { + if (id == null) { + throw new IllegalArgumentException("ID cannot be null."); + } + + if (name == null || name.isBlank()) { + throw new IllegalArgumentException("Name cannot be null or blank."); + } + + if (email == null || email.isBlank() || !email.contains("@") || !email.contains(".")) { + throw new IllegalArgumentException("Email cannot be null or blank, and must contain '@' and '.'"); + } + + if (role == null) { + throw new IllegalArgumentException("Role cannot be null"); + } + + if (settings == null) { + throw new IllegalArgumentException("Settings cannot be null"); + } + + if (inbox == null) { + throw new IllegalArgumentException("Inbox cannot be null"); + } this.id = id; this.name = name; @@ -66,7 +88,7 @@ public String getEmail() { return email; } - public String getRole() { + public Role getRole() { return role; } @@ -81,6 +103,9 @@ public Inbox getInbox() { // Add Setters public void setName(String name) { + if (name == null || name.isBlank()) { + throw new IllegalArgumentException("Name cannot be null or blank."); + } this.name = name; } @@ -89,6 +114,9 @@ public void setPassword(String password) { } public void setEmail(String email) { + if (email == null || email.isBlank() || !email.contains("@") || !email.contains(".")) { + throw new IllegalArgumentException("Email cannot be null or blank, and must contains '@' and '.'"); + } this.email = email; } From 1bb6914324760208171513250bf1dbed0b16643f Mon Sep 17 00:00:00 2001 From: Robin Strand Prestmo Date: Tue, 3 Mar 2026 19:52:54 +0100 Subject: [PATCH 6/6] Added Junit tests to User --- .../team6/models/user/UserTest.java | 218 ++++++++++++++++++ .../team6/models/user/User.class | Bin 2320 -> 3369 bytes ...UserTest$constructorTests$emailTests.class | Bin 0 -> 3560 bytes .../user/UserTest$constructorTests.class | Bin 0 -> 6802 bytes .../team6/models/user/UserTest.class | Bin 0 -> 571 bytes 5 files changed, 218 insertions(+) create mode 100644 helpmehelpapplication/src/test/java/ntnu/sytemutvikling/team6/models/user/UserTest.java create mode 100644 helpmehelpapplication/target/test-classes/ntnu/sytemutvikling/team6/models/user/UserTest$constructorTests$emailTests.class create mode 100644 helpmehelpapplication/target/test-classes/ntnu/sytemutvikling/team6/models/user/UserTest$constructorTests.class create mode 100644 helpmehelpapplication/target/test-classes/ntnu/sytemutvikling/team6/models/user/UserTest.class diff --git a/helpmehelpapplication/src/test/java/ntnu/sytemutvikling/team6/models/user/UserTest.java b/helpmehelpapplication/src/test/java/ntnu/sytemutvikling/team6/models/user/UserTest.java new file mode 100644 index 0000000..5fa92c8 --- /dev/null +++ b/helpmehelpapplication/src/test/java/ntnu/sytemutvikling/team6/models/user/UserTest.java @@ -0,0 +1,218 @@ +package ntnu.sytemutvikling.team6.models.user; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class UserTest { + + @Nested + class constructorTests { + private final UUID validID = UUID.randomUUID(); + private final String validName = "Name"; + private final String validEmail = "Email@gmail.com"; + private final String validPassword = "Password"; + private final Role validRole = Role.NORMAL_USER; + private final Settings validSettings = new Settings(); + private final Inbox validInbox = new Inbox(); + + @Test + void shouldThrowIfIdIsNull() { + assertThrows(IllegalArgumentException.class, () -> + new User( + null, + validName, + validEmail, + validPassword, + validRole, + validSettings, + validInbox + )); + } + + @Test + void shouldThrowIfNameIsNull() { + assertThrows(IllegalArgumentException.class, () -> + new User( + validID, + null, + validEmail, + validPassword, + validRole, + validSettings, + validInbox + )); + } + + @Test + void shouldThrowIfNameIsBlank() { + assertThrows(IllegalArgumentException.class, () -> + new User( + validID, + " ", + validEmail, + validPassword, + validRole, + validSettings, + validInbox + )); + } + + @Nested + class emailTests { + + @Test + void shouldThrowIfEmailIsNull() { + assertThrows(IllegalArgumentException.class, () -> + new User( + validID, + validName, + null, + validPassword, + validRole, + validSettings, + validInbox + )); + } + + @Test + void shouldThrowIfEmailIsBlank() { + assertThrows(IllegalArgumentException.class, () -> + new User( + validID, + validName, + " ", + validPassword, + validRole, + validSettings, + validInbox + )); + } + + @Test + void shouldThrowIfEmailDoesNotContainAt() { + assertThrows(IllegalArgumentException.class, () -> + new User( + validID, + validName, + "test.gmail.com", + validPassword, + validRole, + validSettings, + validInbox + )); + } + + @Test + void shouldThrowIfEmailDoesNotContainPeriod() { + assertThrows(IllegalArgumentException.class, () -> + new User( + validID, + validName, + "test@gmailcom", + validPassword, + validRole, + validSettings, + validInbox + )); + } + } + + @Test + void shouldThrowIfPasswordIsNull() { + assertThrows(IllegalArgumentException.class, () -> + new User( + validID, + validName, + validEmail, + null, + validRole, + validSettings, + validInbox + )); + } + + @Test + void shouldThrowIfRoleIsNull() { + assertThrows(IllegalArgumentException.class, () -> + new User( + validID, + validName, + validEmail, + validPassword, + null, + validSettings, + validInbox + )); + } + + @Test + void shouldThrowIfPasswordIsBlank() { + assertThrows(IllegalArgumentException.class, () -> + new User( + validID, + validName, + validEmail, + " ", + validRole, + validSettings, + validInbox + )); + } + + @Test + void shouldThrowIfSettingsIsNull() { + assertThrows(IllegalArgumentException.class, () -> + new User( + validID, + validName, + validEmail, + validPassword, + validRole, + null, + validInbox + )); + } + + @Test + void shouldThrowIfInboxIsNull() { + assertThrows(IllegalArgumentException.class, () -> + new User( + validID, + validName, + validEmail, + validPassword, + validRole, + validSettings, + null + )); + } + + @Test + void shouldCreateUser() { + User user = new User( + validID, + validName, + validEmail, + validPassword, + validRole, + validSettings, + validInbox + ); + + assertAll( + () -> assertEquals(validID, user.getId()), + () -> assertEquals(validName, user.getName()), + () -> assertEquals(validEmail, user.getEmail()), + () -> assertEquals(validRole, user.getRole()), + () -> assertEquals(validSettings, user.getSettings()), + () -> assertEquals(validInbox, user.getInbox()) + ); + } + + } +} \ No newline at end of file diff --git a/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/user/User.class b/helpmehelpapplication/target/classes/ntnu/sytemutvikling/team6/models/user/User.class index 3a155f92f0d324c28866844af1a908de60cee3eb..e981ecb29753f548c70640e8cfa7b8d65e4f2e66 100644 GIT binary patch literal 3369 zcmb7G-E$LF6#v~e?WW1L#X!N*Rs$$$zM2AxU<$U-Vxy%Xp%E%5n`CXb-E2yBQ(&BN zeDTFUKnKPrpJc`dzfxvoM&EG8NBHia^#sjq3~TxG3V z(k*AQv4;M7cDm&r49=58cITe5cm3<8gj7%;y4P~8*VXdX3xd4W- zPr*wnLfF46AXh{{G3*Nz;iime)sGQ@iDj*%xA_W}E8#rLP5E(1K+Lk`Q5AQ+HdN6GjEX_A3g1=0&8%`l(mBoWrEVz^Ybop9ZBI5HcN zhmom>A4dfCUn`sKLHcn_;80d~9LnBqGw#Rh0tYfyzI?y!%K##nR1j4WLtG$cIaW1g zKXCL?)!8;SO){2pbggtcRVo*C(@s@wy^>m?hd_@}Bv@VOtBzr&R#r0eX||YDF@=sd6f3!vcSv> zQrT|hG8gEIimUj5kT&d`W*WsN(vc2G?*%%#%2s*>{;rERiMUs|tCQ!`WKS`=#H#^% zm+~&Y(Ht@4A~hX>vt(HMas~EhmANrhigT_#|eBvff6N@~0 z3Jhi)t+07n+mZ$q+@emDgS7#wf{(i%63kZxcLb)ogVcjbL0%x$1WXAk^pU4JO+fFnyq4bs$@=RtowhgE1Lk z%1kjMaD?Vq4_*9zx&>)u(<;O_2)%oF^vgF5clo9%D8JLtlW!Vc@=e2s-YTem$kOvV zAihB_*#sWPos|*Z)5Qqj>i%;Bx1=Lrei&2pK`A5&kZDZd1Yc{ICyZ*ckpT3|!>cl2t||%C0~XNnDVn>I1KDlJ-vk$k<{7)Z5 z-5@G0w$+AhRnm_svemG7uWm6(NsMz6)Ua`{VdJ|RcFF6(>Grg$)KA;gPxqZ!6;I!^im@f5Zy|g$h;_kT}EdS6*%cbw&VE}?papvX| TT>Ay5IAGDz3&XT?q=V{z(EAya literal 2320 zcmbVOZBr9h6n<_9Ko1Ey6RM1g^9>Ud$AqX z$*HX-Onf3%8MoqizTl3UIELd2qdz%8@N=!cciRc}<*Lh@?{_S4%Z<7hzOcW42edSV zJWgbB(!^)@Tw&qR3<^h{xS_bvVpfZuknccz2hqETm>Fm^NzAFb8 zOibgV!eHQrA+r-G%zq%@?w8n(5jvqo6BcHeP_J65{h}~;K#~nH*ZG<=aS1j9_kvx= z_x3u0UrY$RKkniq$@+l8AF+8y7yZT`dGh{uOiaw7a!}l*Xm3*KOu?pCb+;Ool3Rb^ zlzc7YTG{b;ow_Ic_%I#rdwj3i170JQv&5HfX@ZYMjcu@yCJM2RIw@1g^5d4Sp~=?g z?kXY?4c4T5BHQ~^l)^9%Tf$ISB=V3si+Hsx6zl`zBOTEb>NxWHXo6}a$HTPfXiIb- z2QgCKcgxQ@pArck(ZA&~dy{TsL)*1Rz3i@g5_(P&d`VgordU}iHpM}lkgmejgfuzM zDd|pnX8+MM3srw-UFwZ-_y>J1idBX)-%-{>| zzT^npk8b1c3U|C$N1^me;*b~@rIXSxS$)M-TCXIUj9y7RhF(cTSw`|TzKP?pISX6H zdX4OFTtqG!`tYiDK@vcN*ad~FSmKE!qZ>TZ3tmYCFDHV>d%-sn!QUo=r+UHbiQpA{ zm*DpKUhthn@HJdd02g|}TZ!NsxEX_2m|l4?LzFYpQH1<%0}q(w9nEkovTDD&p*1Tn zwc6%d<%aTk}-<}$SYgliqQ z;z+Nxyc6fBty6C>`zyWemRG5Zt>3dj+@@+Hp`Fu_0>ghH|L`s5Utv<*<6i@gkygjJ J+t3%>`5zRT*|`7! diff --git a/helpmehelpapplication/target/test-classes/ntnu/sytemutvikling/team6/models/user/UserTest$constructorTests$emailTests.class b/helpmehelpapplication/target/test-classes/ntnu/sytemutvikling/team6/models/user/UserTest$constructorTests$emailTests.class new file mode 100644 index 0000000000000000000000000000000000000000..51a8c3c7dae55e114272893cb6e906b851d467b8 GIT binary patch literal 3560 zcmbtWYgZFT7=DJ^hPX(K)`GPbX|xcO#a`?swi<2{8zUtN*4o-`k^vSrJ7ISg#ZUc9 zJ;xqBdQN{pPe1hs_4J+HK!TF696n@c-pM=9^Uiyl`TM`ue*sv)a}7NVw;k#DhPNwu z-IqJomTfufhU8}brcoC)ZhMCBan~r*r^G#(stU)Gu3wcRki9ti(63=YhlUu#nN4%Y zG<<2<#)HZxuS$>Mw9B`B%jE^(6nxuexH^#!)NGTuLbc4~yGw(JW z%enbX3{wn!1+&g$xXv&nDTnT?t8A)@dJG0bY?+SpRJb*Tctgjh_>5sNKwJ?v#qCCELozR_roC#qmXe!`eX2t-$EbF;Zg^u z7s%YAapdaec;-&oE@>njeHP0A~V-a^`_WmI7NxslKyGG zHJY13+m=kHW^*r<7h=nAbZ6g;$=Q0QXxL%6(n`()h8{e=2I}aSx~tMdB=i-=C`buDWuT#P`QczJ*_D2JdMEp4xpD0 z2Q3lUlOsV39YDtq2dxmOeI)3E4xk?&4%#5l=iNaQJ*vin`(Od2ZHP);1wdH^6pM{`xs=^Bgm+;bSKLm zgRFc688x*gS*hv9^Z_@rV{qMV<4V8nMfBq#d9(*VVlR&$k^EDz_87m=m?nR3QSm*& juk;INmHiptpKZ|0CH)Je%kUT;&EqtaH2QdoU5x$@t(>{* literal 0 HcmV?d00001 diff --git a/helpmehelpapplication/target/test-classes/ntnu/sytemutvikling/team6/models/user/UserTest$constructorTests.class b/helpmehelpapplication/target/test-classes/ntnu/sytemutvikling/team6/models/user/UserTest$constructorTests.class new file mode 100644 index 0000000000000000000000000000000000000000..e7def3c7dea39376de39934c3b6c605f9dc1b659 GIT binary patch literal 6802 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 T$6rYQmDJz){s;br|DgN-7mm4y literal 0 HcmV?d00001 diff --git a/helpmehelpapplication/target/test-classes/ntnu/sytemutvikling/team6/models/user/UserTest.class b/helpmehelpapplication/target/test-classes/ntnu/sytemutvikling/team6/models/user/UserTest.class new file mode 100644 index 0000000000000000000000000000000000000000..810d4b9c1a1ad74452dac74f086ad3201173e017 GIT binary patch literal 571 zcmbtRyG{c!5F95V2YHZ?@G2=%00pL^0YMRg1PY-5(mRI*4nCiB_C?~esE{c506q#a z7eGjK5w^TLJ6_Ftz3(5dZvalQSwjis2$cpFP!(uT)Kp2U+`YUSPjnmvsz=6|a4b;X z-Wf$$6xegY<