You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

211 lines
9.5 KiB

package org.waterproofingdata.wpdauth.service;
import java.util.List;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.waterproofingdata.wpdauth.exception.CustomException;
import org.waterproofingdata.wpdauth.model.EduCemadenOrganizations;
import org.waterproofingdata.wpdauth.model.Users;
import org.waterproofingdata.wpdauth.model.Roles;
import org.waterproofingdata.wpdauth.model.UsersEducemadenOrganizations;
import org.waterproofingdata.wpdauth.model.UsersProviderActivationKey;
import org.waterproofingdata.wpdauth.repository.EduCemadenOrganizationsRepository;
import org.waterproofingdata.wpdauth.repository.UsersEducemadenOrganizationsRepository;
import org.waterproofingdata.wpdauth.repository.UsersRepository;
import org.waterproofingdata.wpdauth.repository.UsersProviderActivationKeyRepository;
import org.waterproofingdata.wpdauth.security.JwtTokenProvider;
@Service
public class UsersService {
@Autowired
private UsersRepository usersRepository;
@Autowired
private EduCemadenOrganizationsRepository eduCemadenOrganizationsRepository;
@Autowired
private UsersEducemadenOrganizationsRepository usersEducemadenOrganizationsRepository;
@Autowired
private UsersProviderActivationKeyRepository usersProviderActivationKeyRepository;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private JwtTokenProvider jwtTokenProvider;
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private JavaMailSender mailSender;
public boolean existsByUsername(String username) {
return usersRepository.existsByUsername(username);
}
public Users search(String username) {
Users user = usersRepository.findByUsername(username);
if (user == null) {
throw new CustomException("The user doesn't exist", HttpStatus.NOT_FOUND);
}
return user;
}
public String login(String username, String password) {
try {
authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
return jwtTokenProvider.createToken(username, usersRepository.findByUsername(username).getRoles());
}
catch (AuthenticationException e) {
throw new CustomException("Invalid username/password supplied", HttpStatus.UNPROCESSABLE_ENTITY);
}
}
public String signup(Users user) {
if (user.getUsername().length() == 0) {
throw new CustomException("Username must be provided", HttpStatus.UNPROCESSABLE_ENTITY);
}
if (!existsByUsername(user.getUsername())) {
if (user.getNickname().length() == 0) {
throw new CustomException("Nickname must be provided", HttpStatus.UNPROCESSABLE_ENTITY);
}
else if (usersRepository.existsByNickname(user.getNickname())) {
String nickname_unique = usersRepository.findSuggestedNickname(user.getNickname());
throw new CustomException(String.format("Nickname already exists. Would you like to use '%s'?", nickname_unique), HttpStatus.UNPROCESSABLE_ENTITY);
}
if (user.getPassword().length() == 0) {
throw new CustomException("Password must be provided", HttpStatus.UNPROCESSABLE_ENTITY);
}
if (user.getState().length() == 0) {
throw new CustomException("State must be provided", HttpStatus.UNPROCESSABLE_ENTITY);
}
if (user.getCity().length() == 0) {
throw new CustomException("City must be provided", HttpStatus.UNPROCESSABLE_ENTITY);
}
if (user.getTermsofusage() != true) {
throw new CustomException("Terms of usage must be accepted", HttpStatus.UNPROCESSABLE_ENTITY);
}
if (user.getRoles().size() != 1) {
throw new CustomException("Only one user.role must be provided", HttpStatus.UNPROCESSABLE_ENTITY);
}
user.setPassword(passwordEncoder.encode(user.getPassword()));
user.setActive(0);
usersRepository.save(user);
return jwtTokenProvider.createToken(user.getUsername(), user.getRoles());
}
else {
throw new CustomException("Username is already in use", HttpStatus.UNPROCESSABLE_ENTITY);
}
}
public void sendAdminKeyByEmailCemaden(String emailcemaden, String username) {
Users user = search(username);
EduCemadenOrganizations eduCemadenOrganization = eduCemadenOrganizationsRepository.findByEmail(emailcemaden);
if (eduCemadenOrganization == null) {
throw new CustomException("Email Cemaden not found.", HttpStatus.NOT_FOUND);
}
String uuid = UUID.randomUUID().toString();
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom("noreply@wp6.com");
message.setTo(emailcemaden);
message.setSubject("Envio de código para alteração de senha");
message.setText(String.format("Olá! O usuário '%s' solicitou a ativação dele para ADMIN dessa Instituição, por isso você está recebendo esse código: '%s'. Se estiver correto, informe esse código ao solicitante e peça para entrar no aplicativo para prosseguir.", user.getNickname(), uuid));
mailSender.send(message);
UsersEducemadenOrganizations userEducemadenOrg = new UsersEducemadenOrganizations();
userEducemadenOrg.setUsersid(user.getId());
userEducemadenOrg.setEducemadenorganizationsid(eduCemadenOrganization.getId());
userEducemadenOrg.setActivationkey(uuid);
userEducemadenOrg.setActive(0);
usersEducemadenOrganizationsRepository.save(userEducemadenOrg);
}
public void activate(String username, String activationkey) {
Users user = search(username);
if (user.getActive() != 0) {
throw new CustomException("User should be inactive to be activated", HttpStatus.UNPROCESSABLE_ENTITY);
}
if (user.getRoles().size() != 1) {
throw new CustomException("User must have only one user.role", HttpStatus.UNPROCESSABLE_ENTITY);
}
if (user.getRoles().get(0) == Roles.ROLE_INSTITUTION) {
UsersEducemadenOrganizations userEducemadenOrganization = usersEducemadenOrganizationsRepository.findByActivationkey(activationkey);
if (userEducemadenOrganization == null) {
throw new CustomException("ROLE_INSTITUTION Activationkey not found.", HttpStatus.NOT_FOUND);
}
else if (user.getId() != userEducemadenOrganization.getUsersid()) {
throw new CustomException("Activationkey does not belong to the informed user", HttpStatus.UNPROCESSABLE_ENTITY);
}
userEducemadenOrganization.setActive(1);
usersEducemadenOrganizationsRepository.save(userEducemadenOrganization);
usersRepository.activateByUsername(username, 1);
String uuid = UUID.randomUUID().toString();
UsersProviderActivationKey userRolesProviderActivationKey = new UsersProviderActivationKey();
userRolesProviderActivationKey.setUsersid(user.getId());
userRolesProviderActivationKey.setActivationkey(uuid);
usersProviderActivationKeyRepository.save(userRolesProviderActivationKey);
}
else if (user.getRoles().get(0) == Roles.ROLE_CLIENT) {
UsersProviderActivationKey userAdmProviderActivationKey = usersProviderActivationKeyRepository.findByActivationkey(activationkey);
if (userAdmProviderActivationKey == null) {
throw new CustomException("Activationkey not found.", HttpStatus.NOT_FOUND);
}
UsersEducemadenOrganizations userAdmEducemadenOrganization = usersEducemadenOrganizationsRepository.findByUserIdAndActivated(user.getId());
if (userAdmEducemadenOrganization == null) {
throw new CustomException("ROLE_INSTITUTION Activationkey not found.", HttpStatus.NOT_FOUND);
}
usersRepository.activateByUsername(username, 1);
UsersEducemadenOrganizations userEducemadenOrg = new UsersEducemadenOrganizations();
userEducemadenOrg.setUsersid(user.getId());
userEducemadenOrg.setEducemadenorganizationsid(userAdmEducemadenOrganization.getEducemadenorganizationsid());
userEducemadenOrg.setActivationkey(activationkey);
userEducemadenOrg.setActive(1);
usersEducemadenOrganizationsRepository.save(userEducemadenOrg);
}
else if (user.getRoles().get(0) == Roles.ROLE_ADMIN) {
throw new CustomException("Admin users should be activated through database.", HttpStatus.UNPROCESSABLE_ENTITY);
}
else {
throw new CustomException("There is a problem with this User registration and it can not be activated.", HttpStatus.UNPROCESSABLE_ENTITY);
}
}
public Users whoami(HttpServletRequest req) {
return usersRepository.findByUsername(jwtTokenProvider.getUsername(jwtTokenProvider.resolveToken(req)));
}
public EduCemadenOrganizations findEduCemadenOrganizationById(Integer userid) {
return eduCemadenOrganizationsRepository.findByUserId(userid);
}
public UsersProviderActivationKey findProviderActivationKeyById(Integer usersid) {
return usersProviderActivationKeyRepository.findByUsersid(usersid);
}
public String refresh(String username) {
return jwtTokenProvider.createToken(username, usersRepository.findByUsername(username).getRoles());
}
}