/** * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.organization.webui.component; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.ResourceBundle; import org.exoplatform.commons.serialization.api.annotations.Serialized; import org.exoplatform.portal.application.PortalRequestContext; import org.exoplatform.portal.config.UserACL; import org.exoplatform.portal.mop.SiteKey; import org.exoplatform.portal.webui.util.Util; import org.exoplatform.services.organization.OrganizationService; import org.exoplatform.services.organization.Query; import org.exoplatform.services.organization.User; import org.exoplatform.services.organization.UserStatus; import org.exoplatform.services.organization.idm.PicketLinkIDMOrganizationServiceImpl; import org.exoplatform.services.security.ConversationState; import org.exoplatform.services.security.Identity; import org.exoplatform.web.application.ApplicationMessage; import org.exoplatform.web.login.LogoutControl; import org.exoplatform.web.url.navigation.NavigationResource; import org.exoplatform.web.url.navigation.NodeURL; import org.exoplatform.webui.application.WebuiRequestContext; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIApplication; import org.exoplatform.webui.core.UIComponent; import org.exoplatform.webui.core.UIConfirmation; import org.exoplatform.webui.core.UIPageIterator; import org.exoplatform.webui.core.UIPopupWindow; import org.exoplatform.webui.core.UISearch; import org.exoplatform.webui.core.lifecycle.UIContainerLifecycle; import org.exoplatform.webui.core.model.SelectItemOption; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.form.UIFormInputSet; import org.exoplatform.webui.form.UIFormSelectBox; import org.exoplatform.webui.form.UIFormStringInput; import org.gatein.web.security.impersonation.ImpersonatedIdentity; import org.gatein.web.security.impersonation.ImpersonationUtils; /** * Created by The eXo Platform SARL Author : chungnv nguyenchung136@yahoo.com Jun 23, 2006 10:07:15 AM */ @ComponentConfig(lifecycle = UIContainerLifecycle.class, events = { @EventConfig(listeners = UIListUsers.DisableEnableUserActionListener.class), @EventConfig(listeners = UIListUsers.ConfirmCloseActionListener.class), @EventConfig(listeners = UIListUsers.AbortCloseActionListener.class), @EventConfig(listeners = UIListUsers.ViewUserInfoActionListener.class), @EventConfig(listeners = UIListUsers.SelectUserActionListener.class), @EventConfig(listeners = UIListUsers.DeleteUserActionListener.class, confirm = "UIListUsers.deleteUser"), @EventConfig(listeners = UIListUsers.ImpersonateUserActionListener.class) }) @Serialized public class UIListUsers extends UISearch { public static final String USER_NAME = "userName"; public static final String LAST_NAME = "lastName"; public static final String FIRST_NAME = "firstName"; public static final String EMAIL = "email"; public static final String USER_STATUS_FILTER = "userStatusFilter"; private static final String[] USER_BEAN_FIELD = { USER_NAME, LAST_NAME, FIRST_NAME, EMAIL }; private static final String[] USER_ACTION = { "ViewUserInfo", "DeleteUser", "ImpersonateUser" }; private static final List<SelectItemOption<String>> OPTIONS_ = Collections.unmodifiableList(Arrays.asList( new SelectItemOption<String>(USER_NAME, USER_NAME), new SelectItemOption<String>(LAST_NAME, LAST_NAME), new SelectItemOption<String>(FIRST_NAME, FIRST_NAME), new SelectItemOption<String>(EMAIL, EMAIL))); private static final List<SelectItemOption<String>> USER_STATUS_OPTIONS = Collections.unmodifiableList(Arrays.asList( new SelectItemOption<String>("Enabled", UserStatus.ENABLED.name()), new SelectItemOption<String>("Disabled", UserStatus.DISABLED.name()), new SelectItemOption<String>("Any", UserStatus.ANY.name()) )); private Query lastQuery_; private UserStatus statusFilter = UserStatus.ENABLED; private String userSelected_; private UIGridUsers grid_; public UIListUsers() throws Exception { super(OPTIONS_); UIFormInputSet inputSet = getUISearchForm().getQuickSearchInputSet(); boolean showDisableUserFilterCheckbox = true; OrganizationService orgService = this.getApplicationComponent(OrganizationService.class); if(orgService instanceof PicketLinkIDMOrganizationServiceImpl && !((PicketLinkIDMOrganizationServiceImpl) orgService).getConfiguration().isFilterDisabledUsersInQueries()) { showDisableUserFilterCheckbox = false; } if(showDisableUserFilterCheckbox) { UIFormSelectBox selectBox = new UIFormSelectBox("UIListUsers-" + USER_STATUS_FILTER, null, USER_STATUS_OPTIONS); selectBox.setValue(UserStatus.ENABLED.name()); selectBox.setId("UIListUsers-" + USER_STATUS_FILTER); inputSet.addChild(selectBox); } grid_ = addChild(UIGridUsers.class, null, "UIListUsersGird"); grid_.configure(USER_NAME, USER_BEAN_FIELD, USER_ACTION); grid_.getUIPageIterator().setId("UIListUsersIterator"); grid_.getUIPageIterator().setParent(this); UIConfirmation uiConfirmation = addChild(UIConfirmation.class, null, null); uiConfirmation.setCaller(this); } /** * @see org.exoplatform.webui.core.UIComponent#processRender(org.exoplatform.webui.application.WebuiRequestContext) */ @Override public void processRender(WebuiRequestContext context) throws Exception { int curPage = grid_.getUIPageIterator().getCurrentPage(); if (lastQuery_ == null) lastQuery_ = new Query(); search(lastQuery_); grid_.getUIPageIterator().setCurrentPage(curPage); grid_.getUIPageIterator().getCurrentPageData(); super.processRender(context); } public void setUserSelected(String userName) { userSelected_ = userName; } public String getUserSelected() { return userSelected_; } public void search(Query query) { lastQuery_ = query; grid_.getUIPageIterator().setPageList(new FindUsersPageList(query, 10, statusFilter)); } public void quickSearch(UIFormInputSet quickSearchInput) throws Exception { Query query = new Query(); UIFormStringInput input = (UIFormStringInput) quickSearchInput.getChild(0); UIFormSelectBox select = (UIFormSelectBox) quickSearchInput.getChild(1); String name = input.getValue(); if (name != null && !(name = name.trim()).equals("")) { if (name.indexOf("*") < 0) { if (name.charAt(0) != '*') name = "*" + name; if (name.charAt(name.length() - 1) != '*') name += "*"; } name = name.replace('?', '_'); String selectBoxValue = select.getValue(); if (selectBoxValue.equals(USER_NAME)) query.setUserName(name); if (selectBoxValue.equals(LAST_NAME)) query.setLastName(name); if (selectBoxValue.equals(FIRST_NAME)) query.setFirstName(name); if (selectBoxValue.equals(EMAIL)) query.setEmail(name); } //Fetch user status UIFormSelectBox selectBox = getUISearchForm().getQuickSearchInputSet() .getChildById("UIListUsers-" + USER_STATUS_FILTER); if(selectBox != null) { String status = selectBox.getValue(); statusFilter = UserStatus.valueOf(status); } else { statusFilter = UserStatus.ANY; } search(query); if (getChild(UIGridUsers.class).getUIPageIterator().getAvailable() == 0) { UIApplication uiApp = Util.getPortalRequestContext().getUIApplication(); uiApp.addMessage(new ApplicationMessage("UISearchForm.msg.empty", null)); } } @SuppressWarnings("unused") public void advancedSearch(UIFormInputSet advancedSearchInput) { } public void showConfirmWindow(String message) { UIConfirmation uiConfirmation = getChild(UIConfirmation.class); createActionConfirms(uiConfirmation); uiConfirmation.setMessage(message); ((WebuiRequestContext) WebuiRequestContext.getCurrentInstance()).addUIComponentToUpdateByAjax(uiConfirmation); } public void createActionConfirms(UIConfirmation uiConfirmation) { ResourceBundle resourceBundle = WebuiRequestContext.getCurrentInstance().getApplicationResourceBundle(); String yes = resourceBundle.getString("UIEditInlineWorkspace.confirm.yes"); String no = resourceBundle.getString("UIEditInlineWorkspace.confirm.no"); List<UIConfirmation.ActionConfirm> actionConfirms = new ArrayList<UIConfirmation.ActionConfirm>(); actionConfirms.add(new UIConfirmation.ActionConfirm("ConfirmClose", yes)); actionConfirms.add(new UIConfirmation.ActionConfirm("AbortClose", no)); uiConfirmation.setActions(actionConfirms); } private boolean executeDisableUser(Event<UIListUsers> event, String userName) throws Exception { if(userName == null) { return false; } UIListUsers uiListUser = event.getSource(); OrganizationService service = uiListUser.getApplicationComponent(OrganizationService.class); User user = service.getUserHandler().findUserByName(userName, UserStatus.ANY); if(user == null) { UIApplication uiApp = event.getRequestContext().getUIApplication(); uiApp.addMessage(new ApplicationMessage("UIListUsers.msg.user-is-deleted", null, ApplicationMessage.WARNING)); return false; } UserACL userACL = uiListUser.getApplicationComponent(UserACL.class); if (userACL.getSuperUser().equals(userName) && user.isEnabled()) { UIApplication uiApp = event.getRequestContext().getUIApplication(); uiApp.addMessage(new ApplicationMessage("UIListUsers.msg.DisableSuperUser", new String[] { userName }, ApplicationMessage.WARNING)); return false; } service.getUserHandler().setEnabled(userName, !user.isEnabled(), true); return true; } public static class ViewUserInfoActionListener extends EventListener<UIListUsers> { public void execute(Event<UIListUsers> event) throws Exception { String username = event.getRequestContext().getRequestParameter(OBJECTID); UIListUsers uiListUsers = event.getSource(); OrganizationService service = uiListUsers.getApplicationComponent(OrganizationService.class); User user = service.getUserHandler().findUserByName(username, UserStatus.ANY); if (user == null) { UIApplication uiApplication = event.getRequestContext().getUIApplication(); uiApplication.addMessage(new ApplicationMessage("UIListUsers.msg.user-is-deleted", null, ApplicationMessage.WARNING)); return; } uiListUsers.setRendered(false); UIUserManagement uiUserManager = uiListUsers.getParent(); UIUserInfo uiUserInfo = uiUserManager.getChild(UIUserInfo.class); uiUserInfo.setUser(username); uiUserInfo.setRendered(true); UIComponent uiToUpdateAjax = uiListUsers.getAncestorOfType(UIUserManagement.class); event.getRequestContext().addUIComponentToUpdateByAjax(uiToUpdateAjax); } } public static class DeleteUserActionListener extends EventListener<UIListUsers> { public void execute(Event<UIListUsers> event) throws Exception { UIListUsers uiListUser = event.getSource(); String userName = event.getRequestContext().getRequestParameter(OBJECTID); OrganizationService service = uiListUser.getApplicationComponent(OrganizationService.class); UserACL userACL = uiListUser.getApplicationComponent(UserACL.class); if (userACL.getSuperUser().equals(userName)) { UIApplication uiApp = event.getRequestContext().getUIApplication(); uiApp.addMessage(new ApplicationMessage("UIListUsers.msg.DeleteSuperUser", new String[] { userName }, ApplicationMessage.WARNING)); return; } UIPageIterator pageIterator = uiListUser.getChild(UIGridUsers.class).getUIPageIterator(); int currentPage = pageIterator.getCurrentPage(); service.getUserHandler().removeUser(userName, true); uiListUser.search(uiListUser.lastQuery_); while (currentPage > pageIterator.getAvailablePage()) currentPage--; pageIterator.setCurrentPage(currentPage); UIComponent uiToUpdateAjax = uiListUser.getAncestorOfType(UIUserManagement.class); event.getRequestContext().addUIComponentToUpdateByAjax(uiToUpdateAjax); } } public static class ImpersonateUserActionListener extends EventListener<UIListUsers> { public void execute(Event<UIListUsers> event) throws Exception { UIListUsers uiListUsers = event.getSource(); String userName = event.getRequestContext().getRequestParameter(OBJECTID); UIApplication uiApplication = event.getRequestContext().getUIApplication(); OrganizationService service = uiListUsers.getApplicationComponent(OrganizationService.class); User userToImpersonate = service.getUserHandler().findUserByName(userName, UserStatus.ANY); if (userToImpersonate == null) { uiApplication.addMessage(new ApplicationMessage("UIListUsers.msg.user-is-deleted", null, ApplicationMessage.WARNING)); return; } UserACL userACL = uiListUsers.getApplicationComponent(UserACL.class); if (!userACL.hasImpersonateUserPermission(userToImpersonate)) { String[] args = new String[] { userName }; uiApplication.addMessage(new ApplicationMessage("UIListUsers.msg.insufficient-permission-to-impersonate-user", args, ApplicationMessage.WARNING)); return; } ConversationState currentConversationState = ConversationState.getCurrent(); Identity currentIdentity = currentConversationState.getIdentity(); if (currentIdentity instanceof ImpersonatedIdentity) { uiApplication.addMessage(new ApplicationMessage("UIListUsers.msg.already-impersonated", null, ApplicationMessage.WARNING)); return; } // Redirect to impersonation servlet PortalRequestContext portalRequestContext = Util.getPortalRequestContext(); SiteKey siteKey = portalRequestContext.getSiteKey(); NodeURL currentNodeURL = portalRequestContext.createURL(NodeURL.TYPE); currentNodeURL.setResource(new NavigationResource(siteKey, portalRequestContext.getNodePath())); String impersonationRedirectURL = ImpersonationUtils.createStartImpersonationURL(portalRequestContext.getRequestContextPath(), userName, currentNodeURL.toString()); portalRequestContext.getJavascriptManager().addJavascript("window.location = '" + impersonationRedirectURL + "';"); } } public static class SelectUserActionListener extends EventListener<UIListUsers> { public void execute(Event<UIListUsers> event) throws Exception { UIListUsers uiListUser = event.getSource(); String userName = event.getRequestContext().getRequestParameter(OBJECTID); UIPopupWindow popup = uiListUser.getAncestorOfType(UIPopupWindow.class); popup.setShow(false); UIGroupMembershipForm groupMembershipForm = popup.getParent(); groupMembershipForm.setUserName(userName); event.getRequestContext().addUIComponentToUpdateByAjax(groupMembershipForm); } } public static class DisableEnableUserActionListener extends EventListener<UIListUsers> { @Override public void execute(Event<UIListUsers> event) throws Exception { UIListUsers uiListUser = event.getSource(); String userName = event.getRequestContext().getRequestParameter(OBJECTID); OrganizationService service = uiListUser.getApplicationComponent(OrganizationService.class); if(userName != null && userName.equals(event.getRequestContext().getRemoteUser())) { //Need to confirm to disable current user //Current user will be disable on confirmed ResourceBundle resourceBundle = event.getRequestContext().getApplicationResourceBundle(); String disableMessage = resourceBundle.getString("UIListUsers.msg.DisableYourSelf"); uiListUser.showConfirmWindow(disableMessage); return; } uiListUser.executeDisableUser(event, userName); } } public static class ConfirmCloseActionListener extends EventListener<UIListUsers> { @Override public void execute(Event<UIListUsers> event) throws Exception { UIListUsers uiListUsers = event.getSource(); UIConfirmation uiConfirmation = uiListUsers.getChild(UIConfirmation.class); uiConfirmation.createEvent("Close", event.getExecutionPhase(), event.getRequestContext()).broadcast(); //Disable current user String userName = event.getRequestContext().getRemoteUser(); if(userName != null) { if(uiListUsers.executeDisableUser(event, userName)) { LogoutControl.wantLogout(); } } UIComponent uiToUpdateAjax = uiListUsers.getAncestorOfType(UIUserManagement.class); event.getRequestContext().addUIComponentToUpdateByAjax(uiToUpdateAjax); } } public static class AbortCloseActionListener extends EventListener<UIListUsers> { @Override public void execute(Event<UIListUsers> event) throws Exception { UIListUsers uiListUsers = event.getSource(); UIConfirmation uiConfirmation = uiListUsers.getChild(UIConfirmation.class); uiConfirmation.createEvent("Close", event.getExecutionPhase(), event.getRequestContext()).broadcast(); } } }