package fi.otavanopisto.pyramus.plugin.auth.internal;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Logger;
import org.apache.commons.lang.math.NumberUtils;
import fi.internetix.smvc.SmvcRuntimeException;
import fi.internetix.smvc.controllers.RequestContext;
import fi.otavanopisto.pyramus.dao.DAOFactory;
import fi.otavanopisto.pyramus.dao.base.EmailDAO;
import fi.otavanopisto.pyramus.dao.base.PersonDAO;
import fi.otavanopisto.pyramus.dao.users.InternalAuthDAO;
import fi.otavanopisto.pyramus.dao.users.StaffMemberDAO;
import fi.otavanopisto.pyramus.dao.users.UserIdentificationDAO;
import fi.otavanopisto.pyramus.domainmodel.base.Person;
import fi.otavanopisto.pyramus.domainmodel.users.InternalAuth;
import fi.otavanopisto.pyramus.domainmodel.users.Role;
import fi.otavanopisto.pyramus.domainmodel.users.User;
import fi.otavanopisto.pyramus.domainmodel.users.UserIdentification;
import fi.otavanopisto.pyramus.plugin.auth.AuthenticationException;
import fi.otavanopisto.pyramus.plugin.auth.InternalAuthenticationProvider;
import fi.otavanopisto.pyramus.plugin.auth.utils.EncodingUtils;
/**
* An authentication provider using the credential storage of the application itself.
*/
public class InternalAuthenticationStrategy implements InternalAuthenticationProvider {
private static Logger logger = Logger.getLogger(InternalAuthenticationStrategy.class.getName());
/**
* Creates a new user.
*
* @param firstName The first name of the user
* @param lastName The last name of the user
* @param email The email address of the user
* @param username The username of the user
* @param password The password of the user
* @param role The role of the user
*
* @return The created user
*/
public User createUser(String firstName, String lastName, String email, String username, String password, Role role) {
StaffMemberDAO userDAO = DAOFactory.getInstance().getStaffMemberDAO();
InternalAuthDAO internalAuthDAO = DAOFactory.getInstance().getInternalAuthDAO();
EmailDAO emailDAO = DAOFactory.getInstance().getEmailDAO();
PersonDAO personDAO = DAOFactory.getInstance().getPersonDAO();
// Trim the email address
email = email != null ? email.trim() : null;
try {
String passwordEncoded = EncodingUtils.md5EncodeString(password);
internalAuthDAO.create(username, passwordEncoded);
// TODO: Should not create always
Person person = personDAO.create(null, null, null, null, Boolean.FALSE);
//FIXME: Create identification? / set default?
User user = userDAO.create(firstName, lastName, role, person, false);
// TODO Default contact type?
emailDAO.create(user.getContactInfo(), null, Boolean.TRUE, email);
return user;
}
catch (UnsupportedEncodingException e) {
throw new SmvcRuntimeException(e);
}
catch (NoSuchAlgorithmException e) {
throw new SmvcRuntimeException(e);
}
}
/**
* Returns the username of a user corresponding to the given identifier, or <code>null</code> if
* not found.
*
* @param externalId The user identifier
*
* @return The username of the user corresponding to the given identifier, or <code>null</code> if
* not found
*/
public String getUsername(String externalId) {
InternalAuthDAO internalAuthDAO = DAOFactory.getInstance().getInternalAuthDAO();
Long internalAuthId = NumberUtils.createLong(externalId);
if (internalAuthId != null && internalAuthId > 0) {
InternalAuth internalAuth = internalAuthDAO.findById(internalAuthId);
return internalAuth == null ? null : internalAuth.getUsername();
}
return null;
}
/**
* Returns the user corresponding to the given credentials. If no user cannot be found, returns
* <code>null</code>.
*
* @param username The username
* @param password The password
*
* @return The user corresponding to the given credentials, or <code>null</code> if not found
*/
public User getUser(String username, String password) {
UserIdentificationDAO userIdentificationDAO = DAOFactory.getInstance().getUserIdentificationDAO();
InternalAuthDAO internalAuthDAO = DAOFactory.getInstance().getInternalAuthDAO();
String passwordEncoded;
try {
passwordEncoded = EncodingUtils.md5EncodeString(password);
}
catch (UnsupportedEncodingException e) {
throw new SmvcRuntimeException(e);
}
catch (NoSuchAlgorithmException e) {
throw new SmvcRuntimeException(e);
}
InternalAuth internalAuth = internalAuthDAO.findByUsernameAndPassword(username, passwordEncoded);
if (internalAuth != null) {
UserIdentification userIdentification = userIdentificationDAO.findByAuthSourceAndExternalId(getName(), String.valueOf(internalAuth.getId()));
if(userIdentification != null){
return userIdentification.getPerson().getDefaultUser();
}
logger.warning("UserIdentification is null");
return null;
}
else {
return null;
}
}
@Override
public String createCredentials(String username, String password) {
InternalAuthDAO internalAuthDAO = DAOFactory.getInstance().getInternalAuthDAO();
try {
String newPasswordEncoded = EncodingUtils.md5EncodeString(password);
InternalAuth internalAuth = internalAuthDAO.create(username, newPasswordEncoded);
String externalId = internalAuth.getId().toString();
return externalId;
}
catch (UnsupportedEncodingException e) {
throw new SmvcRuntimeException(e);
}
catch (NoSuchAlgorithmException e) {
throw new SmvcRuntimeException(e);
}
}
@Override
public void updateUsername(String externalId, String username) {
InternalAuthDAO internalAuthDAO = DAOFactory.getInstance().getInternalAuthDAO();
InternalAuth internalAuth = internalAuthDAO.findById(NumberUtils.createLong(externalId));
internalAuthDAO.updateUsername(internalAuth, username);
}
@Override
public void updatePassword(String externalId, String password) {
InternalAuthDAO internalAuthDAO = DAOFactory.getInstance().getInternalAuthDAO();
try {
InternalAuth internalAuth = internalAuthDAO.findById(NumberUtils.createLong(externalId));
String newPasswordEncoded = EncodingUtils.md5EncodeString(password);
internalAuthDAO.updatePassword(internalAuth, newPasswordEncoded);
}
catch (UnsupportedEncodingException e) {
throw new SmvcRuntimeException(e);
}
catch (NoSuchAlgorithmException e) {
throw new SmvcRuntimeException(e);
}
}
/**
* Updates the credentials of the user corresponding to the given identifer.
*
* @param externalId The user identifier
* @param currentPassword The current password of the user
* @param newUsername The new username of the user
* @param newPassword The new password of the user
*
* @throws AuthenticationException If the current password is invalid
*/
public void updateCredentials(String externalId, String currentPassword, String newUsername, String newPassword)
throws AuthenticationException {
}
/**
* Returns whether this authentication provider is capable of updating the credentials of a user.
* This provider is capable of that, so <code>true</code> is always returned.
*
* @return Always <code>true</code>
*/
public boolean canUpdateCredentials() {
return true;
}
@Override
public boolean validatePassword(String externalId, String password) {
InternalAuthDAO internalAuthDAO = DAOFactory.getInstance().getInternalAuthDAO();
try {
InternalAuth internalAuth = internalAuthDAO.findById(NumberUtils.createLong(externalId));
String passwordEncoded = EncodingUtils.md5EncodeString(password);
return passwordEncoded.equals(internalAuth.getPassword());
}
catch (UnsupportedEncodingException e) {
throw new SmvcRuntimeException(e);
}
catch (NoSuchAlgorithmException e) {
throw new SmvcRuntimeException(e);
}
}
/**
* Returns the name of this authentication provider.
*
* @return The name of this authentication provider
*/
public String getName() {
return "internal";
}
@Override
public String logout(RequestContext requestContext) {
return null;
}
}