200 lines
7.4 KiB
Java
Executable File
200 lines
7.4 KiB
Java
Executable File
/*
|
|
* Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
|
|
*
|
|
* This library 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 library 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 library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
*/
|
|
package com.arsdigita.cms.ui;
|
|
|
|
import com.arsdigita.bebop.FormData;
|
|
import com.arsdigita.bebop.FormProcessException;
|
|
import com.arsdigita.bebop.Label;
|
|
import com.arsdigita.bebop.Link;
|
|
import com.arsdigita.bebop.PageState;
|
|
import com.arsdigita.bebop.SimpleContainer;
|
|
import com.arsdigita.bebop.event.FormSectionEvent;
|
|
import com.arsdigita.cms.CMS;
|
|
import com.arsdigita.cms.ContentSection;
|
|
import com.arsdigita.cms.SecurityManager;
|
|
import com.arsdigita.cms.UserHomeFolderMap;
|
|
import com.arsdigita.cms.util.GlobalizationUtil;
|
|
import com.arsdigita.cms.util.SecurityConstants;
|
|
import com.arsdigita.globalization.GlobalizedMessage;
|
|
import com.arsdigita.kernel.User;
|
|
import com.arsdigita.kernel.permissions.PermissionDescriptor;
|
|
import com.arsdigita.kernel.permissions.PermissionService;
|
|
import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
|
|
import com.arsdigita.persistence.DataQuery;
|
|
import com.arsdigita.persistence.Filter;
|
|
import com.arsdigita.persistence.OID;
|
|
import com.arsdigita.persistence.Session;
|
|
import com.arsdigita.persistence.SessionManager;
|
|
import com.arsdigita.ui.admin.Admin;
|
|
import com.arsdigita.web.Application;
|
|
import com.arsdigita.web.Web;
|
|
import com.arsdigita.xml.Element;
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
import org.apache.log4j.Logger;
|
|
|
|
/**
|
|
* A pane that contains user administration details.
|
|
*
|
|
* @author Tzu-Mainn Chen
|
|
* @version $Id: UserAdminPane.java 287 2005-02-22 00:29:02Z sskracic $
|
|
*/
|
|
public class UserAdminPane extends SimpleContainer {
|
|
|
|
private static final Logger s_log = Logger.getLogger(UserAdminPane.class);
|
|
|
|
private final UserSearchForm m_userFolderResetForm;
|
|
private final UserFolderResetProcessForm m_userFolderResetProcessForm;
|
|
private final Label m_submitLabel;
|
|
private final Label m_deniedLabel;
|
|
private final Link m_link;
|
|
|
|
public UserAdminPane() {
|
|
m_userFolderResetForm = new UserSearchForm
|
|
("userFolderResetForm",
|
|
new Label("Reset a user's home folder to none"));
|
|
add(m_userFolderResetForm);
|
|
|
|
m_userFolderResetProcessForm = new UserFolderResetProcessForm();
|
|
add(m_userFolderResetProcessForm);
|
|
|
|
m_submitLabel = new Label("No default folder set for users");
|
|
add(m_submitLabel);
|
|
|
|
m_deniedLabel = new Label("You do not have permission to view this pane.");
|
|
add(m_deniedLabel);
|
|
Application adminApp = Admin.getInstance();
|
|
// Note that if the admin app is remounted after this form has been
|
|
// created, the link will be incorrect. Since this never happens in
|
|
// practice, we are not going to worry about it. -- 2004-01-27
|
|
m_link = new Link("Administer users site-wide",
|
|
adminApp==null ?
|
|
"not_found" : adminApp.getPrimaryURL());
|
|
add(m_link);
|
|
}
|
|
|
|
private static boolean hasSiteWideAdmin(User user) {
|
|
Application adminApp = Admin.getInstance();
|
|
if ( adminApp == null ) { return false; }
|
|
|
|
PermissionDescriptor admin = new PermissionDescriptor
|
|
(PrivilegeDescriptor.ADMIN, adminApp, user);
|
|
return PermissionService.checkPermission(admin);
|
|
}
|
|
|
|
public final void generateXML(final PageState state,
|
|
final Element parent) {
|
|
if ( !isVisible(state) ) { return; }
|
|
|
|
SecurityManager sm = CMS.getContext().getSecurityManager();
|
|
User user = Web.getContext().getUser();
|
|
|
|
if ( !sm.canAccess(user,SecurityConstants.STAFF_ADMIN) ) {
|
|
m_deniedLabel.generateXML(state, parent);
|
|
return;
|
|
}
|
|
|
|
final FormData one = m_userFolderResetForm.getFormData(state);
|
|
final FormData two =
|
|
m_userFolderResetProcessForm.getForm().getFormData(state);
|
|
|
|
if (one != null && one.isSubmission()) {
|
|
m_userFolderResetForm.generateXML(state, parent);
|
|
m_userFolderResetProcessForm.generateXML(state, parent);
|
|
} else if (two != null && two.isSubmission()) {
|
|
m_userFolderResetForm.generateXML(state, parent);
|
|
m_submitLabel.generateXML(state, parent);
|
|
} else {
|
|
m_userFolderResetForm.generateXML(state, parent);
|
|
|
|
}
|
|
if ( hasSiteWideAdmin(user) ) {
|
|
m_link.generateXML(state, parent);
|
|
}
|
|
}
|
|
|
|
private class UserFolderResetProcessForm extends UserAddForm {
|
|
|
|
public UserFolderResetProcessForm() {
|
|
super(m_userFolderResetForm.getSearchWidget(),"UserFolderResetProcess","Select the users you wish to reset.", "Set no default folder for users");
|
|
}
|
|
|
|
protected final DataQuery makeQuery(final PageState state) {
|
|
final Session session = SessionManager.getSession();
|
|
|
|
final DataQuery query = session.retrieveQuery
|
|
("com.arsdigita.cms.workflow.searchToAddMembers");
|
|
final String search = (String) getSearchWidget().getValue(state);
|
|
|
|
makeFilter(query, search);
|
|
query.addOrder("lastName, firstName, email");
|
|
|
|
final OID oid = CMS.getContext().getContentSection().getOID();
|
|
|
|
PermissionService.objectFilterQuery
|
|
(query, "userId", PrivilegeDescriptor.READ, oid);
|
|
|
|
return query;
|
|
}
|
|
|
|
private void makeFilter(final DataQuery query, final String search) {
|
|
query.clearFilter();
|
|
|
|
final Filter filter = query.addFilter
|
|
("upper(firstName || lastName || email) " +
|
|
"like '%' || upper(:search) || '%'");
|
|
|
|
filter.set("search", search);
|
|
}
|
|
|
|
public final void process(final FormSectionEvent e)
|
|
throws FormProcessException {
|
|
final FormData data = e.getFormData();
|
|
final PageState state = e.getPageState();
|
|
|
|
final String[] users = (String[]) data.get("users");
|
|
|
|
if (users == null) {
|
|
throw new FormProcessException
|
|
(lz("cms.ui.workflow.no_users_were_selected"));
|
|
} else {
|
|
User user;
|
|
ContentSection section = CMS.getContext().getContentSection();
|
|
for (int i = 0; i < users.length; i++) {
|
|
user = User.retrieve(new BigDecimal(users[i]));
|
|
UserHomeFolderMap map = UserHomeFolderMap.findUserHomeFolderMap(user,section);
|
|
if ( map != null ) {
|
|
map.delete();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static GlobalizedMessage gz(final String key) {
|
|
return GlobalizationUtil.globalize(key);
|
|
}
|
|
|
|
private static String lz(final String key) {
|
|
return (String) gz(key).localize();
|
|
}
|
|
|
|
}
|