/** * Copyright 2011 Intuit Inc. All Rights Reserved */ package com.intuit.tank.admin; /* * #%L * JSF Support Beans * %% * Copyright (C) 2011 - 2015 Intuit Inc. * %% * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * #L% */ import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Set; import javax.enterprise.context.Conversation; import javax.enterprise.context.ConversationScoped; import javax.enterprise.event.Event; import javax.faces.model.SelectItem; import javax.inject.Inject; import javax.inject.Named; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.intuit.tank.util.Messages; import org.primefaces.model.DualListModel; import com.intuit.tank.ModifiedUserMessage; import com.intuit.tank.dao.GroupDao; import com.intuit.tank.dao.UserDao; import com.intuit.tank.project.Group; import com.intuit.tank.project.User; import com.intuit.tank.qualifier.Modified; import com.intuit.tank.util.TsConversationManager; import com.intuit.tank.vm.common.PasswordEncoder; import com.intuit.tank.vm.settings.TankConfig; /** * UserEdit * * @author dangleton * */ @Named @ConversationScoped public class UserEdit implements Serializable { private static final long serialVersionUID = 1L; private static final Logger LOG = LogManager.getLogger(UserEdit.class); private String password; private String passwordConfirm; @Inject @Modified private Event<ModifiedUserMessage> userEvent; @Inject private Messages messages; @Inject private Conversation conversation; private User user; private DualListModel<String> selectionModel; /** * @return the current */ public User getUser() { return user; } /** * @return the password */ public String getPassword() { return password; } /** * @return the selectionModel */ public DualListModel<String> getSelectionModel() { return selectionModel; } /** * @param selectionModel * the selectionModel to set */ public void setSelectionModel(DualListModel<String> selectionModel) { this.selectionModel = selectionModel; } public void generateApiToken() { if (user.getApiToken() == null) { user.generateApiToken(); user = new UserDao().saveOrUpdate(user); } } private void initSelectionModel() { GroupDao groupDao = new GroupDao(); selectionModel = new DualListModel<String>(); Set<Group> groups = user.getGroups(); if (groups.isEmpty()) { Set<String> defaultGroups = new TankConfig().getSecurityConfig().getDefaultGroups(); for (String s : defaultGroups) { Group g = groupDao.getOrCreateGroup(s); selectionModel.getTarget().add(g.getName()); } } else { for (Group g : groups) { selectionModel.getTarget().add(g.getName()); } } Set<String> allGroups = new TankConfig().getSecurityConfig().getGroups(); for (String s : allGroups) { if (!selectionModel.getTarget().contains(s)) { Group g = groupDao.getOrCreateGroup(s); selectionModel.getSource().add(g.getName()); } } List<SelectItem> ret = new ArrayList<SelectItem>(); for (Group g : groups) { ret.add(new SelectItem(g.getName())); } } /** * @param password * the password to set */ public void setPassword(String password) { this.password = password.trim(); } /** * * @param user * @return */ public String edit(User user) { conversation.begin(); clear(); this.user = user; initSelectionModel(); return "success"; } /** * * @return */ public String newUser() { conversation.begin(); clear(); this.user = new User(); initSelectionModel(); return "success"; } /** * @return the passwordConfirm */ public String getPasswordConfirm() { return passwordConfirm; } /** * @param passwordConfirm * the passwordConfirm to set */ public void setPasswordConfirm(String passwordConfirm) { this.passwordConfirm = passwordConfirm.trim(); } /** * Saves the user * * @return */ public String save() { boolean isNew = user.getId() == 0; if (!StringUtils.isBlank(password)) { if (!password.equals(passwordConfirm)) { LOG.warn("Password '" + password + "' does not match '" + passwordConfirm + "'"); messages.error("Passwords do not match."); return null; } user.setPassword(PasswordEncoder.encodePassword(password)); } else if (isNew) { messages.error("Passwords is Required."); return null; } UserDao userDao = new UserDao(); user = userDao.saveOrUpdate(user); user.getGroups().clear(); for (String g : selectionModel.getTarget()) { user.addGroup(new GroupDao().getOrCreateGroup(g)); } user = userDao.saveOrUpdate(user); userEvent.fire(new ModifiedUserMessage(user, this)); messages.info("User " + user.getName() + " has been " + (isNew ? "created" : "modified") + "."); conversation.end(); clear(); return "success"; } /** * */ private void clear() { user = null; password = null; passwordConfirm = null; selectionModel = null; } public String cancel() { conversation.end(); clear(); return "success"; } }