UserBean.java 8.23 KB
package fi.insomnia.bortal.beans;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import fi.insomnia.bortal.enums.apps.SpecialPermission;
import fi.insomnia.bortal.enums.apps.UserPermission;
import fi.insomnia.bortal.facade.GroupMembershipFacade;
import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.facade.UserImageFacade;
import fi.insomnia.bortal.model.GroupMembership;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.PlaceGroup;
import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.model.UserImage;
import fi.insomnia.bortal.util.MailMessage;
import fi.insomnia.bortal.utilities.I18n;
import fi.insomnia.bortal.utilities.PasswordFunctions;
import fi.insomnia.bortal.utilities.SearchResult;

/**
 * Session Bean implementation class UserBean
 */
@LocalBean
@Stateless
@DeclareRoles({ UserPermission.S_VIEW_ALL, SpecialPermission.S_USER })
public class UserBean implements UserBeanLocal {

	private static final Logger logger = LoggerFactory.getLogger(UserBean.class);

	/**
	 * Java EE container injektoi tämän luokkamuuttujan luokan luonnin
	 * yhteydessä.
	 */
	@EJB
	private UserFacade userFacade;

	@PersistenceContext
	private EntityManager em;

	@EJB
	private EventBeanLocal eventBean;

	@EJB
	private UserImageFacade userimagefacade;

	@EJB
	private UtilBeanLocal utilbean;

	@EJB
	private CardTemplateBeanLocal ctbean;
	@EJB
	private AccountEventBeanLocal acbean;
	@EJB
	private GroupMembershipFacade groupMembershipFacade;

	@EJB
	private PermissionBeanLocal permbean;

	private GroupMembershipFacade gmfacade;

	@Override
	@RolesAllowed(UserPermission.S_VIEW_ALL)
	public List<User> getUsers() {

		List<User> ret = userFacade.findAll();
		return ret;
	}

	@Override
	@RolesAllowed(SpecialPermission.S_USER)
	public User mergeChanges(User user) throws PermissionDeniedException {
		if (!permbean.isCurrentUser(user)) {

			permbean.fatalPermission(UserPermission.MODIFY);
		}

		User ret = userFacade.merge(user);
		ctbean.checkPrintedCard(user);

		return ret;
	}

	@Override
	public User getUser(String nick) {
		return userFacade.findByLogin(nick);
	}

	@Override
	public List<Role> findUsersRoles(User u) throws PermissionDeniedException {
		User currusr = permbean.getCurrentUser();
		if (!currusr.equals(u)) {
			permbean.fatalNotLoggedIn();
		}

		return localFindUsersRoles(u);

	}

	public List<Role> localFindUsersRoles(User u) {
		Set<Role> checkedRoles = new HashSet<Role>();
		if (u != null)
		{
			addRecursive(checkedRoles, u.getRoles());

			if (permbean.isLoggedIn()) {

				LanEvent event = eventBean.getCurrentEvent();
				// add roles from events default role.
				addRecursive(checkedRoles, event.getDefaultRole());

				// add roles from accountEvents of the user
				addRecursive(checkedRoles, acbean.getRolesFromAccountEvents(u));

				for (GroupMembership member : groupMembershipFacade.findMemberships(u)) {
					addRecursive(checkedRoles, member.getPlaceReservation().getProvidesRole());

				}
			}
		}
		return new ArrayList<Role>(checkedRoles);
	}

	private void addRecursive(Set<Role> checkedRoles, Collection<Role> roles) {
		for (Role r : roles) {
			addRecursive(checkedRoles, r);
		}
	}

	private void addRecursive(Set<Role> checkedRoles, Role role) {
		if (role == null || checkedRoles.contains(role)) {
			return;
		}
		checkedRoles.add(role);
		for (Role r : role.getParents()) {
			addRecursive(checkedRoles, r);
		}

	}

	@Override
	@RolesAllowed(SpecialPermission.S_USER)
	public UserImage uploadImage(Integer userid, String contentType, byte[] image, String filename, String description) throws PermissionDeniedException {
		User user = permbean.getCurrentUser();
		logger.debug("uploading image to userid {}", userid);
		if (userid == null || userid.equals(0)) {
			userid = user.getId();
		}

		if (!user.getId().equals(userid)) {
			permbean.fatalPermission(UserPermission.MODIFY, "usert tried to save picture to userid " + userid + " without sufficient permissions!");
			user = userFacade.find(userid);
		}
		UserImage userimage = new UserImage(user);
		userimage.setMimeType(contentType);
		userimage.setImageData(image);
		userimage.setName(filename);
		userimage.setDescription(description);

		user.getUserImageList().add(userimage);

		// setting uploaded image as the default.
		user.setCurrentImage(userimage);

		return userimage;
	}

