package binky.reportrunner.service.impl; import java.security.NoSuchAlgorithmException; import java.util.LinkedList; import java.util.List; import org.apache.log4j.Logger; import binky.reportrunner.dao.ReportRunnerDao; import binky.reportrunner.data.RunnerGroup; import binky.reportrunner.data.RunnerUser; import binky.reportrunner.service.UserService; import binky.reportrunner.util.EncryptionUtil; public class UserServiceImpl implements UserService { private ReportRunnerDao<RunnerUser, String> userDao; private ReportRunnerDao<RunnerGroup, String> groupDao; private static Logger logger = Logger.getLogger(UserServiceImpl.class); @Override public void saveOrUpdate(RunnerUser user) { userDao.saveOrUpdate(user); } @Override public void deleteUser(String userName) { userDao.delete(userName); } @Override public RunnerUser getUser(String userName) { RunnerUser user = userDao.get(userName); if (user != null) { user.setGroups(getGroupsForUser(userName)); } return user; } @Override public List<RunnerGroup> getGroupsForUser(String userName) { RunnerUser user = userDao.get(userName); if (user.getIsAdmin()) { return groupDao.getAll(); } else { return user.getGroups(); } } @Override public List<RunnerUser> getAll() { return userDao.getAll(); } public void setUserDao(ReportRunnerDao<RunnerUser, String> userDao) { this.userDao = userDao; //if no admin user then create one checkForAnyUsers(); } public void setGroupDao(ReportRunnerDao<RunnerGroup, String> groupDao) { this.groupDao = groupDao; } @Override public boolean changePassword(String userName, String oldPassword, String newPassword) throws NoSuchAlgorithmException { RunnerUser u = userDao.get(userName); EncryptionUtil enc = new EncryptionUtil(); if (u.getPassword().equals(enc.hashString(oldPassword))) { u.setPassword(enc.hashString(newPassword)); userDao.saveOrUpdate(u); return true; } else { return false; } } @Override public RunnerUser createUser(String userName, String password, String fullName, boolean readOnly, boolean administrator, boolean locked, List<RunnerGroup> groups) throws NoSuchAlgorithmException{ EncryptionUtil e = new EncryptionUtil(); RunnerUser user = new RunnerUser(); user.setUserName(userName); user.setFullName(fullName); user.setPassword(e.hashString(password)); user.setIsReadOnly(readOnly); user.setIsLocked(locked); user.setIsAdmin(administrator); user.setGroups(groups); userDao.saveOrUpdate(user); return user; } private void checkForAnyUsers() { List<RunnerUser> us = this.userDao.getAll(); if (us==null || us.size()<1) { try { logger.warn("creating admin user as there are no users!"); createUser("admin","password","Administrator",false,true,false,new LinkedList<RunnerGroup>()); } catch (NoSuchAlgorithmException e) { logger.fatal(e,e); } } } }