java/code/src/com/redhat/rhn/frontend/action/user/DeleteUserAction.java | 16 ++- java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml | 7 + java/code/src/com/redhat/rhn/frontend/xmlrpc/DeleteUserException.java | 40 +++++++ java/code/src/com/redhat/rhn/frontend/xmlrpc/user/UserHandler.java | 12 ++ java/code/src/com/redhat/rhn/manager/user/DeleteSatAdminException.java | 52 ++++++++++ java/code/src/com/redhat/rhn/manager/user/UserManager.java | 11 ++ 6 files changed, 136 insertions(+), 2 deletions(-)
New commits: commit 2d5f5fa328b2461ae4884bca56be2ce5615e6722 Author: Devan Goodwin dgoodwin@redhat.com Date: Tue Jun 30 15:57:48 2009 -0300
508789 - Block deletion of last remaining Satellite Administrator.
diff --git a/java/code/src/com/redhat/rhn/frontend/action/user/DeleteUserAction.java b/java/code/src/com/redhat/rhn/frontend/action/user/DeleteUserAction.java index 809f4c1..d17484b 100644 --- a/java/code/src/com/redhat/rhn/frontend/action/user/DeleteUserAction.java +++ b/java/code/src/com/redhat/rhn/frontend/action/user/DeleteUserAction.java @@ -21,6 +21,7 @@ import com.redhat.rhn.domain.user.User; import com.redhat.rhn.frontend.struts.RequestContext; import com.redhat.rhn.frontend.struts.RhnAction; import com.redhat.rhn.manager.acl.AclManager; +import com.redhat.rhn.manager.user.DeleteSatAdminException; import com.redhat.rhn.manager.user.UserManager;
import org.apache.struts.action.ActionErrors; @@ -83,7 +84,20 @@ public class DeleteUserAction extends RhnAction { return getStrutsDelegate().forwardParams(mapping.findForward("failure"), params); } - UserManager.deleteUser(loggedInUser, uid); + + try { + UserManager.deleteUser(loggedInUser, uid); + } + catch (DeleteSatAdminException e) { + errors.add(ActionMessages.GLOBAL_MESSAGE, + new ActionMessage("user.cannot.delete.last.sat.admin")); + Map params = new HashMap(); + params.put("uid", uid); + addErrors(request, errors); + return getStrutsDelegate().forwardParams(mapping.findForward("failure"), + params); + } + ActionMessages msg = new ActionMessages(); msg.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("user.delete", user.getLogin())); diff --git a/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml b/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml index a1d65ac..32fafc1 100644 --- a/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml +++ b/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml @@ -1085,6 +1085,13 @@ http://www.oasis-open.org/committees/xliff/documents/xliff-core-1.1.xsd" </context-group> </trans-unit>
+ <trans-unit id="user.cannot.delete.last.sat.admin"> +<source>Cannot delete the last remaining satellite administrator.</source> + <context-group name="ctx"> + <context context-type="sourcefile">/rhn/users/DeleteUser</context> + </context-group> + </trans-unit> + <trans-unit id="Users/Servers"> <source>Users/Servers</source> <context-group name="ctx"> diff --git a/java/code/src/com/redhat/rhn/frontend/xmlrpc/DeleteUserException.java b/java/code/src/com/redhat/rhn/frontend/xmlrpc/DeleteUserException.java new file mode 100644 index 0000000..4d5b2c8 --- /dev/null +++ b/java/code/src/com/redhat/rhn/frontend/xmlrpc/DeleteUserException.java @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2009 Red Hat, Inc. + * + * This software is licensed to you under the GNU General Public License, + * version 2 (GPLv2). There is NO WARRANTY for this software, express or + * implied, including the implied warranties of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 + * along with this software; if not, see + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + * + * Red Hat trademarks are not licensed under GPLv2. No permission is + * granted to use or replicate Red Hat trademarks that are incorporated + * in this software or its documentation. + */ + +package com.redhat.rhn.frontend.xmlrpc; + +import com.redhat.rhn.FaultException; +import com.redhat.rhn.common.localization.LocalizationService; + +/** + * Delete User Exception + * + * Thrown whenever a problem occurs deleting a user. + * + * @version $Rev$ + */ +public class DeleteUserException extends FaultException { + + /** + * Constructor + * @param resourceKey Resource bundle key for error message to return. + */ + public DeleteUserException(String resourceKey) { + super(2601, "Error deleting user", LocalizationService.getInstance(). + getMessage(resourceKey, new Object [] {})); + } + +} + diff --git a/java/code/src/com/redhat/rhn/frontend/xmlrpc/user/UserHandler.java b/java/code/src/com/redhat/rhn/frontend/xmlrpc/user/UserHandler.java index 15ae77f..71fcd0c 100644 --- a/java/code/src/com/redhat/rhn/frontend/xmlrpc/user/UserHandler.java +++ b/java/code/src/com/redhat/rhn/frontend/xmlrpc/user/UserHandler.java @@ -14,6 +14,10 @@ */ package com.redhat.rhn.frontend.xmlrpc.user;
+import com.redhat.rhn.frontend.xmlrpc.DeleteUserException; + +import com.redhat.rhn.manager.user.DeleteSatAdminException; + import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -535,7 +539,13 @@ public class UserHandler extends BaseHandler { User loggedInUser = getLoggedInUser(sessionKey); ensureOrgAdmin(loggedInUser); User target = XmlRpcUserHelper.getInstance().lookupTargetUser(loggedInUser, login); - UserManager.deleteUser(loggedInUser, target.getId()); + + try { + UserManager.deleteUser(loggedInUser, target.getId()); + } + catch (DeleteSatAdminException e) { + throw new DeleteUserException("user.cannot.delete.last.sat.admin"); + }
return 1; } diff --git a/java/code/src/com/redhat/rhn/manager/user/DeleteSatAdminException.java b/java/code/src/com/redhat/rhn/manager/user/DeleteSatAdminException.java new file mode 100644 index 0000000..c1d4482 --- /dev/null +++ b/java/code/src/com/redhat/rhn/manager/user/DeleteSatAdminException.java @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2009 Red Hat, Inc. + * + * This software is licensed to you under the GNU General Public License, + * version 2 (GPLv2). There is NO WARRANTY for this software, express or + * implied, including the implied warranties of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 + * along with this software; if not, see + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + * + * Red Hat trademarks are not licensed under GPLv2. No permission is + * granted to use or replicate Red Hat trademarks that are incorporated + * in this software or its documentation. + */ +package com.redhat.rhn.manager.user; + +import com.redhat.rhn.common.RhnRuntimeException; + +import com.redhat.rhn.domain.user.User; + +/** + * DeleteSatAdminException + * + * Exception thrown when we cannot delete a Satellite administrator. (presumably because + * they are the last remaining) + * + * @version $Rev$ + */ +public class DeleteSatAdminException extends RhnRuntimeException { + + private User targetUser; + + /** + * Constructor + * + * @param targetUserIn User we could not delete. + */ + public DeleteSatAdminException(User targetUserIn) { + super(); + this.targetUser = targetUserIn; + } + + /** + * Return the target user we could not delete. + * + * @return target user + */ + public User getTargetUser() { + return targetUser; + } + +} diff --git a/java/code/src/com/redhat/rhn/manager/user/UserManager.java b/java/code/src/com/redhat/rhn/manager/user/UserManager.java index b2c26e1..ae9208f 100644 --- a/java/code/src/com/redhat/rhn/manager/user/UserManager.java +++ b/java/code/src/com/redhat/rhn/manager/user/UserManager.java @@ -40,6 +40,7 @@ import com.redhat.rhn.frontend.dto.SystemSearchResult; import com.redhat.rhn.frontend.listview.PageControl; import com.redhat.rhn.frontend.taglibs.list.decorators.PageSizeDecorator; import com.redhat.rhn.manager.BaseManager; +import com.redhat.rhn.manager.SatManager;
import org.apache.commons.lang.BooleanUtils; import org.apache.log4j.Logger; @@ -450,6 +451,16 @@ public class UserManager extends BaseManager { pex.setLocalizedSummary(ls.getMessage("permission.jsp.summary.deleteuser")); throw pex; } + + // Do not allow deletion of the last Satellite Administrator: + User toDelete = UserFactory.lookupById(loggedInUser, targetUid); + if (toDelete.hasRole(RoleFactory.SAT_ADMIN)) { + if (SatManager.getActiveSatAdmins().size() == 1) { + log.warn("Cannot delete the last Satellite Administrator"); + throw new DeleteSatAdminException(toDelete); + } + } + CallableMode m = ModeFactory.getCallableMode("User_queries", "delete_user"); Map inParams = new HashMap();
spacewalk-commits@lists.fedorahosted.org