diff --git a/growbros-frontend/src/components/Footer.tsx b/growbros-frontend/src/components/Footer.tsx deleted file mode 100644 index cc81f271aa523774852d870efd819f0ab8d88e1c..0000000000000000000000000000000000000000 --- a/growbros-frontend/src/components/Footer.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import {NavLink} from "react-router-dom"; -import {deleteCookie} from "../jwt/Cookies.ts"; - -function Footer() { - const handleLogout = () => { - deleteCookie('Jwt'); - }; - return ( - <nav> - <ul> - <div className="navLinks"> - <li> - <NavLink to="/home" onClick={handleLogout}> - Ausloggen</NavLink> - </li> - </div> - </ul> - </nav> - ); -} -export default Footer(); \ No newline at end of file diff --git a/growbros-frontend/src/pages/Login.tsx b/growbros-frontend/src/pages/Login.tsx index 21c4eed299ff37a0abf020ea54bfdd09f3603792..7a158f613b3d7a0f7bd3fd81b80cbaa172538680 100644 --- a/growbros-frontend/src/pages/Login.tsx +++ b/growbros-frontend/src/pages/Login.tsx @@ -16,7 +16,6 @@ function Login() { await handleLogin(); }; const handleLogin = async () => { - try { const res = await fetch("http://localhost:8080/api/v1/auth/authenticate",{ method:"POST", body:JSON.stringify({email:email,password:password}), @@ -38,14 +37,18 @@ function Login() { navigate('/'); } else { - window.alert(`Fehler bei der Anmeldung: ${res.status} - ${res.statusText}`); + const errorBody = await res.json(); + if (res.status === 400 && errorBody.error === 'InvalidEmailException') { + window.alert("Fehler bei der Anmeldung: Ungültige E-Mail-Adresse."); + console.error('Fehler bei der Anmeldung: Ungültige E-Mail-Adresse.'); + } else { + window.alert(`Fehler bei der Anmeldung: ${res.status} - ${res.statusText}`); + console.error('Fehler bei der Anmeldung:', res.status, res.statusText); + } + navigate('/login'); - console.error('Fehler bei der Anmeldung:', res.status, res.statusText); - } - } catch (error:any) { - console.error('Fehler bei der Anmeldung:', error.message); - } + } }; return ( diff --git a/growbros-frontend/src/pages/Register.tsx b/growbros-frontend/src/pages/Register.tsx index 7f56bc005e2128523104bd9df77fa5a4b6ee5049..cfb54045f8d85871541ef52f86fbf20a9008c872 100644 --- a/growbros-frontend/src/pages/Register.tsx +++ b/growbros-frontend/src/pages/Register.tsx @@ -44,17 +44,17 @@ function Register() { e.preventDefault(); //verhindert, dass die Seite neu geladen wird, wenn das Formular abgeschickt wird if (!isValidEmail(email)) { - openErrorModal('Ungültige E-Mail-Adresse'); + openErrorModal('Ungültige E-Mail-Adresse. Frontend'); return; } if (!isValidName(firstname) || !isValidName(lastname)) { - openErrorModal('Vorname und Nachname dürfen nicht leer sein'); + openErrorModal('Vorname und Nachname dürfen nicht leer sein. Frontend'); return; } if (!isValidPassword(password)) { - openErrorModal('Das Passwort muss mindestens 4 Zeichen lang sein'); + openErrorModal('Das Passwort muss mindestens 4 Zeichen lang sein. Frontend'); return; } await handleRegister(); @@ -64,31 +64,45 @@ function Register() { console.log("handle register") try { const requestBody = { - firstname:firstname, - lastname:lastname, - email:email, - password:password + firstname: firstname, + lastname: lastname, + email: email, + password: password }; console.log(requestBody) const res = await fetch("http://localhost:8080/api/v1/auth/register", { - method:"POST", + method: "POST", headers: { "Content-Type": "application/json" }, - body:JSON.stringify(requestBody - )} + body: JSON.stringify(requestBody) + } ) - const {token} = await res.json(); - console.log("Jwt Token not decoded"+token); - const decodedToken = jwtDecode(token); - // @ts-ignore - const expirationDate = new Date(decodedToken.exp * 1000); //*1000 Anzahl der Sekunden seit 1.1.1970 darstellt - JS arbeitet jedoch normalerweise mit Millisekunden - setCookie("Jwt",token, expirationDate); - console.log("Jwt decoded " + decodedToken); - navigate('/'); - } catch (error:any) { - console.error('Fehler bei der Anmeldung:', error.message); - console.dir(error) + if (res.ok) { + const {token} = await res.json(); + console.log("Jwt Token not decoded" + token); + const decodedToken = jwtDecode(token); + // @ts-ignore + const expirationDate = new Date(decodedToken.exp * 1000); //*1000 Anzahl der Sekunden seit 1.1.1970 darstellt - JS arbeitet jedoch normalerweise mit Millisekunden + setCookie("Jwt", token, expirationDate); + console.log("Jwt decoded " + decodedToken); + navigate('/'); + } else { + const errorBody = await res.json(); + if (res.status === 400 && errorBody.error === 'InvalidEmailException') { + window.alert("Fehler bei der Anmeldung: Ungültige E-Mail-Adresse."); + console.error('Fehler bei der Anmeldung: Ungültige E-Mail-Adresse.'); + } else if (res.status === 409 && errorBody.error === 'DataIntegrityViolationException') { + window.alert("Fehler bei der Anmeldung: E-Mail-Adresse bereits vorhanden."); + console.error('Fehler bei der Anmeldung: E-Mail-Adresse bereits vorhanden.'); + + } else { + window.alert(`Fehler bei der Anmeldung: ${res.status} - ${res.statusText}`); + console.error('Fehler bei der Anmeldung:', res.status, res.statusText); + } + } + + } catch (e) { } }; diff --git a/src/main/java/hdm/mi/growbros/auth/AuthenticationService.java b/src/main/java/hdm/mi/growbros/auth/AuthenticationService.java index 9cba3736e0de8b1adadc8ddd73b2a57a6fd31ec1..5eefc1fbc13466a3c0abd13d0b7caa13d7074ad9 100644 --- a/src/main/java/hdm/mi/growbros/auth/AuthenticationService.java +++ b/src/main/java/hdm/mi/growbros/auth/AuthenticationService.java @@ -1,5 +1,7 @@ package hdm.mi.growbros.auth; +import hdm.mi.growbros.exceptions.InvalidDataException; +import hdm.mi.growbros.exceptions.InvalidEmailException; import hdm.mi.growbros.models.user.Role; import hdm.mi.growbros.models.user.User; import hdm.mi.growbros.models.user.UserRepository; @@ -9,6 +11,8 @@ import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import java.util.regex.Matcher; +import java.util.regex.Pattern; @Service @RequiredArgsConstructor @@ -24,6 +28,19 @@ public class AuthenticationService { * @return */ public AuthenticationResponse register(RegisterRequest request) { + + if (!isValidEmail(request.getEmail())) { + throw new InvalidEmailException("Ungültige E-Mail-Adresse. Backend"); + } + + if (request.getFirstname().length() < 4 ) { + throw new InvalidDataException("Vorname muss mindestens 4 Zeichen lang sein. Backend"); + } + + if (request.getLastname().length() < 4) { + throw new InvalidDataException("Nachname muss mindestens 4 Zeichen lang sein. Backend"); + } + var user = User.builder() .firstname(request.getFirstname()) .lastname(request.getLastname()) @@ -53,4 +70,12 @@ public class AuthenticationService { .token(jwtToken) .build(); } + + private boolean isValidEmail(String email) { + String emailRegex = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}$"; + Pattern pattern = Pattern.compile(emailRegex); + Matcher matcher = pattern.matcher(email); + return matcher.matches(); + } + } diff --git a/src/main/java/hdm/mi/growbros/exceptions/InvalidDataException.java b/src/main/java/hdm/mi/growbros/exceptions/InvalidDataException.java new file mode 100644 index 0000000000000000000000000000000000000000..294be0649c56b73df3a9b22551a3d49b451b2968 --- /dev/null +++ b/src/main/java/hdm/mi/growbros/exceptions/InvalidDataException.java @@ -0,0 +1,8 @@ +package hdm.mi.growbros.exceptions; + +public class InvalidDataException extends RuntimeException{ + public InvalidDataException(String message) { + super(message); + } +} + diff --git a/src/main/java/hdm/mi/growbros/exceptions/InvalidEmailException.java b/src/main/java/hdm/mi/growbros/exceptions/InvalidEmailException.java new file mode 100644 index 0000000000000000000000000000000000000000..34a7752f84ee19022b2fab3b92920b52f67126d8 --- /dev/null +++ b/src/main/java/hdm/mi/growbros/exceptions/InvalidEmailException.java @@ -0,0 +1,7 @@ +package hdm.mi.growbros.exceptions; + +public class InvalidEmailException extends RuntimeException{ + public InvalidEmailException(String message) { + super(message); + } +} diff --git a/src/main/java/hdm/mi/growbros/security/ApplicationConfig.java b/src/main/java/hdm/mi/growbros/security/ApplicationConfig.java index cdcfea21e3eea3034feaa74ce26c54c11afa49f9..22a72c69b6e3d1dc465f5c66db24624e2fe2e6f8 100644 --- a/src/main/java/hdm/mi/growbros/security/ApplicationConfig.java +++ b/src/main/java/hdm/mi/growbros/security/ApplicationConfig.java @@ -17,7 +17,7 @@ import org.springframework.security.crypto.password.PasswordEncoder; @RequiredArgsConstructor public class ApplicationConfig { private final UserRepository repository; - @Bean //Schnittstelle die verwendet wird, um Benutzerdetails zu laden + @Bean public UserDetailsService userDetailsService() { return username -> repository.findByEmail(username) .orElseThrow(() -> new UsernameNotFoundException("User not found"));