/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/rwiki/trunk/rwiki-tool/tool/src/java/uk/ac/cam/caret/sakai/rwiki/tool/command/EditAuthZGroupCommand.java $ * $Id: EditAuthZGroupCommand.java 84222 2010-11-03 13:15:52Z david.horwitz@uct.ac.za $ *********************************************************************************** * * Copyright (c) 2003, 2004, 2005, 2006 The Sakai Foundation. * * Licensed under the Educational Community License, Version 1.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ecl1.php * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package uk.ac.cam.caret.sakai.rwiki.tool.command; import java.io.IOException; import java.util.Iterator; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.authz.api.AuthzGroup; import org.sakaiproject.authz.api.AuthzGroupService; import org.sakaiproject.authz.api.AuthzPermissionException; import org.sakaiproject.authz.api.GroupNotDefinedException; import org.sakaiproject.authz.api.Role; import org.sakaiproject.component.api.ComponentManager; import org.sakaiproject.tool.cover.SessionManager; import uk.ac.cam.caret.sakai.rwiki.service.api.RWikiSecurityService; import uk.ac.cam.caret.sakai.rwiki.tool.RWikiServlet; import uk.ac.cam.caret.sakai.rwiki.tool.RequestScopeSuperBean; import uk.ac.cam.caret.sakai.rwiki.tool.api.HttpCommand; import uk.ac.cam.caret.sakai.rwiki.tool.bean.AuthZGroupEditBean; import uk.ac.cam.caret.sakai.rwiki.tool.bean.ErrorBean; import uk.ac.cam.caret.sakai.rwiki.tool.bean.ResourceLoaderBean; import uk.ac.cam.caret.sakai.rwiki.tool.bean.ViewBean; import uk.ac.cam.caret.sakai.rwiki.tool.bean.helper.ViewParamsHelperBean; /** * @author andrew */ public class EditAuthZGroupCommand implements HttpCommand { private static Log log = LogFactory.getLog(EditAuthZGroupCommand.class); private String editRealmPath; private String cancelEditPath; private String successfulPath; private String permissionPath; private String unknownRealmPath; private String idInUsePath; private AuthzGroupService realmService; public void init() { ComponentManager cm = org.sakaiproject.component.cover.ComponentManager .getInstance(); realmService = (AuthzGroupService) load(cm, AuthzGroupService.class .getName()); } private Object load(ComponentManager cm, String name) { Object o = cm.get(name); if (o == null) { log.error("Cant find Spring component named " + name); } return o; } /* * (non-Javadoc) * * @see uk.ac.cam.caret.sakai.rwiki.service.api.HttpCommand#execute(javax.servlet.http.HttpServletRequest, * javax.servlet.http.HttpServletResponse) */ public void execute(Dispatcher dispatcher, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestScopeSuperBean rssb = RequestScopeSuperBean .getFromRequest(request); ViewParamsHelperBean vphb = rssb.getNameHelperBean(); AuthZGroupEditBean realmEditBean = rssb.getRealmEditBean(); String requestedRealmId = realmEditBean.getLocalSpace(); String saveType = vphb.getSaveType(); AuthzGroup realmEdit; try { if (realmEditBean.getRealmEdit() == null) { realmEdit = realmService.getAuthzGroup(requestedRealmId); realmEditBean.setRealmEdit(realmEdit); } else { // Check the current realm edit is the same as the requested // one: realmEdit = realmEditBean.getRealmEdit(); if (!requestedRealmId.equals(realmEdit.getId())) { // TODO: set errorBean and ignore current request i.e. go // back to start ErrorBean errorBean = rssb.getErrorBean(); ResourceLoaderBean rlb = rssb.getResourceLoaderBean(); errorBean.addError(rlb.getString("editauthz.currently_editing1", "You are currently editing: ") + realmEdit.getId() + rlb.getString("editauthz.currently_editing2", ". You must finish editing this realm first")); realmEditBean.setLocalSpace(realmEdit.getId()); saveType = null; } } if (saveType == null || "".equals(saveType)) { // Begin a realmEdit... editDispatch(dispatcher,request, response); return; } else if (saveType.equals(AuthZGroupEditBean.CANCEL_VALUE)) { // cancel a realmEdit... // TODO: CHECK We beleive that this is no longer needed since // locking in authz group // is optimistic // realmService.cancelEdit(realmEdit); realmEditBean.setRealmEdit(null); cancelDispatch(dispatcher,request, response); String pageName = vphb.getGlobalName(); String realm = vphb.getLocalSpace(); ViewBean vb = new ViewBean(pageName, realm); String requestURL = request.getRequestURL().toString(); SessionManager.getCurrentToolSession().setAttribute( RWikiServlet.SAVED_REQUEST_URL, requestURL + vb.getInfoUrl()); return; } else if (saveType.equals(AuthZGroupEditBean.SAVE_VALUE)) { // complete a realmEdit... Map requestMap = request.getParameterMap(); for (Iterator it = realmEdit.getRoles().iterator(); it .hasNext();) { Role roleEdit = (Role) it.next(); updateRoleEdit(roleEdit, requestMap); } realmService.save(realmEdit); realmEditBean.setRealmEdit(null); successfulDispatch(dispatcher,request, response); String pageName = vphb.getGlobalName(); String realm = vphb.getLocalSpace(); ViewBean vb = new ViewBean(pageName, realm); String requestURL = request.getRequestURL().toString(); SessionManager.getCurrentToolSession().setAttribute( RWikiServlet.SAVED_REQUEST_URL, requestURL + vb.getInfoUrl()); } } catch (GroupNotDefinedException e) { realmEditBean.setRealmEdit(null); unknownRealmDispatch(dispatcher,request, response); return; } catch (AuthzPermissionException e) { // redirect to permission denied page realmEditBean.setRealmEdit(null); permissionDeniedDispatch(dispatcher,request, response); return; } } public String getIdInUsePath() { return idInUsePath; } public void setIdInUsePath(String idInUsePath) { this.idInUsePath = idInUsePath; } public String getPermissionPath() { return permissionPath; } public void setPermissionPath(String permissionPath) { this.permissionPath = permissionPath; } public String getUnknownRealmPath() { return unknownRealmPath; } public void setUnknownRealmPath(String unknownRealmPath) { this.unknownRealmPath = unknownRealmPath; } public String getCancelEditPath() { return cancelEditPath; } public void setCancelEditPath(String cancelEditPath) { this.cancelEditPath = cancelEditPath; } public String getEditRealmPath() { return editRealmPath; } public void setEditRealmPath(String editRealmPath) { this.editRealmPath = editRealmPath; } public String getSuccessfulPath() { return successfulPath; } public void setSuccessfulPath(String successfulPath) { this.successfulPath = successfulPath; } private void successfulDispatch(Dispatcher dispatcher, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { dispatcher.dispatch(successfulPath, request, response ); } private void cancelDispatch(Dispatcher dispatcher, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { dispatcher.dispatch(cancelEditPath, request, response ); } private void editDispatch(Dispatcher dispatcher, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { dispatcher.dispatch(editRealmPath, request, response ); } private void permissionDeniedDispatch(Dispatcher dispatcher, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { dispatcher.dispatch(permissionPath, request, response ); } private void unknownRealmDispatch(Dispatcher dispatcher, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { dispatcher.dispatch(unknownRealmPath,request, response ); } private void updateRoleEdit(Role roleEdit, Map map) { String id = roleEdit.getId(); if (map.get("create_" + id) != null) { if (!roleEdit.isAllowed(RWikiSecurityService.SECURE_CREATE)) { roleEdit.allowFunction(RWikiSecurityService.SECURE_CREATE); } } else { if (roleEdit.isAllowed(RWikiSecurityService.SECURE_CREATE)) { roleEdit.disallowFunction(RWikiSecurityService.SECURE_CREATE); } } if (map.get("read_" + id) != null) { if (!roleEdit.isAllowed(RWikiSecurityService.SECURE_READ)) { roleEdit.allowFunction(RWikiSecurityService.SECURE_READ); } } else { if (roleEdit.isAllowed(RWikiSecurityService.SECURE_READ)) { roleEdit.disallowFunction(RWikiSecurityService.SECURE_READ); } } if (map.get("update_" + id) != null) { if (!roleEdit.isAllowed(RWikiSecurityService.SECURE_UPDATE)) { roleEdit.allowFunction(RWikiSecurityService.SECURE_UPDATE); } } else { if (roleEdit.isAllowed(RWikiSecurityService.SECURE_UPDATE)) { roleEdit.disallowFunction(RWikiSecurityService.SECURE_UPDATE); } } // if (requestMap.get("delete_" + id) != null) { // if (!roleEdit.contains(RWikiSecurityServiceImpl.SECURE_DELETE)) { // roleEdit.add(RWikiSecurityServiceImpl.SECURE_DELETE); // } // } else { // if (roleEdit.contains(RWikiSecurityServiceImpl.SECURE_DELETE)) { // roleEdit.remove(RWikiSecurityServiceImpl.SECURE_DELETE); // } // } if (map.get("admin_" + id) != null) { if (!roleEdit.isAllowed(RWikiSecurityService.SECURE_ADMIN)) { roleEdit.allowFunction(RWikiSecurityService.SECURE_ADMIN); } } else { if (roleEdit.isAllowed(RWikiSecurityService.SECURE_ADMIN)) { roleEdit.disallowFunction(RWikiSecurityService.SECURE_ADMIN); } } if (map.get("superadmin_" + id) != null) { if (!roleEdit.isAllowed(RWikiSecurityService.SECURE_SUPER_ADMIN)) { roleEdit.allowFunction(RWikiSecurityService.SECURE_SUPER_ADMIN); } } else { if (roleEdit.isAllowed(RWikiSecurityService.SECURE_SUPER_ADMIN)) { roleEdit .disallowFunction(RWikiSecurityService.SECURE_SUPER_ADMIN); } } } }