	@Override
	public UserImage findUserImage(int id) throws PermissionDeniedException {

		UserImage ret = null;
		if (id == 0 && permbean.isLoggedIn()) {
			ret = permbean.getCurrentUser().getCurrentImage();
		} else {
			ret = userimagefacade.find(id);
			if (ret != null && !permbean.isCurrentUser(ret.getUser())) {
				permbean.fatalPermission(UserPermission.MODIFY, "Not enough rights to access image id: " + id + " for user " + ret.getUser());
			}
		}
		return ret;
	}

	// @Override
	// public List<User> searchName(String name) {
	// return userFacade.searchForName(name);
	// }

	@Override
	public User createNewUser(User user, String password) {

		user.resetPassword(password);
		// Tallennetaan olio kantaan...
		userFacade.create(user);
		em.flush();
		return user;
	}

	@Override
	public User findPasswordResetUser(Integer id, String hash) {
		User ret = null;
		if (id != null && hash != null && id > 0 && !hash.isEmpty()) {
			User user = userFacade.find(id);
			if (user != null && hash.equals(user.getConfirmHash())) {
				ret = user;
			}
		}
		return ret;
	}

	@Override
	public boolean resetPassword(User user, String password, String hash) {
		User nuser = userFacade.find(user.getId());
		if (user.equals(nuser) && hash.equals(nuser.getConfirmHash())) {
			logger.debug("Changing user {} password with confirmhash {}", user, hash);
			nuser.setConfirmHash(null);
			nuser.resetPassword(password);
			userFacade.merge(nuser);
			return true;
		}
		return false;
	}

	@Override
	public User initPasswordReset(User user, String hash, String mailpath) {
		if (hash == null || hash.length() < 20 || user == null || user.getEmail() == null || user.getEmail().length() <= 5) {
			logger.info("Not sending email with params {} {}", new Object[] { user, hash });
			return null;
		}
		logger.info("sending mail! user {} hash {} path {}", new Object[] { user, hash, mailpath });
		MailMessage msg = new MailMessage();
		msg.setTo(user);
		msg.setSubject(I18n.get("passwordreset.mailSubject"));
		msg.setMessage(I18n.get("passwordreset.mailBody", mailpath));

		logger.info("sending mail! user {} hash {} path {}", new Object[] { user, hash, mailpath });
		utilbean.sendMail(msg);

		user = userFacade.find(user.getId());
		user.setConfirmHash(hash);
		return user;

	}

	@Override
	public User findById(Integer id) {
		return userFacade.find(id);
	}

	@Override
	public SearchResult<User> getUsers(int page, int pagesize, String sort, String search) {
		return userFacade.searchUser(page, pagesize, sort, search);
	}

	// @Override
	// public long getUsersCount(String search) {
	// return userFacade.searchUserCount(search);
	// }

	@Override
	@RolesAllowed("USER/EXECUTE")
	public boolean invite(String invitemail) {

		List<User> usercheck = userFacade.findByEmail(invitemail.trim());
		if (usercheck.size() > 0) {
			return false;
		}
		User creator = permbean.getCurrentUser();
		LanEvent ev = eventBean.getCurrentEvent();
		PlaceGroup pg = new PlaceGroup(ev, Calendar.getInstance(), Calendar.getInstance(), false);
		pg.setCreator(creator);
		pg.setName("Invitebean");
		String token = PasswordFunctions.generateRandomString(30, PasswordFunctions.ALL_CHARS);
		pg.getMembers().add(new GroupMembership(pg, null, token));
		creator.getPlaceGroups().add(pg);

		return true;
	}

	@Override
	public GroupMembership findToken(String token) {
		return gmfacade.findByToken(token);
	}

	@Override
	public void createFromToken(User user, GroupMembership gm) {
		gm = gmfacade.merge(gm);

		gm.setUser(user);
		gm.setInviteAccepted(Calendar.getInstance());

		userFacade.create(user);
	}

}