diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/config/filter/JwtTokenFilter.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/config/filter/JwtTokenFilter.java index 4011b3bc..8528b456 100644 --- a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/config/filter/JwtTokenFilter.java +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/config/filter/JwtTokenFilter.java @@ -1,5 +1,6 @@ package com.hydraulic.applyforme.config.filter; + import com.hydraulic.applyforme.model.security.UserDetailsImpl; import com.hydraulic.applyforme.service.impl.UserDetailsServiceImpl; import com.hydraulic.applyforme.util.JwtUtil; @@ -47,6 +48,7 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse return; } + System.out.println("header " + header); final String token = header.substring(7); @@ -54,7 +56,9 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse try { emailAddress = jwtUtil.getUsernameFromToken(token); + System.out.println("Email Address " + emailAddress); + } catch (IllegalArgumentException e) { System.out.println("Unable to get JWT Token"); } catch (ExpiredJwtException e) { diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/config/security/SecurityConfiguration.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/config/security/SecurityConfiguration.java index 9132ab89..c7abb172 100644 --- a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/config/security/SecurityConfiguration.java +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/config/security/SecurityConfiguration.java @@ -83,7 +83,6 @@ public WebSecurityCustomizer webSecurityCustomizer() { @Bean public AuthenticationManager authenticationManagerBean(HttpSecurity http) throws Exception { AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class); - authenticationManagerBuilder.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); authenticationManagerBuilder.authenticationProvider(authenticationProvider); return authenticationManagerBuilder.build(); } diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/controller/ChangePasswordController.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/controller/ChangePasswordController.java new file mode 100644 index 00000000..59e8d001 --- /dev/null +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/controller/ChangePasswordController.java @@ -0,0 +1,27 @@ +package com.hydraulic.applyforme.controller; + +import com.hydraulic.applyforme.model.domain.Member; +import com.hydraulic.applyforme.model.dto.password.ChangePasswordDto; +import com.hydraulic.applyforme.service.ChangePasswordService; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping( + value = "password", + produces = { MediaType.APPLICATION_JSON_VALUE } +) +public class ChangePasswordController { + + private ChangePasswordService service; + + public ChangePasswordController(ChangePasswordService passwordService) { + this.service = passwordService; + } + + @PostMapping("/change-password/{id}") + public Member changePassword(@Validated @RequestBody ChangePasswordDto password, @PathVariable(name = "id") Long id){ + return service.changePassword(id, password); + } +} diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/controller/exception/GlobalExceptionController.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/controller/exception/GlobalExceptionController.java index 2f302863..bf40fb18 100644 --- a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/controller/exception/GlobalExceptionController.java +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/controller/exception/GlobalExceptionController.java @@ -11,7 +11,6 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; @@ -204,7 +203,6 @@ public Object forbidden(AccessDeniedException ex, HttpServletRequest request) { return body; } - @ResponseStatus(HttpStatus.UNAUTHORIZED) @ExceptionHandler(AuthenticationException.class) public Object unauthorized(AuthenticationException ex, HttpServletRequest request) { diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/dto/authentication/SignInDto.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/dto/authentication/SignInDto.java index 7ce7cdc0..bb144e20 100644 --- a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/dto/authentication/SignInDto.java +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/dto/authentication/SignInDto.java @@ -1,6 +1,7 @@ package com.hydraulic.applyforme.model.dto.authentication; + import com.fasterxml.jackson.annotation.JsonProperty; import com.hydraulic.applyforme.annotation.PhoneNumberConstraint; import lombok.AllArgsConstructor; diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/dto/password/ChangePasswordDto.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/dto/password/ChangePasswordDto.java new file mode 100644 index 00000000..dacb80b3 --- /dev/null +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/dto/password/ChangePasswordDto.java @@ -0,0 +1,13 @@ +package com.hydraulic.applyforme.model.dto.password; + +import com.hydraulic.applyforme.model.domain.Member; +import lombok.Data; + +@Data +public class ChangePasswordDto { + + private String password; + private String oldPassword; + private String newPassword; + private String reNewPassword; +} diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/exception/InvalidOldPasswordException.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/exception/InvalidOldPasswordException.java new file mode 100644 index 00000000..d442cbc9 --- /dev/null +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/exception/InvalidOldPasswordException.java @@ -0,0 +1,12 @@ +package com.hydraulic.applyforme.model.exception; + +public class InvalidOldPasswordException extends ApplyForMeException{ + + private static final long serialVersionUID = 1L; + public static final String ENTITY_NAME = "Password"; + + @Override + public String getMessage() { + return String.format("%s entry does not match old password.", ENTITY_NAME); + } +} diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/security/UserDetailsImpl.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/security/UserDetailsImpl.java index 8ccfb7a1..1f70fbeb 100644 --- a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/security/UserDetailsImpl.java +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/model/security/UserDetailsImpl.java @@ -7,7 +7,6 @@ import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; - import java.util.Arrays; import java.util.Collection; import java.util.List; diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/repository/impl/UpdateMemberRepositoryImpl.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/repository/impl/UpdateMemberRepositoryImpl.java new file mode 100644 index 00000000..412e51dc --- /dev/null +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/repository/impl/UpdateMemberRepositoryImpl.java @@ -0,0 +1,25 @@ +package com.hydraulic.applyforme.repository.impl; + +import com.hydraulic.applyforme.model.domain.Member; +import com.hydraulic.applyforme.repository.UpdateMemberRepository; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import javax.persistence.EntityNotFoundException; +import javax.persistence.PersistenceContext; + +@Repository +public class UpdateMemberRepositoryImpl implements UpdateMemberRepository { + + + @PersistenceContext + private EntityManager entityManager; + + public Member getOne(Long id) { + return entityManager.find(Member.class, id); + } + + public Member updateOne(Member body) { + return entityManager.merge(body); + } + } diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/repository/jpa/PasswordJpaRepository.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/repository/jpa/PasswordJpaRepository.java new file mode 100644 index 00000000..c2aa28b4 --- /dev/null +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/repository/jpa/PasswordJpaRepository.java @@ -0,0 +1,14 @@ +package com.hydraulic.applyforme.repository.jpa; + +import com.hydraulic.applyforme.model.domain.Member; +import com.hydraulic.applyforme.model.dto.password.ChangePasswordDto; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface PasswordJpaRepository extends JpaRepository { + + Optional findById(ChangePasswordDto id); + + Member findById(Long id); +} diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/AuthenticationService.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/AuthenticationService.java index 0d703c99..80290884 100644 --- a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/AuthenticationService.java +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/AuthenticationService.java @@ -6,6 +6,5 @@ public interface AuthenticationService { void resetPassword(ResetPasswordDto resetPasswordDto); - void authenticate(String username, String password) throws Exception; } diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/ChangePasswordService.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/ChangePasswordService.java new file mode 100644 index 00000000..a5553749 --- /dev/null +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/ChangePasswordService.java @@ -0,0 +1,11 @@ +package com.hydraulic.applyforme.service; + +import com.hydraulic.applyforme.model.domain.Member; +import com.hydraulic.applyforme.model.dto.password.ChangePasswordDto; + +public interface ChangePasswordService { + + Member changePassword(Long Id, ChangePasswordDto password); + + boolean checkIfValidOldPassword(Member member, String password); +} diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/impl/AuthenticationServiceImpl.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/impl/AuthenticationServiceImpl.java index 61541927..bce6ef48 100644 --- a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/impl/AuthenticationServiceImpl.java +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/impl/AuthenticationServiceImpl.java @@ -40,7 +40,6 @@ public AuthenticationServiceImpl(MemberSecretJpaRepository secretJpaRepository, this.memberJpaRepository = memberJpaRepository; this.memberRepository = memberRepository; } - public void resetPassword(ResetPasswordDto dto) { MemberSecretCode secretCodeExists = secretJpaRepository.findByForgotPasswordCode(dto.getToken()); diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/impl/ChangePasswordServiceImpl.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/impl/ChangePasswordServiceImpl.java new file mode 100644 index 00000000..c5575a45 --- /dev/null +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/impl/ChangePasswordServiceImpl.java @@ -0,0 +1,62 @@ +package com.hydraulic.applyforme.service.impl; + +import com.hydraulic.applyforme.model.domain.Member; +import com.hydraulic.applyforme.model.dto.password.ChangePasswordDto; +import com.hydraulic.applyforme.model.exception.InvalidOldPasswordException; +import com.hydraulic.applyforme.repository.jpa.PasswordJpaRepository; +import com.hydraulic.applyforme.service.ChangePasswordService; +import lombok.extern.slf4j.Slf4j; +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; + +import static java.util.regex.Pattern.matches; + +@Slf4j +@Service +public class ChangePasswordServiceImpl implements ChangePasswordService { + + @Autowired + private ModelMapper modelMapper; + + @Autowired + private PasswordEncoder passwordEncoder; + + private final PasswordJpaRepository jpaRepository; + + public ChangePasswordServiceImpl(PasswordJpaRepository jpaRepository) { + this.jpaRepository = jpaRepository; + } + + @Override + @Transactional + public boolean checkIfValidOldPassword(Member member, String oldPassword) { + return matches(oldPassword, member.getPassword()); + } + + @Override + @Transactional + public Member changePassword(Long id, ChangePasswordDto password) { + final Member member = jpaRepository.findById(id); + + Member mapper = new Member(); + mapper = modelMapper.map(id, Member.class); + + if (checkIfValidOldPassword(member, member.getPassword())){ + if (password.getNewPassword().equals(password.getReNewPassword())) { + member.setPassword(password.getNewPassword()); + jpaRepository.save(member); + } + }else{ + throw new InvalidOldPasswordException(); + } + + return member; + + } + + +} diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/impl/UserDetailsServiceImpl.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/impl/UserDetailsServiceImpl.java index 75079424..00e8aa5c 100644 --- a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/impl/UserDetailsServiceImpl.java +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/service/impl/UserDetailsServiceImpl.java @@ -8,7 +8,6 @@ import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Component; - import javax.transaction.Transactional; @Component diff --git a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/util/JwtUtil.java b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/util/JwtUtil.java index e9294e50..f7279f3a 100644 --- a/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/util/JwtUtil.java +++ b/Apply-For-Me-Api/src/main/java/com/hydraulic/applyforme/util/JwtUtil.java @@ -14,7 +14,6 @@ import org.springframework.context.annotation.PropertySource; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Component; - import java.util.*; import java.util.function.Function; @@ -113,5 +112,4 @@ else if (role.getCode().equals("Professional")) { } claimsMap.put("memberType", memberType); } - } diff --git a/applyforme.web b/applyforme.web new file mode 160000 index 00000000..1652502d --- /dev/null +++ b/applyforme.web @@ -0,0 +1 @@ +Subproject commit 1652502dc5030dab173ca69440e8409025a860f5