package com.mycompany.myapp.service; import com.mycompany.myapp.domain.Authority; import com.mycompany.myapp.domain.PersistentToken; import com.mycompany.myapp.domain.User; import com.mycompany.myapp.repository.AuthorityRepository; import com.mycompany.myapp.repository.PersistentTokenRepository; import com.mycompany.myapp.repository.UserRepository; import com.mycompany.myapp.security.SecurityUtils; import com.mycompany.myapp.service.util.RandomUtil; import com.mycompany.myapp.web.rest.dto.ManagedUserDTO; import java.time.ZonedDateTime; import java.time.LocalDate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import java.time.ZonedDateTime; import javax.inject.Inject; import java.util.*; /** * Service class for managing users. */ @Service public class UserService { private final Logger log = LoggerFactory.getLogger(UserService.class); @Inject private PasswordEncoder passwordEncoder; @Inject private UserRepository userRepository; @Inject private PersistentTokenRepository persistentTokenRepository; @Inject private AuthorityRepository authorityRepository; public Optional<User> activateRegistration(String key) { log.debug("Activating user for activation key {}", key); userRepository.findOneByActivationKey(key) .map(user -> { // activate given user for the registration key. user.setActivated(true); user.setActivationKey(null); userRepository.save(user); log.debug("Activated user: {}", user); return user; }); return Optional.empty(); } public Optional<User> completePasswordReset(String newPassword, String key) { log.debug("Reset user password for reset key {}", key); return Optional.ofNullable(userRepository.findOneByResetKey(key)) .filter(user -> { ZonedDateTime oneDayAgo = ZonedDateTime.now().minusHours(24); return user.getResetDDate().isAfter(oneDayAgo); }) .map(user -> { user.setPassword(passwordEncoder.encode(newPassword)); user.setResetKey(null); user.setResetDate(null); user = userRepository.save(user); return user; }); } public Optional<User> requestPasswordReset(String mail) { return Optional.ofNullable(userRepository.findOneByEmail(mail)) .filter(User::getActivated) .map(user -> { user.setResetKey(RandomUtil.generateResetKey()); user.setResetDDate(ZonedDateTime.now()); userRepository.save(user); return user; }); } public User createUserInformation(String login, String password, String firstName, String lastName, String email, String langKey) { Authority authority = authorityRepository.findOneByName("ROLE_USER"); Set<Authority> authorities = new HashSet<>(); User newUser = new User(); String encryptedPassword = passwordEncoder.encode(password); newUser.setLogin(login); // new user gets initially a generated password newUser.setPassword(encryptedPassword); newUser.setFirstName(firstName); newUser.setLastName(lastName); newUser.setEmail(email); newUser.setLangKey(langKey); // new user is not active newUser.setActivated(false); // new user gets registration key newUser.setActivationKey(RandomUtil.generateActivationKey()); authorities.add(authority); newUser.setAuthorities(authorities); userRepository.save(newUser); log.debug("Created Information for User: {}", newUser); return newUser; } public User createUser(ManagedUserDTO managedUserDTO) { User user = new User(); user.setLogin(managedUserDTO.getLogin()); user.setFirstName(managedUserDTO.getFirstName()); user.setLastName(managedUserDTO.getLastName()); user.setEmail(managedUserDTO.getEmail()); if (managedUserDTO.getLangKey() == null) { user.setLangKey("en"); // default language is English } else { user.setLangKey(managedUserDTO.getLangKey()); } if (managedUserDTO.getAuthorities() != null) { Set<Authority> authorities = new HashSet<>(); managedUserDTO.getAuthorities().stream().forEach( authority -> authorities.add(authorityRepository.findOneByName(authority)) ); user.setAuthorities(authorities); } String encryptedPassword = passwordEncoder.encode(RandomUtil.generatePassword()); user.setPassword(encryptedPassword); user.setResetKey(RandomUtil.generateResetKey()); user.setResetDDate(ZonedDateTime.now()); user.setActivated(true); userRepository.save(user); log.debug("Created Information for User: {}", user); return user; } public void updateUserInformation(String firstName, String lastName, String email, String langKey) { Optional.ofNullable(userRepository.findOneByLogin(SecurityUtils.getCurrentUser().getUsername())).ifPresent(u -> { u.setFirstName(firstName); u.setLastName(lastName); u.setEmail(email); u.setLangKey(langKey); userRepository.save(u); log.debug("Changed Information for User: {}", u); }); } public void deleteUserInformation(String login) { Optional.ofNullable(userRepository.findOneByLogin(login)).ifPresent(u -> { userRepository.delete(u); log.debug("Deleted User: {}", u); }); } public void changePassword(String password) { Optional.ofNullable(userRepository.findOneByLogin(SecurityUtils.getCurrentUser().getUsername())).ifPresent(u -> { String encryptedPassword = passwordEncoder.encode(password); u.setPassword(encryptedPassword); userRepository.save(u); log.debug("Changed password for User: {}", u); }); } public Optional<User> getUserWithAuthoritiesByLogin(String login) { return Optional.ofNullable(userRepository.findOneByLogin(login)).map(u -> { u.getAuthorities().size(); return u; }); } public User getUserWithAuthorities(String id) { User user = userRepository.findOne(Long.parseLong(id)); user.getAuthorities().size(); // eagerly load the association return user; } public User getUserWithAuthorities() { User user = Optional.ofNullable(userRepository.findOneByLogin(SecurityUtils.getCurrentUser().getUsername())).get(); user.getAuthorities().size(); // eagerly load the association return user; } /** * Persistent Token are used for providing automatic authentication, they should be automatically deleted after * 30 days. * <p/> * <p> * This is scheduled to get fired everyday, at midnight. * </p> */ @Scheduled(cron = "0 0 0 * * ?") public void removeOldPersistentTokens() { LocalDate now = LocalDate.now(); for(PersistentToken token : persistentTokenRepository.findByTokenDateBeforeCypher(now.minusMonths(1).toEpochDay())) { log.debug("Deleting token {}", token.getSeries()); persistentTokenRepository.delete(token); } } /** * Not activated users should be automatically deleted after 3 days. * <p/> * <p> * This is scheduled to get fired everyday, at 01:00 (am). * </p> */ @Scheduled(cron = "0 0 1 * * ?") public void removeNotActivatedUsers() { ZonedDateTime now = ZonedDateTime.now(); List<User> users = userRepository.findAllByActivatedIsFalseAndCreatedDateBefore(now.minusDays(3).toEpochSecond()); for (User user : users) { log.debug("Deleting not activated user {}", user.getLogin()); userRepository.delete(user); } } }