package org.butor.dbauth.model;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.butor.auth.common.AuthMessageID;
import org.butor.auth.common.user.ListUserCriteria;
import org.butor.auth.common.user.User;
import org.butor.auth.common.user.UserKey;
import org.butor.auth.common.user.UserModel;
import org.butor.auth.common.user.UserQuestions;
import org.butor.auth.common.user.UserServices;
import org.butor.auth.dao.UserDao;
import org.butor.checksum.CommonChecksumFunction;
import org.butor.json.CommonRequestArgs;
import org.butor.json.service.Context;
import org.butor.json.service.ResponseHandler;
import org.butor.ldap.LdapUserModel;
import org.butor.mail.IMailer;
import org.butor.utils.ApplicationException;
import org.butor.utils.CommonMessageID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Strings;
public class DefaultUserModel implements UserServices, UserModel {
private Logger logger = LoggerFactory.getLogger(getClass());
private UserDao userDao;
public static final String EMAIL_REGEX = "^[a-zA-Z0-9\\w\\.-]+@[a-zA-Z0-9\\w\\.-]+\\.[a-zA-Z0-9\\w\\.-]+$";
public static final Pattern emailPattern = Pattern.compile(EMAIL_REGEX);
private LdapUserModel ldapUserModel = null;
private IMailer mailer;
@Override
public void listUser(final Context ctx, ListUserCriteria criteria, String func) {
CommonRequestArgs cra = ctx.getRequest();
ResponseHandler<Object> rh = ctx.getResponseHandler();
List<User> list = userDao.listUser(criteria, func, cra);
Iterator<User> it = list.iterator();
while (it.hasNext()) {
User u = it.next();
u.setPwd(null);
rh.addRow(u);
}
}
@Override
public void readUser(Context ctx, String id, String func) {
ResponseHandler<Object> rh = ctx.getResponseHandler();
CommonRequestArgs cra = ctx.getRequest();
User user = readUser(id, func, cra);
if (user == null) {
rh.addMessage(CommonMessageID.NOT_FOUND.getMessage());
return;
}
rh.addRow(user);
}
@Override
public void updateUser(Context ctx, User user) {
ResponseHandler<Object> rh = ctx.getResponseHandler();
if (Strings.isNullOrEmpty(user.getEmail())) {
rh.addMessage(CommonMessageID.MISSING_ARG.getMessage("Email"));
return;
}
if (Strings.isNullOrEmpty(user.getId())) {
rh.addMessage(CommonMessageID.MISSING_ARG.getMessage("ID"));
return;
}
CommonRequestArgs cra = ctx.getRequest();
validateUser(user);
if(Strings.isNullOrEmpty(user.getFullName())) {
user.setFullName(user.getDisplayName());
}
if (!Strings.isNullOrEmpty(user.getNewPwd())) {
user.setPwd(CommonChecksumFunction.SHA512.generateChecksum(user.getNewPwd()));
}
UserKey uk = userDao.updateUser(user, cra);
if (uk == null) {
rh.addMessage(CommonMessageID.NOT_FOUND.getMessage());
return;
}
rh.addRow(uk);
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void insertUser(Context ctx, User user) {
ResponseHandler<Object> rh = ctx.getResponseHandler();
CommonRequestArgs cra = ctx.getRequest();
validateUser(user);
if(Strings.isNullOrEmpty(user.getFullName())) {
user.setFullName(user.getDisplayName());
}
if (!Strings.isNullOrEmpty(user.getNewPwd())) {
user.setPwd(CommonChecksumFunction.SHA512.generateChecksum(user.getNewPwd()));
}
UserKey uk = userDao.insertUser(user, cra);
if (uk == null) {
rh.addMessage(CommonMessageID.SERVICE_FAILURE.getMessage());
return;
}
rh.addRow(uk);
}
private void validateUser(User user) {
if (user == null) {
ApplicationException.exception(CommonMessageID.MISSING_ARG.getMessage("User"));
}
if (Strings.isNullOrEmpty(user.getId())) {
ApplicationException.exception(CommonMessageID.MISSING_ARG.getMessage("ID"));
}
if (Strings.isNullOrEmpty(user.getEmail())) {
ApplicationException.exception(CommonMessageID.MISSING_ARG.getMessage("Email"));
}
Matcher matcher = emailPattern.matcher(user.getEmail());
if (!matcher.find()) {
ApplicationException.exception(CommonMessageID.INVALID_ARG.getMessage("Email"));
}
if (Strings.isNullOrEmpty(user.getFirstName())) {
ApplicationException.exception(CommonMessageID.MISSING_ARG.getMessage("First name"));
}
if (Strings.isNullOrEmpty(user.getLastName())) {
ApplicationException.exception(CommonMessageID.MISSING_ARG.getMessage("Last name"));
}
if (Strings.isNullOrEmpty(user.getDisplayName())) {
ApplicationException.exception(CommonMessageID.MISSING_ARG.getMessage("Display name"));
}
if (user.getFirmId() <= 0) {
ApplicationException.exception(CommonMessageID.MISSING_ARG.getMessage("Firm"));
}
if (!Strings.isNullOrEmpty(user.getNewPwd()) || !Strings.isNullOrEmpty(user.getNewPwdConf())) {
if (Strings.isNullOrEmpty(user.getNewPwd())) {
ApplicationException.exception(CommonMessageID.MISSING_ARG.getMessage("New password"));
}
if (Strings.isNullOrEmpty(user.getNewPwdConf())) {
ApplicationException.exception(CommonMessageID.MISSING_ARG.getMessage("Confirm new password"));
}
if (!user.getNewPwd().equals(user.getNewPwdConf())) {
ApplicationException.exception(CommonMessageID.INVALID_ARG.getMessage("new passwords do not match"));
}
}
String id = user.getId();
//force id to lowercase
user.setId(id.toLowerCase());
boolean emailId = emailPattern.matcher(id).find();
if (!emailId) {
ApplicationException.exception(AuthMessageID.USER_ID_SHOULD_BE_EMAIL.getMessage());
}
}
@Override
public void deleteUser(Context ctx, UserKey uk) {
CommonRequestArgs cra = ctx.getRequest();
User user = userDao.readUser(uk.getId(), null, cra);
if (user == null) {
ApplicationException.exception(AuthMessageID.USER_NOT_FOUND.getMessage());
}
if (user.isActive()) {
ApplicationException.exception(AuthMessageID.USER_SHOULD_BE_INACTIVE_TO_BE_DELETED.getMessage());
}
userDao.deleteUser(uk, cra);
}
@Override
public User readUser(String id, String func, CommonRequestArgs cra) {
return userDao.readUser(id, func, cra);
}
@Override
public void readQuestions(Context ctx, String id) {
ResponseHandler<Object> rh = ctx.getResponseHandler();
CommonRequestArgs cra = ctx.getRequest();
UserQuestions uq = userDao.readQuestions(id, cra);
if (uq == null) {
rh.addMessage(CommonMessageID.NOT_FOUND.getMessage());
return;
}
rh.addRow(uq);
}
@Override
public void updateState(Context ctx, User user) {
ResponseHandler<Object> rh = ctx.getResponseHandler();
CommonRequestArgs cra = ctx.getRequest();
UserKey uk = userDao.updateState(user, cra);
if (uk == null) {
rh.addMessage(CommonMessageID.NOT_FOUND.getMessage());
return;
}
rh.addRow(uk);
}
@Override
public void updateQuestions(Context ctx, UserQuestions questions) {
ResponseHandler<Object> rh = ctx.getResponseHandler();
CommonRequestArgs cra = ctx.getRequest();
UserKey uk = userDao.updateQuestions(questions, cra);
if (uk == null) {
rh.addMessage(CommonMessageID.NOT_FOUND.getMessage());
return;
}
rh.addRow(uk);
}
public void setLdapUserModel(LdapUserModel ldapUserModel) {
this.ldapUserModel = ldapUserModel;
}
public void setMailer(IMailer mailer) {
this.mailer = mailer;
}
}